Estoy teniendo dificultad con una consulta. Tengo una red de linestrings, cada uno con un valor en el n_type columna. Este puede ser uno de un puñado de opciones. Me gustaría generar una nueva tabla en la que grupos de cualquier linestrings que son del mismo tipo y que forma una línea continua.
Antes:
Después de:
Aquí es lo que he conseguido hasta ahora. Devuelve resultados, sino que no tienen ningún sentido - de los tipos no coinciden y devuelve demasiadas características.
Por favor, también tenga en cuenta que he definido "continuo" como cualquier línea dentro de los 5 pies de su vecino y encuentro en menos de un ángulo 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 una consulta recursiva es el camino a seguir, pero estoy feliz de estar equivocado en eso. Recursives son un poco difícil de asimilar.
Edit: también debo agregar que yo ya he probado la agregación utilizando ST_Union y ST_Linemerge, y luego volcar el resultado. Esta clase de obras, pero no cuenta para >30 grado intersecciones y también no se puede honrar a los cinco pies de tolerancia para la conectividad.