Memorizzare GeoJSON FeatureCollection su PostgreSQL con PostGIS?


21

Sono nuovo di GeoJSON. Ho una collezione di funzionalità GeoJSON come mostrato e vorrei memorizzarla nella tabella Postgres (tabella di test). La mia tabella postgres ha un ID seriale e una colonna geometrica.

{
    "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",
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [
                            2442627.9025405287,
                            -3705499.954308534
                        ],
                        [
                            2425506.008204649,
                            -3886502.837287831
                        ],
                        [
                            2425506.008204649,
                            -3886502.837287831
                        ],
                        [
                            2555143.2081763083,
                            -3910962.686339088
                        ],
                        [
                            2442627.9025405287,
                            -3705499.954308534
                        ]
                    ]
                ]
            }
        }
    ]
}

Vorrei inserire i dati GeoJSON nella tabella di test della tabella.

Come posso procedere?

Sto usando Postgres versione 9.3.5 con Postgis versione 2.1.3


Sono stato indirizzato a domande precedentemente poste che rispondono su come memorizzare una singola funzione, ad esempio un punto o un poligono. La mia domanda chiede come salvare più funzioni nel file GeoJSON. Per caratteristiche multiple intendo una combinazione di punti, linee e tipi di caratteristiche poligonali in un file.



Ciao Ricardo, ho visto quella domanda ma non affronta il mio problema. Voglio salvare un elenco di funzionalità, non solo un singolo tipo di funzionalità. Dai un'occhiata alla mia collezione di funzionalità GeoJSON nella mia domanda.
Jay,

@Jay Quindi ora o la tua domanda è "Come faccio a dividere una collezione geojson in singole funzionalità o è necessario aggiungere ulteriori informazioni (magari archiviando informazioni che quelle geometrie appartengono a una sorta di collezione?)
Jakub Kania,

1
Grazie @ John per la tua risposta. Da quando sono nuovo in GIS e GeoJSON, ho voluto alcuni suggerimenti con il mio problema a portata di mano. Sfondo della domanda: un utente disegna le funzionalità su una mappa e acquisisco la raccolta di funzioni disegnate. Vorrei salvare questa raccolta in un DB con un ID univoco. Successivamente, i dati salvati possono essere recuperati per un ID fornito. Il testabile in postgres ha 2 colonne. colonna gid di tipo seriale per contenere l'id e colonna geom di tipo geometrico.
Jay,

1
@Jay Sì, puoi memorizzare il JSON ma non sarà una geometria, quindi non potrai facilmente interrogare il vicino più vicino ecc.
Jakub Kania,

Risposte:


26

Supponendo di avere almeno PostgreSQL versione 9.3, è possibile utilizzare alcune funzioni e operatori JSON per estrarre le parti pertinenti della specifica GeoJSON richiesta da ST_GeomFromGeoJSON per creare geometrie.

Prova quanto segue, dove puoi sostituire JSON nella parte superiore:

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",
         "geometry": {
           "type": "Polygon",
           "coordinates": [
             [ [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 properties
FROM (
  SELECT json_array_elements(fc->'features') AS feat
  FROM data
) AS f;

Trova tre geometrie. La geomcolonna ha l'oggetto geometria e gidè il numero della funzione. La ST_AsTextfunzione mostra l' equivalente WKT di ciascuna geometria. Ho anche incluso gli propertiesattributi o che possono essere definiti per ciascuna geometria, come mostrato nelle specifiche.

 gid |                   geom                   |              properties
-----+------------------------------------------+--------------------------------------
   1 | POINT(102 0.5)                           | {"prop0": "value0"}
   2 | LINESTRING(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 rows)

È necessario assegnare un SRID per la geometria, utilizzando ST_SetSRID.

O se hai semplicemente bisogno di una singola GEOMETRYCOLLECTION eterogenea, puoi renderla compatta in questo modo:

SELECT ST_AsText(ST_Collect(ST_GeomFromGeoJSON(feat->>'geometry')))
FROM (
  SELECT json_array_elements('{ ... put JSON here ... }'::json->'features') AS feat
) AS f;

GEOMETRYCOLLECTION(POINT(2565453.18267219 -3835048.65976031),LINESTRING(2727584.72197102 -3713449.19424187,2732476.69178127 -3992291.47342619),POLYGON((2442627.90254053 -3705499.95430853,2425506.00820465 -3886502.83728783,2555143.20817631 -3910962.68633909,2442627.90254053 -3705499.95430853)))

Vedi anche Creazione di raccolte di caratteristiche GeoJSON con funzioni JSON e PostGIS dal Postgres OnLine Journal, che fa il contrario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.