8 votos

Errores en consultas recursivas de PostGIS en conectividad de línea base

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:

enter image description here

Después de:

enter image description here

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.

1voto

Max Ruf Puntos 162

Su solución es, al menos, la falta de una pre-orden de los componentes de la línea como Juan el Barça, dijo.

Consultas recursivas son muy, muy difícil de asimilar, diría yo.

Usted debe tratar de replicar ST_Linemerge comportamiento en una nueva base de datos de la función. Me gustaría probar primero a mirar el código fuente de un ST_Linemerge implementación y replicar, la alteración de él para producir el ángulo de 30 grados de contracción.

Descartar de la agregación de los segmentos que no están en un ángulo de menos de 30 grados., usted debe comparar DENTRO de una agregación de bucle.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X