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
#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
评论
我认为您需要指定表具有srid:4326,看起来您的表具有srid:3857,但是您的geojson具有经度/纬度(即srid:4326或WGS84)我想使用3857。那么,GeoJSON的外观如何?