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