Sql server 在SQL Server中,对地理变量使用EnvelopeCenter未返回正确的值
我有一个SQL查询,其中我声明了两个地理变量,然后我试图在为这些变量赋值后找到多边形的中心点 这是我的代码: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
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