Mam plik kształtu zawierający łuki przedstawiające ścieżkę, którą przejechała ciężarówka rozrzucająca nawóz na farmę.
Powiedzmy, że wiem, że szerokość rozrzutu wynosi 30 m, tzn. Ciężarówka może rozrzucać nawóz 15 m po obu stronach pojazdu.
Chcę wygenerować zestaw wielokątów, które pokazują:
1) Całkowity obszar, który otrzymał nawóz
2) Obszary zachodzenia na siebie, tj. W których dwa oddzielne przejścia były zbyt blisko siebie, tak że niektóre części gospodarstwa otrzymały podwójną prawidłową „dawkę” „nawozu.
Naiwnym podejściem jest po prostu tworzenie wielokątów zasięgu jako buforów wokół łuków. Działa to w szczególnym przypadku, w którym linie rozłożenia różnią się od siebie. Jednak ciężarówka mogłaby poruszać się wokół farmy w coraz mniejszej spirali, a prosty bufor nie pokazywałby nakładania się, w którym dwa przejścia spirali były zbyt blisko siebie (jeśli spirala jest pojedynczym łukiem, skończyłbym pojedynczy wielokąt bez nakładających się części).
Jeśli jest to istotne, używam TatukGIS VCL DK, ale naprawdę szukam algorytmu, a nie konkretnego rozwiązania.
Kilka wyjaśnień w odpowiedzi na dotychczasową dyskusję:
1) Nie mogę polegać na danych wektorowych posiadających określone metadane (np. Dzienniki GPS lub szybkość rozsiewu). Pozwalam użytkownikowi wybrać warstwę i określić szerokość rozkładania, a następnie uruchamia się raport.
2) Celem raportu jest naprawdę pokazanie użytkownikowi, jak „wykwalifikowany” był operator pojazdu, gdzie „wykwalifikowany” oznacza „osiągnął najwyższy zasięg przy najmniejszym nakładaniu się”.
3) Czuję się bardziej swobodnie na ziemi wektorowej niż na ziemi rastrowej, więc wolę rozwiązania oparte na wektorach.
Dzięki,
Darren.
źródło
Odpowiedzi:
Być może najprostszym rozwiązaniem jest rozbicie pojedynczej geometrii na segmenty i buforowanie tych pojedynczych segmentów: w przypadku spirali buforujesz każdy łuk, a następnie przecinasz poszczególne łuki, aby uzyskać liczbę. Uważaj, aby uniknąć fałszywego nakładania się, nie buforując końców segmentów, tylko po lewej i prawej stronie samych segmentów.
Innym podejściem jest nałożenie siatki wielokątów na dane, a następnie w obrębie każdej komórki siatki buforowanie każdego przecinającego się segmentu linii osobno. Aby być dokładnym, chcesz wziąć komórkę siatki do analizy, buforować ją, a następnie zebrać przecinające się segmenty i buforować je, wykonując analizę w oryginalnym oknie komórki.
Każda z tych opcji powinna dać rozsądne oszacowanie nakładania się. Mogę wymyślić kilka bardziej dokładnych podejść, ale wymagałyby one wiedzy na temat danych.
źródło
Brak rozwiązania, ale niektóre dane wejściowe:
Problem ten wydaje się podobny do problemu wykrywania koalescencji linii w generalizacji mapy . Dzieje się tak, gdy duży styl jest nakładany na falistą linię (symbol nakłada się na siebie):
Ten dokument s. 176–180 (w języku francuskim… przepraszam) podaje algorytmy do wykrywania takich samo-przecinających się części. Zasada jest taka, jak zaproponowano przez scw , aby użyć pojedynczego bufora bocznego każdego segmentu złożonego z segmentu plus 0, 1 lub 2 łuki kół. JTS zawiera implementację tego bufora po jednej stronie, która może być użyteczna.
źródło
W rozwiązaniu wektorowym ominie się potencjalnie krytyczną zmienną : czas, a przez to szybkość rozprzestrzeniania się. Gdy ciągnik porusza się szybciej, mniej nawozu jest rozrzucane na jednostkę powierzchni, a gdy porusza się wolniej (zwalniając w zakręt i przyspieszając o jeden), rozprowadza więcej nawozu na jednostkę powierzchni. Ponadto, jeśli ciągnik rozrzuca materiał podczas skrętu, materiał będzie bardziej skoncentrowany w kierunku wnętrza zakrętu, a mniej skoncentrowany w kierunku na zewnątrz.
Dane czasowe byłyby dostępne w zapisie GPS postępu ciągnika. Nachylenia (przebyta odległość podzielona przez upływ czasu) oszacują prędkości w każdym punkcie. Alternatywnie można (jako przybliżenie) założyć stałą prędkość wewnątrz pola i wolniejszą prędkość w rozsądnym buforze wewnętrznym granicy pola.
Reprezentacja rastrowa poradzi sobie z tymi problemami. Rasteryzuj ścieżkę ciągnika. Spowoduje to ustawienie wszystkich komórek nieprzecinanych przez ciągnik na wartości NoData (lub na zero). Gdyby ciągnik poruszał się ze standardową, stałą prędkością, wystarczyłoby wprowadzić stałą wartość do każdej z komórek danych. Teraz, na przykład, jeśli ciągnik poruszałby się z dwukrotnie większą prędkością, (przypuszczalnie) jego szybkość stosowania byłaby o połowę mniejsza, a można to przedstawić poprzez zmniejszenie o połowę wartości w komórkach.
Zasadniczo wartością do umieszczenia w dowolnej komórce jest dawka aplikacji na jednostkę powierzchni . Jeśli ciągnik równomiernie rozrzuca x kg nawozu na sekundę do 15 mz każdej strony podczas jazdy z prędkością y m / s, wówczas rozrzuca x / y kg / s / [m / s] / (2 * 15 m) = x / (30 lat ) Kg / m ^ 2 nawozu. Zatem x / (30 lat ) to wartość, którą należy wprowadzić do każdej komórki. podano x, ay obliczono na podstawie danych GPS.
Samo-skrzyżowania zasadniczo nie stanowią problemu . Jeśli ścieżka ciągnika przecina się sama, dodawaj wkłady za każdym razem, gdy przekręca komórkę. W tym celu może to wymagać specjalnego przetwarzania, w zależności od sposobu tworzenia siatki i możliwości oprogramowania GIS.
Po wykonaniu tego przygotowania reszta jest szybka i łatwa: ogniskowa suma tej siatki, przy użyciu okrągłego sąsiedztwa o promieniu 15 m, znajduje skumulowaną ilość rozproszoną na jednostkę powierzchni w każdej komórce.
źródło
Nie jestem w 100% pewien co do protokołu StackExchange, więc zamieszczam to jako odpowiedź na moje pytanie. Tak czy inaczej to odpowiedź.
Podstawowym algorytmem jest:
1. Podziel dowolną geometrię na warstwie na segmenty nie dłuższe niż 1/2 szerokości rozrzutu.
2. Dla każdego segmentu:
- Utwórz „bufor toczny”, patrząc do tyłu wzdłuż kształtu i buforując wszystkie poprzednie segmenty, w których skumulowana długość tych segmentów jest mniejsza niż szerokość rozrzutu (promień zderzaka = 1/2 szerokości rozrzutu)
- Utwórz „bufor następnego segmentu” tylko następnego segmentu (promień bufora = 1/2 szerokości rozrzutu)
- odejmij „bufor toczny” od „bufora następnego segmentu”, aby uzyskać „nowy bufor”
- dołącz do wszystkich „nowego bufora” wielokąty razem, aby uzyskać pojedynczy wielokąt na kształt.
Zasadniczo pozwala to kierowcy pojazdu rozrzutnika wykonywać skręty pod kątem prostym (lub szerszym) bez kary nakładania się, ale jeśli zawrócą zbyt ostro, aby rozłożyć się na „starej ziemi”, zaczynamy nakładać się.
Spirala wygląda tak, jak chcę:
źródło