적용 범위 + 호 세트에서 겹침을 계산하는 알고리즘


10

비료를 농장에 뿌려 놓은 트럭으로 이동 한 경로를 나타내는 호를 포함하는 shapefile이 있습니다.

확산 폭이 30m임을 알고 있다고 가정 해 봅시다. 즉, 트럭이 차량의 어느 쪽이든 비료를 15m 살포 할 수 있습니다.

I는 표시 다각형의 세트를 생성 할 :
1)의 총 면적이 수신 비료
팜의 일부는 두번 올바른 "도즈를 수신하도록 두 개의 패스가 서로 너무 가깝게했다 예 2) 중첩 영역, "비료.

순진한 접근 방식은 커버리지 다각형을 원호 주위의 버퍼로 만드는 것입니다. 이것은 스프레드 라인이 서로 다른 특별한 경우에 작동합니다. 그러나 트럭은 점점 줄어드는 나선형으로 농장 주변을 여행 할 수 있으며 나선형의 두 패스가 너무 가까이있는 경우 간단한 버퍼가 겹치지 않습니다 (나선이 단일 호이면 끝납니다) 겹치는 부분이없는 단일 다각형).

관련이 있다면 TatukGIS VCL DK를 사용하고 있지만 실제로 특정 솔루션이 아닌 알고리즘을 찾고 있습니다.

지금까지의 논의에 대한 몇 가지 설명 :

1) 특정 메타 데이터 (예 : GPS 로그 또는 확산 률)가있는 벡터 데이터에 의존 할 수 없습니다. 사용자가 레이어를 선택하고 스프레드 너비를 지정하면 보고서가 실행됩니다.

2)이 보고서의 목적은 실제로 사용자가 차량 운전자가 "숙련 된"능력을 보여주는 것인데, 여기서 "숙련 된"은 "가장 낮은 중첩으로 가장 높은 범위를 달성"을 의미합니다.

3) 래스터 랜드보다 벡터 랜드에서 더 편안하므로 벡터 기반 솔루션을 선호합니다.

감사,

대런


1
이것이 예측 된 폭풍 경로를 기반으로 누적 강수를 예측하는 방법과 유사한 지 궁금합니다.
커크 Kuykendall

답변:


3

아마도 가장 간단한 해결책은 단일 지오메트리를 세그먼트로 분할하고 해당 개별 세그먼트를 버퍼링하는 것입니다. 나선형의 경우 각 호를 버퍼링 한 다음 개별 호를 교차시켜 카운트를 구성하십시오. 세그먼트의 끝을 버퍼링하지 않고 세그먼트 자체의 왼쪽과 오른쪽에만 잘못된 겹침을 피하십시오.

또 다른 방법은 데이터에 다각형 그리드를 오버레이 한 다음 각 그리드 셀 내에서 모든 교차 선 세그먼트를 개별적으로 버퍼링하는 것입니다. 이를 정확하게하기 위해, 분석중인 그리드 셀을 가져 와서 버퍼링 한 다음 교차 세그먼트를 수집하고 이들을 버퍼링하여 원래 셀 창 내에서 분석을 수행하려고합니다.

이러한 옵션 중 하나를 사용하면 겹치는 부분을 합리적으로 추정 할 수 있습니다. 몇 가지 더 정확한 접근 방법을 생각할 수 있지만 데이터에 대해 알고 있어야합니다.


감사. 지오메트리를 세그먼트로 나누고 버퍼링하는 첫 번째 제안을 따라 생각하고있었습니다. 모서리의 모서리가 둥글게되도록 세그먼트 끝을 버퍼링해야한다고 생각합니다. 직각 선으로 시작하는 경우를 생각하면-끝을 버퍼링하지 않으면 모서리 바깥쪽에 사각형이 누락 된 두 개의 겹치는 사각형으로 끝납니다 (텍스트로 표현하기 어려움!)
dbruning

