여러 다각형에 대한 다각형 알고리즘의 점


11

다각형이 많은 Google지도가 있습니다.

내가 관심있는 문제는 다음과 같습니다. 위도, 경도 점이 주어지면이 점이있는 모든 다각형을 결정하는 가장 좋은 방법은 무엇입니까?

명백한 방법은 각 다각형에 대해 "다각형에서 포인트"알고리즘을 반복적으로 실행하는 것이지만 특히 수천 개의 다각형이있는 경우 이러한 쿼리에 응답하는 효율적인 알고리즘이 있는지 궁금합니다.


Google Maps API에 대해 잘 모르지만 브라우저는 이와 같은 큰 쿼리를 수행하기에 가장 좋은 장소는 아닙니다. PostGIS (무료), ArcServer 또는 Oracle Spatial은 이와 같은 요청을 더 잘 처리하는 경향이 있습니다.
canisrufus

나는 다른 무엇보다 알고리즘에 관심이 있습니다. BTW, PostGIS에서 어떻게 하시겠습니까?
numan

다음 URL은 다각형의 요점을 말합니다 .. (이것은 사용하지 않았습니다.) .. 시도해보십시오. eriestuff.blogspot.com/2008/02/…

3
구의 다각형은 구를 두 부분으로 나누기 때문에 "내부"라고 할 권리가 있기 때문에 "다각형 점"은 구의 점에는 의미가 없습니다. 북극 또는 남극은 적도를 정의하는 다각형의 '내부'입니까? 위도 긴 ... 직교없는 기억
Spacedman

4
@Spaced "polygon"과 "polyline"을 혼동합니다. 다각형은 점에서 완벽하게 이해됩니다. 다각형은 단순한 경계 (닫힌 폴리 라인)가 아니라 내부를 포함합니다. 다각형 경계가 구를 두 개의 연결된 구성 요소로 나누지 만 방향 규칙과 같은 방법으로 다각형 내부로 하나를 지정하는 방법은 여러 가지가 있습니다 (예 : 내부가 경계를 통과 할 때 내부가 왼쪽에 있음) ) 또는 래스터 표현을 사용합니다.
whuber

답변:


12

이러한 모든 질문과 마찬가지로 최적의 접근 방식은 "사용 사례"와 기능이 표현되는 방식에 따라 다릅니다. 유스 케이스는 일반적으로 (a) 각 계층에 오브젝트가 많거나 적은지 여부와 (b) 계층 중 하나 (또는 ​​둘 다)가 일부 데이터 구조를 사전 계산할 수 있는지 여부; 즉, 둘 중 하나 또는 둘 다가 충분히 정적이고 사전 계산에 투자 할 가치가 없는지 여부입니다.

이 경우 다음 시나리오가 발생합니다. 일반적으로 포인트는 동적입니다. 즉, 사전에 제공되지 않습니다. 사전에 또는 매우 큰 그룹에서 사용 가능한 경우 정렬을 기반으로 한 일부 최적화를 사용할 수 있습니다. Q 는 쿼리 지점 수이고 P 는 다각형 정점 수입니다 .

벡터 다각형 데이터

(1) 토토에 몇 점, 다각형 정점이 거의 없습니다 . 클래식 라인 스 태빙 알고리즘 과 같은 무차별 대입 절차를 사용하십시오 . 적절한 방법의 경우 비용은 O (P * Q)입니다. 점을 다각형 가장자리와 비교하는 데 O (1) 시간이 걸리고 이러한 모든 비교를 수행해야하기 때문입니다.

(2) 다각형 꼭지점은 많지만 동적입니다. 쿼리에서 점을 사용할 때마다 다각형이 모두 변경되었을 수 있습니다. 다시 무차별 알고리즘을 사용하십시오. 비용은 여전히 ​​O (P * Q)인데, P 가 클 것이기 때문에 큰 것이지만 도움이되지 않습니다. 변경 사항이 작거나 제어 된 경우 ( 예 : 다각형 모양이 약간 변경되거나 단순히 느리게 이동하는 경우) 다음 솔루션 버전을 사용하고 다각형이 변경 될 때 데이터 구조를 업데이트하는 효율적인 방법을 찾을 수 있습니다. 그것은 원래의 연구에 대한 문제 일 것입니다.

(3) 많은 다각형 정점 및 정적 다각형 (다각형 레이어는 거의 변경되지 않음). 검색을 지원하기 위해 데이터 구조를 사전 계산합니다 ( 라인 스윕 또는 쿼드 트리 알고리즘을 기반으로 할 수 있음 ). 이러한 알고리즘의 사전 계산 비용은 O (P * log (P))이지만 쿼리 비용은 O (Q * log (P))가되므로 총 비용은 O ((P + Q) * log ( 피)).

