digital-guard / preserv

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

Implementar novo tipo de dado datagrid #115

Closed crebollobr closed 1 year ago

crebollobr commented 2 years ago

Para importar dados do tipo grid como

https://geoportal.dane.gov.co/descargas/CNPV2018/Shapefile/ShapefileGrid1km2_VihopeCNPV2018.rar

Tipo do dado datagrid.

Exemplo: make_conf.yaml ( não funciona, somente para exemplo )

  datagrid:
        subtype: full
        method: shp2sql
        file: 1
        sql_select: ['gid', 'nomelog AS via_name', 'endereco_n AS house_number']
        orig_filename: rb_20201116/lotes
0e1 commented 2 years ago

Criado um ftype chamado datagrid que aceita apenas pontos no commit https://github.com/digital-guard/preserv/commit/ed06f4099196b36af7ac4026fa7d8ff47c81180b.

Com isso, ingestar o centro das células do grid. Para isso, usar ST_crentroid, de maneira semelhante ao utilizado no sql_view do layer geoaddress de Porto Alegre/RS: https://github.com/digital-guard/preserv-BR/blob/main/data/RS/PortoAlegre/_pk0018.01/make_conf.yaml#L33.

Nota: nesse fytpe ainda não é possível utilizar o subtype: ext e realizar um join com um layer de cadastro. Será implementado conforme demanda.

crebollobr commented 2 years ago

Não funcionou o makefile Diretório: /var/gits/_dg/preserv-CO/data/_pk0006.01 comandos

make me pg_db=ingest20
make datagrid pg_db=ingest20

Resultado

carlos@addressforall:/var/gits/_dg/preserv-CO/data/_pk0006.01$ make datagrid pg_db=ingest20
make: *** No rule to make target 'datagrid'.  Stop.
0e1 commented 2 years ago

Atualizei o template. Agora deve funcionar.

crebollobr commented 2 years ago

Deu certo o makefile

                              any_load                              
--------------------------------------------------------------------
 From file_id=1 inserted type=datagrid_full.                       +
                                                                   +
         Statistics:                                               +
 .                                                                 +
         Before deduplication:                                     +
                                                                   +
         Originals: 1147103 items.                                 +
                                                                   +
         Not Intersecs: 11571 items.                               +
                                                                   +
         Invalid: 0 items.                                         +
                                                                   +
         Not simple: 0 items.                                      +
                                                                   +
         Empty: 0 items.                                           +
                                                                   +
         Small: 0 items.                                           +
                                                                   +
         Null: 0 items.                                            +
                                                                   +
         Invalid geometry type: 0 items.                           +
                                                                   +
         Not closed: 0 items.                                      +
                                                                   +
         Large: 0 items.                                           +
                                                                   +
         Inserted in feature_asis: 1135532 items.                  +
                                                                   +
         Inserted in feature_asis_discarded: 11571 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: 1135532                        +

(1 row)
crebollobr commented 2 years ago

Sobre os dados descartados, aparentemente os dados de fronteira e ilha foram descartados

image

crebollobr commented 2 years ago

Não foi possível publicar, não tem o target no makefile

0e1 commented 2 years ago

Sobre os dados descartados, aparentemente os dados de fronteira e ilha foram descartados

image

Esse parece ser o caso onde cabe usar buffer_type: 2 no layer, para aplicar um buffer de 5km na geometria da jurisdição. Ver https://github.com/digital-guard/preserv/blob/main/docs/pt/man-diversos.md#buffer-em-geometrias-jurisdicionais.

0e1 commented 2 years ago

Não foi possível publicar, não tem o target no makefile

Vou investigar.

0e1 commented 2 years ago

O commit https://github.com/digital-guard/preserv/commit/914e36dbd08e3c490bf2c580443ba8c687a07a4c resolve a falta de datagrid no case da função ingest.feature_asis_export. Com isso, layers datagrid podem ser publicados.

Porém, para o caso especifico de CO/_pk0006.01 a quantidade de espaço disponível (nesse momento 92GB) parece não ser suficiente para realizar a publicação.

Na última etapa da publicação, na função publicating_geojsons_p5, quando são escritos os arquivos no disco, acontece o erro:

--- Gerando arquivos em   ---
psql postgres://postgres@localhost/ingest20 -c "SELECT ingest.publicating_geojsons('datagrid','CO','testegrid','1',9,'3');"

