Esto es ciertamente posible con rásteres.
Con suerte, esta captura de pantalla muestra el problema más claramente. La parte B del voronoi está más cerca 'mientras el cuervo vuela' al centro original del voronoi, pero esto no tiene en cuenta el hecho de que tomaría más tiempo caminar por el edificio. Entiendo que la pregunta del OP es que el voronoi debe tener en cuenta esta distancia adicional para caminar por el edificio.
Me gusta la sugerencia de @Guillaume. Sin embargo, cuando lo probé tuve problemas r.grow.distance
para honrar la máscara (ver más abajo. Las ondas no deberían pasar por los edificios).
Mi conocimiento de Grass no es tan fuerte como podría ser, así que tal vez estoy haciendo algo estúpido. Definitivamente, primero revisa esa sugerencia ya que será mucho menos trabajo que la mía ;-)
Paso 1: crear una superficie de costo
El primer paso es crear una superficie de costo. Esto solo debe hacerse una vez.
- crear una capa editable, agujeros y todo.
- agregue un campo llamado 'unidad', configúrelo en 1.
- usando polígono a ráster en su capa vectorial "perforada" (la que tiene los agujeros), usando el campo 'unidad'. Ahora tiene una capa "máscara", donde 1 es espacio libre y 0 se está construyendo.
use la calculadora ráster para convertir esto en una superficie de costo. Estableceré 'afuera' en 1 y 'adentro' en 9999. Esto hará que moverse por los edificios sea extremadamente difícil.
(("máscara @ 1" = 1) * 1) + (("máscara @ 1" = 0) * 9999)
Puede obtener resultados más 'orgánicos' agregando un poco de ruido a la superficie de costo (por ejemplo, use un número aleatorio del 1 al 3, en lugar de solo 1 para pxiels al aire libre).
Paso 2. Crear rásteres de costos acumulativos para cada centro voronoi
Ahora podemos ejecutar (para una celda voronoi a la vez) el algoritmo GRASS r.cost.coordinates
contra nuestra capa de superficie de costo.
Para la coordenada de inicio, use el centro vornoi. Para la coordenada final, elija una de las esquinas de su área. Sugiero usar 'Knights Tour' ya que esto da resultados más suaves.
El resultado muestra líneas de igual tiempo de viaje desde un centro voronoi. Tenga en cuenta cómo las bandas se envuelven alrededor de los edificios.
No estoy seguro de la mejor manera de automatizar esto. Tal vez el modo de procesamiento por lotes, o hecho en pyqgis.
Paso 3. Combina los rásteres
Esto probablemente necesitará código. El algoritmo sería
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
Ese enfoque debería generar un ráster donde cada celda está categorizada por el centro voronoi más cercano, teniendo en cuenta los obstáculos.
Entonces podría usar raster-to-polygon. A continuación, puede usar el complemento Generalizar para eliminar los artefactos de efecto "paso" del ráster.
Disculpas por la vaguedad en los pasos 2 y 3 ... Espero que alguien intervenga con una solución más elegante :)