¿Cómo insertar un polígono de GeoJSON en una tabla de PostGIS?

28

Necesito insertar un polígono de GeoJSON en mi tabla de PostGIS. Así es como se ve la consulta SQL.

INSERT INTO tablename (name, polygon)
VALUES (
    'Name',
    ST_GeomFromGeoJSON(
        '{
            "type": "Polygon",
            "coordinates": [
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

Lamentablemente, recibo un mensaje de error.

ERROR:  Geometry SRID (0) does not match column SRID (3857)

El GeoJSON ya está en el sistema de referencia correcto. Pero esto no está especificado. ¿Cómo especifico el SRID en el GeoJSON? ¿Qué aspecto tiene que tener el GeoJSON?

Actualización: cuando envuelvo la geometría creada por ST_GeomFromGeoJSON con ST_SetSRID(..., 3857) , se produce otro error. En mi opinión, no parece que la geometría tenga una dimensión Z.

ERROR:  Geometry has Z dimension but column does not
    
pregunta danijar 16.05.2013 - 12:21

4 respuestas

27

Echando un vistazo al código fuente de PostGIS, descubrí cómo analiza los SRID. Esta es la forma correcta de especificar el SRID en GeoJSON.

La especificación GeoJSON dice que las coordenadas de un polígono son una matriz de cadenas de líneas. Por lo tanto, tuve que envolverlos con corchetes adicionales.

{
    "type":"Polygon",
    "coordinates":
    [
        [
            [-91.23046875,45.460130637921],
            [-79.8046875,49.837982453085],
            [-69.08203125,43.452918893555],
            [-88.2421875,32.694865977875],
            [-91.23046875,45.460130637921]
        ]
    ],
    "crs":{"type":"name","properties":{"name":"EPSG:3857"}}
}
    
respondido por el danijar 16.05.2013 - 15:20
10

Hay un par de problemas con tu JSON.

  1. En primer lugar, las coordenadas deben ser una matriz de matrices.
  2. En segundo lugar, mirando las coordenadas, parece que los valores son Latlong en un sistema de coordenadas geográficas, probablemente EPSG: 4326. Eso entonces necesita ser transformado a EPSG: 3857.

Una vez que haya corregido estas dos cosas, puede insertar la fila, utilizando la siguiente consulta SQL:

INSERT INTO "Parcels"("Name", the_geom)
    VALUES ('Corrected_Shape', 
    ST_TRANSFORM(ST_GeomFromGeoJSON('{
    "type":"Polygon",
    "coordinates":[[
        [-91.23046875,45.460130637921],
        [-79.8046875,49.837982453085],
        [-69.08203125,43.452918893555],
        [-88.2421875,32.694865977875],
        [-91.23046875,45.460130637921]
    ]],
    "crs":{"type":"name","properties":{"name":"EPSG:4326"}}
}'),3857));

Si esto no funciona, (es decir, sigue recibiendo el error con Z diemsnion), actualice la pregunta con la versión de PostGis y la Declaración de creación de su tabla.

    
respondido por el Devdatta Tengshe 17.05.2013 - 08:58
3

su geojson debe tener valores UTM en su lugar, puede transformarlo con Proj u otras herramientas en línea, pero puede hacerlo fácil y directamente con Postgis antes de insertarlo en su tabla, intente esto (sin probar):

SELECT ST_AsText(ST_Transform(ST_GeomFromGeoJSON
    (
        {
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }
    ),4326),3857));
    
respondido por el Gery 16.05.2013 - 12:55
2
INSERT INTO tablename (name, polygon)
VALUES
(
    'Name',
    ST_GeomFromGeoJSON
    (
        '{
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

falta "'"

    
respondido por el Zakaria Jaddy 27.03.2015 - 12:43

Lea otras preguntas en las etiquetas