Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,16 @@ backend = cube.to_lucc_data(
| `std` | zonal | nearest | não |
| `min` | zonal | min | não |
| `max` | zonal | max | não |
| `majority` | zonal | mode | não |
| `minority` | zonal | mode | não |
| `percentage` | zonal | mode | **sim** |
| `majority` | zonal | nearest¹ | não |
| `minority` | zonal | nearest¹ | não |
| `percentage` | zonal | nearest¹ | **sim** |
| `attribute` | zonal | nearest | não |
| `presence` | zonal | nearest | não |
| `min_distance` | proximity | nearest | não |
| `count` | proximity | nearest | não |

> ¹ Usam `needs_fine_alignment=True`: o GridAligner reamosttrea com `nearest` em alta resolução; a redução real (contagem por janela) é feita pelo operador.

## Pipeline

```
Expand Down
14 changes: 14 additions & 0 deletions docs/architecture/catalog.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,22 @@ cube.catalog.search_derived_variables(tile_id="009002")

# Por spec_hash (exato)
cube.catalog.get_derived_by_hash("a3f9...")

# Remover entrada por ID
cube.catalog.delete_derived("a3f9..._slope")
```

## Limpeza de entradas órfãs

O catálogo acumula entradas cujos arquivos Zarr foram deletados (comum ao apagar o store para re-testar). `purge_stale()` remove essas entradas:

```python
n = cube.purge_stale() # retorna o número de entradas removidas
print(f"Removidas {n} entradas órfãs")
```

`load()` já ignora silenciosamente entradas sem arquivo no disco — `purge_stale()` é uma limpeza explícita para manter o catálogo enxuto.

## Evolução do schema

O schema usa `CREATE TABLE IF NOT EXISTS` — seguro para idempotência. Novas colunas exigem `ALTER TABLE` ou migração manual. Os campos descritivos extras de modelos (como `purity_threshold` de `Derivation`) vivem apenas no modelo Python, não no banco — isso protege a compatibilidade retroativa para campos reservados.
2 changes: 1 addition & 1 deletion docs/architecture/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ Cada operador é uma subclasse de `Operator` que se auto-registra no `OPERATOR_R
```python
class MajorityOperator(Operator):
name = "majority"
_resampling = Resampling.mode
_resampling = Resampling.nearest

def compute(self, data, var, grid) -> xr.DataArray:
...
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture/pipeline.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ final_ds[var.name] = result

Não contém nenhuma lógica de operador — é puro despacho. O `if/elif` histórico foi eliminado.

Monta o `xr.Dataset` final com CRS nomeado (evita `PROJCS["unknown"]` no QGIS para CRSs sem EPSG registrado, como BDC Albers) e `transform`.
Monta o `xr.Dataset` final. `write_crs()` e `write_transform()` são chamados **depois** do loop de variáveis — rioxarray propaga `grid_mapping="spatial_ref"` apenas para as data variables já presentes no Dataset no momento da chamada. Chamar antes do loop resultaria em nenhuma variável recebendo o atributo, impedindo que leitores CF (QGIS, GDAL) detectem a projeção automaticamente. O CRS é nomeado explicitamente para evitar `PROJCS["unknown"]` em CRSs sem código EPSG registrado (ex: BDC Albers).

---

Expand Down
Loading