Closed crebollobr closed 2 years ago
Problema 02
A camada via as ruas não tem continuidade
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
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.
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:
Com isso, apenas o segmento da Rua Fernando de Noronha foi mantido na _featureasis:
Já a Rua Maceió, foi para a _feature_asisdiscarded:
Vejo dois caminhos:
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.
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.
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:
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.
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.
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.
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
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