Mehr

Speichern von GeoJSON FeatureCollection in PostgreSQL mit PostGIS?


Ich bin neu bei GeoJSON. Ich habe eine GeoJSON-Feature-Sammlung wie gezeigt und möchte sie in der Postgres-Tabelle (Testtabelle) speichern. Meine Postgres-Tabelle hat eine Seriennummern- und Geometriespalte.

{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [ 2565453.1826721914, -3835048.659760314 ] } }, { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [ [ 2727584.7219710173, -3713449.1942418693 ], [ 2732476.691781269, -3992291.473426192 ] } }, { "type": "Feature ", "Geometrie": { "Typ": "Polygon", "Koordinaten": [ [ [ 2442627.9025405287, -3705499.954308534 ], [ 2425506.008204649, -3886502.837287831 ], [ 2425506.008204649, -3886502.837287831 ], [ 2555143.2081623068, -3988108623068, -3988 2442627.9025405287, -3705499.954308534 ] ] } } ] }

Ich möchte die GeoJSON-Daten in die Tabelle testtable einfügen.

Wie gehe ich vor?

Ich verwende Postgres Version 9.3.5 mit Postgis Version 2.1.3 2.


Ich wurde auf zuvor gestellte Fragen verwiesen, die beantworten, wie ein einzelnes Feature, z. B. ein Punkt oder Polygon, gespeichert wird. Meine Frage lautet, wie mehrere Features in der GeoJSON-Datei gespeichert werden. Mit mehreren Features meine ich eine Mischung aus Punkt-, Linien- und Polygon-Feature-Typen in einer Datei.


Vorausgesetzt, Sie haben mindestens PostgreSQL Version 9.3, können Sie einige JSON-Funktionen und -Operatoren verwenden, um die relevanten Teile der GeoJSON-Spezifikation zu extrahieren, die von ST_GeomFromGeoJSON zum Erstellen von Geometrien erforderlich sind.

Versuchen Sie Folgendes, wobei Sie das JSON im oberen Teil ersetzen können:

WITH data AS (SELECT '{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": {"type": "Point", "coordinates": [102.0, 0.5 ]}, "properties": {"prop0": "value0"} }, { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [ [102.0, 0.0] , [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] ] }, "properties": { "prop0": "value0", "prop1": 0.0 } }, { "type": "Feature" , "Geometrie": { "Typ": "Polygon", "Koordinaten": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ] }, "properties": { "prop0": "value0", "prop1": {"this": "that"} } } ] }'::json AS fc) SELECT row_number() OVER () AS gid, ST_AsText(ST_GeomFromGeoJSON(feat->>'geometry')) AS geom, feat->'properties' AS-Eigenschaften FROM ( SELECT json_array_elements(fc->'features') AS feat FROM data ) AS f;

Findet drei Geometrien. DasgeomSpalte enthält das Geometrieobjekt und diegidist die Funktionsnummer. DasST_AsText-Funktion zeigt das WKT-Äquivalent jeder Geometrie an. Ich habe auch dieEigenschaftenoder Attribute, die für jede Geometrie definiert werden können, wie in der Spezifikation gezeigt.

gid | Geom | Eigenschaften ---+----------------------------------------+ -------------------------------------------------- 1 | PUNKT(102 0,5) | {"prop0": "value0"} 2 | LINIENSTRING(102 0,103 1,104 0,105 1) | { + | | "prop0": "value0", + | | "prop1": 0.0 + | | } 3 | POLYGON((100 0,101 0,101 1,100 1,100 0)) | { + | | "prop0": "value0", + | | "prop1": {"this": "that"}+ | | } (3 Reihen)

Sie sollten der Geometrie mit ST_SetSRID eine SRID zuweisen.

Oder wenn Sie einfach nur eine einzige heterogene GEOMETRYCOLLECTION benötigen, können Sie diese so kompakt gestalten:

SELECT ST_AsText(ST_Collect(ST_GeomFromGeoJSON(feat->>'geometry'))) FROM ( SELECT json_array_elements('{… JSON hier einfügen… }'::json->'features') AS feat ) AS f; GEOMETRYSAMMLUNG(POINT(2565453.18267219 -3835048.65976031),LINESTRING(2727584.72197102 -3713449.19424187,2732476.69178127 -3992291.47342619),POLYGON((2442627.90254053 -3705499.95430853.

Siehe auch Erstellen von GeoJSON-Feature-Sammlungen mit JSON- und PostGIS-Funktionen aus dem Postgres OnLine Journal, das das Gegenteil bewirkt.


Schau das Video: Leaflet Tutorial #5: Add GeoJSON using JavaScript (Oktober 2021).