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

Problemas com Itu/_pk0024.01 #109

Closed crebollobr closed 2 years ago

crebollobr commented 2 years ago

Problema 01

https://github.com/digital-guard/preserv-BR/tree/main/data/SP/Itu/_pk0024.01

Parcel precisa de opção a mais no comando ogr2ogr

Modificação no makefile linha 332 adicionar -nlt CONVERT_TO_LINEAR -nlt PROMOTE_TO_MULTI

Se for possível adicionar um parâmetro no make_conf.yaml para isso

sudo docker run --rm --network host -v $(sandbox):/tmp osgeo/gdal ogr2ogr -lco GEOMETRY_NAME=geom -overwrite -f "PostgreSQL" PG:" dbname='$(pg_db)' host='localhost' port='5432' user='postgres' " "/tmp/LOGRADOURO_2019.tab"  -nln pk7600002401201_p2_via -nlt CONVERT_TO_LINEAR -nlt PROMOTE_TO_MULTI
crebollobr commented 2 years ago

Problema 02

A camada via as ruas não tem continuidade

image

image

Obs: Meu qgis não suporta esse formato

Branch https://github.com/digital-guard/preservCutGeo-BR2021/tree/Itu-20220521-01/data/SP/Itu/_pk0024.01

0e1 commented 2 years ago

Problema 01

Estendi o uso de method_opts para o método ogr2ogr, então você pode usar:

method_opts: -nlt CONVERT_TO_LINEAR -nlt PROMOTE_TO_MULTI

junto com o método ogr2ogr.

Eu troquei a chave extension pela chave codec.

Assim, os respectivos layers ficaram assim:

  parcel:
        subtype: full
        method: ogr2ogr
        file: 1
        sql_select: ['Bairro as nsvia_name','Logradouro AS via_name','Numero AS house_number', 'geom']
        orig_filename: lotes_Itu
        codec: TAB
  via:
        subtype: full
        method: ogr2ogr
        file: 2
        sql_select: ['Logradouro AS via_name', 'geom']
        orig_filename: LOGRADOURO_2019
        codec: TAB
        method_opts: -nlt CONVERT_TO_LINEAR -nlt PROMOTE_TO_MULTI

Essas alterações não afetem em nada os arquivos gerados.

Isso resolve o problema 1.

0e1 commented 2 years ago

Problema 02

Esse problema tem potencial de afetar todos os layer via.

Você pode visualizar os dados ingeridos no qgis, via ssh. Com isso você pode ver os dados nas tabelas ingest.feature_asis e ingest.feature_asis_discarded.

Resumo de ingestão:

----------------------------------------------------------------------
 From file_id=1 inserted type=via_full.                              +
                                                                     +
         Statistics:                                                 +
 .                                                                   +
         Before deduplication:                                       +
                                                                     +
         Originals: 8695 items.                                      +
                                                                     +
         Not Intersecs: 15 items.                                    +
                                                                     +
         Invalid: 1 items.                                           +
                                                                     +
         Not simple: 124 items.                                      +
                                                                     +
         Empty: 3 items.                                             +
                                                                     +
         Small: 29 items.                                            +
                                                                     +
         Null: 0 items.                                              +
                                                                     +
         Invalid geometry type: 0 items.                             +
                                                                     +
         Not closed: 0 items.                                        +
                                                                     +
         Large: 0 items.                                             +
                                                                     +
         Inserted in feature_asis: 8527 items.                       +
                                                                     +
         Inserted in feature_asis_discarded: 168 items.              +
                                                                     +
                                                                     +
         After deduplication:                                        +
                                                                     +
         Removed duplicates from feature_asis: 1650 items.           +
                                                                     +
         Inserted in feature_asis_discarded (duplicates): 1650 items.+
                                                                     +
         Inserted in feature_asis (aggregated duplicates): 750 items.+
                                                                     +
         Resulting in feature_asis: 7627                             +

(1 row)

Conforme o resumo, algumas geometrias foram consideradas duplicadas.

Nós consideramos duplicadas as geometrias que possuem o mesmo geohash.

O geohash é obtido pela função:

CREATE OR REPLACE FUNCTION f(geom text, file_id bigint, ghs_size integer)
RETURNS text AS $f$
    SELECT ST_Geohash(ST_PointOnSurface(geom),ghs_size)
$f$ LANGUAGE SQL IMMUTABLE;

Com o geohash, o software obtem e trata as duplicadas em https://github.com/digital-guard/preserv/blob/main/src/ingest-step1-ini.sql#L1432. O tratamento significa escolher uma das geometrias, consideradas duplicadas, como sendo a representante do grupo.

No caso em questão, o que esta acontecendo é que segmentos de reta que possuem como intersecção apenas um ponto, estão tendo o mesmo geohash.

