Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 在SQL Server中,对地理变量使用EnvelopeCenter未返回正确的值_Sql Server_Sqlgeography_Wkt - Fatal编程技术网

Sql server 在SQL Server中,对地理变量使用EnvelopeCenter未返回正确的值

Sql server 在SQL Server中,对地理变量使用EnvelopeCenter未返回正确的值,sql-server,sqlgeography,wkt,Sql Server,Sqlgeography,Wkt,我有一个SQL查询,其中我声明了两个地理变量,然后我试图在为这些变量赋值后找到多边形的中心点 这是我的代码: DECLARE @g1 GEOGRAPHY; DECLARE @g2 GEOGRAPHY; SET @g1 = geography::STGeomFromText('POLYGON((-90.06875038146973 35.512324341620996,-90.06767749786377 35.51504904492378,-90.06407260894775 35.51499

我有一个SQL查询,其中我声明了两个地理变量,然后我试图在为这些变量赋值后找到多边形的中心点

这是我的代码:

DECLARE @g1 GEOGRAPHY;
DECLARE @g2 GEOGRAPHY;

SET @g1 = geography::STGeomFromText('POLYGON((-90.06875038146973 35.512324341620996,-90.06767749786377 35.51504904492378,-90.06407260894775 35.51499664765537,-90.06381511688232 35.512219543493465,-90.06875038146973 35.512324341620996))',4326);
SET @g2 = geography::STGeomFromText('POLYGON ((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))',4326);

SELECT  @g1 AS 'G1' ,
        @g2 AS 'G2';

SELECT  'G1' AS 'Polygon' ,
        @g1.EnvelopeCenter().Lat AS 'Lat' ,
        @g1.EnvelopeCenter().Long AS 'Long'
UNION ALL
SELECT  'G2' AS 'Polygon' ,
        @g2.EnvelopeCenter().Lat AS 'Lat' ,
        @g2.EnvelopeCenter().Long AS 'Long'
现在,对于第二个多边形,它将正确返回中心lat/long值47.6545001086162,-122.35299904254。但是对于第一个,它返回值90,0


为什么我得不到第一个多边形的正确中心点?如果由于某种原因,这种方法不可能实现,那么还有其他方法可以找到给定WKT字符串的中心点吗?

地球表面上的任何闭合线都可以描述两个不同的有限空间之一。为了知道要定义哪个空间,您需要确定形状的“内部”在哪里

在这种情况下,G1目前描述了地球的大部分减去-90.066,35.513附近的少量空间

如果希望它描述地球的一小部分,包括-90.066、35.513,则需要更改用于描述形状的点序列:

DECLARE @g1 GEOGRAPHY;
DECLARE @g2 GEOGRAPHY;

SET @g1 = geography::STGeomFromText('POLYGON((
                                              -90.06875038146973 35.512324341620996,
                                              -90.06381511688232 35.512219543493465,
                                              -90.06407260894775 35.51499664765537,
                                              -90.06767749786377 35.51504904492378,
                                              -90.06875038146973 35.512324341620996
                                              ))',4326);
SET @g2 = geography::STGeomFromText('POLYGON ((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))',4326);

SELECT  @g1 AS 'G1' ,
        @g2 AS 'G2';

SELECT  'G1' AS 'Polygon' ,
        @g1.EnvelopeCenter().Lat AS 'Lat' ,
        @g1.EnvelopeCenter().Long AS 'Long'
UNION ALL
SELECT  'G2' AS 'Polygon' ,
        @g2.EnvelopeCenter().Lat AS 'Lat' ,
        @g2.EnvelopeCenter().Long AS 'Long'
结果(2):


这是因为它是描述形状的点序列,用于确定形状的内部与外部-它被称为“左手法则”。

这是完美的!35.513,-90.066是我期望看到的。但我通常不控制输入点的顺序,而且我的一些多边形有洞。那么,如果值为90,0,有没有办法反转空间?因为手动更改点序列可能会变得混乱,尤其是在多边形有洞的情况下。如果不可能,则可以。我发现可以使用STCentroid()方法获得类似的值,该方法返回“geometry”变量的质心(我只需要近似值)。在这种情况下,顺序似乎并不重要。但我只是想知道这是否可能。无论是哪种情况,都非常感谢你解决了我的问题@Raj-您可以使用
STArea
添加一个健全性检查,如果它看起来相当大,您可以使用
STDifference
在当前地理位置和
FullGlobe
之间进行检查?@Raj:要回答您的“反转空间”问题,有
ReorientObject()
方法可在地理实例上执行此操作!此外,我的健康检查通常是
@g.EnvelopeAngle>90
Polygon Lat                    Long
------- ---------------------- ----------------------
G1      35.5136474138606       -90.0660789036838
G2      47.6545001086162       -122.352999904254