Выбор узлов, разделяющих отрезки линии
Я хочу выбрать узлы, разделяющие отрезки линии в слое. Я хочу выбирать узлы только там, где они пересекаются двумя линиями, а НЕ когда они встречаются более чем с двумя линиями (например, пересечение 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'