digital-guard / preserv-BR

Digital Preservation of Brazilian metadata of donated maps.
http://git.digital-guard.org/preserv-BR
3 stars 1 forks source link

PR/Londrina/_pk0106.01: Analise de problema de dados #139

Closed crebollobr closed 1 year ago

crebollobr commented 1 year ago

Banco ingest20

Link https://github.com/digital-guard/preserv-BR/tree/main/data/PR/Londrina/_pk0106.01

{"via_name": "RUA SYLVIO CARLOS SILVA", "error_mask": "000100000000"}

Item com geometria não fechada (em se tratando de polígonos) ?

                              any_load                              
--------------------------------------------------------------------
 From file_id=1 inserted type=via_full.                            +
                                                                   +
         Statistics:                                               +
 .                                                                 +
         Before deduplication:                                     +
                                                                   +
         Originals: 6096 items.                                    +
                                                                   +
         Not Intersecs: 0 items.                                   +
                                                                   +
         Invalid: 0 items.                                         +
                                                                   +
         Not simple: 0 items.                                      +
                                                                   +
         Empty: 0 items.                                           +
                                                                   +
         Small: 0 items.                                           +
                                                                   +
         Null: 0 items.                                            +
                                                                   +
         Invalid geometry type: 0 items.                           +
                                                                   +
         Not closed: 6015 items.                                   +
                                                                   +
         Large: 0 items.                                           +
                                                                   +
         Inserted in feature_asis: 78 items.                       +
                                                                   +
         Inserted in feature_asis_discarded: 6015 items.           +
                                                                   +
                                                                   +
         After deduplication:                                      +
                                                                   +
         Removed duplicates from feature_asis: 0 items.            +
                                                                   +
         Inserted in feature_asis_discarded (duplicates): 0 items. +
                                                                   +
         Inserted in feature_asis (aggregated duplicates): 0 items.+
                                                                   +
         Resulting in feature_asis: 78                             +

(1 row)
0e1 commented 1 year ago

Eu adicionei o README e o reproducibility.sh para facilitar o suporte.

A função any_load tem o trecho de código

        SELECT *
        FROM a0
        WHERE ST_IsClosed(geom) = TRUE OR GeometryType(geom) IN ('LINESTRING','MULTILINESTRING')

e o trecho

        SELECT file_id, gid, properties, geom, B'000100000000' AS error
        FROM a0
        WHERE ST_IsClosed(geom) = FALSE AND GeometryType(geom) NOT IN ('LINESTRING','MULTILINESTRING')

Esses trechos tem por objetivo detectar e marcar polígonos não fechados.

Obviamente, linhas não são fechadas. Então o problema está no tipo da geometria do layer e nos tipos de linhas que levamos em conta nos trechos de código mencionados acima. Veja

ingest1=# SELECT ST_IsClosed(geom) FROM pk7600010601101_p1_via LIMIT 1;
 st_isclosed 
-------------
 f
(1 row)

ingest1=# SELECT GeometryType(geom) FROM pk7600010601101_p1_via LIMIT 1;
   geometrytype   
------------------
 MULTILINESTRINGM
(1 row)

Em resumo, o problema decorre da falta de 'MULTILINESTRINGM' nos trechos de código.

@ppKrauss o que fazer com linhas que possuem vértices com de mais de duas dimensões?

@crebollobr alguma informação sobre como interpretar a dimensão extra nos vértices das linhas?

0e1 commented 1 year ago

O caminho adotado para essa situação será:

0e1 commented 1 year ago

O caminho adotado para essa situação será:

* forçar 2 coordenadas com https://postgis.net/docs/ST_Force2D.html;

* usar um dos dois bits reserva na _error_mask_ para indicar que foi descartada a 3 dimensão;

  * apesar disso a geometria **não** será descartada.

Não foi adotado esse caminho.

'LINESTRINGM','MULTILINESTRINGM' foram adicionados conforme o commit https://github.com/digital-guard/preserv/commit/140196d990a9776f8d1b78616fecb4898b73d250.

O motivo de não aplicar ST_Force2D foi que ST_SimplifyPreserveTopology e ST_ReducePrecision aplicadas por default em todas as geometrias ingeridas já ignoram a terceira coordenada. Isso pode ser visto aplicado as funções diretamente nas geometrias de pk7600010601101_p1_via:

SELECT GeometryType(ST_SimplifyPreserveTopology( -- remove collinear points 
                            ST_ReducePrecision( -- round decimal degrees of SRID 4326, ~1 meter
                              geom
                              ,0.000001
                            ),
                            0.00000001
                    )) FROM pk7600010601101_p1_via LIMIT 10;
 geometrytype 
--------------
 LINESTRING
 MULTILINESTRING
...
(10 rows)

Output da ingestão após a mudança:

psql postgres://postgres@localhost/ingest42 -c "SELECT ingest.any_load('shp2sql','/tmp/sandbox/_pk7600010601_001/Export_Output.shp','via_full','pk7600010601101_p1_via','7600010601101','b1cc16e9070aa2c624d1eeebde8a00e4b9bea471fb76a79c4f8ec5902c250c3e.rar',array['NOME as via'],5,1)"
                                             any_load                                              
---------------------------------------------------------------------------------------------------
 Statistics from file_id=581 (via_full of 7600010601101 of BR-PR-Londrina) in ingest.feature_asis.+
                                                                                                  +
             Originals: 6096 items.                                                               +
                                                                                                  +
             Not Intersecs: 2 items.                                                              +
                                                                                                  +
             Invalid: 0 items.                                                                    +
                                                                                                  +
             Not simple: 80 items.                                                                +
                                                                                                  +
             Empty: 7 items.                                                                      +
                                                                                                  +
             Small: 24 items.                                                                     +
                                                                                                  +
             Null: 0 items.                                                                       +
                                                                                                  +
             Invalid geometry type: 0 items.                                                      +
                                                                                                  +
             Not closed: 0 items.                                                                 +
                                                                                                  +
             Large: 0 items.                                                                      +
                                                                                                  +
             Deduplication: 4 items.                                                              +
                                                                                                  +
             Resulting in feature_asis: 5983.                                                     +
                                                                                                  +
             Resulting in feature_asis_discarded: 110.                                            +

(1 row)

Confira os resultados nas tabelas ingest.donated_packcomponent e ingest.feature_asis.
psql postgres://postgres@localhost/ingest42 -c "DROP  TABLE IF EXISTS pk7600010601101_p1_via CASCADE"
DROP TABLE
FIM.