Как разбить дороги OSM на отдельные сегменты на перекрестках?


10

Я хочу создать дорожную сеть для использования с 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)

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


Согласно документации, ST_Split не возвращает исходную неразделенную геометрию. Что это за лишний «.geom» висит в последней закрывающей скобке в первой строке вашего оператора SELECT? Может быть так просто, как удалить это.
Scro

@ Scro, о чем .geomты говоришь? Не могу определить это!
DJQ

Технически, я думаю, это будет вторая строка оператора SELECT. Также я имею в виду создание таблицы split_roads. Это строка, которая заканчивается на «))). Geom) как geom».
Scro

хм, я получаю ошибку, когда я это делаю. 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.
DJQ

Выглядела ли вся строка так: ST_GeomFromEWKB ((ST_Dump (ST_Split (g.geom, blade.geom)))) As geom,
Scro

Ответы:


6

Не настоящее решение вашей проблемы, но попробуйте osm2po ... он создает идеальный код SQL для маршрутизации в pgrouting: http://osm2po.de/


Спасибо за предложение. Я попытался , osm2pgroutingно это требует больше памяти , чем мой сервер имеет и заканчивается без отделки.
djq

2
@djq osm2po может обрабатывать гораздо большие файлы, чем osm2pgrouting. Это может даже загрузить planet.osm
underdark

ах, я изначально думал, что osm2poэто опечатка. Есть ли прямая установка в Ubuntu?
djq

Это готовый скомпилированный файл JAR (java). Просто запустите его, как описано на сайте.
ГИС студент

11

Простой ответ: не надо. Вы не должны делать это таким образом.

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

Вам нужно испачкать руки оригинальным файлом OSM, если вы не хотите использовать существующие инструменты, такие как osm2pgrouting (где сеть достаточно мала) или osm2po.


1
Точно . Это также еще одна ошибка, которую делают некоторые люди, когда обрабатывают данные navteq и teleatlas. Подземный переход / Эстакада - это боль, но реальность.
Раги Язер Бурхум

1
Согласен. Добро пожаловать в ГИС, где данные всегда более или менее плохие
simplexio

3

Что касается вашей общей проблемы с использованием pgRouting: я думаю, что @Uffer, @GisStudent и другие, которые показывают, как использовать «OSC & etc.», они правы. Следуйте подсказкам «лучших практик» и «стандартов» ...

О вашем вопросе: «разбить дороги на отдельные отрезки на перекрестках» или «как удалить все исходные неразделенные геометрии». Я могу помочь, если вы покажете здесь свои результаты, шаг за шагом ...

Первый шаг: анализ топологии

 CREATE TABLE split_points_topo as
  SELECT     
    a.gid as gid_a, b.gid  as gid_b, ST_Relation(a.geom, b.geom) as DE9IM_code
  FROM
    roads as a,
    roads as b
  WHERE a.gid != b.gid AND a.geom && b.geom;

 SELECT DISTINCT st_geometryType(geom) FROM roads;
 SELECT DISTINCT DE9IM_code FROM split_points_topo;
 -- list here the results o these two queries!  ... after we can continue.

2

Еще одно «нереальное решение вашей проблемы», но наш конвертер OSM разделяется на пересечениях, в то время как он конвертирует из OSM в SHP. Это более эффективно, поскольку позволяет сравнивать ID узлов, а не выполнять геометрические вычисления.


1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.