모서리의 모서리가 둥글게되도록 세그먼트 끝을 버퍼링해야한다고 생각합니다. 각 세그먼트에 대한 버퍼를 이전 세그먼트에 대한 버퍼와 교차시킨 다음 각 버퍼의 "새"부분 만 마스터 버퍼에 축적하는 방법을 생각했습니다. 무시한다는 아이디어는 이전 세그먼트와 겹치지 만 픽업은 이전 세그먼트와 겹칩니다.
dbruning

2

해결책은 없지만 일부 입력 :

이 문제는 맵 일반화 의 라인 유착 감지 문제와 유사 해 보입니다 . 큰 스타일이 유연한 선 (심볼 자체 겹침)에 적용될 때 발생합니다.

여기에 이미지 설명을 입력하십시오

이 문서 pp. 176-180 (프랑스어 ... 죄송합니다)은 그러한 자체 교차 부분을 탐지하는 알고리즘을 제공합니다. 원리는 scw 에 의해 제안 된 바와 같이 , 세그먼트 + 0, 1 또는 2 개의 원호로 구성된 각 세그먼트의 단일 사이드 버퍼를 사용하는 것이다. JTS 는 유용 할 수있는이 단일 버퍼 의 구현 을 포함 합니다.


자기 교차로 감지에 관심이있는 이유는 무엇입니까? 그리고 왜 "단일"버퍼를 제안합니까? 어느 쪽도 문제와 관련이없는 것 같습니다.
whuber

트럭이 비료를 여러 번 퍼뜨리는 위치, 즉 퍼짐 영역이 서로 교차하는 위치를 감지하는 것이 목적입니다.
julien

2

벡터 솔루션은 잠재적으로 중요한 변수 인 시간과 확산 속도 를 놓칠 것 입니다. 트랙터가 더 빨리 움직일 때 단위 면적당 더 적은 비료가 퍼지고 더 느리게 움직일 때 (회전으로 감속하여 하나에서 가속 됨) 단위 면적당 더 많은 비료가 퍼집니다. 또한, 트랙터가 회전하는 동안 재료를 퍼 뜨리면, 재료는 회전 안쪽으로 더 집중되고 바깥쪽으로 덜 집중됩니다.

시간 데이터는 트랙터의 진행 상황을 GPS 기록으로 볼 수 있습니다. 경사면 (이동 한 거리를 경과 시간으로 나눈 값)은 모든 지점에서 속도를 추정합니다. 대안 적으로, (근사치로서) 필드 내부에서 일정한 속도를, 필드 경계의 합리적인 내부 버퍼 내에서 느린 속도를 가정 할 수 있습니다.

래스터 표현은 이러한 문제를 처리 할 수 ​​있습니다. 트랙터의 경로를 래스터 화하십시오. 이렇게하면 트랙터와 교차하지 않는 모든 셀이 NoData 값 (또는 0)으로 설정됩니다. 트랙터가 표준의 일정한 속도로 움직여야한다면 각 데이터 셀에 일정한 값을 넣으면 충분합니다. 예를 들어, 트랙터가이 속도의 두 배로 움직 인 경우 (아마도) 적용 비율이 절반으로 줄어들고 이는 셀의 값을 절반으로 표시 할 수 있습니다.

일반적으로 셀에 넣을 값은 단위 면적당 적용 비율입니다 . 트랙터가 y m / sec 의 속도로 주행하면서 초당 x m의 비료를 각면에서 15 m까지 균일하게 퍼 뜨리면 x / y Kg / sec / [m / sec] / (2 * 15 m) = x / (30 y ) Kg / m ^ 2 비료. 따라서 x / (30 y )는 각 셀에 넣을 값입니다. x 가 주어지고 y 는 GPS 데이터로부터 계산됩니다.

자체 교차는 원칙적으로 문제가되지 않습니다 . 트랙터의 경로가 스스로 교차하는 경우 셀을 다시 교차 할 때마다 기여를 추가하십시오. 그리드가 생성되는 방식과 GIS 소프트웨어의 기능에 따라이를 위해 특별한 처리가 필요할 수 있습니다.

