Estoy teniendo dificultades con una consulta. Tengo una red de cadenas lineales, cada una con un valor en la columna n_type. Esta puede ser una de las pocas opciones. Me gustaría generar una nueva tabla que agrupe las cadenas lineales que sean del mismo tipo y que formen una línea continua.
Antes de:

Después:

Esto es lo que tengo hasta ahora. Devuelve resultados, pero no tienen ningún sentido: los tipos no coinciden y devuelve demasiadas características.
Tenga en cuenta también que he definido "continuo" como cualquier línea dentro de los 5 pies de su vecino y que se encuentra en un ángulo de menos de 30 grados.
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
He asumido que una consulta recursiva es el camino a seguir, pero estoy feliz de que me demuestren lo contrario. Los recursivos son un poco difíciles de asimilar.
Editar: también debo agregar que ya he intentado agregar usando ST_Union y ST_Linemerge, y luego volcar el resultado. Esto funciona un poco, pero no tiene en cuenta las intersecciones de> 30 grados y tampoco puede cumplir con la tolerancia de cinco pies para la conectividad.
a.pk_uid != b.pk_uid