5 votos

Eliminar no deseados Linestrings de Multilinestring en Postgis

Tengo un Multilinestring capa y he notado que en algunos de mis geometrías no son deseados Linestrings. Se componen de dos puntos (inicio y final), pero ambos son la misma cantidad de puntos. Que está causando estragos cuando trato de leer esta capa de SQLServer.

Ejemplo de una geometría:

   "MULTILINESTRING((-3.00712325415935 43.3437538570123,-3.00711888681593 43.3437506773148),
   (-3.00693096810649 43.34361446115,-3.00692660078307 43.3436112814451),
   (-3.00692660078307 43.3436112814451,-3.00692660078307 43.3436112814451),
   (-3.00692660078307 43.3436112814451,-3.0068846515836 43.3436419720614),
   (-3.00692660078307 43.3436112814451,-3.0069222334601 43.34360810174),
   (-3.00691127288165 43.3436001834041,-3.00690690556026 43.3435970036984))"

Aviso tercer Linestring que tiene los mismos puntos de inicio y final. ¿Cómo puedo eliminar estos no deseados Linestrings de mi geometrías?

Un enfoque podría ser quitar el linestrings que st_length=0, pero no sé cómo construir la consulta. Supongo que tengo que usar st_linemerge primera dividir el multi geometría en partes individuales?

Necesito un poco de ayuda de un experto en esto...

7voto

Patrick Puntos 20392

Usted puede utilizar ST_Dump para sacar el individuo Linestrings, prueba los de longitud > 0, y luego volver a crear el Multilinestring utilizando ST_Collect (en lugar de ST_Union o ST_LineMerge, que implican espacial real de procesamiento de los cálculos, en lugar de simplemente la combinación de la subyacente geometrías en sus múltiples versiones, como se ha señalado por @dbaston).

SELECT 
     ST_AsText(ST_Collect(geom)) 
  FROM 
    (SELECT    
        (ST_Dump(
           ST_GeomFromText('MULTILINESTRING(
             (-3.00712325415935 43.3437538570123,-3.00711888681593 43.3437506773148),
             (-3.00693096810649 43.34361446115,-3.00692660078307 43.3436112814451),
             (-3.00692660078307 43.3436112814451,-3.00692660078307 43.3436112814451),
             (-3.00692660078307 43.3436112814451,-3.0068846515836 43.3436419720614),
             (-3.00692660078307 43.3436112814451,-3.0069222334601 43.34360810174),
             (-3.00691127288165 43.3436001834041,-3.00690690556026 43.3435970036984))'))
       ).geom) g
WHERE ST_Length(g.geom) > 0;

que produce:

MULTILINESTRING(
    (-3.00691127288165 43.3436001834041,-3.00690690556026 43.3435970036984),
    (-3.00712325415935 43.3437538570123,-3.00711888681593 43.3437506773148),
    (-3.00692660078307 43.3436112814451,-3.0069222334601 43.34360810174),
    (-3.00693096810649 43.34361446115,-3.00692660078307 43.3436112814451),
    (-3.00692660078307 43.3436112814451,-3.0068846515836 43.3436419720614))

es decir, con la línea con la repetida coordenadas ido. Obviamente, usted quiere quitar el ST_AsText que es sólo para ilustración. Nota, ST_Dump es un conjunto de devolver la función, así que tienes que envolverlo entre paréntesis, seguido por .geom, para obtener la geometría de la espalda, es decir,

(ST_Dump(geom)).geom

que se siente un poco extraño al principio.

Se podría hacer algo similar a la anterior con un recuento de puntos distintos, pero creo que, de las pruebas en la longitud como usted sugiere, es el más limpio.

EDIT. De hecho resulta que en este caso, usted ni siquiera necesita para la prueba de la longitud de la cadena de línea, como ST_Union ignora el punto cuando la construcción de la MultiLinestring copia de seguridad. Hay otras maneras de ignorar ciertos tipos de geometría cuando se realiza una unión, tales como las pruebas con ST_GeometryType en la cláusula where.

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