在地理变量上使用 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"。