Гуляем по пересеченной местности в открытых ГИС: о базовых возможностях моделирования пеших перемещений на основе QGIS, GRASS и SAGA

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница является черновиком статьи.


Расчёт изохрон, оптимальных маршрутов и коридоров наименьших затрат для пеших перемещений на основе цифровых моделей рельефа в QGIS 3 (с использованием модулей GRASS и SAGA)

В статье рассмотрены решения некоторых отдельных, наиболее популярных задач, связанных с моделированием пеших перемещений (людей или животных) по пересечённой местности. Потребность в такого рода моделировании часто возникает при необходимости проложить маршрут в пешем походе, определить области перемещений пределах заданных временных интервалов, а также в задачах археологии, зоологии и других дисциплин.

Рассмотрим решения для трёх базовых проблем:

  1. Построение изохрон перемещений по пересеченной местности относительно одной или множества исходных точек
  2. Построение оптимального (с точки зрения временных затрат) маршрута по пересеченной местности между двумя точками
  3. Построение коридора оптимальных временных затрат между двумя точками

Для подготовки данных и моделирования будем использовать открытый пакет QGIS 3.0.2 с модулями GRASS и SAGA, вызов которых доступен из панели анализа. Тестирование осуществлялось в средах Windows 10 x64 и Linux Mint 18.2 x64

Подготовка данных

Для демонстрации будет использоваться набор данных для территории Республики Тыва, в горной местности к северо-востоку от Кызыла. У озера Маны-Холь. В качестве источников использовались:

  • Данные OpenStreetMap. Способы их загрузки неоднократно описывались. В статье использовалась архивная выгрузка с NextGIS на Тыву. От OSM нам понадобятся границы озёр (а также, опционально, дороги, застройка, типы землепользования).
  • Данные о рельефе. Чем точнее ваши данные, тем лучше. В статье использовались данные с http://viewfinderpanoramas.org/dem3.html, где собраны данные на весь мир с разрешением 3 секунды.
  • Данные о типах подстилающей поверхности. В статье использовались данные MODIS Global Land Cover Climatology. Можно обойтись и без этих данных, в статье они приводятся только в целях демонстрации принципов их учёта.

Архив с данными для примера из статьи можно загрузить здесь.

Итак, приступаем к подготовке данных. Для начала загрузим всё необходимое в QGIS:

  • Векторные слои с препятствиями. Это могут быть любые объекты, по которым нельзя ходить. В нашем случае это только площадная гидрография из OSM (озёра, реки). Потенциально это может быть что угодно - здания, закрытые территории карьеров, военные полигоны и прочее.
  • Загруженные данные по рельефу в .hgt
  • Данные по типам подстилающей поверхности
  • Спутниковая подложка Bing из плагина QuickMapServices для наглядности.


Ogis dem walking 1.png


Соберём данные по рельефу в единый растровый набор. Для этого воспользуемся функцией merge из GDAL - Raster miscellaneous.


Ogis dem walking 2.png