ERROR:  could not write to file "base/pgsql_tmp/pgsql_tmp587637.112": No space left on device
CONTEXT:  SQL statement "WITH geohash_GeomsMosaic AS (
            SELECT * FROM  geohash_GeomsMosaic_jinfo(
                            (SELECT kx_profile->'ghs_distrib_mosaic' from ingest.donated_packcomponent WHERE id=$1),
                            '{"density_km2":"val","area_km2":"val","area":"val"}  '::jsonb,
                            (SELECT ingest.buffer_geom(geom,1) FROM ingest.vw01full_jurisdiction_geom where isolabel_ext=$2)
                            )
        )
        INSERT INTO ingest.publicating_geojsons_p5distrib
        SELECT  t.ghs,
                (u.info || jsonb_build_object(
                    'ghsval_unit','bytes',
                    'ghs_bytes', bytes,
                    'size', size,
                    'size_unit', size_unit,
                    'size_unitDensity', (size::float/(u.info->'area_km2')::float),
                    'ghs_itemsDensity', ((u.info->'ghs_items')::float/(u.info->'area_km2')::float),
                    'ghs_area', ((u.info->'area_km2')::float) )
                ) AS info,
                u.geom
        FROM
        (
            SELECT  ghs,
                    SUM(length(St_asGeoJson(ST_Intersection( r.geom, s.geom )))) AS bytes,

                    (CASE (SELECT geomtype FROM ingest.vw03full_layer_file WHERE id=$1) WHEN 'line' THEN SUM(ST_Length(ST_Intersection( r.geom, s.geom ), true))/1000  WHEN 'poly' THEN SUM(ST_Area(ST_Intersection( r.geom, s.geom ),true))/1000000.0  END) AS size,
                    (SELECT lineage->'feature_asis_summary'->'size_unit' FROM ingest.vw03full_layer_file WHERE id=$1) AS size_unit
            FROM ingest.publicating_geojsons_p3exprefix r
            LEFT JOIN geohash_GeomsMosaic s
            ON r.prefix = s.ghs
            GROUP BY ghs
        ) t
        LEFT JOIN geohash_GeomsMosaic u
        ON t.ghs = u.ghs"
PL/pgSQL function ingest.publicating_geojsons_p5(bigint,text,text,integer,integer) line 37 at SQL statement
SQL function "publicating_geojsons" statement 4
SQL function "publicating_geojsons" statement 1
make: *** [makefile:110: publicating_geojsons_datagrid] Error 1
crebollobr commented 2 years ago

buffer_type: 2

Melhorou, mas tem alguns dados no feature_asis_discarted

image

crebollobr commented 2 years ago

Quantos giga estima de espaço para ingestão?

0e1 commented 2 years ago

buffer_type: 2

Melhorou, mas tem alguns dados no feature_asis_discarted

image

Adicionei novas opções de valores para buffer_type no commit https://github.com/digital-guard/preserv/commit/1ad590eea3c0087fb589d436c68ea5a6623f873b:

Aplicar buffer_type: 3 deve capturar as geometrias que ficaram de fora.

0e1 commented 2 years ago

Quantos giga estima de espaço para ingestão?

Bem, retestando, fazendo passo a passo e generalizando alguns case, usando o tipo de geometria, funcionou a publicação. Provável que em algum desses case, a opção errada estava sendo escolhida e o banco tentando fazer algo que serve para polígonos e que não pode ser feito em pontos. Fato é que o processo todo (da ingestão à publicação) estão funcionando. Para testar e avaliar os arquivos publicaáveis, recriar a base ingest. Não esquecer de aplicar um buffer maior, para nenhum ponto ficar de fora.

ppKrauss commented 2 years ago

@crebollobr , sobre a questão de "estouro de memória", o ideal é fazer uma estivamtiva do quanto precisa. O @0e1 implementou uma gambiarra para fazer a publicação com cláusula SQL LIMIT de maneira que se publica algo e aí serve de amostra para estimar o quanto falta de memória em disco.

As grades, assim que otimizadas no OSM.CODES serão armazenadas com apenas ID bigint e atributo (ex. população na célula) para economizar espaço em disco, analogo a grid_ibge_censo2010_info... Mas até lá vamos levando com publicação comum.

0e1 commented 2 years ago

@crebollobr , sobre a questão de "estouro de memória", o ideal é fazer uma estivamtiva do quanto precisa. O @0e1 implementou uma gambiarra para fazer a publicação com cláusula SQL LIMIT de maneira que se publica algo e aí serve de amostra para estimar o quanto falta de memória em disco.

