Я пытаюсь определить, где дороги пересекаются друг с другом, и выделить точку на этом перекрестке, указав количество дорог, которые образуют перекресток.
Мне было интересно, есть ли какой-нибудь способ использования ST_NumPoints для достижения этой цели, но я не могу понять, что мне следует делать. Что я сделал, так это создал таблицу точек, где линии пересекаются, используя следующий код:
CREATE TABLE test_points as
SELECT
ST_Intersection(a.geom, b.geom),
a.gid
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom);
Если я запускаю это на примере дорог, я получаю следующую сетку точек (дороги показаны для иллюстрации):
Если я осматриваю одну из точек, я вижу, что есть много точек, наложенных друг на друга:
GID здесь - это идентификатор дороги, но я не понимаю, почему есть много точек. Я могу понять, что 4 балла подсчитываются за центральное пересечение дорог, но здесь перечислено 12 баллов. Есть ли лучший способ выполнить этот расчет в PostGIS?
COUNT()
таких какCOUNT(ST_Touches(..))
и,COUNT(ST_Intersection(..))
но это, похоже, не работает, как все значения12
.Это немного сложнее, чем вы могли ожидать. Это потому, что не существует хорошего способа анализа отношений для более чем пары. Вы не можете поместить три строки в функцию и спросить, пересекаются ли все они.
Но, по крайней мере, один из подходов может заключаться в том, чтобы сначала найти перекрестки, а затем проверить, сколько дорог касается каждого перекрестка (все это можно сделать в одном запросе).
Если ваши дороги идеально соединены друг с другом, и нет никаких дорог, проходящих через перекресток, то вы можете сделать что-то вроде этого (не проверено):
отредактировано с забытым предложением группы (все еще не проверено):
Если дороги не соединены надлежащим образом и / или некоторые дороги проходят через перекресток, это более сложно.
НТН
Никлас
источник
distinct_crosspoints ,roads
моей таблицы (roads_test
)? Я попробовал это, но потом получил ошибкуgeom
из-за неоднозначности.Если линия A (id 1) пересекает линию B (id 2), это точка пересечения, в которой мы нуждаемся. Но линия B также пересекает линию A в той же точке. Но нам не нужно это дважды. Вот почему я использую
a.gid < b.gid
вместоa.gid != b.gid
источник