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:
y la siguiente fue su tabla de atributos:
- tabla tc_line (parte)
- tabla tc_point
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;
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.
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:
- ST_ClosestPoint
- 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)
y me ha cargado correctamente como nueva capa tc_proj, y su tabla de atributos:
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,
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.