Jest to z pewnością możliwe w przypadku rastrów.
Mam nadzieję, że ten zrzut ekranu lepiej pokazuje problem. Część B voronoi jest bliżej „w linii prostej” od oryginalnego centrum voronoi, ale nie bierze to pod uwagę faktu, że obejście budynku zajęłoby więcej czasu. Rozumiem pytanie PO, że voronoi muszą wziąć pod uwagę tę dodatkową odległość, aby obejść budynek.
Podoba mi się sugestia @ Guillaume. Jednak gdy spróbowałem, miałem problemy r.grow.distance
z uhonorowaniem maski (patrz poniżej. Fale nie powinny przechodzić przez budynki).
Moja wiedza na temat Trawy nie jest tak silna, jak mogłaby być, więc może robię coś głupiego. Zdecydowanie sprawdź najpierw tę sugestię, ponieważ będzie to o wiele mniej pracy niż moja ;-)
Krok 1 - Utwórz powierzchnię kosztów
Pierwszym krokiem jest stworzenie powierzchni kosztowej. Tę czynność należy wykonać tylko raz.
- utwórz edytowalną warstwę, dziury i wszystko.
- dodaj pole o nazwie „jednostka”, ustaw je na 1.
- używając wielokąta do rastra na „wykrawanej” warstwie wektorowej (tej, która ma dziury), używając pola „jednostki”. Masz teraz „maskę” warstwy, gdzie 1 oznacza wolne miejsce, a 0 buduje.
użyj kalkulatora rastrowego, aby przekształcić go w powierzchnię kosztów. Ustawię „na zewnątrz” na 1, a „wewnątrz” na 9999. To sprawi, że poruszanie się po budynkach będzie wyjątkowo trudne.
((„mask @ 1” = 1) * 1) + ((„mask @ 1” = 0) * 9999)
Możesz uzyskać więcej „organicznych” wyników, dodając trochę szumu do powierzchni kosztów (np. Użyj losowej liczby od 1 do 3, a nie tylko 1 dla pikseli zewnętrznych).
Krok 2. Utwórz skumulowane rastry kosztów dla każdego centrum Voronoi
Teraz możemy uruchomić (dla jednej komórki voronoi na raz) algorytm GRASS r.cost.coordinates
względem naszej warstwy powierzchni kosztowej.
Jako współrzędną początkową użyj centrum Vornoi. Jako współrzędną końcową wybierz jeden z rogów swojego obszaru. Sugeruję użycie „Knights Tour”, ponieważ daje to płynniejsze wyniki.
Wynik pokazuje linie równego czasu podróży z jednego centrum voronoi. Zwróć uwagę, jak opaski owijają się wokół budynków.
Nie wiem, jak najlepiej to zautomatyzować. Może przetwarzanie w trybie wsadowym lub w pyqgis.
Krok 3. Scal rastry
Prawdopodobnie będzie to wymagać kodu. Algorytm byłby
create a raster 'A' to match the size of your cumulative cost images
fill raster 'A' with a suitably high number e.g. 9999
create an array of the same size as the raster.
for each cumulative cost raster number 1..N
for each cell in image
if cell < value in raster 'A'
set value in raster 'A' to cell value
set corresponding cell in array to cum. cost image number
write out array as a raster
Takie podejście powinno dać raster, w którym każda komórka jest podzielona na kategorie według najbliższego centrum voronoi, biorąc pod uwagę przeszkody.
Następnie możesz użyć rastra do wielokąta. Następnie możesz użyć wtyczki Uogólnij, aby usunąć artefakty efektu „kroku” z rastra.
Przepraszamy za niejasność za kroki 2 i 3 ... Mam nadzieję, że ktoś wpadnie na bardziej eleganckie rozwiązanie :)