Как разделить улицы города на перекрестки с помощью PostGIS?


Я хочу использовать PostGIS для разбивки улиц OpenStreetMap по пересечениям. Я пытаюсь поместить улицы города в графовую структуру, с узлами, образованными пересечениями и ребрами, нарисованными дорогами.

В настоящее время я использую команду ST_Intersection, которая разбивает дорогу на все возможные перестановки ее компонентов.

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

пересечения

1 2

1 ответ:

Для этого есть два варианта -

1) Используйте pgRouting , который учитывает такие вещи, как вертикальные различия между дорогами (например, туннели и эстакады)

2) Используйте этот SQL-код, где dc_streets_subset - Данные OSM для DC.

--Get a list of all intersections in city
CREATE TABLE dc_intersections AS 
SELECT DISTINCT (ST_DUMP(ST_INTERSECTION(a.geom, b.geom))).geom AS ix 
FROM dc_streets_subset a 
INNER JOIN dc_streets_subset b 
ON ST_INTERSECTS(a.geom,b.geom)
WHERE geometrytype(st_intersection(a.geom,b.geom)) = 'POINT';

CREATE INDEX ON dc_intersections USING gist(ix);

CREATE TABLE dc_union AS 
SELECT ST_UNION(geom) as geom
FROM dc_streets_subset;

CREATE INDEX ON dc_union USING gist(geom);

CREATE TABLE dc_segments AS
SELECT (ST_DUMP(ST_SPLIT(a.geom,b.ix))).geom
FROM dc_union a
INNER JOIN dc_intersections b
ON ST_INTERSECTS(a.geom, b.ix);