Предполагая, что у вас есть по крайней мере PostgreSQL версии 9.3, вы можете использовать несколько функций и операторов JSON для извлечения соответствующих частей спецификации GeoJSON, требуемой ST_GeomFromGeoJSON для создания геометрий.
Попробуйте следующее, где вы можете заменить JSON в верхней части:
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;
Находит три геометрии. Столбец geom содержит объект геометрии, а gid - номер объекта. Функция ST_AsText показывает WKT-эквивалент каждой геометрии. Я также включил свойства или атрибуты, которые можно определить для каждой геометрии, как показано в спецификации.
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)
Вы должны назначить SRID для геометрии, используя ST_SetSRID.
Или, если вам просто нужна одна гетерогенная ГЕОМЕТРИЧЕСКАЯ КОЛЛЕКЦИЯ, вы можете сделать ее такой компактной:
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)))
См. Также Создание коллекций объектов GeoJSON с помощью функций JSON и PostGIS из журнала Postgres OnLine , который делает обратное.