태그 보관물: sql

sql

SQL 2008에 대한 다각형 “핸드 니스”변경 (역 다각형 정점 순서) 어떤 사람들은

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에 묶여 있습니다.

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



답변

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. 설명 된이 방법은 오버 헤드를 작게 유지하면서 매우 효율적입니다 […].


답변

> = 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); 

답변

Stack Overflow에서 제안한 것처럼 SQL Server Spatial Tools 의 SQL과 C #의 부정한 하이브리드를 사용할 수있는 것처럼 보입니다 .

참고 : 이 답변이 게시 될 당시에는 정보가 많지 않았습니다. SQL Server 공간 도구 가 필요 하지 않은 경우이 방법을 사용하지 마십시오 . 대신 여기 또는 스택 오버플 로에서 다른 답변 중 하나를 시도하십시오 .


답변