2017-02-13 15 views
0

두 개의 Geography 변수를 선언 한 SQL 쿼리가 있는데 값이 할당 된 후 다각형의 중심점을 찾으려고합니다. 변수.Geography 변수에서 EnvelopeCenter를 사용하면 SQL Server에서 올바른 값을 반환하지 않습니다.

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 문자열의 중심점을 찾을 수있는 다른 방법이 있습니까?

답변

1

지구 표면의 닫힌 선은 두 개의 다른 유한 공간 중 하나를 설명 할 수 있습니다. 어떤 공간이 정의되고 있는지를 알기 위해서는, 모양의 "내부"가 어디인지를 결정해야합니다.

이 경우 G1은 현재 지구의 상당 부분에서 약 -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' 
:

당신은 -90.066은 35.513, 그럼 당신은 당신이 모양을 설명하는 데 사용하는 포인트의 순서를 변경해야 포함 세계의 작은 부분을 설명하려면

결과 (2)는 형상의 외부 대 내부를 결정하기 위해 사용되는 형상을 기술하는 점들의 시퀀스이기 때문에

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

이다 - 그것은 "왼손 법칙"이라합니다.

+0

완벽합니다. 35.513, -90.066이 내가 기대했던 것입니다. 하지만 일반적으로 입력 된 점의 순서를 제어하지는 못하고 일부 다각형에는 구멍이 있습니다. 값이 90, 0이면 공간을 반전시킬 수있는 방법이 있습니까? 수작업으로 포인트 시퀀스를 변경하면 특히 다각형에 구멍이있는 경우 지저분해질 수 있습니다. – Raj

+0

가능하지 않다면 괜찮습니다. 나는 STCentroid() 메소드를 사용하여 비슷한 값을 얻는 것이 가능하다는 것을 발견했다. 대신에 'geometry'변수의 중심을 반환한다. (나는 단지 근사값이 필요하다.) 그리고 그 순서는 중요하지 않습니다. 그러나 그것이 가능한지 궁금합니다. 두 경우 모두 내 문제를 해결해 주셔서 감사합니다. – Raj

+0

@Raj - 'STArea'를 사용하여 온 전성 체크를 추가 할 수 있으며, 다소 큰 것처럼 보이면 현재 지리와 'FullGlobe'사이에 'STDifference'를 사용할 수 있습니까? –