У меня проблемы с запросом. У меня есть сеть строк, каждая из которых имеет значение в столбце n_type. Это может быть одним из нескольких вариантов. Я хотел бы создать новую таблицу, которая группирует любые строки линий того же типа и которые образуют непрерывную линию.
Перед:
После:
Вот что у меня так далеко. Он возвращает результаты, но они не имеют никакого смысла - типы не совпадают, и он возвращает слишком много функций.
Также обратите внимание, что я определил «непрерывную» как любую линию в пределах 5 футов от соседа и встречающуюся под углом менее 30 градусов.
WITH RECURSIVE all_links (i, pk_uid, n_type, geom) AS (
SELECT 1 AS i,
pk_uid,
n_type,
geom
FROM network
WHERE n_type != 'none'
UNION ALL
SELECT a.i + 1,
b.pk_uid,
b.n_type,
b.geom
FROM network b, all_links a
WHERE b.n_type = a.n_type
AND b.geom <#> a.geom <= 5 --lines are continuous if within 5 feet of neighbor
AND ABS( DEGREES( 3*pi() - st_azimuth(st_startpoint(a.geom),st_endpoint(a.geom)) + st_azimuth(st_startpoint(b.geom),st_endpoint(b.geom)))::int % 360 - 180) <= 30 ) --only take links within 30 degrees of the same angle
SELECT i, n_type, ST_Union(the_geom) FROM all_links GROUP BY i, n_type
Я предположил, что рекурсивный запрос - это путь, но я счастлив, что оказался неправ в этом. Рекурсивы немного трудно уловить.
Изменить: я должен также добавить, что я уже пытался агрегировать с использованием ST_Union и ST_Linemerge, а затем выводить результат. Это своего рода работает, но не учитывает пересечения> 30 градусов и также не может соблюдать пятифутовый допуск для подключения.
a.pk_uid != b.pk_uid
Ответы:
Ваше решение, по крайней мере, пропускает предварительный заказ линейных компонентов, как сказал Джон Барса.
Я бы сказал, что рекурсивные запросы очень и очень трудно поддается поиску.
Вы должны попытаться повторить поведение ST_Linemerge в новой функции базы данных. Сначала я бы попытался взглянуть на источник реализации ST_Linemerge и повторить его, чтобы получить 30-градусный угол.
Чтобы отбросить из агрегата сегменты, которые не находятся под углом <30 градусов, вы должны сравнить их ВНУТРИ цикла агрегации.
источник