Cómo extraer POINT de una STRING [LINE | MULTILINE]

10

Me gustaría crear un vectorLayer QGISpara mostrar todos los puntos que forman una LINESTRINGo una MULTILINESTRINGalmacenada en una base de PostGISdatos.

Creo que necesito transformar todos los puntos de LINESTRING(o MULTILINESTRING) a POINT.

Primera pregunta :

¿Hay alguna PostGISfunción para hacer eso?

Segunda pregunta :

Si quiero excluir puntos duplicados de la POINTtabla de resultados , ¿cómo puedo hacer eso?

Heisenbug
fuente
gracias a todos. Todas tus respuestas me han ayudado mucho. Tengo que pensar un poco para decidir cuál debería ser marcado como el correcto :)
Heisenbug

Respuestas:

7

Para obtener un punto en orden y un enlace a la geometría original, use

SELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings)

y elimine los duplicados de http://wiki.postgresql.org/wiki/Deleting_duplicates

recuerde que necesita tener una identificación única para eliminar duplicados, si no tiene una necesita crearla

simplexio
fuente
Hola, hay un error tipográfico, debes eliminar el último soporte. La sintaxis correcta debería serSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso el
5

En cuanto a la primera pregunta, existe una función PostGIS solo para eso, ST_DumpPoints .

El primer ejemplo en la página de documentos es exactamente lo que necesita. Es una función de retorno de conjunto, por lo que no solo volca los puntos, sino también cierta información (la matriz de ruta) que los relaciona con la geometría original. Como solo te interesan los puntos, puedes probar algo como esto:

SELECT (dp).geom FROM (
  SELECT ST_DumpPoints(geom) AS dp
    FROM linestrings
)
kprist
fuente
2

anuncio 1.

CREATE TABLE points AS
SELECT ST_PointFromWKB(ST_AsEWKB(linestring_geom)) AS point_geom FROM linestring_table;

anuncio 2. Seleccione puntos duplicados PostGIS

CREATE TEMPORARY TABLE temp AS 
SELECT *
FROM points AS a, points AS b
WHERE ST_Equals(a.geom, b.geom) AND a.id <> b.id;

DROP FROM points USING temp WHERE points.id=temp.id;
Vladimir
fuente
Esto no funciona, se produce geometrías vacías y PostgreSQL emite advertencias para cada fila procesada: OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this. Podrías saltarte por ST_AsEWKB()completo, pero aún así no tendría ningún sentido, mira el último ejemplo en ST_PointFromWKB
kprist el
Se devuelve NULL si la entrada bytea no representa una geometría POINT.
Vladimir el
2

Para volcar solo puntos únicos, puede usar algunas subconsultas con una SELECT DISTINCT ONexpresión :

SELECT geom, gid, path
FROM (
  SELECT DISTINCT ON (geom) geom, path, gid
  FROM (
    SELECT (ST_DumpPoints(the_geom)).geom, (ST_DumpPoints(the_geom)).path, gid
    FROM my_linestrings_table
  ) f
  ORDER BY geom, path, gid
) f
ORDER BY gid, path;
Mike T
fuente