다음 과 같은 특별한 경우 에 일부 개선이 가능합니다.

(a) 모든 다각형은 볼록합니다 ( 다각형을보다 빠르게 처리 할 수 ​​있음 ).

(b) 모든 다각형 내부는 분리 되어 있으며,이 경우 단일 다각형으로 간주 할 수 있습니다 (삼각형 기반 알고리즘과 같은 간단하고 효율적인 알고리즘 허용).

(c) 대부분의 다각형은 매우 구부러 지지 않습니다. 즉 경계 상자의 많은 부분을 차지합니다.이 경우 경계 상자 만 기반으로 초기 테스트를 수행 한 다음 해당 솔루션을 세분화 할 수 있습니다. 이것은 대중적인 최적화입니다.

(d) 포인트 수가 많다. 정렬하면 타이밍이 향상 될 수 있습니다. 예를 들어, 왼쪽에서 오른쪽으로 선 스윕 포인트 인 폴리곤 알고리즘을 구현할 때 첫 번째 좌표에서 포인트를 정렬하여 다각형 가장자리를 스윕하는 동시에 포인트를 스윕 할 수 있습니다. 그런 최적화가 게시되었음을 알지 못합니다. 그러나 출판 된 것은 모든 점과 다각형 정점의 합집합에 대해 제한된 삼각 분할 을 수행하는 것입니다 . 일단 삼각 분할이 완료되면 내부 점을 빠르게 식별해야합니다. 계산 비용은 O (Q * log (Q) + (P + Q) * log (P + Q))로 조정됩니다.

래스터 다각형 데이터

다각형 레이어를 이진 표시기 래스터 (1 = 다각형 내부, 0 = 외부)로 봅니다. 래스터 값을 내부 / 외부 표시기로 변환하려면 룩업 테이블이 필요할 수 있습니다. 이제 각 점 프로브는 래스터 셀을 색인화하고 해당 값을 읽으려면 O (1)의 노력이 필요합니다. 총 노력은 O (Q)입니다.

일반적으로

멋진 하이브리드 솔루션많은 정적 벡터 다각형 (위의 벡터 케이스 3)의 경우 처음에는 다각형을 래스터 화해야합니다. 아마도 거친 해상도로도 다각형 경계의 일부를 교차하는 셀을 구별합니다 (예 : 값 2). . 래스터 프로브 (비용 : O (1))를 사용하면 일반적으로 명확한 답이 나오지만 (점은 내부 또는 외부에있는 것으로 알려짐) 때로는 부정확 한 대답이 나타납니다 (점은 적어도 하나의 가장자리를 통과하는 셀에 해당합니다) 이 경우 더 비싼 O (log (P)) 벡터 쿼리가 수행됩니다. 이 방법을 사용하면 래스터에 약간의 추가 저장 비용이 발생하지만, 대부분의 경우 작은 래스터 (1MB는 {0,1,2, null} 값을 저장하는 2000 x 2000 래스터를 허용 할 수 있음)도 계산 시간에 큰 이점을 제공 할 수 있습니다 . 무증상,


7

다각형 경계 상자가 쿼드 트리와 같은 곳에 저장되어 있으면이를 사용하여 확인할 다각형을 신속하게 결정할 수 있습니다. 최소한 각 다각형에 대해 다각형의 전체 점을 수행하는 것과 달리 점이 각 다각형 경계 상자 안에 있는지 확인할 수 있습니다. 개인적으로 메모리에 다각형을 캐시하고 JTS 또는 NetTopology 제품군과 같은 것을 사용하여 교차 쿼리를 수행하는 웹 서비스를 설정했습니다.


1

postgis에서 ST_Intersects 는 인덱스를 사용하여 먼저 점이 다각형의 경계 상자 안에 있는지 확인한 다음 실제로 다각형 안에 있는지 다시 확인합니다. 그것은 빠르며 종종 매우 빠릅니다.

PostGIS에 데이터를 저장했다면 데이터베이스가 계산을 수행하기에 적합한 장소라는 것은 의심의 여지가 없습니다. 다른 경우에는 다각형을 중간 또는 클라이언트 프로그램으로 보내야합니다. 즉, 계산 자체보다 훨씬 많은 시간이 걸리고 관련 다각형을 얻는 것입니다.

/ 니클라스

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