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