Построение карты изохрон

11/06/2011
Подписка RSS

изохроны, транспортная доступность, catchment area, drive-time distance

В данном методе рассматривается способ создания карт изохрон, т.е. изолиний одновременности того или иного события.

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

В статье «Гений места в цепочках поставок» мы рассматривали вопрос влияния городов на окружающее пространство и обсуждали форму поля влияния для случая, когда в качестве транспортной сети выступает «воздух», т.е. из любой точки географического пространства можно попасть в заданный город со скоростью ковра-самолёта. В этом случае, полученное поле влияния одного города представляло собой ячейку Вороного, а совокупность полей всех городов – диаграмму Вороного.

В реальной городской среде попасть из пункта А в пункт Б по воздуху могут немногие, для прочих существует транспортная система, ограничивающая направления возможности движения и имеющая определённое сопротивление заданной скорости движения. Средняя скорость движения по транспортной сети зависит от класса дороги, скоростного режима, загруженности и пр.

В нашем расчёте мы будем учитывать влияние транспортной сети с учётом ряда идеализаций:

  • Предполагается, что транспортная сеть плоская, и не имеет уклонов. Это предположение верно для большинства городов европейской части РФ и мало влияет на автомобильный транспорт. Тем не менее, учёт уклона дорог необходим при анализе движения пешеходов
  • Все дороги равнозначны с точки зрения загруженности, пропускной способности и средней скорости движения. Характеристики дорожной сети неизменны
  • Отсутствует взаимное влияние пользователей транспортной сети (дороги всегда свободны)

На практике мы можем учесть все три вида идеализаций, введя среднее время движения от одного участка дороги к другому. Основная проблема в данном случае – доступность данных о скоростном режиме (т.е. статистика пробок и заторов).

Информацию о дорожной сети можно получить, благодаря усилиям проекта OpenStreetMap. Предварительно «обрезанные» по территориальному признаку файлы данных (формат OSM) для стран СНГ можно получить с помощью соответствующего сервиса GIS-LAB.

Теперь нам предстоит выполнить следующие шаги:

  1. Преобразовать данные о дорогах в граф дорожной сети и назначить «импеданс» (сопротивление) отдельным дугам дорожного графа
  2. От заданной целевой точки на графе дорожной сети (местоположении банка/школы и т.д.) необходимо сделать расчёт кратчайших расстояний (или времени движения) до ряда выбранных опорных точек
  3. По информации о времени движения до опорных точек интерполировать данные на оставшиеся регионы карты
  4. Визуализировать карту изохрон

К известным доступным инструментам, с помощью которых можно построить дорожный граф, относятся ГИС-система gvSIG с расширением Network Analysis, СУБД PostGIS с расширением pgRouting, а также СУБД Spatialite.

Как решить поставленную задачу в PostGIS, подробно описано в отличной статье «Creating Catchment Areas with pgRouting and QGIS». gvSIG позволяет вручную построить кратчайшие пути от заданной точки до опорных, но автоматизировать построение карты изохрон, где подобный расчёт нужно выполнить сотни раз, будет сложнее.

Spatialite – самое простое решение из представленных. Это однопользовательская СУБД на базе SQLite с поддержкой пространственных данных и алгоритмов их обработки. Также, Spatialite позволяет подключать источники данных в формате CVS/TXT и shape-файлы ESRI. Для установки достаточно скачать и установить оболочку и инструменты с сайта разработчика. Spatialite включает в себя программу импорта дорожной сети в формате файла OSM, после чего позволяет построить на базе имеющейся информации граф дорожной сети.

После скачивания OSM-файла с данными по Санкт-Петербургу с GIS-LAB, необходимо в командной строке указать:

spatialite_osm_net -o piter.osm -d piter.sqlite -T roads -m

На выходе мы получим базу данных piter.sqlite с информацией, размещающейся в таблице roads.

Теперь эти данные необходимо преобразовать в граф дорожной сети. Для этого, имеется графическая утилита spatialite-gui, с помощью которой необходимо запустить построитель графа:

После запуска построителя графа дорожной сети, в базе появится представление roads_net, к которому можно делать запросы для определения кратчайшего маршрута от узла A к узлу B. Поддерживаются два алгоритма поиска пути в графе: алгоритм Дейкстры и «А-star». Между ними можно переключаться, с помощью запроса:

UPDATE roads_net SET algorithm ='Dijkstra или A*';

Простейший запрос выглядит следующим образом: 

SELECT * FROM roads_net WHERE NodeFrom=304524784 AND NodeTo=25896396;

Результатом будет выборка, в первой строке которой – сводка по маршруту, содержащая «полилинию» с сегментами маршрута. Все остальные строки – это отдельные участки найденного кратчайшего маршрута, т.е. дуги дорожного графа. Поле cost содержит информацию о длине участков маршрута в метрах.

После того, как мы разобрались с построением маршрута между двумя точками, необходимо сделать выборку из N точек и рассчитать маршруты от заданной точки до каждой из них.

