Bu kesinlikle rasterlerle mümkündür.
Bu ekran görüntüsü umarım sorunu daha net gösterir. Voronoi'nin B kısmı, 'karga uçarken' orijinal voronoi merkezine daha yakındır, ancak bu, binanın etrafında yürümenin daha uzun süreceği gerçeğini dikkate almaz. OP'nin sorusunu anladığım şey, voronoi'nin binanın etrafında dolaşmak için bu ekstra mesafeyi hesaba katması gerektiğidir.
@Guillaume'in önerisini beğendim. Ancak, denediğimde r.grow.distance
maskeyi onurlandırmakta zorlandım (aşağıya bakın. Dalgalar binalardan geçmemelidir).
Çim bilgim olabildiğince güçlü değil, belki de aptalca bir şey yapıyorum. Kesinlikle, bu öneriye bakın, çünkü benimkinden çok daha az iş olacak ;-)
Adım 1 - Maliyet yüzeyi oluşturma
İlk adım bir maliyet yüzeyi oluşturmaktır. Bunun sadece bir kez yapılması gerekir.
- düzenlenebilir bir katman, delikler ve hepsi oluşturun.
- 'birim' adlı bir alan ekleyin, 1 olarak ayarlayın.
- "delikli" vektör katmanınızda (deliklere sahip olan) çokgen-raster kullanarak, 'birim' alanını kullanarak. Artık 1 "boş alan ve 0'ın oluşturduğu bir katman" maskesi "var.
Bunu maliyet yüzeyine dönüştürmek için raster hesap makinesini kullanın. 'Dış mekanı' 1'e ve 'iç mekanı' 9999'a ayarlayacağım. Bu, binalarda hareket etmeyi oldukça zorlaştıracak.
(( "Maske @ 1" = 1) * 1) + (( "maske @ 1" = 0) * 9999)
Maliyet yüzeyine biraz gürültü ekleyerek daha fazla 'organik' sonuç elde edebilirsiniz (örneğin, dış mekan pikselleri için 1 yerine 1'den 3'e kadar rastgele sayı kullanın.)
Adım 2. Her bir voronoi merkezi için kümülatif maliyet rasterleri oluşturun
Şimdi (tek seferde bir voronoi hücresi için) GRASS algoritmasını r.cost.coordinates
maliyet yüzey katmanımıza karşı çalıştırabiliriz.
Başlangıç koordinatı için vornoi merkezini kullanın. Son koordinat için, bölgenizin köşelerinden birini seçin. Daha pürüzsüz sonuçlar verdiği için 'Şövalyeler Turu' kullanmanızı öneririm.
Sonuç, bir voronoi merkezinden eşit seyahat süresi çizgilerini gösterir. Bantların binaların etrafına nasıl sarıldığına dikkat edin.
Bunu en iyi nasıl otomatik hale getireceğinden emin değilim. Toplu iş modunu işleyebilir veya pyqgis ile yapabilirsiniz.
3. Adım. Rasterleri birleştir
Bu muhtemelen koda ihtiyaç duyacaktır. Algoritma
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
Bu yaklaşım, her hücrenin, engelleri dikkate alarak, en yakın olduğu voronoi merkezi tarafından kategorize edildiği bir raster vermelidir.
Daha sonra raster-çokgene kullanabilirsiniz. Daha sonra "adım" efekti artefaktlarını taramadan kaldırmak için Generalize eklentisini kullanabilirsiniz .
Adım 2 ve 3'teki belirsizlikler için özür dilerim ... Birisinin daha şık bir çözümle çalmasını umuyorum :)