Це, звичайно, можливо при растрах.
Цей скріншот, сподіваємось, чіткіше показує проблему. Частина B вороного ближче "як ворона летить" до початкового вороного центру, але це не враховує того факту, що ходити довше будівлі буде потрібно довше. Я розумію питання ОП в тому, що вороному потрібно врахувати цю додаткову відстань, щоб пройти навколо будівлі.
Мені подобається пропозиція від @Guillaume. Однак, коли я спробував це, у мене виникли проблеми r.grow.distance
з дотриманням маски (див. Нижче. Пульсації не повинні проходити крізь будівлі).
Мої знання про траву не такі сильні, як це могло б бути, тому, можливо, я роблю щось дурне. Однозначно, спочатку перевірте цю пропозицію, оскільки це буде набагато менше роботи, ніж моя ;-)
Крок 1 - Створіть поверхню витрат
Перший крок - створити поверхню витрат. Це потрібно зробити лише один раз.
- створити редагований шар, отвори та інше.
- додайте поле під назвою "одиниця", встановіть його на 1.
- використовуючи полігон до растру на вашому "пробитому" векторному шарі (той, у якому є отвори), використовуючи поле "одиниця". Тепер у вас є шар "маска", де 1 - це вільний простір, а 0 - це будівництво.
використовуйте растровий калькулятор, щоб перетворити це на поверхню витрат. Я встановлю "на відкритому повітрі" 1 і "в приміщенні" на 9999. Це зробить переміщення по будівлях надзвичайно важким.
(("маска @ 1" = 1) * 1) + (("маска @ 1" = 0) * 9999)
Ви можете отримати більш "органічні" результати, додавши трохи шуму на поверхню витрат (наприклад, використовуйте випадкове число від 1 до 3, а не просто 1 для зовнішніх пікселів.)
Крок 2. Створіть сукупні растрові витрати для кожного вороного центру
Тепер ми можемо запустити (для однієї вороної комірки одночасно) алгоритм GRASS відповідно r.cost.coordinates
до нашого поверхневого шару витрат.
Для початку координати скористайтеся центром vornoi. Для кінцевої координати виберіть один з кутів вашої області. Я пропоную використовувати "Найт-тур", оскільки це дає більш плавні результати.
Результат показує лінії рівного часу подорожі від одного вороного центру. Зверніть увагу, як смуги обмотуються навколо будівель.
Не знаєте, як найкраще це автоматизувати. Можливо обробка пакетного режиму, або виконана в pyqgis.
Крок 3. Об'єднайте растри
Можливо, для цього знадобиться код. Алгоритм був би
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
Такий підхід повинен дати растр, коли кожна клітина класифікується за центром вороного, який є найближчим до неї, з урахуванням перешкод.
Потім можна використовувати растр-до-багатокутник. Потім ви можете використовувати плагін Generalize для видалення артефактів ефекту "ступінь" з растру.
Вибачте за невизначеність на кроках 2 і 3 ... Я сподіваюся, що хтось зазіхає на більш елегантне рішення :)