digital-guard / preserv

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

ERROR: transform: Point outside of projection domain (2050) #133

Closed 0e1 closed 1 year ago

0e1 commented 1 year ago

A ingestão de BR-AM-Manaus/_pk0071.01 resultou no erro

psql postgres://postgres@localhost/ingest42 -c "SELECT ingest.any_load('shp2sql','/tmp/sandbox/_pk7600007101_002/OpenStreetMap_Shapefiles/NUMERACAO.shp','geoaddress_full','pk7600007101101_p1_geoaddress','7600007101101','4134127ab8fe9d96a17d1cfb833437de98a0186e7121db4994ae4763ab4d542a.rar',array['gid', 'ENDEREÇO as via', 'NUMERACAO as hnum', 'geom'],1,1)"
ERROR:  transform: Point outside of projection domain (2050)

erro semelhante resultou a tentativa de ingestão de BR-PB-JoaoPessoa/_pk0072.01

psql postgres://postgres@localhost/ingest42 -c "SELECT ingest.any_load('shp2sql','/tmp/sandbox/_pk7600007201_001/Logradouro_gerais.shp','via_full','pk7600007201201_p2_via','7600007201201','393dc287ca1b626ecb180b40d6c9ec2ebc74a3364444a4418d77e7225c32f3f7.zip',array['gid', 'NOME_LOGR as via', 'geom'],5,1)"
ERROR:  transform: Point outside of projection domain (2050)
0e1 commented 1 year ago

Sobre BR-PB-JoaoPessoa/_pk0072.01, usando reproducibility.sh do layer via obtemos

SELECT ST_Transform(geom,4326) FROM pk7600007201201_p2_via;
ERROR:  transform: Point outside of projection domain (2050)

Utilizando a função descrita em Find geometries with coordinates that do not belong in projection obtemos o gid com problema

SELECT gid, nome_logr, ST_AsText(geom) FROM pk7600007201201_p2_via WHERE transform_safe(geom,4326) IS NULL AND geom IS NOT NULL;
WARNING:  XX000: transform: Point outside of projection domain (2050)
  gid  |     nome_logr     |                                                                                            st_astext                                                                                            
-------+-------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 21751 | RUA SEM NOME 7561 | MULTILINESTRING((NaN 9204702.09840553,NaN 9204702.965978181,NaN 9204713.37684997,NaN 9204684.313166225,NaN 9204669.130644867,NaN 9204668.263072219,NaN 9204650.044046588,NaN 9204646.57375599))
(1 row)

Assim, excluindo tal gid podemos usar ST_Transform(geom,4326) sem problemas.

0e1 commented 1 year ago

Sobre BR-AM-Manaus/_pk0071.01 usando reproducibility.sh do layer geoaddress e a mesma função citada anteriormente

SELECT gid, ST_AsText(geom) FROM pk7600007101101_p1_geoaddress WHERE transform_safe(geom,4326) IS NULL AND geom IS NOT NULL;
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
WARNING:  XX000: transform: Point outside of projection domain (2050)
  gid  |                       st_astext                        
-------+--------------------------------------------------------
 15703 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 15767 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 15780 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 15879 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 15937 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 16211 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 16395 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 18290 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 18420 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 18449 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 18450 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 18704 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 18874 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 18931 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 18932 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 19198 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 19199 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
 19203 | POINT(-1.797693134862316e+308 -1.797693134862316e+308)
(18 rows)

Excluindo tais gid, podemos usar a ST_Transform.

0e1 commented 1 year ago

Necessário avaliar forma de excluir gids antes de aplicar a função _anyload. Verificar se a chave after_extract utilizada em CO/_pk0006.02 pode ser usada nesse caso.

Outra possibilidade é remover as features problemáticas logo no inicio da _anyload, antes da aplicação da ST_Transform. Podendo ainda atribuir um bit na error_mask para indicar esse problema (temos ainda 2 bits de reserva). Trecho onde é aplicada a ST_Transform na _anyload:

q_query := format(
    $$
    WITH
    scan AS (
    SELECT %s AS file_id,
            CASE
                WHEN %s THEN gid
                ELSE gid+COALESCE((SELECT MAX(feature_id) FROM ingest.feature_asis WHERE file_id=%s),0)
            END AS gid,
    properties,
            CASE
                WHEN ST_SRID(geom)=0 THEN ST_SetSRID(geom,4326)
                WHEN %s AND ST_SRID(geom)!=4326 AND %s THEN ST_Transform(geom,4326)
                ELSE geom
            END AS geom
    FROM (
        SELECT %s,  -- feature_id_col
                %s as properties,
                %s -- geom
        FROM %s %s
        ) t
    ),
    a0 AS (
    SELECT *
    FROM scan
    WHERE ST_IsValid(geom)
    ),
0e1 commented 1 year ago

Avaliar ainda a utilização de sql_view no lugar de sql_select, de maneira que se exclua as features problemáticas. Necessário conhecer os gid e que exista um identificador na camada.

BR-RS-PortoAlegre/_pk0018.01 é um exemplo de uso com sql_view complexo.

0e1 commented 1 year ago

Avaliar ainda a utilização de sql_view no lugar de sql_select, de maneira que se exclua as features problemáticas. Necessário conhecer os gid e que exista um identificador na camada.

BR-RS-PortoAlegre/_pk0018.01 é um exemplo de uso com sql_view complexo.

Solução aplicada para BR-PB-JoaoPessoa/_pk0072.01 no commit https://github.com/digital-guard/preserv-BR/commit/77c61c3944f3dd263e3a686d5bf6e60637d5b8e9.

Solução aplicada para BR-AM-Manaus/_pk0071.01 no commit https://github.com/digital-guard/preserv-BR/commit/a930e7820bd1a1424b6d99fe0e595f9e8348fa3c.

0e1 commented 1 year ago

Arquivos filtrados dos dois pacotes de dados já estão disponíveis em https://github.com/digital-guard/preserv-BR/issues/144. Arquivos para o CutGeo ainda sendo gerados.