Isso certamente é possível com rasters.
Esperamos que esta captura de tela mostre o problema mais claramente. A porção B dos voronoi está mais próxima 'do corvo voa' do centro original dos voronoi, mas isso não leva em conta o fato de que levaria mais tempo para caminhar pelo prédio. Meu entendimento da pergunta do OP é que os voronoi precisam levar em conta essa distância extra para caminhar pelo prédio.
Gosto da sugestão do @Guillaume. No entanto, quando tentei, tive problemas r.grow.distance
para honrar a máscara (veja abaixo. As ondulações não devem passar pelos edifícios).
Meu conhecimento de Grass não é tão forte quanto poderia ser, então talvez eu esteja fazendo algo estúpido. Definitivamente, verifique essa sugestão primeiro, pois será muito menos trabalhoso que o meu ;-)
Etapa 1 - Crie uma superfície de custo
O primeiro passo é criar uma superfície de custo. Isso só precisa ser feito uma vez.
- crie uma camada editável, buracos e tudo.
- adicione um campo chamado 'unidade', defina-o como 1.
- usando polígono para varredura em sua camada vetorial "perfurada" (a que possui os furos), usando o campo 'unit'. Agora você tem uma "máscara" de camada, em que 1 é espaço livre e 0 está construindo.
use a calculadora raster para transformar isso em uma superfície de custo. Definirei 'outdoor' como 1 e 'indoor' como 9999. Isso tornará a proibição de mover-se através de edifícios proibitivamente.
(("máscara @ 1" = 1) * 1) + (("máscara @ 1" = 0) * 9999)
Você pode obter mais resultados 'orgânicos' adicionando um pouco de ruído à superfície de custo (por exemplo, use número aleatório de 1 a 3, em vez de apenas 1 para pxiels externos).
Etapa 2. Crie rasters de custo cumulativos para cada centro voronoi
Agora podemos executar (para uma célula voronoi de cada vez) o algoritmo GRASS r.cost.coordinates
na nossa camada de superfície de custo.
Para a coordenada inicial, use o centro vornoi. Para a coordenada final, escolha um dos cantos da sua área. Sugiro usar o 'Knights Tour', pois isso fornece resultados mais suaves.
O resultado mostra linhas de tempo de viagem igual a partir de um centro voronoi. Observe como as bandas envolvem os prédios.
Não tenho certeza da melhor maneira de automatizar isso. Talvez processando o modo em lote ou feito em pyqgis.
Etapa 3. Mesclar as rasters
Provavelmente precisará de código. O algoritmo seria
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
Essa abordagem deve gerar uma varredura em que cada célula é categorizada pelo centro voronoi mais próximo, levando em consideração os obstáculos.
Você poderia usar a varredura em polígono. Você pode usar o plug-in Generalizar para remover os artefatos de efeito "etapa" da varredura.
Pedimos desculpas pela imprecisão nos passos 2 e 3 ... Espero que alguém concorde com uma solução mais elegante :)