Я хочу создать дорожную сеть для использования с pgRouting, используя данные OpenStreetMap. Я загрузил шейп-файл из GeoFabrik в таблицу Postgres (с включенной PostGIS). Однако у меня была одна проблема: дороги не всегда заканчиваются на перекрестках, поэтому я решил разделить их на каждом перекрестке или перекрестке.
Чтобы определить все перекрестки, где дороги пересекались или пересекались, я использовал следующее SQL
(аналогично предыдущему вопросу):
CREATE TABLE split_points as
SELECT DISTINCT
ST_GeometryN(ST_Intersection(a.geom, b.geom),1) as geom
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom)
OR
ST_Crosses(a.geom, b.geom)
AND a.gid != b.gid
GROUP BY
ST_Intersection(a.geom, b.geom);
Теперь я хочу разделить дороги, используя эти точки. Я использовал следующий подход:
CREATE TABLE split_roads as
SELECT
ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))).geom) As geom,
generate_series(1,ST_NumGeometries((ST_Split(g.geom, blade.geom)))) as gid
FROM
split_points as blade,
roads as g
WHERE
ST_Intersects(g.geom, blade.geom);
Проблема с этим разделенным подходом состоит в том, что полная длина дороги остается в дополнение ко всем разделенным участкам. Чтобы удалить эти неразделенные геометрии дороги, которые были включены, я использовал ST_Equals()
функцию, чтобы идентифицировать их и удалить их:
DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)
Тем не менее, этот подход не удаляет все исходные неразделенные геометрии (хотя он удаляет некоторые из них). Есть ли лучший подход для удаления (или всего), чтобы в таблице были только разделенные геометрии?
.geom
ты говоришь? Не могу определить это!ERROR: function st_geomfromewkb(geometry_dump) does not exist LINE 4: ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))))... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Ответы:
Не настоящее решение вашей проблемы, но попробуйте osm2po ... он создает идеальный код SQL для маршрутизации в pgrouting: http://osm2po.de/
источник
osm2pgrouting
но это требует больше памяти , чем мой сервер имеет и заканчивается без отделки.osm2po
это опечатка. Есть ли прямая установка в Ubuntu?Простой ответ: не надо. Вы не должны делать это таким образом.
Из шейп-файлов дороги OSM невозможно различить перекрестки и переходы / переходы. Вы создадите перекрестки, которые не существуют в действительности, если вы разделите все, казалось бы, пересекающиеся дороги.
Вам нужно испачкать руки оригинальным файлом OSM, если вы не хотите использовать существующие инструменты, такие как osm2pgrouting (где сеть достаточно мала) или osm2po.
источник
Что касается вашей общей проблемы с использованием pgRouting: я думаю, что @Uffer, @GisStudent и другие, которые показывают, как использовать «OSC & etc.», они правы. Следуйте подсказкам «лучших практик» и «стандартов» ...
О вашем вопросе: «разбить дороги на отдельные отрезки на перекрестках» или «как удалить все исходные неразделенные геометрии». Я могу помочь, если вы покажете здесь свои результаты, шаг за шагом ...
Первый шаг: анализ топологии
источник
Еще одно «нереальное решение вашей проблемы», но наш конвертер OSM разделяется на пересечениях, в то время как он конвертирует из OSM в SHP. Это более эффективно, поскольку позволяет сравнивать ID узлов, а не выполнять геометрические вычисления.
источник
Один из способов решить ее алгоритмически - добавить начальную и конечную точки каждой дороги к набору «перекрестков», чтобы вы могли быть уверены, что каждый отрезок находится между двумя перекрестками.
источник