As grades, assim que otimizadas no OSM.CODES serão armazenadas com apenas ID bigint e atributo (ex. população na célula) para economizar espaço em disco, analogo a grid_ibge_censo2010_info... Mas até lá vamos levando com publicação comum.

@ppKrauss A publicação ocorreu sem aplicar LIMIT. Comentei acima. Provavelmente, em um dos case a opção errado era escolhida e dava problema. Tornei os case dependentes apenas do tipo de geometria. Antes eles dependiam do ftclass_name.

Resumo, a publicação funcionou, sem gambiarra (para esse caso, claro).

ppKrauss commented 2 years ago

@crebollobr podemos fechar? (obrigado @0e1 agora sem bugs!)

crebollobr commented 2 years ago

A publicação gerou arquivos grandes, vamos publicar assim?

carlos@addressforall:/var/gits/_dg/preservCutGeo-CO2021$ ls -lh /var/gits/_dg/preservCutGeo-CO2021/data/_pk0006.01/datagrid
total 149M
-rw-rw-r-- 1 carlos carlos 151K jul 18 15:07 geohashes.geojson
-rw-rw-r-- 1 carlos carlos  19M jul 18 14:54 pts_6.geojson
-rw-rw-r-- 1 carlos carlos 131M jul 18 14:54 pts_d.geojson

Não tenho permissão no git digital-guard/preservCutGeo-CO2021.git

carlos@addressforall:/var/gits/_dg/preservCutGeo-CO2021$ git push --set-upstream origin dane-20220718-01
Username for 'https://github.com': crebollo@gmail.com
Password for 'https://crebollo@gmail.com@github.com': 
remote: Permission to digital-guard/preservCutGeo-CO2021.git denied to crebollobr.
fatal: unable to access 'https://github.com/digital-guard/preservCutGeo-CO2021.git/': The requested URL returned error: 403
crebollobr commented 1 year ago

O arquivo é muito grande para publicar do modo regular. comandos:

cd /var/gits/_dg/preservCutGeo-CO2021/data/_pk0006.01/datagrid
git pull origin HEAD
git checkout -b datagrid-20221029
git add *
git commit -m "publicação datagrid"
git push --set-upstream origin  datagrid-20221029
carlos@addressforall:/var/gits/_dg/preservCutGeo-CO2021/data/_pk0006.01/datagrid$ git push --set-upstream origin  datagrid-20221029
Username for 'https://github.com': crebollo@gmail.com
Password for 'https://crebollo@gmail.com@github.com': 
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 4 threads
Compressing objects: 100% (13/13), done.
Writing objects: 100% (15/15), 10.29 MiB | 1.84 MiB/s, done.
Total 15 (delta 4), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (4/4), completed with 1 local object.
remote: error: Trace: 6892269b63bb642390266b44d4b3b1aea7e23a19e576570c4e5c19a7f9533c84
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File data/_pk0006.01/datagrid/pts_d.geojson is 130.42 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
To https://github.com/digital-guard/preservCutGeo-CO2021.git
 ! [remote rejected] datagrid-20221029 -> datagrid-20221029 (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/digital-guard/preservCutGeo-CO2021.git'
crebollobr commented 1 year ago

Não seria melhor dividir esse arquivo em células menores?

ppKrauss commented 1 year ago

ATENÇÃO NÃO PUBLICAR AINDA GRADES

Conforme comentado acima não é hora de publicar, precisamos ter a "grade oficial OSMcodes" do país antes, para converter e publicar os dados no formato oficial.

As grades, assim que otimizadas no OSM.CODES serão armazenadas com apenas ID bigint e atributo (ex. população na célula) para economizar espaço em disco, analogo a grid_ibge_censo2010_info... Mas até lá vamos levando com publicação comum.

Ainda estamos testando as implementações com ID de célula 64bits com visualização base16h. Em seguida precisaremos converter uma grade na outra, e esse algoritmo ainda não foi otimizado.

... E não cabe publicar a grade original: grades não-DGGS não se prestam à publicação em git.

ppKrauss commented 1 year ago

Pré-requisito para esta issue: https://github.com/osm-codes/GGeohash/issues/16

0e1 commented 1 year ago

Adicionei sobre o layer na wiki: https://wiki.addressforall.org/doc/dg:AsIs_feature_types#Com_geometria.