$ path / tmp / current.json"); tlačiť JSON $ fullJSON; zavrieť JSON; nasledovaný…" /> $ path / tmp / current.json"); tlačiť JSON $ fullJSON; zavrieť JSON; nasledovaný…" />
Viac

Píšete údaje GeoJSON do PostGIS v Perle?


Pracujem so súbormi GeoJSON a musím ich uložiť v PostgreSQL pomocou Perlu. Môžem to urobiť v dvoch krokoch:

open (JSON, "> $ cesta / tmp / current.json"); tlačiť JSON $ fullJSON; zavrieť JSON;

nasledovaný:

'/ usr / bin / ogr2ogr -f "PostgreSQL" PG: "dbname = užívateľ databázy = datauser" "$ cesta / tmp / current.json" -nln datatable -append'; unlink ("$ cesta / tmp / current.json");

Ale dúfal som v čisté riešenie Perl bez použitia spustiteľného súboru ogr2ogr. Čítal som o Geo :: GDAL, ale nie som si istý, či je to ten správny nástroj.

Trochu som experimentoval s kódom, ktorý som našiel:

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

Syntax sa však nepodarilo úplne správne. Celý reťazec JSON je: $ fullJSON

Ak má niekto nejaké informácie alebo kód na vykonanie tejto úlohy, rád by som si ich pozrel. Vyzerá to pekne priamo.


Pre mňa veľmi zaujímavá otázka, pretože mám rád perl a nový swigGeo :: OGR,Geo :: GDALväzby vytvorené pomocou GDAL 2.0.2 (dobré veci od verzie 1.11) a udržiavané Ari Jolmou sa javia ako dokonalé na zvládnutie geo vecí aj v Perle.

Stručne povedané: Mali by ste použiť profesionálaogr2ogrnástroj a nasledujúci skript je viac o tom, ako používať GDAL s perlom, ako čítať informácie o vrstvách a ako iterovať nad funkciami a vytvárať niektoré príkazy SQL. Myslím si, že perl API je veľmi podobné python API. Tiež sa vyhýbam tomu, aby som zvládol veci s DBI a vygeneroval klasikuVLOŽTEnamiesto toho vyhlásenie.

Ak chcete získať predstavu o tom, ako používať jazyk GDAL v jazyku perl, môžete použiť 80% pythonovskej kuchárskej knihy (jazyk crossover) a na ostatné odkazy na triedy perl.

Vysvetlím príklad mesta.geojson, vďaka Michaelovi Mahemoffovi. Všetky nastavenia v súbore perl sú statické parametre ($ súbor, $ vrstva, $ epsg,polí) a zodpovedajúci obsahu tohto súboru. Chcem iba získať predstavu o tom, ako to funguje a ako sa cíti.

Tu volal rýchly a špinavý skripttest-json.pl:

#! / usr / bin / perl -w use strict; použite Geo :: OGR; # Nastaviť meno ovládača moje $ dname = 'GeoJSON'; # Nastaviť súbor JSON my $ file = 'cities.geojson'; # Nastaviť názov vrstvy môj $ lname = 'OGRGeoJSON'; # Nastaviť názov stĺpca mesta moje $ key_city = 'mesto'; # Nastaviť názov stĺpca geometrie my $ key_geom = 'geom'; # Nastaviť názov tabuľky môj $ table = 'table'; # Nastaviť EPSG my $ epsg = '4326'; # Získajte ovládač môj $ driver = Geo :: OGR :: GetDriverByName ($ dname) alebo zomrieť "Neznámy ovládač $ dname  n"; # Otvorte súbor môj $ dsource = $ driver-> Otvorte ($ súbor) alebo zomrite „Neznámy súbor $ súbor  n“; # Zoznam vrstiev na preskúmanie vecí # Ak chcete získať všetky nastavenia vyššie key_ ..., epsg & listLayers ($ dsource);

Na opakovanie tejto funkcie a vytlačenie príkazu INSERT používam túto slučku:

# Znovu otvorte vrstvu pre iteráciu môj $ layer = $ dsource-> GetLayerByName ($ lname) alebo "Neznáma vrstva $ lname  n"; # Iterácia nad funkciami while (moje $ data = $ layer-> GetNextFeature) {my $ geom = $ data-> Geometry-> AsText; # získajte geom ako WKT my $ city = $ data -> {$ key_city}; # získajte názov mesta $ city = & escapeSqlStr ($ mesto); # urobte únik bez UTF8 ;-) # zostavte príkaz vloženia print "INSERT INTO $ table ($ key_city, $ key_geom) VALUES  n". "($ mesto, ST_GeomFromEWKT ('SRID = $ epsg; $ geom');  n  n";} # hotové

Servisná rutina pre zoznam laikov a atribútov:

# čiastková rutina na získanie vrstiev a atribútov # @param je údajový zdroj sub listLayers () {my $ dataSource = shift; # Iterácia nad vrstvami môjho $ lix (0… $ dataSource-> GetLayerCount-1) {my $ layer = $ dataSource-> GetLayerByIndex ($ lix); # získať vrstvu môj $ srs = $ vrstva-> GetSpatialRef; # získajte priestorový referenčný systém my $ gtype = $ layer-> GeometryType; # získajte typ geometrie my $ numFt = $ layer-> GetFeatureCount; # získajte počet funkcií # štatistika vrstvy vytlačiť „layer:“, $ lix + 1, „name:“, $ layer-> GetName, „features:“, $ numFt, „type:“, $ gtype, „ n spatial-reference: ", $ srs-> Export ('Proj4'),"  n "; # List attrbutes my $ layerDefn = $ layer-> GetLayerDefn (); # získať metadáta definície vrstvy pre môj $ fix (0… $ layerDefn-> GetFieldCount-1) {my $ fieldDefn = $ layerDefn-> GetFieldDefn ($ fix); # get print definition field "attribute:", $ fix + 1, "name:", $ fieldDefn-> Name, "type:", $ fieldDefn-> Type, " n"; } print " n"; }}

A nejaké otázky týkajúce sa úniku a odpovedania na otázky a nulové zaobchádzanie:

# čiastková rutina pre minimálnu NULL a únikovú manipuláciu # rutina lepšie vykonaná s DBI (tu nie je spracovanie URI UTF8) sub escapeSqlStr () {my $ str = shift; vrátiť 'NULL' ak! $ str; $ str = ~ s / '/ ' / s; return "" ". $ str." '"; } #EOF

Skript mi ​​dáva tento výstup:

$ ./test-json.pl | hlavová vrstva: 1 názov: vlastnosti OGRGeoJSON: typ 661: priestorový odkaz na bod: + proj = longlat + datum = WGS84 + atribút no_defs: 1 názov: typ wikipedia: atribút reťazca: 2 názov: typ mesta: reťazec INSERT INTO tabuľka (mesto , geom) VALUES ('Adak', ST_GeomFromEWKT ('SRID = 4326; POINT (-176,633 51,883)'); ...


Pozri si video: QGIS Tutorial: Adding and Viewing GeoJSON in QGIS EN (Október 2021).