在地理变量上使用 EnvelopeCenter 未在 SQL 服务器中返回正确的值
Using EnvelopeCenter on a Geography variable is not returning the correct value in SQL Server
我有一个 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'
现在,对于第二个多边形,returns 中心 lat/long 值正确为 47.6545001086162,-122.352999904254。但是对于第一个,它 returns 的值为 90, 0.
为什么我没有得到第一个多边形的正确中心点?如果由于某种原因无法通过这种方式,是否有任何其他方法可以找到给定 WKT 字符串的中心点?
地球表面上的任何闭合线都可以描述两个不同的有限 space 之一。为了知道正在定义哪个 space,您需要确定形状的 "inside" 在哪里。
在这种情况下,G1 目前描述了地球的大部分减去少量 space 大约 -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):
Polygon Lat Long
------- ---------------------- ----------------------
G1 35.5136474138606 -90.0660789036838
G2 47.6545001086162 -122.352999904254
这是因为描述形状的点序列用于确定形状的内部与外部 - 它被称为 "left-hand rule"。
我有一个 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'
现在,对于第二个多边形,returns 中心 lat/long 值正确为 47.6545001086162,-122.352999904254。但是对于第一个,它 returns 的值为 90, 0.
为什么我没有得到第一个多边形的正确中心点?如果由于某种原因无法通过这种方式,是否有任何其他方法可以找到给定 WKT 字符串的中心点?
地球表面上的任何闭合线都可以描述两个不同的有限 space 之一。为了知道正在定义哪个 space,您需要确定形状的 "inside" 在哪里。
在这种情况下,G1 目前描述了地球的大部分减去少量 space 大约 -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):
Polygon Lat Long
------- ---------------------- ----------------------
G1 35.5136474138606 -90.0660789036838
G2 47.6545001086162 -122.352999904254
这是因为描述形状的点序列用于确定形状的内部与外部 - 它被称为 "left-hand rule"。