Come estrarre POINT da una STRING [LINE | MULTILINE]


10

Vorrei creare un vettoreLayer QGISper visualizzare tutti i punti che formano uno LINESTRINGo un MULTILINESTRINGarchiviato in un PostGISDB.

Penso che devo trasformare tutti i punti di LINESTRING(o MULTILINESTRING) in POINT.

Prima domanda :

C'è qualche PostGISfunzione per farlo?

Seconda domanda :

Se voglio escludere punti duplicati dalla POINTtabella dei risultati , come posso farlo?


grazie a tutti. Tutte le tue risposte mi hanno aiutato molto. Devo pensarci un po 'per decidere quale dovrebbe essere contrassegnato come corretto :)
Heisenbug,

Risposte:


7

Per ottenere il punto in ordine e collegarlo alla geometria originale usare

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

e rimuovi i pubblicazioni da http://wiki.postgresql.org/wiki/Deleting_duplicates

ricorda che devi disporre di un ID univoco per la rimozione di pubblicazioni, se non ne hai uno devi crearlo


Ciao c'è un refuso, dovresti rimuovere l'ultima parentesi. La sintassi corretta dovrebbe essereSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso

5

Per quanto riguarda la prima domanda, esiste una funzione PostGIS proprio per questo, ST_DumpPoints .

Il primo esempio nella pagina dei documenti è esattamente ciò di cui hai bisogno. È una funzione di ritorno, quindi non solo scarica i punti, ma anche alcune informazioni (l'array del percorso) che li collega alla geometria originale. Dato che ti interessano solo i punti, potresti provare qualcosa del genere:

SELECT (dp).geom FROM (
  SELECT ST_DumpPoints(geom) AS dp
    FROM linestrings
)

2

annuncio 1.

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

annuncio 2. Selezionare Punti duplicati 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;

Questo non funziona, produce geometrie vuote e PostgreSQL emette avvertenze per ogni riga trasformati: OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this. Potresti semplicemente saltare del ST_AsEWKB()tutto, ma ancora non avrebbe alcun senso, vedi l'ultimo esempio in ST_PointFromWKB
kprist,

NULL viene restituito se l'ingresso bytea non rappresenta una geometria POINT.
Vladimir,

2

Per scaricare solo punti univoci, è possibile utilizzare alcune sottoquery con SELECT DISTINCT ONun'espressione :

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.