Dies ist sicherlich mit Rastern möglich.
Dieser Screenshot zeigt das Problem hoffentlich deutlicher. Der Teil B des Voronoi befindet sich in Luftlinie näher am ursprünglichen Voronoi-Zentrum. Dies berücksichtigt jedoch nicht die Tatsache, dass das Umrunden des Gebäudes länger dauern würde. Mein Verständnis der Frage des OP ist, dass die Voronoi diese zusätzliche Entfernung berücksichtigen müssen, um um das Gebäude herumzugehen.
Ich mag den Vorschlag von @Guillaume. Als ich es versuchte, hatte ich jedoch Probleme, r.grow.distance
die Maske zu ehren (siehe unten. Die Wellen sollten nicht durch die Gebäude gehen).
Mein Graswissen ist nicht so stark wie es sein könnte, also mache ich vielleicht etwas Dummes. Schauen Sie sich diesen Vorschlag auf jeden Fall zuerst an, da er viel weniger Arbeit kostet als meiner ;-)
Schritt 1 - Erstellen Sie eine Kostenfläche
Der erste Schritt besteht darin, eine Kostenfläche zu erstellen. Dies muss nur einmal durchgeführt werden.
- Erstellen Sie eine bearbeitbare Ebene, Löcher und alles.
- Fügen Sie ein Feld mit dem Namen "Einheit" hinzu und setzen Sie es auf 1.
- Verwenden Sie Polygon-zu-Raster auf Ihrer "ausgestanzten" Vektorebene (die Ebene mit den Löchern) und verwenden Sie das Feld "Einheit". Sie haben jetzt eine Ebenen- "Maske", in der 1 freier Speicherplatz ist und 0 erstellt wird.
Verwenden Sie den Rasterrechner, um daraus eine Kostenfläche zu machen. Ich werde "draußen" auf 1 und "drinnen" auf 9999 setzen. Dies wird das Bewegen durch Gebäude unerschwinglich erschweren.
(("Maske @ 1" = 1) * 1) + (("Maske @ 1" = 0) * 9999)
Sie können mehr "organische" Ergebnisse erzielen, indem Sie der Kostenoberfläche ein wenig Rauschen hinzufügen (z. B. verwenden Sie eine Zufallszahl von 1 bis 3 anstelle von nur 1 für Pxiels im Freien.)
Schritt 2. Erstellen Sie kumulative Kostenraster für jedes Voronoi-Zentrum
Jetzt können wir (für jeweils eine Voronoi-Zelle) den GRASS-Algorithmus r.cost.coordinates
gegen unsere Kostenoberflächenschicht ausführen .
Verwenden Sie für die Startkoordinate das Vornoi-Zentrum. Wählen Sie für die Endkoordinate eine der Ecken Ihres Bereichs aus. Ich schlage vor, 'Knights Tour' zu verwenden, da dies zu glatteren Ergebnissen führt.
Das Ergebnis zeigt Linien gleicher Laufzeit von einem Voronoi-Zentrum. Beachten Sie, wie sich die Bänder um die Gebäude wickeln.
Ich bin mir nicht sicher, wie ich das am besten automatisieren kann. Möglicherweise wird der Batch-Modus verarbeitet oder in Pyqgis ausgeführt.
Schritt 3. Führen Sie die Raster zusammen
Dies wird wahrscheinlich Code benötigen. Der Algorithmus wäre
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
Dieser Ansatz sollte ein Raster ergeben, bei dem jede Zelle unter Berücksichtigung von Hindernissen nach dem Voronoi-Zentrum kategorisiert wird, dem sie am nächsten liegt.
Sie können dann Raster-zu-Polygon verwenden. Sie können dann das Plugin " Verallgemeinern" verwenden , um die Artefakte des "Schritt" -Effekts aus dem Raster zu entfernen.
Entschuldigung für die Unbestimmtheit in den Schritten 2 und 3 ... Ich hoffe, jemand mischt sich mit einer eleganteren Lösung ein :)