Получившийся временный слой сохраним в geotiff, с которым продолжим работу (для этого в контекстном меню слоя нужно выбрать "сохранить как". При этом в процессе сохранения произведем некоторые манипуляции. Во-первых, выберем правильную систему координат, например UTM для подходящей зоны. Для тестового участка это зона 47N (EPSG:32647). Во-вторых, для будущих задач нам потребуются данные о рельефе такие, у которых пространственное разрешение по X и Y совпадает (т.е. пиксели должны быть квадратными или почти квадратными, с пренебрежимо малой разницей). Для этого вручную устанавливаем одинаковое разрешение для обоих измерений. Проще всего приравнять большее разрешение к меньшему. Результат запишем в файл DEM.tif


Ogis dem walking 3.png


Теперь приведем к нужному виду данные о типах подстилающей поверхности. Через пункт контекстного меню "сохранить как" настраиваем нужное: устанавливаем систему координат UTM 47N и задаем новый охват равный охвату слоя с рельефом, для этого есть специальная кнопка. Всё лишнее будет отсечено. Результат сохраним в файл land_cover_cut.tif


Ogis dem walking 4.png


Слой с площадной гидрографией нам интересен во многих смыслах. Сохраним слой water-polygon в систему координат UTM 47N, называем water.geojson


Ogis dem walking 5.png


Одной из наших задач будет расчёт зон доступности озера Маны-Холь, поэтому по ходу дела получим точки его берега. Для этого выделяем в слое water это озеро, и с помощью инструмента Extract Verticies получаем слой с точками на береговой линии выделенного объекта. Сохраним его как lake-points.geojson


Ogis dem walking 6.png


Теперь поработаем со слоями препятствий на примере той же воды. На самом деле нам нужно в слое с ЦМР (DEM.tif) установить все пиксели с препятствиями в No Data. Сделать это можно множеством способов, посмотрим на один из них. Первый шаг - растеризация векторного слоя. Используем инструмент SAGA - Raster creation tools. Задаём в качестве исходного слоя water, Output Values устанавливаем в data/no-data, указываем охват равный охвату слоя DEM (это можно сделать через контекстное меню справа от поля ввода значений), а также задаём пространственное разрешение (cellsize) равным выбранному разрешению для слоя DEM, можно выбрать значение меньше.


Ogis dem walking 7.png


В результате получаем растровый слой, в котором на месте воды пиксели имеют значение 1, а во всех остальных местах - no data.


Ogis dem walking 8.png


Теперь обращаем значения data / no-data с помощью простого инструмента SAGA - Raster tools - Invert data/no-data.


Ogis dem walking 9.png


Теперь всё наоборот - там, где были объекты, теперь no-data. Во всех остальных местах пиксели имеют значение 1. Сохраним этот набор данных в water_inverted.tif

Это то, что нам нужно. Теперь можно простым способом превратить соответствующие пиксели ЦМР в no data. Для этого открываем калькулятор растров (в меню Raster), и просто перемножаем слой с ЦМР и слой water_inverted. То есть задаём такое выражение, которое расчитаем в границах DEM.tif. Результат сохраним в DEM_masked.tif.

"DEM@1"*"water_inverted@1"


Ogis dem walking 10.png


Результат - желанная ЦМР с "дырками".


Ogis dem walking 11.png


Аналогичным образом можно пометить как no-data любые другие векторные полигоны, в зависимости от ваших задач и территории. Чтобы закончить подготовку основных данных, создадим два векторных слоя (через меню Layer - Create Layer), каждый из которых будет содержать по одной точке. Один слой назовём start_point, второй end_point - это точки, между которыми мы будем строить оптимальный маршрут и коридор наименьших затрат. Также у нас уже есть слой с точками по берегу озера - относительно них будут рассчитываться зоны доступности.


Ogis dem walking 12.png


Расчёт поля стоимости перемещений

Основная задача, лежащая в основе многих последующих расчётов, это получение поля стоимости перемещений, то есть такого растра, в каждой ячейке которого хранилась бы стоимость (например, в минутах) достижения этой ячейки из одной или множества заданных в пространстве точек. Для расчёта такого поля существует два подхода:

  • Интерактивный расчёт стоимостей перемещения из заданных точек. Это более сложный подход, и он востребован в тех случаях, когда невозможно назначить каждой конкретной ячейке пространства определенную стоимость её пересечения (например, если пересечение ячейки в разные стороны стоит разную цену). Одна из вариаций такого подхода доступна в модуле GRASS r.walk.
  • Назначение каждой ячейке базового пространства (например ЦМР) константной стоимости её пересечения, и расчёт поля стоимости от заданных точек по этим константным значениям. Это более простой подход, и его проще реализовать для произвольной функции перемещений в ГИС. В этом поможет модуль GRASS r.cost.


Попробуем разобраться с обоими подходами.

С использованием модуля r.walk

Модуль r.walk предназначен непосредственно для расчёта стоимости перемещений по пересеченной местности с учётом некоторых дополнительных условий. Остановимся на основных моментах. В QGIS запустить r.walk можно через панель анализа в GRASS - raster - r.walk.points

Основные входные данные: ЦМР (elevation raster map) и слой с затратами, связанными с типом подстилающей поверхности (friction cost).

С ЦМР всё ясно, она у нас уже готова. Значения в ячейках растра с friction cost будут учитываться так: это количество дополнительных секунд, которые будут затрачиваться на преодоление 1 метра соответствующем пикселе. А вот такого набора данных мы ещё не подготовили! Об этом несколько позже, а пока разберёмся с другими параметрами.

Start points - точки, относительно которых будет производиться расчёт стоимостей. End points - опциональный параметр, если указать какой-то слой, то расчёт стоимостей будет прекращен по достижению алгоритмом поиска точек в этом слое.

Далее следуют настройки корневой формулы, по которой будет производиться расчёт. Процитируем, переведем и прокомментируем документацию:

Главная формула расчёта:

T = a*delta_S + b*delta_H_uphill + c*delta_H_moderate_downhill + d*delta_H_steep_downhill

где:

T - время движения в секундах,

delta S - преодолеваемое горизонтальное расстояние в метрах (берётся из ЦМР),

delta H - преодолеваемая разница высот в метрах (берётся из ЦМР),

a, b, c, d - коэффициенты, связанные с движением в разных условиях.


a: время в секундах, которое требуется для преодоления 1 метра на ровной поверхности.

b: дополнительное время в секундах, затрачиваемое на метр перемены высоты на подъёмах.

c: дополнительное время в секундах, затрачиваемое на метр перемены высоты на плавных спусках (используются положительные значения для уменьшения цены)

d: дополнительное время в секундах, затрачиваемое на метр перемены высоты на крутых спусках (используются отрицательные значения для увеличения стоимости)


Значения по умолчанию были предложены как стандартные для среднестатистического человека. Вы можете, изменяя их, моделировать перемещения для специальных категорий людей или для определенных видов зверей.


Далее определяется коэффициент Lambda для связи полученной по формуле выше T и поверхности friction cost. Связь осуществляется по формуле:

total cost = movement time cost + lambda * friction costs * delta_S

где:

movement time cost - время движения в секундах, рассчитанное по формуле выше,

lamda - обсуждаемый коэффициент,

friction costs - значение friction cost в текущем месте,

delta S - преодолеваемое горизонтальное расстояние в метрах (берётся из ЦМР),


Следующий параметр - slope factor. По сути, он участвует в формуле расчёта T как показатель перехода от плавного спуска (когда спуск ускоряет перемещение и приятен) к крутому спуску (когда уклон начинает работать наоборот, замедлять перемещение). Значение по умолчанию (-0.2125) соответствует тангенсу 12 градусов, т.е. угол склона меньше 12 градусов будет восприниматься как плавный, а больше 12 градусов - как крутой.


Параметр Maximum cumulative cost опциональный и определяет цену, по достижению которой расчёты приостанавливаются. Например, вас интересуют только территории в пределах 2 часовой доступности, тогда следует установить этот параметр равным 7200 (в секундах).


Таким образом, с помощью поверхности friction cost, коэффициентов a,b,c,d и фактора угла уклона можно достаточно гибко моделировать перемещения в рамках предлагаемой авторами модели.


Оставим значения коэффициентов по умолчанию, и займемся подготовкой поверхности friction cost. Здесь всё зависит от выбранной вами модели типов подстилающей поверхности и собственных соображений о том, какой тип как влияет на скорость перемещения. Если совсем не охота об этом размышлять, можно не использовать никакой карты типов земель и просто создать в калькуляторе растров набор данных, состоящий из одних нулей. Если дать r.walk такой растр как friction cost, то на основную формулу просто не будет накладываться никаких дополнительных ограничений. Давайте попробуем вместе. В калькуляторе растров в границах слоя DEM создадим новый растр zero_frictions.tif по формуле

 0 


Ogis dem walking 13.png


И теперь запустим r.walk с этим растром в качестве friction cost, нашей ЦМР и точками береговой линии озера в качестве Start points. Все остальные параметры оставим по умолчанию, и посмотрим, какие результаты будут получены.


Ogis dem walking 14.png


После расчётов мы получаем два новых набора данных: Cumulative cost и Movement Directions.


Ogis dem walking 15.png
Ogis dem walking 16.png


Они оба полезны и будут использованы в дальнейших расчётах. Растр Cumulative cost в каждой ячейке содержит минимальное время перемещения от озера до этой ячейки в секундах. Растр Movement Directions содержит в каждой ячейке направление, в которые был совершен переход при расчёте Cumulative cost. По растру Cumulative cost хорошо видны неоднородности, особенно в областях с наибольшими перепадами высот. Также очевидно, что для встрече с озером (пикселями no-data) алгоритму пришлось их обходить.


С использованием альтернативных функций перемещения и r.cost

Построение оптимального маршрута

Расчёт коридора наименьших затрат

Дополнительные сведения

Для QGIS 2.* существует плагин Walking Time, использующий функцию Тоблера для построения маршрута.

Источники