Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中反转JSON多边形顺序以调整环的方向_Sql_Sql Server_Json_Sqlgeography - Fatal编程技术网

如何在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;)。