Como extrair POINT de uma string [LINE | MULTILINE]

9

Gostaria de criar um vectorLayer QGISpara exibir todos os pontos que formam um LINESTRINGou um MULTILINESTRINGarmazenado em um PostGISbanco de dados.

Eu acho que preciso transformar todos os pontos de LINESTRING(ou MULTILINESTRING) para POINT.

Primeira pergunta :

Existe alguma PostGISfunção para fazer isso?

Segunda pergunta :

Se eu quiser excluir pontos duplicados da POINTtabela de resultados , como posso fazer isso?

Heisenbug
fonte
obrigado a todos. Todas as suas respostas me ajudaram muito. Eu tenho que pensar um pouco, a fim de decidir qual deve ser marcado como o correto :)
Heisenbug

Respostas:

7

Para obter pontos em ordem e vincular à geometria original, use

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

e remova os publicadores de http://wiki.postgresql.org/wiki/Deleting_duplicates

lembre-se de que você precisa ter um ID exclusivo para remoção pública, se não tiver um, precisará criá-lo

simplexio
fonte
Oi, há um erro de digitação, você deve remover o último suporte. A sintaxe correta deve serSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso
5

No que diz respeito à primeira pergunta, existe uma função PostGIS apenas para isso, ST_DumpPoints .

O primeiro exemplo na página de documentos é exatamente o que você precisa. É uma função de retorno de conjunto, portanto, não apenas despeja os pontos, mas também algumas informações (a matriz do caminho) que os relaciona à geometria original. Como você se preocupa apenas com os pontos, tente algo assim:

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

anúncio 1.

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

anúncio 2. Selecione Pontos 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
fonte
Isso não funciona, ela produz geometrias vazias e PostgreSQL emite avisos para cada linha processada: OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this. Você poderia simplesmente ignorar ST_AsEWKB()por completo, mas ainda não faria qualquer sentido, ver o último exemplo em ST_PointFromWKB
kprist
NULL será retornado se o bytea de entrada não representar uma geometria POINT.
Vladimir
2

Para despejar apenas pontos exclusivos, você pode usar algumas subconsultas com uma SELECT DISTINCT ONexpressão :

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
fonte