Мне нужно подключить автобусные остановки (точки) к сетевому уровню (данные OSM). Эти автобусные остановки не лежат прямо на линиях (см. Скриншот), и их местоположение не должно быть перемещено. Я использую PostGIS, pgrouting и QGIS, и сеть уже маршрутизируется с исходными и целевыми столбцами и т. Д.
В основном я хочу сделать две вещи потом:
- Получение расстояния между автобусными остановками с использованием анализа кратчайшего пути.
- Создание изохрон с пешим расстоянием от автобусной остановки с использованием сети OSM.
Для получения точных значений необходимо, чтобы маршрут «начинался» и «останавливался» ближе всего к автобусным остановкам. Во многих случаях ближайший существующий узел будет слишком далеко, чтобы получить точные значения. Но не должно быть маршрутов к фактическому месту расположения автобусной остановки. В моем примере на рисунке вы можете видеть, как должна выглядеть маршрутизация между остановками.
Есть ли возможность автоматически вставлять в сеть новые узлы (LINESTRING), которые находятся ближе всего к автобусным остановкам, или есть возможность начать маршрутизацию на своего рода «фиктивной точке», которая устанавливается только для запроса (аналогично тому, что для дороги плагин графика в QGIS делает)?
Это мое полное решение. Это требует своего рода взлома для выполнения разделения: я получаю точки на линиях (способы использования терминологии OSM)
ST_ClosestPoint
, а затем буферизую их на очень маленьком расстоянии, чтобы разделение действительно заработало. В противном случае неточности / ошибки округления препятствовали расщеплению.Проблема заключается в том, что он генерирует два разбиения в каждой строке на точку (из-за буферизации). Для моего использования это было хорошо, так как позже я перенаправил между точками разделения, ближайшими к исходным точкам, которые были вне линии, и это могла быть любая из двух точек разделения пересечения буфера линии.
Я начал с загрузки данных OSM и добавления их в Postgres:
Разделение путей с использованием буфера:
Создайте топологию, необходимую для маршрутизации с помощью pgrouting:
источник
Поскольку я работаю над аналогичной задачей, я просто хотел рассказать о подходе, который я использую в настоящее время. При этом используется GRASS GIS, но, поскольку мои эксперименты с PostGIS пошли, довольно сложно добавить несколько новых точек в существующие LineStrings, разделив эти LineStrings в соответствующих местах - хотя я уверен, что есть удобное решение.
Теперь я использовал
v.net
функцию GRASS GIS, используя опциюconnect
. Просто выберитеinput vector line layer
иpoints layer
. Существует возможность либо привязать точки к ближайшей точке на линиях, либо создать новые соединения между ближайшей точкой на линиях и новой точкой.Вот изображение до и после. С правой стороны, для каждой точки слоя точек был добавлен узел в дорожной сети:
После этого в PostGIS, после создания
..._vertices_pgr
таблицы вне дорожной сети, просто назначьте свои точки ближайшей вершине, чтобы вы могли использовать их в своих запросах маршрутизации. Для этой задачи вы можете использоватьST_ClosestPoint
функцию, которую сделал @Setraworks в своем ответе.Недостатками этого подхода являются:
Этот подход хорошо работает, если у вас есть определенное количество точек, которые нужно добавить в дорожную сеть (как в примере с автобусными остановками).
Если кто-нибудь может привести рабочий пример с использованием PostGIS, я бы хотел прочитать об этом!
источник
Существует сообщение, в котором обсуждается аналогичная проблема. Вы можете увидеть это сообщение по следующему адресу: http://osdir.com/ml/qgis-user-gis/2011-11/msg00220.html.
источник