0

我有一个 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'

现在,对于第二个多边形,它将中心纬度/经度值正确返回为 47.6545001086162、-122.352999904254。但是对于第一个,它返回值 90, 0。

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

4

1 回答 1

1

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

在这种情况下,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):

Polygon Lat                    Long
------- ---------------------- ----------------------
G1      35.5136474138606       -90.0660789036838
G2      47.6545001086162       -122.352999904254

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

于 2017-02-13T15:28:00.933 回答