이 준비를 마치면 나머지는 빠르고 쉽습니다. 반경 15m의 원형 이웃을 사용 하여이 격자 의 초점 합계 는 모든 셀의 단위 면적 당 누적 양을 찾습니다.


1
+1 커널 (트랙터를 나타냄)이 각 행 대신 경로를 따라 이동할 수 있도록하는 도구가있는 경우이 문제를보다 쉽게 ​​관리 할 수 ​​있습니다.
Kirk Kuykendall

@Kirk 경로 나 행 또는 커널로 무엇이든 따를 필요가 없습니다. 초점에 수반되는 관점의 변화를 이해하는 것이 중요합니다. 문제를 여러 경로에서 재료를 퍼뜨리는 것으로 보는 대신 필드의 모든 포인트에 얼마나 많은 재료가 쌓이는지를 계산하는 것으로보십시오 . 분명히 동일한 솔루션의 동일한 문제입니다. 움직이는 커널 접근법 (및 제안 된 버퍼링 접근법)은 첫 번째 관점을 취합니다. 초점, 두 번째. 그러나 초점 합계 도구를 사용할 수 있습니다. 움직이는 커널 계산은 아닙니다.
whuber

속도와 확산 속도를 알고 있다면 래스터 접근 방식이 최선의 방법이라고 생각합니다. 불행히도이 특정 시나리오에서 우리는 어느 것도 모른다. 최종 사용자는이 적용 범위 보고서에 대한 입력으로 모든 계층을 선택할 수 있으며 특정 메타 데이터가있는 형상에 의존 할 수 없습니다.
dbruning

@dbruning이 방법은 알려진 속도 / 확산 속도 를 요구 하지 않는 것 같습니다 . 그것들이 있다면 그것들 (+보다 정확한 현실 모델)을 허용합니다. 그러나 원하는 측정치 (총 면적 범위, 오버랩 영역)를 시스템에서 가져 오려면 일부 셀 임계 값 + 계산이 더 필요하며 정확도 트레이드 오프도 혼합되어 있습니다.
Dan S.

@dbruning 스프레드 비율을 모르면 상대 스프레드 비율을 얻게됩니다. 속도를 모르는 경우 사람들이 어떻게 트랙터를 운전하는지 알고 있어야하며 상대 속도의 합리적인 추정치를 도출 할 수 있어야합니다. 일정한 속도와 일정한 확산 속도를 가정해도 합리적인 답변을 얻을 수 있습니다. 그들은 트랙터 경로의 직선 부분에 대한 버퍼 기반 답변에 동의합니다. 그리고 곡선 부분에서 더 사실적 일 것입니다.
whuber

2

StackExchange 프로토콜을 100 % 확신하지 못 하므로이 질문에 대한 답변으로 게시하고 있습니다. 어쨌든 내가 사용한 대답입니다.

기본 알고리즘은 다음과 같습니다.
1. 레이어의 모든 지오메트리를 스프레드 폭의 1/2 이하로 세그먼트로 나눕니다.
2. 각 세그먼트에 대해 :
-모양을 따라 뒤로보고 해당 세그먼트의 누적 길이가 스프레드 너비 (버퍼 반경 = 1/2 스프레드 너비)보다 작은 모든 이전 세그먼트를 버퍼링하여 "롤링 버퍼"를
만듭니다. 다음 세그먼트의 "다음 세그먼트 버퍼"(버퍼 반경 = 1/2 스프레드 폭)
- "다음 버퍼"에서 "롤링 버퍼"를 빼서 "새 버퍼"를 얻습니다.- "새 버퍼"를
모두 결합하십시오. 모양별로 단일 다각형을 얻기 위해 다각형을 함께 사용합니다.

기본적으로 이것은 스프레더 차량 운전자가 오버랩 페널티없이 직각 (또는 더 넓은) 회전을 할 수있게하지만, 그들이 너무 오래된 것으로 "오래된지면"에 퍼지도록함으로써 오버랩을 시작합니다.

파란색 오버랩

나선형은 내가 원하는 것처럼 보입니다.

나선

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