4 votos

ST_split devolvió el error o mal resultado

Tengo una línea shapefile tc_line con 166 segmentos y un punto de shapefile tc_point con 8 puntos, y me cargaron en la base de datos PostGIS con el gestor de bases de datos:

enter image description here

y la siguiente fue su tabla de atributos:

  • tabla tc_line (parte)

enter image description here

  • tabla tc_point

enter image description here

Debido a que estos puntos son sólo cerca de la línea, no el derecho, trato de usar ST_ClosestPoint en primer lugar, a continuación, utilice ST_Split a dividir la línea.

@amball, he probado el código en la edición de respuesta y el resultado mostró que:

SELECT ST_Split(ln.geom, ST_Collect(newpt_geom))
FROM tc_line AS ln, 
    (SELECT ST_ClosestPoint(ST_Collect(ln.geom), pt.geom) AS newpt_geom
     FROM tc_line AS ln, tc_point AS pt GROUP BY pt.geom) t1 GROUP BY ln.geom;

enter image description here

El resultado fue extraño porque había 166 filas de la misma manera como las filas de la línea original tenía, lo que significa que ST_split no funciona. Así que cargué el resultado como nueva capa para comprobarlo.

enter image description here

Pero En QGIS no la puedo ver, incluso me puse su CRS, y como yo quería exportar como shapefile de ESRI, el mensaje de error apareció:

Export to vector file failed.
Error: creation of layer failed (OGR error:Geometry type of `Geometry Collection' not supported in shapefiles.
Type can be overridden with a layer creation option
of SHPT=POINT/ARC/POLYGON/MULTIPOINT/POINTZ/ARCZ/POLYGONZ/MULTIPOINTZ.
)

Así que he intentado dividir la línea con 2 etapas:

  1. ST_ClosestPoint
  2. ST_split

En la primera etapa me encontré con el código:

    SELECT 
    tc_point.id as pointid, 
    St_ClosestPoint(ST_collect(tc_line.geom), tc_point.geom) as closest,
    st_astext(St_ClosestPoint(st_collect(tc_line.geom), tc_point.geom)) as text
    FROM tc_point, tc_line GROUP BY tc_point.id;

El resultado fueron multa: (8 puntos más cercanos)

enter image description here

y me ha cargado correctamente como nueva capa tc_proj, y su tabla de atributos:

enter image description here

Entonces corrí etapa 2:

SELECT ST_Split(ln.geom, ST_Collect(tc_proj.geom))
from tc_line as ln, tc_proj GROUP BY ln.geom;

error apareció:

Splitting a Line by a GeometryCollection is unsupported

Soy novato en SQL y SQL de código abierto, tales como PostGIS. Cómo trabajar la anterior tarea con éxito? Estoy trabajando con PostGIS 2.2.1


Actualización#1

@amball, he probado el código siguiente,

SELECT ST_Split(ln.geom, newpt_geom)
FROM tc_line AS ln, 
    (SELECT ST_ClosestPoint(ST_Collect(ln.geom), pt.geom) AS newpt_geom 
     FROM tc_line AS ln, tc_point AS pt
     GROUP BY pt.geom) t1
WHERE ST_Intersects(ln.geom, newpt_geom);

y su resultado,

enter image description here

No sé por qué hay 4 filas en el resultado, y yo podía ver nada usando Create a view, también, Load as new layer obtienen nada. Por lo tanto, aún no puedo determinar si el resultado es correcto.

5voto

amball Puntos 41

En primer lugar, si usted está recibiendo un error de sintaxis, sería de gran ayuda para publicar tu consulta completa.

En segundo lugar, usted probablemente querrá ST_ClosestPoint(tc_line, tc_point), que devuelve un punto (que puede utilizar para dividir la línea) en lugar de ST_LineLocatePoint(), que devuelve la fracción a lo largo de la línea donde está el punto más cercano se encuentra.

La consulta exacta depende también de lo que quieres hacer. Mezcla todos los segmentos de línea y, a continuación, dividir con los puntos? Conservar el original de los segmentos de línea y el uso de cada punto para dividir el segmento más cercano?

EDICIÓN basada en la aclaración en los comentarios.

Usted necesita primero encontrar el punto más cercano de las líneas. Hay varias maneras de hacer esto, pero creo que la más sencilla es algo como esto:

SELECT ST_ClosestPoint(ST_Collect(ln.geom), pt.geom) AS newpt_geom 
    FROM tc_line AS ln, tc_point AS pt;

A continuación, el uso de estos nuevos puntos de dividir su geometría:

SELECT ST_Split(ln.geom, ST_Collect(newpt_geom));

Ponerlos juntos:

SELECT ST_Split(ln.geom, ST_Collect(newpt_geom))
FROM tc_line AS ln, 
    (SELECT ST_ClosestPoint(ST_Collect(ln.geom), pt.geom) AS newpt_geom 
     FROM tc_line AS ln, tc_point AS pt
     GROUP BY pt.geom) t1;

Tenga en cuenta que usted necesita PostGIS 2.2.0+ para usar el Multipunto como la hoja en ST_Split. De lo contrario, una consulta más compleja es necesario.

1voto

Jon Raphaelson Puntos 874

ST_Snap es la función que me gustaría utilizar para pegar los puntos a la línea. La consulta completa para dividir líneas en los puntos sería algo como esto SELECT ST_Split(ln.geom,ST_Union(ST_Snap(pt.geom, ln.geom, ST_Distance(pt.geom, ln.geom)*1.01))) FROM points pt, lines ln;

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