Ou seja, ST_PointOnSurface(geom1) = ST_PointOnSurface(geom2) = {ponto A} = geom1 intersecção geom2.

Por exemplo, a Rua Maceió e trecho da Rua Fernando de Noronha possuem o mesmo geohash:

Captura de tela de 2022-05-21 19-48-10

Com isso, apenas o segmento da Rua Fernando de Noronha foi mantido na _featureasis:

Captura de tela de 2022-05-21 19-51-15

Já a Rua Maceió, foi para a _feature_asisdiscarded:

Captura de tela de 2022-05-21 19-52-32

Vejo dois caminhos:

  1. Alterar a função f, de maneira que se reduzam as chances de que ST_Geohash seja aplicada em um ponto comum de geometrias distintas;
  2. Alterar o tratamento aplicado as geometrias duplicadas.

O primeiro me parece mais correto. Se o segundo, manteríamos na base geometrias com geohash iguais, o que poderia ocasionar problemas em outras partes do workflow.

0e1 commented 2 years ago

Eu penso em aplicar ST_LineInterpolatePoint com a função random para LINESTRING e MULTILINESTRING:

CREATE OR REPLACE FUNCTION f(geom geometry, file_id bigint, ghs_size integer)
RETURNS text AS $f$
    SELECT ST_Geohash(CASE (GeometryType(geom))
        WHEN 'POINT' THEN geom
        WHEN 'LINESTRING' THEN ST_LineInterpolatePoint(geom,random())
        WHEN 'MULTILINESTRING' THEN ST_LineInterpolatePoint(ST_GeometryN(geom,(floor(random()*ST_NumGeometries(geom))::int)),random())
        ELSE ST_PointOnSurface(geom) END
,ghs_size)
$f$ LANGUAGE SQL IMMUTABLE;

Com isso, teríamos o problema minimizado, como mostra o resumo:

--------------------------------------------------------------------
 From file_id=1 inserted type=via_full.                           +
                                                                   +
         Statistics:                                               +
 .                                                                 +
         Before deduplication:                                     +
                                                                   +
         Originals: 8695 items.                                    +
                                                                   +
         Not Intersecs: 15 items.                                  +
                                                                   +
         Invalid: 1 items.                                         +
                                                                   +
         Not simple: 124 items.                                    +
                                                                   +
         Empty: 3 items.                                           +
                                                                   +
         Small: 29 items.                                          +
                                                                   +
         Null: 0 items.                                            +
                                                                   +
         Invalid geometry type: 0 items.                           +
                                                                   +
         Not closed: 0 items.                                      +
                                                                   +
         Large: 0 items.                                           +
                                                                   +
         Inserted in feature_asis: 8527 items.                     +
                                                                   +
         Inserted in feature_asis_discarded: 168 items.            +
                                                                   +
                                                                   +
         After deduplication:                                      +
                                                                   +
         Removed duplicates from feature_asis: 8 items.            +
                                                                   +
         Inserted in feature_asis_discarded (duplicates): 8 items. +
                                                                   +
         Inserted in feature_asis (aggregated duplicates): 4 items.+
                                                                   +
         Resulting in feature_asis: 8523                           +

(1 row)

Confira os resultados nas tabelas ingest.donated_packcomponent e ingest.feature_asis.
FIM.
ppKrauss commented 2 years ago

Eu penso em aplicar ST_LineInterpolatePoint com a função random para LINESTRING e MULTILINESTRING:

Ok, já sabíamos que a gambiarra não ia durar, boa hora para retomar uma solução definitiva. Devemos relembrar o seguinte:

  1. A função precípua do ID-Geohash é a de identificar univocamente. No caso de pontos outra importante função é eliminar duplicações, porém no caso de geometrias de dimensão não-zero o critério de duplicação precisa ser mais eficaz.

  2. O risco de ocorrência de duas linhas paralelas e bem próximas sempre vai existir. As linhas paralelas serão mesmo notadas como linhas duplicadas quando reduzimos a precisão da análise.

  3. O risco de linhas diferentes porém com pequenos segmentos paralelos ou com extremidades que se tocam, sempre vai existir.

A solução ST_LineInterpolatePoint(linestring,fraction) parece ser satisfatória, mas sem random para preservar o objetivo de identificação reprodutivel. Basta fraction=0.5. Os itens 2 e 3 acima continuarão gerando geohashes duplicados, os quais só trataremos a posteriori na Consolidação (não nesta etapa de Filtragem). Importante apenas avaliar visualmente, por amostragem, as linhas duplicadas, só para ter certeza de que pouco está sendo perdido.

ppKrauss commented 2 years ago

Questão de Itu resolvida (closed issue), o bug discutido acima é geral, melhorar o software a partir da https://github.com/digital-guard/preserv/issues/112