C'est certainement possible avec les rasters.
Nous espérons que cette capture d'écran montre le problème plus clairement. La partie B du voronoi est plus proche «à vol d'oiseau» du centre d'origine du voronoi, mais cela ne tient pas compte du fait qu'il faudrait plus de temps pour se promener dans le bâtiment. Ma compréhension de la question du PO est que les voronoi doivent prendre en compte cette distance supplémentaire pour se promener dans le bâtiment.
J'aime la suggestion de @Guillaume. Cependant, quand je l'ai essayé, j'ai eu du mal r.grow.distance
à honorer le masque (voir ci-dessous. Les ondulations ne devraient pas traverser les bâtiments).
Ma connaissance de Grass n'est pas aussi solide qu'elle pourrait l'être, alors peut-être que je fais quelque chose de stupide. Certainement, consultez d'abord cette suggestion car ce sera beaucoup moins de travail que le mien ;-)
Étape 1 - Créer une surface de coût
La première étape consiste à créer une surface de coût. Cela a seulement besoin d'être fait une fois.
- créer un calque modifiable, des trous et tout.
- ajoutez un champ appelé 'unité', réglez-le sur 1.
- en utilisant polygone-à-raster sur votre couche vectorielle "perforée" (celle qui a les trous), en utilisant le champ "unité". Vous avez maintenant un "masque" de calque, où 1 est un espace libre et 0 est un bâtiment.
utilisez la calculatrice raster pour en faire une surface de coût. Je définirai «extérieur» à 1 et «intérieur» à 9999. Cela rendra les déplacements dans les bâtiments extrêmement difficiles.
(("masque @ 1" = 1) * 1) + (("masque @ 1" = 0) * 9999)
Vous pouvez obtenir des résultats plus «organiques» en ajoutant un peu de bruit à la surface des coûts (par exemple, utilisez un nombre aléatoire de 1 à 3, plutôt que seulement 1 pour les pxiels extérieurs.)
Étape 2. Créez des rasters de coûts cumulés pour chaque centre de voronoi
Maintenant, nous pouvons exécuter (pour une cellule de voronoï à la fois) l'algorithme GRASS r.cost.coordinates
contre notre couche de surface de coût.
Pour la coordonnée de départ, utilisez le centre de vornoi. Pour la coordonnée de fin, choisissez l'un des coins de votre zone. Je suggère d'utiliser "Knights Tour" car cela donne des résultats plus fluides.
Le résultat montre des lignes de temps de trajet égal à partir d'un centre voronoi. Notez comment les bandes s'enroulent autour des bâtiments.
Je ne sais pas comment automatiser cela au mieux. Peut-être le traitement en mode batch, ou fait dans pyqgis.
Étape 3. Fusionnez les rasters
Cela aura probablement besoin de code. L'algorithme serait
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
Cette approche devrait produire un raster où chaque cellule est classée par le centre de voronoï dont elle est la plus proche, en tenant compte des obstacles.
Vous pouvez ensuite utiliser le tramage sur polygone. Vous pouvez ensuite utiliser le plug-in Généraliser pour supprimer les artefacts d'effet "pas" du raster.
Toutes mes excuses pour l'imprécision des étapes 2 et 3 ... j'espère que quelqu'un interviendra avec une solution plus élégante :)