Это, конечно, возможно с растрами.
Надеемся, что этот скриншот показывает проблему более четко. Часть В вороноя «ближе к лету» ближе к первоначальному центру вороноя, но это не принимает во внимание тот факт, что для обхода здания потребуется больше времени. Мое понимание вопроса ОП заключается в том, что вороной должен учитывать это дополнительное расстояние, чтобы пройтись вокруг здания.
Мне нравится предложение от @Guillaume. Однако, когда я попробовал это, у меня были проблемы с получением r.grow.distance
маски (см. Ниже. Рябь не должна проходить через здания).
Мои знания о траве не так сильны, как могли бы, поэтому, возможно, я делаю что-то глупое. Определенно, сначала проверьте это предложение, так как оно будет намного меньше работы, чем мое ;-)
Шаг 1 - Создайте поверхность затрат
Первый шаг - создать поверхность затрат. Это нужно сделать только один раз.
- создать редактируемый слой, отверстия и все.
- добавьте поле с именем 'unit', установите его в 1.
- используя полигон-растр на «вырубленном» векторном слое (который имеет отверстия), используя поле «unit». Теперь у вас есть слой «маска», где 1 - свободное пространство, а 0 - здание.
используйте растровый калькулятор, чтобы превратить это в поверхность затрат. Я установлю «на улице» на 1 и «в помещении» на 9999. Это затруднит передвижение по зданиям.
(( "Маска @ 1" = 1) * 1) + (( "маска @ 1" = 0) * 9999)
Вы можете получить более «естественные» результаты, добавив немного шума на поверхность затрат (например, используйте случайное число от 1 до 3, а не просто 1 для наружных пикселей).
Шаг 2. Создайте растры совокупной стоимости для каждого вороного центра
Теперь мы можем запустить (для одной вороной ячейки за раз) алгоритм GRASS r.cost.coordinates
против нашего поверхностного слоя затрат.
Для начальной координаты используйте центр vornoi. В качестве конечной координаты выберите один из углов вашей области. Я предлагаю использовать «Knights Tour», поскольку это дает более плавные результаты.
Результат показывает линии равного времени прохождения от одного вороного центра. Обратите внимание, как полосы обвивают здания.
Не уверен, как лучше всего это автоматизировать. Может быть, обработка в пакетном режиме или в 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 для удаления артефактов эффекта «step» из растра.
Приносим извинения за неопределенность на шагах 2 и 3 ... Я надеюсь, что кто-то присоединится к более элегантному решению :)