So extrahieren Sie POINT aus einem [LINE | MULTILINE] STRING

9

Ich möchte eine vectorLayer erstellen QGIS, um alle Punkte anzuzeigen, die eine LINESTRINGoder eine MULTILINESTRINGin einer Datenbank gespeicherte bilden PostGIS.

Ich denke, dass ich alle Punkte von LINESTRING(oder MULTILINESTRING) umwandeln muss POINT.

Erste Frage :

Gibt es eine PostGISFunktion, um das zu tun?

Zweite Frage :

POINTWie kann ich das tun, wenn ich doppelte Punkte aus der Ergebnistabelle ausschließen möchte?

Heisenbug
quelle
Dank an alle. Alle Ihre Antworten haben mir sehr geholfen. Ich muss ein wenig nachdenken, um zu entscheiden, welche als die richtige markiert werden soll :)
Heisenbug

Antworten:

7

Um Punkte in Ordnung zu bringen und mit der ursprünglichen Geometrie zu verknüpfen, verwenden Sie

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

und entfernen Sie dublicates von http://wiki.postgresql.org/wiki/Deleting_duplicates

Denken Sie daran, dass Sie eine eindeutige ID zum Entfernen von Dublicates benötigen. Wenn Sie keine haben, müssen Sie diese erstellen

Simplexio
quelle
Hallo, es gibt einen Tippfehler, du solltest die letzte Klammer entfernen. Die richtige Syntax sollte seinSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso
5

Für die erste Frage gibt es eine PostGIS-Funktion, ST_DumpPoints .

Das erste Beispiel auf der Dokumentenseite ist genau das, was Sie brauchen. Es handelt sich um eine Set-Return-Funktion, bei der nicht nur die Punkte ausgegeben werden, sondern auch einige Informationen (das Pfadarray), die sie mit der ursprünglichen Geometrie in Beziehung setzen. Da Sie sich nur um die Punkte kümmern, können Sie Folgendes ausprobieren:

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

ad 1.

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

Anzeige 2. Wählen Sie Doppelte Punkte 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
quelle
Dies funktioniert nicht, es werden leere Geometrien erzeugt und PostgreSQL gibt Warnungen für jede verarbeitete Zeile aus : OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this. Sie könnten einfach ST_AsEWKB()ganz überspringen , aber es würde immer noch keinen Sinn ergeben, siehe das letzte Beispiel in ST_PointFromWKB
kprist
NULL wird zurückgegeben, wenn die Eingabe bytea keine POINT-Geometrie darstellt.
Vladimir
2

Um nur eindeutige Punkte zu sichern, können Sie einige Unterabfragen mit einem SELECT DISTINCT ONAusdruck verwenden :

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.
quelle