如何将GeoJSON多边形插入PostGIS表?


33

我需要将GeoJSON中的多边形插入到PostGIS表中。这就是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]
            ]
        }'
    )
)

不幸的是,我收到一条错误消息。

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

GeoJSON已经在正确的参考系统中。但这没有指定。如何在GeoJSON中指定SRID?GeoJSON需要什么样?

更新:当我包装由此创建的几何时ST_GeomFromGeoJSONST_SetSRID(..., 3857)会引发另一个错误。在我看来,几何图形似乎没有Z尺寸。

ERROR:  Geometry has Z dimension but column does not

我认为您需要指定表具有srid:4326,看起来您的表具有srid:3857,但是您的geojson具有长/纬度(即srid:4326或WGS84)
Gery

我想使用3857。那么,GeoJSON的外观如何?
danijar

Answers:


32

看一下PostGIS的源代码,我发现了它是如何解析SRID的。这是在GeoJSON中指定SRID的正确方法。

GeoJSON规范说多边形的坐标是线串的数组。因此,我不得不用其他括号将它们包裹起来。

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

16

JSON有两个问题。

  1. 首先,坐标应该是一个数组数组。
  2. 其次,查看坐标,看起来值在地理坐标系中是Latlong,最有可能是EPSG:4326。然后需要将其转换为EPSG:3857。

纠正这两件事后,您可以使用以下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));

如果这不起作用,(例如,您仍然收到Z diemsnion的错误),请使用PostGis版本和表的Create Statement更新问题。


为什么您认为坐标不在EPSG:3857中?
danijar

3
因为EPSG:3857的单位是(伪)米,并且起源于大西洋。使用米时,您将没有6位小数精度,并且该数据将位于非洲海岸附近的大西洋。
Devdatta Tengshe

坐标来自地图上的输入,并且有很多小数。为了测试,我在非洲附近的大西洋上绘制了一个区域。但多亏了您,我可以改进地图以将坐标四舍五入为整米。
danijar

@danijar:那没关系。如果这些坐标在EPSG:4326中,则它将位于美国东部各州。
Devdatta Tengshe

5

您的geojson必须具有UTM值,您可以使用Proj或其他在线工具对其进行转换,但是在将其插入到表中之前,可以使用postgis轻松直接地进行操作,请尝试以下操作(未经测试):

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

因此,您建议将4326上的SRID转换为3857?然后我可以直接尝试ST_Transform(ST_SetSRID(...,4326),3857),不是吗?为什么需要执行此额外的转换步骤?
danijar

我认为您应该测试您的要求,也许您建议的是您唯一需要的步骤,然后尝试并发布您所得到的信息
Gery 13'May

这就是我得到的。ERROR: transform: couldn't project point (9.25253e-302 6.08985e+159 1.18576e-322): latitude or longitude exceeded limits (-14)
danijar

3
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]
            ]
        }'
    )
)

失踪 ”'”


4
您能否在此答案中添加更多背景信息并解释它如何回答OP的问题,并且与现有答案不同
Devdatta Tengshe15年

老实说,在JSON 必须是一个字符串,它是不是在这个问题一个字符串,它不是答案的至少一个字符串。这个答案可能指出了显而易见的答案,但不一定对所有人都显而易见,因此值得一提。
Forbesmyester '16
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.