如何在SQL Server中反转JSON多边形顺序以调整环的方向
在如何在SQL Server中反转JSON多边形顺序以调整环的方向,sql,sql-server,json,sqlgeography,Sql,Sql Server,Json,Sqlgeography,在varchar列vertices中,我存储以下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":-
varchar
列vertices
中,我存储以下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 maps多边形中的字符串。我的目的是将其保存为geography
数据类型,并将其存储到[geo]
列中
我的问题是当我试图使用:
geography::STGeomFromText('POLYGON(' + replace(replace(replace(replace(replace(vertices,'{"lng":',''),',"lat":',' '),'[','('),']',')'),'}','') + ')', 4326)
我得到了地理错误:
24205:指定的输入不代表有效的地理实例,因为它超过了一个半球。每个地理实例必须适合单个半球。此错误的一个常见原因是多边形的环方向错误。若要创建大于1的实例,请升级SQL Server版本,并将数据库兼容性级别至少更改为110
看看其他堆栈溢出的答案,我被告知这是一个环定向问题,我需要反转Json。据我所知,第一点和最后一点是起点/终点,它们很好,我需要颠倒所有其他点的顺序
我的问题:使用SQL Server中的函数有什么方法可以做到这一点吗?如果您使用的是SQL Server 2014+和几何体类型;您的代码应该可以完美地工作:
declare @g geometry, @json nvarchar(400) = '[{"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}]';
set @g = geometry::STPolyFromText('POLYGON(' + replace(replace(replace(replace(replace(@json,'{"lng":',''),',"lat":',' '),'[','('),']',')'),'}','') + ')', 4326);
SELECT @g.ToString();
但是如果您的问题是关于创建标量函数,那么代码可以是这样的:
create function dbo.GetPolygon
(
@inputJson nvarchar(max),
@sid int
)
returns geometry
as
begin
declare @g geometry, @json nvarchar(max) = @inputJson;
set @g = geometry::STPolyFromText('POLYGON(' + replace(replace(replace(replace(replace(@json,'{"lng":',''),',"lat":',' '),'[','('),']',')'),'}','') + ')', @sid);
return @g;
end
go
select dbo.GetPolygon(@json, 4326).ToString();
然后像这样使用它:
create function dbo.GetPolygon
(
@inputJson nvarchar(max),
@sid int
)
returns geometry
as
begin
declare @g geometry, @json nvarchar(max) = @inputJson;
set @g = geometry::STPolyFromText('POLYGON(' + replace(replace(replace(replace(replace(@json,'{"lng":',''),',"lat":',' '),'[','('),']',')'),'}','') + ')', @sid);
return @g;
end
go
select dbo.GetPolygon(@json, 4326).ToString();
但如果您使用的是地理类型:您不能简单地绘制多边形,它还应包括一些其他条件: 注意:地理类型比几何图形有点限制。它不能穿过不同的半球,而且外圈必须逆时针画
地理
用于陆地空间数据(即弯曲的地球表面上的数据)
有关更多地理信息,请查看:
顺便说一句;此代码也可以正常工作并有效:如果您使用的是SQL Server 2014+和几何体类型;您的代码应该可以完美地工作:
declare @g geometry, @json nvarchar(400) = '[{"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}]';
set @g = geometry::STPolyFromText('POLYGON(' + replace(replace(replace(replace(replace(@json,'{"lng":',''),',"lat":',' '),'[','('),']',')'),'}','') + ')', 4326);
SELECT @g.ToString();
但是如果您的问题是关于创建标量函数,那么代码可以是这样的:
create function dbo.GetPolygon
(
@inputJson nvarchar(max),
@sid int
)
returns geometry
as
begin
declare @g geometry, @json nvarchar(max) = @inputJson;
set @g = geometry::STPolyFromText('POLYGON(' + replace(replace(replace(replace(replace(@json,'{"lng":',''),',"lat":',' '),'[','('),']',')'),'}','') + ')', @sid);
return @g;
end
go
select dbo.GetPolygon(@json, 4326).ToString();
然后像这样使用它:
create function dbo.GetPolygon
(
@inputJson nvarchar(max),
@sid int
)
returns geometry
as
begin
declare @g geometry, @json nvarchar(max) = @inputJson;
set @g = geometry::STPolyFromText('POLYGON(' + replace(replace(replace(replace(replace(@json,'{"lng":',''),',"lat":',' '),'[','('),']',')'),'}','') + ')', @sid);
return @g;
end
go
select dbo.GetPolygon(@json, 4326).ToString();
但如果您使用的是地理类型:您不能简单地绘制多边形,它还应包括一些其他条件: 注意:地理类型比几何图形有点限制。它不能穿过不同的半球,而且外圈必须逆时针画
地理
用于陆地空间数据(即弯曲的地球表面上的数据)
有关更多地理信息,请查看:
顺便说一句;此代码也可以正常工作且有效:您使用的是哪个版本的SQL Server?SQL Server 2016SQL Server 2016SQL Server 2012(IIRC)SQL 2012中的“超过一个半球”错误消失。JSON仍然不能表示您感兴趣的东西(即,很可能整个世界都有一个东西大小的洞),但这可以通过调用
.ReorientObject()
方法来解决。但是回到基本问题,我认为您使用的是SQL 2008(或者在一个设置了兼容模式的数据库中)。让我再检查一下版本。但是我是否将.ReorientObject()
放在geography::STGeomFromText()
调用的末尾?您使用的是哪个版本的SQL Server?SQL Server 2016SQL Server 2016SQL Server 2012(IIRC)SQL 2012中的“超过一个半球”错误消失了。JSON仍然不能表示您感兴趣的东西(即,很可能整个世界都有一个东西大小的洞),但这可以通过调用.ReorientObject()
方法来解决。但是回到基本问题,我认为您使用的是SQL 2008(或者在一个设置了兼容模式的数据库中)。让我再检查一下版本。但是我是否要将.ReorientObject()
放在geography::stgeomefromtext()
调用的末尾?非常感谢,但我需要的是地理,而不是几何。谢谢好啊问题是我分不清你说的和我说的有什么区别。这才是精神错乱的真正定义。为什么我的会导致错误,而你的不会。我没有遗漏任何东西。顺便说一句,SQL Server 2016。谢谢,好的!,我将很快在本地SQL Server 2016中检查它-HTH;)。非常感谢,但我需要的是地理,不是几何。谢谢好啊问题是我分不清你说的和我说的有什么区别。这才是精神错乱的真正定义。为什么我的会导致错误,而你的不会。我没有遗漏任何东西。顺便说一句,SQL Server 2016。谢谢,好的!,我将很快在本地SQL Server 2016中检查它-HTH;)。