У мене виникають труднощі із запитом. У мене є мережа рядків рядків, кожна зі значенням у колонці 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