4

주어진 포인트가 다각형인지 아닌지를 결정하는 SQL 쿼리를 작성하려고합니다. (저는 SQL Server 2008 R2를 사용하고 있습니다).SQL Server 용 다각형 알고리즘의 포인트

나는 다음과 같습니다 this tutorial (그냥 복사/붙여 넣기 및 테이블 이름 변경) 대략적으로 작동하지만 전혀 정확하지 않습니다. 예를 들어 좌표가 주어진 점을 고려해 봅시다 :
P = 45.7664, 4.87383. 당신이 4 개 정점에이 점 주위에 작은 다각형 (대략 사각형)을 그리면

좌표 : 그것은 반면
S = 45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909

아래 링크에 주어진 절차는 점이 다각형에없는 대답 .. . 이 (내 자신의 형식 텍스트)의 출력입니다 :
false output

(다각형 20 위의 다각형이다) 그러나 당신이 광장을 확대하는 경우 (내 테스트에서 10 배 더 큰), 홍보 ocedure 대답 내 지점에 사각형입니다.

그래서 저는 다른 알고리즘을 찾고 있습니다. 여기
내 정점 테이블은 모든 정점을 포함하는 것은 내 DB의 각 폴리곤의 좌표입니다 내가 매개 변수에 전달 주어진 포인트가 다각형 인 경우 (몇 수천가) 모든 다각형에 대해 확인해야 Vertice table

(그리고 그렇다면 어떤 것입니까?). 루프를 혼자서 할 수는 있지만 정확히 놓치지 마십시오 다각형의 점 알고리즘.

누군가 나를 도울 수 있습니까? 대단히 감사합니다.

요약

대응하는 SQL 바이올린 : http://sqlfiddle.com/#!3/0caa4/1

+0

데이터베이스에 거대한 레코드가있는 경우 성능이 떨어지고 1600000 개 레코드에서이 쿼리를 시도하고 완료하는 데 평균 2 분이 걸립니다. –

+0

안녕하세요 Jitendra, 이것은 오래된 질문이지만 프로젝트는 아직 개발 중입니다 (개인 프로젝트 임)[email protected] Thul에 대한 설명과 함께 내 링크에 제공된 알고리즘을 구현했지만 완벽하게 작동하지만 너무 많은 레코드로 시도한 적이 없었습니다. 당신은 대답으로 더 나은 알고리즘을 제안 할 수 있습니다, 그것은 환영합니다! – AlexB

답변

7

귀하의 문제는 당신이 뒤로 다각형을 정의한 것입니다. 이제 당신이 볼 수 있듯이 네이티브 SQL 지리 유형

declare @s geography, @t geography, @p geography; 
select @s = geography::STPolyFromText('POLYGON((45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909))', 4326); 
select @t = geography::STPolyFromText('POLYGON((46.05227 5.366821, 45.73302 5.460205, 45.687 4.674683, 45.97215 4.693909, 46.05227 5.366821))', 4326); 
select @p = geography::STPointFromText('POINT(45.7664 4.87383)', 4326); 

select @p.STIntersects(@s), @p.STIntersects(@t); 
select @p.STBuffer(10), @s, @t; 

이것을 알아 보자, @s 거의 전 세계를 보유하고 있습니다. 결과 세트 뷰어에서 "사각형"이 있어야하는 곳을 확대하면 구멍이 생깁니다. 당신이 예상하는 영역 인 @t과 대조하십시오. 또한 2012 년 이전에 존재했던 지형 공간 인스턴스가 반구 경계를 넘을 수 없다는 제한을 개선 한 SQL 2012에서이를 실행했습니다. 위의 코드를 2008 인스턴스에서 실행하면 @s에 대한 오류가 발생할 수 있습니다. @s을 정의하는 줄을 주석 처리하면 실행됩니다. 지리 (graphy/metry) 다각형을 정의 할 때

는 "오른쪽"규칙이있다. 당신이 지정한 순서대로 포인트를 방문하는 차에 있다고 상상해보십시오. 당신이 정의하고있는 부분은 당신이 자동차의 오른쪽을 바라 보았을 때 볼 수있는 것입니다.

+0

답변 해 주셔서 감사합니다. 그러나 당신이 정의한대로 왜'@ s'에서, 당신은 반구 경계를 넘어서고 있는지 이해하지 못합니다 ... 북반구의 작은 다각형 일뿐입니다!?!? 그 밖의'STIntersects' 알고리즘은 내가 가진 알고리즘보다 더 좋을 것 같습니다. 함수가 테스트되고 다시 테스트 된 것으로 가정합니다 ... – AlexB

+0

다각형을 정의 했으므로'@ s'는 전체 세계에서 사각형을 뺀 것입니다. 예정된. –

+0

당신은 내가 바보라고 생각할 것입니다. 그러나 나는 아직도 한 가지를 이해하지 못합니다. 당신은'@ s'은 전 세계가 내 의도 한 사각형을 뺀 것이라고 말합니다. 그러나'@ s'는 북반구의 100 % 국가 인 프랑스에있는 다각형입니다. 그래서 저는 왜 반구 경계를 넘어야합니까 ?? 그런 다음, 제가 당신을 이해한다면, 다른 다각형 안에 다각형을 그릴 때 가장 큰 다각형 자체가 작은 것입니다. 그렇다면 두 개의 다각형을 어떻게 겹쳐 쌓을 수 있습니까? – AlexB