digital-guard / preserv

Digital Preservation Project
http://git.digital-guard.org/preserv
Apache License 2.0
0 stars 0 forks source link

Filtragem de "poeira" e geometrias inválidas #80

Closed ppKrauss closed 11 months ago

ppKrauss commented 2 years ago

Durante a ingestão é importante descartar geometrias inválidas, para garantir que o custo de revisão das geometrias problemáticas fique por conta do fornecedor (envia mais tarde uma segunda versão dos dados). A tabela ingest.feature_asis portanto não deveria conter "dados muito ruins".

Alguns critérios são óbvios, outros requerem discussão para decidirmos sua implementação:

  1. IS NOT NULL
  2. ST_IsSimple e ST_IsValid, ver https://stackoverflow.com/a/58587330/287948
  3. As geometrias de dimensão superior a zero não podem ser nem conter "poeira" ou "buracos de contrabando", ou seja, possuem dimensão superior ao erro estipulado. Por exemplo os polígonos, mesmo relativos a parcel precisam ter área mínima, de por exemplo 5 m2.
  4. Geometrias internas à jurisdição. Por exemplo o material Geofabrick do Brasil que é incluso por segurança para além da fronteira, precisa ser descartado. Um ponto de endereço da cidade X não pode estar contido na jurisdição Y.
    PS: o caso de parcel (ex. condomínios horizontais e fazendas) é mais complexo. Ao contrário das jurisdições globais (país), a demanda por separação em escala maior (ex. municipal) é menos rígida. Estando na na fronteira, por default recortamos parcel conforme interseção da jurisdição. A parte que ficou de fora é também jurisdição da cidade vizinha, precisamos avaliar como garantir que a inclusão completa ocorra. Idem estradas municipais e trechos federais, segmentados por jurisdição.

Indicar aqui nesta issue as decisões finais e fechar a issue quando todas estiverem implementadas nas funções de ingestão, em particular ingest.any_load.

0e1 commented 2 years ago

Talvez devêssemos acrescentar mais um critério:

  1. ST_IsEmpty

Erros do tipo:

ERROR:  field name must not be null
CONTEXT:  SQL function "feature_asis_geohashes" statement 1
SQL function "feature_asis_assign_signature" statement 1
SQL statement "UPDATE ingest.donated_PackComponent
    SET proc_step=3,   -- if insert process occurs after q_query.
        lineage =  lineage || ingest.feature_asis_assign_signature(q_file_id)
    WHERE id=q_file_id"
PL/pgSQL function ingest.any_load(text,text,text,text,bigint,text,text[],integer,text,boolean) line 178 at SQL statement
make: *** [makefile:192: parcel] Error 1

São ocasionados por geometrias vazias. Quando a geometria é vazia, ST_GeoHash não retorna um geohash, ocasionando o erro citado acima.

O erro acima foi retornado por causa dos seguintes _featureid do parcel de Rio Branco:

 file_id | feature_id |                      properties                      |            geom            | kx_ghs9 | gtype | ghs 
---------+------------+------------------------------------------------------+----------------------------+---------+-------+-----
       6 |      60066 | {"via_name": "RUAMADEREIRA", "house_number": "662"}  | 0103000020E610000000000000 |         | poly  | 
       6 |      62999 | {"via_name": "RUA13 DE MAIO", "house_number": "410"} | 0103000020E610000000000000 |         | poly  | 
       6 |      89718 | {"via_name": "TRVMINEIRO,", "house_number": null}    | 0103000020E610000000000000 |         | poly  | 

Aplicando ST_AsText à geom:

SELECT ST_AsText('0103000020E610000000000000');
   st_astext   
---------------
 POLYGON EMPTY
0e1 commented 11 months ago

O tratamento atual data as geometrias foi descrito em https://github.com/digital-guard/preserv/blob/main/docs/pt/man-diversos.md#resumo-do-tratamento-aplicado-%C3%A0s-geometrias-no-processo-de-ingest%C3%A3o