SQL 2008에 대한 다각형 "핸드 니스"변경 (역 다각형 정점 순서)


11

SQL 2008에 들어 가려고하는 수만 점으로 구성된 수백 가지 모양 ( polygon들과 multipolygons)이 있습니다.

불행히도, 가져 오려고 시도한 모양은 "오른손"입니다 (각 요소의 둘레는 포함 된 점을 중심으로 시계 방향으로 그려집니다). SQL Server는 적어도 geography유형에 대해 "왼손"모양 (내부 시계 반대 방향)을 가정 합니다. 이것은 SQL이 모양을 제외한 지구 전체를 선택하려고한다고 가정합니다 . 어떤 사람들은 이것을 "내부"모양으로 묘사합니다.

에서 MSDN 절망적 말을하지 않습니다,하는 링 방향 하나를 사용하는 것입니다 :

우리가 사용하는 경우 geography공간 인스턴스를 저장하는 데이터 형식을, 우리는 링의 방향을 지정하고 정확하게 인스턴스의 위치를 설명해야합니다.

SQL 2008에서 잘못된 링 방향을 사용하면 다음 오류 (강조 표시)와 충돌합니다.

사용자 정의 루틴 또는 집계 "지리"를 실행하는 동안 .NET Framework 오류가 발생했습니다. Microsoft.SqlServer.Types.GLArgumentException : 24205 : 지정된 입력이 단일 반구를 초과하므로 유효한 지리 인스턴스를 나타내지 않습니다. 각 지리 인스턴스는 단일 반구 안에 맞아야합니다. 이 오류의 일반적인 원인은 다각형의 링 방향이 잘못 되기 때문입니다 .

geometry대신 모양을 가져 오는 것이 geography잘 작동하지만 가능하면 사용하고 싶습니다 geography.

SQL 2012에서는 이 문제를 해결 하는 것이 매우 사소한 것처럼 보이지만 2008에 묶여 있습니다.

도형을 어떻게 변환해야합니까?


1
+1 좋은 질문 ... Sql 서버가 왼손잡이 모양이라고 가정하는 링크가 있습니까?
커크 Kuykendall

@Kirk 감사합니다. 공식 문서를 찾는 데 문제가 있지만 "링 방향"이 중요하다고 말하는 MSDN에 연결할 수 있습니다 (어떻게 사용할지는 말하지 않더라도). 또한 충돌 할 때 발생하는 오류를 입력합니다.
Michael-Clay는 어디에 있습니까 Shirky

답변:


14

Spatial Ed의 블로그 에는 간결한 솔루션이있었습니다. 다음은 변환을 보여주는 일부 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. 설명 된이 방법은 오버 헤드를 작게 유지하면서 매우 효율적입니다 [...].


2
SQL Server 2008 r2에서는 STUnion () 내부에 .MakeValid ()를 넣어야 작동했습니다. .STUnion (@ geom.MakeValid (). STStartPoint ())
Chris Smith

@Smitty SQL이 시작점을 달리 결정할 수없는 경우에 적합합니다. 어쩌면 모양이 스스로 또는 다른 이상한 상황으로 두 배가되면?
Michael-Clay는 어디에 있습니까 Shirky

예, 제 상황에서 모양이 엉뚱하고 겹칩니다.
크리스 스미스

0

> = SQL Server 2012에서는 ReorientObject () 메서드가이를 수행해야합니다. <SQL Server 2012의 경우 다음은 대체 방법입니다.

기존 SQL 지리 @g를 들어, 아래 코드는 점을 추출하고 역순으로 점 (정점)과 다각형을 다시 만들 :
(주 1 :하지 반지 / 무게 중심과 다중 다각형 또는 다각형에 대한 간단한 다각형에 대한 작품)
(참고 2 : SRID 4326 (WGS 84) 좌표계 사용)

--For existing geography @g
DECLARE @GeometryText varchar(max), @ReversedPolygon geography
DECLARE @GeometryType varchar(20) = 'POLYGON', @Count int
SET @Count = @g.STNumPoints()
WHILE @Count > 0
BEGIN
    SET @GeometryText = @GeometryText + CONVERT(varchar(30),CONVERT(decimal(12,8),@g.STPointN(@Count).Long)) + ' ' + CONVERT(varchar(30),CONVERT(decimal(12,8),@g.STPointN(@Count).Lat))
    SET @Count = @Count - 1
    IF @Count > 0 SET @GeometryText = @GeometryText + ','
END
SET @GeometryText = @GeometryType +'((' + @GeometryText + '))'
SET @ReversedPolygon = geography::STGeomFromText(@GeometryText, 4326); 

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.