我需要将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_GeomFromGeoJSON包装由ST_SetSRID(..., 3857)创建的几何时,会引发另一个错误。在我看来,几何图形似乎没有Z维度。

ERROR:  Geometry has Z dimension but column does not


评论

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

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

#1 楼

看一下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"}}
}


评论


那行吗?应该在crs中指定什么-GeoJSON中数据的SRID,或要将其转换为目标的SRID?我的意思是您的座标看起来像是经度/纬度,我相信是EPSG:4326?仍然有EPSG:3857。

– Jayarjo
20 May 23'5:32



#2 楼

JSON有几个问题。


首先,坐标应为数组数组。
其次,查看坐标,看起来值在地理坐标系中为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语句更新问题。

评论


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

– danijar
13年5月17日在9:30

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

–德夫达塔(Devdatta Tengshe)
13年5月17日在10:59

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

– danijar
13年5月17日在11:13

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

–德夫达塔(Devdatta Tengshe)
13年5月17日在11:40

#3 楼

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

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
13年5月16日在11:18

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

–极了
13年5月16日在11:50



这就是我得到的。错误:转换:无法投影点(9.25253e-302 6.08985e + 159 1.18576e-322):纬度或经度超出限制(-14)

– danijar
13年5月16日在12:36

我不知道ST_GeomFromGeoJSON接受SRID的第二个参数,对吗?它没有记录:postgis.net/docs/ST_GeomFromGeoJSON.html

– Jayarjo
20-05-23在5:30

#4 楼




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


缺少“'”

评论


您能否在此答案中添加更多上下文并解释其如何回答OP的问题,并且与现有答案不同

–德夫达塔(Devdatta Tengshe)
15年3月27日在12:17

老实说,JSON必须是一个字符串,它不是问题中的字符串,并且至少不是其中一个答案中的字符串。这个答案可能指出了显而易见的事实,但不一定对所有人都显而易见,因此值得一提。

– Forbesmyester
16年4月13日在13:54

我从字面上尝试了此示例,但是给出:SQL错误[XX000]:错误:GeoJSON中的“坐标”没有足够的嵌套错误:错误:GeoJSON中的“坐标”没有足够的嵌套错误:GeoJSON中的“坐标”没有足够的嵌套嵌套的

–迭戈·基罗斯(DiegoQuirós)
20年7月30日在14:24