Самый простой способ сделать подобную выборку – это выбрать первые N (допустим, 500) уникальных строк из таблицы roads, упорядочив её случайным образом:

SELECT DISTINCT node_to FROM roads ORDER BY RANDOM() LIMIT 500;

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

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

Теперь, имея необходимые опорные точки, сформируем запрос для расчёта расстояний от заданной точки с кодом 304524784 до каждой из опорных:

SELECT NodeFrom, NodeTo, Cost, EndPoint(Geometry) As Geom FROM roads_net
INNER JOIN
(SELECT DISTINCT 304524784 as 'start_node', node_to FROM roads ORDER BY RANDOM() LIMIT 500)ON nodefrom = start_node AND nodeto=node_to 
WHERE ArcRowId IS NULL AND Geom IS NOT NULL;

Условие 'ArcRowId IS NULL' позволяет ограничиться выборкой только сводки (первой строки запроса) по кратчайшему маршруту между парами точек, в то время как 'Geom IS NOT NULL' отбрасывает те случаи, когда маршрут между двумя точками невозможно проложить.

Результаты расчёта сохраним в таблицу ISOCOST (добавим перед предыдущим запросом CREATE TABLE ISOCOST AS SELECT…). После чего в графической утилите конвертируем поле Geom (меню Recover geometry...) и установим систему географических координат (широта, долгота) WGS84 (SRID=4326).

Теперь визуализируем полученные результаты в системе QGIS:

Цветовой шкалой (зелёный–жёлтый–красный) показаны точки по степени их удаления от стартовой.

Далее, проведём интерполяцию данных и построим цветовую карту в QGIS с помощью расширения «Интерполяция»:

Как и ожидалось, из-за неравномерности выборки опорных точек, видны дефекты и структурные нарушения в полученной цветовой карте.

Теперь завершим построение карты изохрон, добавив изолинии с помощью модуля GDAL QGIS (меню «Растр»-«Изолинии»). В качестве метрики времени будет выступать расстояние в метрах по дорожной сети от целевой точки (т.к. мы приняли, что скорость движения по всем элементам транспортной сети одинакова):

Полученный результат – это практически карта изохрон, но в других единицах. Если говорить о классической карте, то вместо расстояний там должно быть указано время в пути. Преобразовав расстояние во время (исходя из средней скорости 30 км/ч), и изменив число цветовых классов по количеству часов в пути, получаем следующую карту:

Представленный вариант визуализации карт изохрон далеко не единственный: существует подход, при котором визуализацию выполняют с помощью набора цветовых линейных соединителей от целевой точки до опорных. В качестве опорных точек в этом случае обычно выступают анализируемые объекты. Например, целевая точка склад, опорные – точки доставки.

CREATE TABLE ISOCOST_LINES AS
SELECT
NodeFrom, NodeTo, (Cost/30000) As TCost, LineFromText('LINESTRING('||X(StartPoint(Geometry))||' '||Y(StartPoint(Geometry))||','||X(EndPoint(Geometry))||' '||Y(EndPoint(Geometry))||')',4326) AS GeoLines FROM roads_net
INNER JOIN
(SELECT DISTINCT 304524784 as 'start_node', node_to FROM roads ORDER BY RANDOM() LIMIT 500)
ON nodefrom = start_node AND nodeto = node_to WHERE ArcRowId IS NULL AND GeoLines IS NOT NULL ;

Теперь немного усложним задачу. Что делать, если центров влияния (целевых узлов) больше 1? Это означает, что нам необходимо провести описанную процедуру в каждой опорной точке несколько раз для каждого из центров, а потом выбрать минимальное расстояние из рассчитанных.

Сначала создаём таблицу sources с одной колонкой и записываем туда список целевых узлов (2 штуки). После этого, модифицируем исходный запрос:

CREATE TABLE AMATRIX AS SELECT NodeFrom, NodeTo, Cost, EndPoint(Geometry) AS Geom FROM roads_net INNER JOIN
(SELECT start_node, node_to FROM
(SELECT DISTINCT node_to FROM roads, sources ORDER BY RANDOM() LIMIT 500),sources)
ON nodefrom = start_node AND nodeto = node_to WHERE ArcRowId IS NULL AND Geom IS NOT NULL;

Находим минимальные расстояния для набора центров обслуживания (это не лучший пример запроса, но, возможно, агрегация в SQLite работает несколько иным способом, чем в других СУБД):

CREATE TABLE AMATRIX2 AS
SELECT NodeFrom,NodeTo,Cost,Geom FROM AMATRIX INNER JOIN
(SELECT NodeTo AS NT,Min(Cost) As MCost FROM AMATRIX GROUP BY NodeTo) AS A ON AMATRIX.NodeTo=A.NT AND AMATRIX.Cost=A.MCost ORDER BY NodeTo;

Получаем следующий результат:

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