41 votos

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

Necesito insertar un polígono desde GeoJSON a mi tabla 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]
            ]
        }'
    )
)

Desgraciadamente, 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 puedo especificar el SRID en el GeoJSON? ¿Qué aspecto debe tener el GeoJSON?

Actualización: Cuando envuelvo la geometría creada por ST_GeomFromGeoJSON con ST_SetSRID(..., 3857) arroja 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

40voto

scro Puntos 23

Echando un vistazo al código fuente de PostGIS descubrí cómo analiza los SRID. Aquí está 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 envolverlas con paréntesis 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"}}
}

23voto

Anthony Cramp Puntos 126

Hay un par de problemas con tu JSON.

  1. En primer lugar, las coordenadas deben ser un array de arrays.
  2. En segundo lugar, mirando las coordenadas, parece que los valores son Latlong en un sistema de coordenadas geográficas, muy probablemente EPSG:4326. Por lo tanto, hay que transformarlos en EPSG:3857.

Una vez corregidas 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, usted todavía está recibiendo el error con Z diemsnion), por favor, actualice la pregunta con la versión PostGis, y la declaración de creación de su tabla.

5voto

Subimage Puntos 1492

Tu geojson debe tener valores UTM en su lugar, podrías transformarlo con Proj u otras herramientas online, pero puedes hacerlo fácil y directamente con postgis antes de insertarlo en tu tabla, prueba esto (no probado):

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));

4voto

Alex Puntos 194
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 "'"

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X