From e7f19c8b0a9983f6aeec9e2ccb95a3525d044327 Mon Sep 17 00:00:00 2001 From: Sergio Souza Costa Date: Mon, 15 Jun 2026 10:51:41 -0300 Subject: [PATCH] docs: fix operator resampling in README/overview, document purge_stale and CRS ordering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README.md: majority/minority/percentage show mode resampling — corrected to nearest + footnote explaining needs_fine_alignment window reduction - docs/architecture/overview.md: MajorityOperator example used Resampling.mode — corrected to Resampling.nearest - docs/architecture/catalog.md: added purge_stale() and delete_derived() documentation in new "Limpeza de entradas órfãs" section - docs/architecture/pipeline.md: clarified that write_crs() is called after the variable loop (explains the CRS-not-detected bug and its fix) Co-Authored-By: Claude Sonnet 4.6 --- README.md | 8 +++++--- docs/architecture/catalog.md | 14 ++++++++++++++ docs/architecture/overview.md | 2 +- docs/architecture/pipeline.md | 2 +- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3cb5342..53ea4b8 100644 --- a/README.md +++ b/README.md @@ -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 ``` diff --git a/docs/architecture/catalog.md b/docs/architecture/catalog.md index ad1ac46..dbf937f 100644 --- a/docs/architecture/catalog.md +++ b/docs/architecture/catalog.md @@ -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. diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md index 4313108..fb89a8d 100644 --- a/docs/architecture/overview.md +++ b/docs/architecture/overview.md @@ -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: ... diff --git a/docs/architecture/pipeline.md b/docs/architecture/pipeline.md index 0183388..3d13327 100644 --- a/docs/architecture/pipeline.md +++ b/docs/architecture/pipeline.md @@ -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). ---