Выбор узлов, разделяющих отрезки линии

Я хочу выбрать узлы, разделяющие отрезки линии в слое. Я хочу выбирать узлы только там, где они пересекаются двумя линиями, а НЕ когда они встречаются более чем с двумя линиями (например, пересечение T или пересечение с четырьмя путями и т. Д.).

Вот лучшая фотография, которую я могу дать (у меня нет репутации публиковать фотографии). Линия --- слева - это первый сегмент, а строка --x - x - x справа - второй. O - это узел в середине, который я хочу выбрать.

-------------------------------------- 0 - х --- х - х --x --- х --- х - х - х - х - х - х - х - х

Я НЕ хочу выбирать узлы, где более двух линий касаются узла.

Пока я пробовал этот запрос

CREATE TABLE contacts_st_touching_faults as
SELECT ST_Intersection(a.the_geom, b.the_geom), Count(Distinct a.gid) = 2
FROM final_layer as a, final_layer as b
WHERE ST_Touches(a.the_geom, b.the_geom)
AND a.gid != b.gid
GROUP BY ST_Intersection(a.the_geom, b.the_geom)

Когда я запускаю этот запрос, он дает мне пересечения с пересекающимися более чем двумя линиями (пересечения T и пересечения с 4 путями).

Я также попытался добавить ST_intersects, и это, похоже, не сработало так же, как ST_touches, но если вы знаете, как заставить их работать или каким-либо другим способом, это было бы очень признательно!

Спасибо за помощь!

2 ответа

Решение

Это должно работать:

WITH contacts AS(
SELECT a.gid AS gid1,b.gid AS gid2, ST_Intersection(a.the_geom, b.the_geom) AS intersection
FROM final_layer as a, final_layer as b
WHERE ST_Touches(a.the_geom, b.the_geom)
AND a.gid<b.gid
)
SELECT *
FROM contacts c1
LEFT JOIN contacts c2
  ON ((c1.gid1=c2.gid1 AND c1.gid2<>c2.gid2) OR (c1.gid1=c2.gid2 AND c1.gid1<>c1.gid2))
  AND c1.intersection=c2.intersection
WHERE c2.gid1 IS NULL;

Это будет работать лучше, если ST_Intersection будет перемещен в окончательный запрос, но я хотел сделать это проще.

Это перечислит узлы с пересекающимися линиями буксировки.

    SELECT array_agg (gid) AS gids, count (gid) AS count, geom
    ОТ 
      - перечисляет все вершины (точки) из линий
      (ВЫБЕРИТЕ gid, (ST_DumpPoints(geom)). Geom AS geom
      FROM lines_layer) AS p
    GROUP BY p.geom
    Имея количество (gid) = 2
    ORDER BY count(gid);

Для всех узлов замените '= 2' на '> 1'

Другие вопросы по тегам