Questo è certamente possibile con i raster.
Speriamo che questo screenshot mostri il problema più chiaramente. La porzione B del voronoi è più vicina "in linea d'aria" al centro originale del voronoi, ma ciò non tiene conto del fatto che ci vorrebbe più tempo per camminare intorno all'edificio. La mia comprensione della domanda del PO è che il voronoi deve tenere conto di questa distanza extra per camminare intorno all'edificio.
Mi piace il suggerimento di @Guillaume. Tuttavia, quando l'ho provato ho avuto problemi r.grow.distance
ad onorare la maschera (vedi sotto. Le increspature non dovrebbero passare attraverso gli edifici).
La mia conoscenza di Grass non è così forte come potrebbe essere, quindi forse sto facendo qualcosa di stupido. Sicuramente, controlla prima quel suggerimento in quanto sarà molto meno lavoro del mio ;-)
Passaggio 1: creare una superficie di costo
Il primo passo è creare una superficie di costo. Questo deve essere fatto solo una volta.
- creare un livello modificabile, buchi e tutto.
- aggiungi un campo chiamato 'unit', impostalo su 1.
- usando il poligono-raster sul tuo livello vettoriale "perforato" (quello che ha i buchi), usando il campo 'unit'. Ora hai una "maschera" di livello, dove 1 è spazio libero e 0 sta costruendo.
usa la calcolatrice raster per trasformarla in una superficie di costo. Imposterò "all'aperto" su 1 e "interno" su 9999. Ciò renderà proibitivo il passaggio attraverso gli edifici.
(( "Maschera @ 1" = 1) * 1) + (( "maschera @ 1" = 0) * 9999)
È possibile ottenere risultati più "organici" aggiungendo un po 'di rumore alla superficie dei costi (ad esempio, utilizzare un numero casuale da 1 a 3, anziché solo 1 per i pixel esterni).
Passaggio 2. Creare raster dei costi cumulativi per ciascun centro voronoi
Ora possiamo eseguire (per una cella voronoi alla volta) l'algoritmo GRASS sul r.cost.coordinates
nostro livello di superficie di costo.
Per le coordinate iniziali, utilizzare il centro vornoi. Per la coordinata finale, scegli uno degli angoli della tua area. Suggerisco di usare 'Knights Tour' in quanto ciò dà risultati più fluidi.
Il risultato mostra linee di uguale tempo di viaggio da un centro voronoi. Nota come le bande avvolgono gli edifici.
Non sono sicuro del modo migliore per automatizzare questo. Forse l'elaborazione in modalità batch o eseguita in pyqgis.
Passaggio 3. Unire i raster
Questo probabilmente avrà bisogno di codice. L'algoritmo sarebbe
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
Tale approccio dovrebbe produrre un raster in cui ogni cellula è classificata dal centro voronoi a cui è più vicina, tenendo conto degli ostacoli.
È quindi possibile utilizzare raster-to-poligono. È quindi possibile utilizzare il plug-in Generalize per rimuovere gli artefatti dell'effetto "step" dal raster.
Ci scusiamo per la vaghezza nei passaggi 2 e 3 ... Spero che qualcuno entri in contatto con una soluzione più elegante :)