$ path / tmp / current.json"); imprimir JSON $ fullJSON; close JSON; seguido pela…" /> $ path / tmp / current.json"); imprimir JSON $ fullJSON; close JSON; seguido pela…" />
Mais

Escrevendo dados GeoJSON em PostGIS em perl?


Estou trabalhando com arquivos GeoJSON e preciso armazená-los no PostgreSQL usando perl. Posso fazer isso em 2 etapas:

abrir (JSON, "> $ path / tmp / current.json"); imprimir JSON $ fullJSON; close JSON;

seguido pela:

'/ usr / bin / ogr2ogr -f "PostgreSQL" PG: "dbname = database user = datauser" "$ path / tmp / current.json" -nln datatable -append'; unlink ("$ path / tmp / current.json");

Mas eu esperava uma solução perl pura, sem usar o executável ogr2ogr. Eu estava lendo sobre Geo :: GDAL, mas não tenho certeza se esta é a ferramenta certa.

Eu estava experimentando um pouco com um código que encontrei:

my $ sth = $ dbh-> prepare ("INSERT INTO datatable (geom) VALUES (GeomFromEWKT ('SRID = ?; POINT (???)'));")

Mas não conseguia acertar a sintaxe. A string JSON inteira é: $ fullJSON

Se alguém tiver alguma informação ou código para realizar esta tarefa, adoraria vê-lo. Parece muito simples.


Para mim, uma pergunta muito interessante, porque gosto de perl e com o novo gole baseadoGeo :: OGR,Geo :: GDALbindings criados com GDAL 2.0.2 (coisas boas desde a versão 1.11) e mantidos por Ari Jolma parecem ser perfeitos para lidar com coisas geográficas em perl também.

Resumindo: você deve usar o profissionalogr2ogrA ferramenta e o script a seguir são mais sobre como usar GDAL com perl, como ler as informações da camada e como iterar sobre os recursos e criar algumas instruções SQL. Acho que a API perl é muito semelhante à API python. Eu também evito lidar com as coisas do DBI e gerar um clássicoINSERIRdeclaração em vez disso.

Para ter uma ideia de como usar GDAL em perl, você pode usar 80% do livro de receitas do python (cross over de linguagem) e a referência de classe de perl para o resto.

Eu baixei um exemplo de cities.geojson, graças a Michael Mahemoff. Todas as configurações no arquivo perl são parâmetros estáticos ($ file, $ layer, $ epsg,chaves de campo) e correspondendo ao conteúdo deste arquivo. Só quero ter uma ideia de como funciona e se sente.

Aqui, o script rápido e sujo chamadotest-json.pl:

#! / usr / bin / perl -w use estrito; use Geo :: OGR; # Defina o nome do driver my $ dname = 'GeoJSON'; # Defina o arquivo json my $ file = 'cities.geojson'; # Defina o nome da camada my $ lname = 'OGRGeoJSON'; # Defina o nome da coluna da cidade my $ key_city = 'city'; # Defina o nome da coluna da geometria my $ key_geom = 'geom'; # Defina o nome da tabela my $ table = 'table'; # Defina EPSG como $ epsg = '4326'; # Pegue o driver my $ driver = Geo :: OGR :: GetDriverByName ($ dname) ou die "Driver desconhecido $ dname  n"; # Abra o arquivo my $ dsource = $ driver-> Open ($ file) ou morra "Arquivo desconhecido $ file  n"; # Liste as camadas para investigar o material # para obter todas as configurações acima key_…, epsg & listLayers ($ dsource);

Para iterar o recurso e imprimir a instrução INSERT, uso este loop:

# Abra a camada para iteração novamente my $ layer = $ dsource-> GetLayerByName ($ lname) ou die "Camada desconhecida $ lname  n"; # Itere sobre os recursos while (my $ data = $ layer-> GetNextFeature) {my $ geom = $ data-> Geometria-> AsText; # obtenha o geom como WKT minha $ city = $ data -> {$ key_city}; # obtenha o nome da cidade $ city = & escapeSqlStr ($ city); # faça alguns escapes sem UTF8 ;-) # construa a instrução insert print "INSERT INTO $ table ($ key_city, $ key_geom) VALUES  n". "($ city, ST_GeomFromEWKT ('SRID = $ epsg; $ geom');  n  n";} # concluído

A rotina de serviço para listar os layes e atributos:

# sub-rotina para obter as camadas e atributos # @param é uma sub-lista de dadosSourceLayers () {my $ dataSource = shift; # Itere sobre as camadas para meu $ lix (0… $ dataSource-> GetLayerCount-1) {my $ layer = $ dataSource-> GetLayerByIndex ($ lix); # obter a camada my $ srs = $ layer-> GetSpatialRef; # obter o sistema de referência espacial my $ gtype = $ layer-> GeometryType; # obter o tipo de geometria my $ numFt = $ layer-> GetFeatureCount; # obter o número de recursos # Estatísticas de camada imprimir "layer:", $ lix + 1, "name:", $ layer-> GetName, "features:", $ numFt, "type:", $ gtype, " n referência espacial: ", $ srs-> Export ('Proj4'),"  n "; # List Attrbutes my $ layerDefn = $ layer-> GetLayerDefn (); # obter os metadados de definição de camada para meu $ fix (0… $ layerDefn-> GetFieldCount-1) {my $ fieldDefn = $ layerDefn-> GetFieldDefn ($ fix); # obtém a definição de campo print "attribute:", $ fix + 1, "name:", $ fieldDefn-> Name, "type:", $ fieldDefn-> Type, " n"; } imprimir " n"; }}

E algumas coisas de escape de Q&D e manuseio de nulos:

# sub rotina para um NULL mínimo e manipulação de escape # rotina melhor realizada com DBI (sem manipulação de URI UTF8 aqui) sub escapeSqlStr () {my $ str = shift; retorna 'NULL' se! $ str; $ str = ~ s / '/ ' / s; return "'". $ str. "'"; } #EOF

O script me dá esta saída:

$ ./test-json.pl | camada principal: 1 nome: OGRGeoJSON características: 661 tipo: Ponto de referência espacial: + proj = longlat + datum = WGS84 + no_defs atributo: 1 nome: wikipedia tipo: String atributo: 2 nome: cidade tipo: String INSERT INTO tabela (cidade , geom) VALUES ('Adak', ST_GeomFromEWKT ('SRID = 4326; POINT (-176.633 51.883)');…


Assista o vídeo: QGIS Tutorial: Adding and Viewing GeoJSON in QGIS EN (Outubro 2021).