Як розділити дороги ОСМ на окремі відрізки на перехрестях?


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))))) Як 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-дороги Shapefiles неможливо відрізнити між перехрестями та над / підходами. Ви створите перехрестя, яких насправді не існує, якщо розділити всі, здавалося б, перетинаючі дороги.

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


1
Саме так . Це також ще одна помилка, яку деякі люди роблять, обробляючи дані navteq і teleatlas. Підземний переїзд - це біль, але реальність.
Рагі Ясер Бурхум

1
Погодьтеся. Ласкаво просимо до ГІС, де дані завжди більш-менш погані
simplexio

3

Щодо вашої загальної проблеми з використанням pgRouting: Я думаю, що @Uffer, @GisStudent та інші, які показують, як використовувати "OSC і т.д.", вони мають рацію. Дотримуйтесь підказки "найкращих практик" та "стандартів" ...

Про ваше запитання: "розділити дороги на окремі відрізки на перехрестях" або "як видалити всі початкові нерозрізнені геометрії". Я можу допомогти, якщо ви покажете тут свої результати, крок за кроком ...

Перший крок: аналіз топології

 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. Це більш ефективно, оскільки він може порівнювати ідентифікацію вузлів, а не робити геометричні обчислення.


1

Одним із способів вирішити це алгоритмічно було б додати початкову та кінцеву точку кожної цілої дороги до набору "перехресть", щоб ви могли бути впевнені, що кожен відрізок знаходиться між двома перехрестями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.