【发布时间】:2017-09-06 03:32:18
【问题描述】:
在varchar 列verticies 中,我存储了这个 JSON:
[{"lng":-82.82312393275788,"lat":27.982508364801642},
{"lng":-82.8065586098819,"lat":27.984479050536944},
{"lng":-82.808017731586,"lat":27.9704560800863},
{"lng":-82.82166481105378,"lat":27.975004270258353},
{"lng":-82.8230381020694,"lat":27.980537643052056},
{"lng":-82.82312393275788,"lat":27.982508364801642}]
这是保存为来自 Google 地图多边形的字符串。我的意图是将其保存为 geography 数据类型,并将其存储到 [geo] 列中。
我的问题是当我尝试使用时:
geography::STGeomFromText('POLYGON(' + replace(replace(replace(replace(replace(vertices,'{"lng":',''),',"lat":',' '),'[','('),']',')'),'}','') + ')', 4326)
我收到地理错误:
24205:指定的输入不代表有效的地理实例,因为它超出了单个半球。每个地理实例必须适合单个半球。此错误的一个常见原因是多边形的环方向错误。要创建大于半球的地理实例,请升级 SQL Server 版本并将数据库兼容级别更改为至少 110。
查看其他堆栈溢出答案,我被告知这是一个环方向问题,我需要反转 Json。据我了解,第一个点和最后一个点是起点/终点,它们很好,我需要颠倒所有其他点的顺序。
我的问题:有没有办法使用 SQL Server 中的函数来做到这一点?
【问题讨论】:
-
您使用的是哪个版本的 SQL Server?
-
SQL Server 2016
-
SQL Server 2016
-
(IIRC)SQL 2012 中的“超过一个半球”错误消失了。JSON 仍然不能代表您感兴趣的事物(即很可能整个世界都有事物大小的洞),但这可以通过调用
.ReorientObject()方法调用来修复。但回到根本问题,我认为您使用的是 SQL 2008(或在其兼容模式设置为此类的数据库中)。 -
好的。让我仔细检查一下版本。但是我应该将
.ReorientObject()放在geography::STGeomFromText()调用的末尾吗?
标签: sql sql-server json sqlgeography