使用PostGIS将GeoJSON FeatureCollection存储到PostgreSQL吗?


21

我是GeoJSON的新手。如图所示,我有一个GeoJSON功能集,并希望将其存储在postgres表(测试表)中。我的postgres表有一个序列号和几何列。

{
    "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
                        ]
                    ]
                ]
            }
        }
    ]
}

我想将GeoJSON数据插入表testtable中。

我该怎么办?

我正在使用Postgres版本9.3.5和Postgis版本2.1.3


我已经被引导到先前提出的问题,这些问题回答了如何存储单个要素(例如点或多边形)。我的问题询问如何在GeoJSON文件中保存多个功能。多个要素是指在一个文件中混合使用点,线和面要素类型。



里卡多,您好,我已经看到了这个问题,但是并没有解决我的问题。我要保存功能列表,而不仅仅是单个功能类型。请查看我的问题中的我的GeoJSON功能集合。
2015年

@Jay所以现在您的问题是“我如何将geojson集合分解为单个要素,或者您需要添加更多信息(也许存储那些几何形状属于某种集合的信息?)
Jakub Kania

1
谢谢@John的回复。由于我是GIS和GeoJSON的新手,所以我想就我的问题提出一些建议。问题的背景:用户在地图上绘制要素,而我捕获所绘制要素的集合。我想将此集合保存在具有唯一ID的数据库中。以后,可以获取提供的ID的保存数据。postgres中的testable有2列。序列号的gid列(用于保存id)和几何类型的geom列。
周杰伦

1
@Jay是的,您可以存储JSON,但是它不会是几何图形,因此您可以轻松查询最近的邻居等。
Jakub Kania

Answers:


26

假设您至少具有PostgreSQL 9.3版,则可以使用一些JSON函数和运算符来提取ST_GeomFromGeoJSON所需的GeoJSON规范的相关部分以创建几何。

请尝试以下操作,您可以在其中替换顶部的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等效项。我还包括了properties可以为每种几何定义的或属性,如规范所示。

 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)

您应该使用ST_SetSRID为几何指定SRID。

或者,如果您只需要一个异构的GEOMETRYCOLLECTION,则可以使其紧凑,如下所示:

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

另请参见Postgres OnLine Journal上的使用JSON和PostGIS函数创建GeoJSON Feature Collections的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.