2010-12-10 4 views
9

사용자가 드로잉을 클릭하여 Silverlight에서 다각형을 그릴 수 있도록 허용하고 있습니다. 그런 다음 포인트를 반복하고 경도와 위도로 변환 한 다음 SQL에 저장합니다 (geography 열에 있음).SQL 공간 폴리곤 안쪽에

세계가 둥글며 모든 것 때문에 시계 방향으로 그리는 경우에만 작동한다는 것이 문제입니다. 그렇지 않으면 다각형을 세계 일주에 만들려고 시도하고 실패합니다.

어떻게하면 제대로 할 수 있습니까? 그들이 드로잉하는 방식을 고쳐야합니까? 그렇다면 어떻게해야할까요?

답변

0

지리 정보 지리 데이터 유형에서 일반적인 개념 인 다각형은 다수의 정점과 그 정점 사이의 모서리로 정의됩니다. 그러나 다각형의 내부와 외부를 구별 할 수 있어야합니다. 이는 가장자리의 한면이 항상 내부를 정의한다고 가정하는 시스템에 의해 수행됩니다 (다른 표준은 왼쪽 또는 오른쪽을 사용함)

한 방향으로는 작은 원을 그리고 다른 방향으로 그려야합니다 작은 원을 제외하고 전체 세계를 포함하는 구체. 후자는 지리적 인 제한을 깨고 예외를 제기하는 경향이 있습니다.

도넛 그리기를 고려한다면 중심에 '구멍'을 정의하기 위해 2 개의 다각형이 있고 시계/반 시계 방향 패턴으로 점을 가져야합니다.

+0

예, 알고 있습니다. 그러나 나는 그것에 대해 무엇을해야합니까? – Matt

+0

점이 그려지는 순서는 무시하고 적절한 순서로 읽어야합니다. – Andrew

+0

그리고 어떻게해야 순서대로 읽어야합니까? – Matt

1

RTM 버전의 SqlServer 2008에 연결되어있는 경우 항상 자유롭게 배포 할 수있는 sqlspatial tools from codeplex을 사용할 수 있으며 해당 라이브러리에서 makevalid 메서드 만 사용할 수 있습니다. 당신이 SQLSERVER 데날리의 CTP1과 재생 시간이 있다면

당신이 반구보다 큰 개체를 수용 할 수 있습니다 단지 픽업 새로운 공간 유형 ReorientObject 방법에있을 수 있습니다 - 필요한 경우 : 개체의 방향

1

나는 a similar question 요청 최근 GIS StackExchange에서 나는 아래에 재현되는 SQL 전용 솔루션을 찾은 것으로 믿습니다.

결국 대답은 Spatial Ed's Blog에서 발견되었습니다. (가) 변환 시연

SQL : 에드의 포스트에서

DECLARE @geom GEOMETRY = 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'; 
DECLARE @geog GEOGRAPHY = @geom.MakeValid().STUnion(@geom.STStartPoint()).STAsText() 

그리고 발췌 :

이 문제의 핵심은이 STUnion() 방법이다. 이것은 OGC 기반의 방법이기 때문에 주어진 지형지 물에 대해 전체 지오메트리를 처리하기 때문에 폴리곤을이 방 법에 필요한 방위로 강제 설정합니다. 이는 단지 Geography type [...]에 사용되는 방식입니다. 그림 된이 방법은 오버 헤드를 작게 유지하면서 매우 효율적입니다 [...]. 지리에 대한 EnvelopeAngle() 방법의 결과가 180 인 경우

당신은 확인할 수 있습니다
+0

당신은 2008 년이 일을 어떻게 얻었습니까? 'Microsoft.SqlServer.Types.SqlGeography'형식에 대해 'MakeValid'메서드를 찾을 수 없습니다. – capdragon

+0

@capdragon :'geometry '또는'geography'에서'MakeValid()'를 시도 했습니까? – Michael

+0

지리학. 나는 너와 비슷한 상황에 처해있다. 기하학을 투영하고 별도의 피쳐 클래스에서 지리로 변환했지만 지금은 "각 지형 인스턴스가 단일 반구 안에 들어 있어야합니다.이 오류의 일반적인 원인은 다각형의 링 방향이 잘못되었습니다."라는 오류가 발생합니다. – capdragon

3

, 다음, 그것을 해결하기 위해 ReorientObject() 기능을 사용합니다. 당신이 당신의 다각형의 둘레를 걸어 '사물'이 표시되어야하므로, 왼손은 항상 ... 내부해야합니다 ...

--A CW polygon 
DECLARE @G3 GEOGRAPHY = 'POLYGON ((45 45, 44 45, 44 46, 45 46, 45 45))';  
SELECT @G3.EnvelopeAngle();    --180 
SELECT @G3.ReorientObject().STAsText(); --POLYGON ((44 46, 44 45, 45 45, 45 46, 44 46)) 
+0

Excelent 대답. 방금 날 구해 줬어. –

+0

@Pabloker가 도움이되어 기쁘다. 당신도 이것을 볼 수 있습니다 [링크] (http://stackoverflow.com/a/30389579/1468295) –

0

왼손 규칙이 지배 : 여기

은 샘플입니다 '를 반 시계 방향으로 디지털화합니다. 구멍이있는 도넛과 폴리에 대해서도 마찬가지입니다.

관심있는 폴리곤 영역의 왼손을 '안쪽'으로 유지하면 시계 방향으로 디지털화됩니다.

어느 것이 정확한지를 결정하는 간단한 방법은 항상 작은 영역의 것을 취하는 것입니다 ... 모든 워크 플로에서 할 수있는 것은, 절반 이상인 디지털화 된 폴리곤은 없습니다. world ...

워크 플로는 다음과 같이됩니다. 사용자가 다각형을 만들고 반대 방향 (ReorientObject() SQL Server에서)으로 다른 다각형을 만든 다음 해당 영역을 비교합니다. 논리적으로 가장 작은 것은 옳은.

이 문제를 해결하기위한 또 다른 방법입니다.