Jak wyodrębnić POINT z ciągu [LINE | MULTILINE]

10

Chciałbym utworzyć vectorLayer w QGIScelu wyświetlenia wszystkich punktów, które tworzą a LINESTRINGlub MULTILINESTRINGprzechowywane w PostGISDB.

Myślę, że muszę przekształcić wszystkie punkty LINESTRING(lub MULTILINESTRING) na POINT.

Pierwsze pytanie :

Czy jest jakaś PostGISfunkcja, aby to zrobić?

Drugie pytanie :

POINTJak mogę to zrobić, jeśli chcę wykluczyć zduplikowane punkty z tabeli wyników ?

Heisenbug
źródło
dziękuje za wszystko. Wszystkie twoje odpowiedzi bardzo mi pomogły. Muszę się trochę zastanowić, aby zdecydować, która z nich powinna być oznaczona jako poprawna :)
Heisenbug

Odpowiedzi:

7

Aby uzyskać punkt w kolejności i link do geometrii pierwotnej, użyj

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

i usuń dublikaty z http://wiki.postgresql.org/wiki/Deleting_duplicates

pamiętaj, że musisz mieć jeden unikalny identyfikator do zdublowania, jeśli go nie masz, musisz go utworzyć

simplexio
źródło
Cześć, jest literówka, powinieneś usunąć ostatni nawias. Prawidłowa składnia powinna brzmiećSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso
5

Jeśli chodzi o pierwsze pytanie, istnieje tylko funkcja PostGIS, ST_DumpPoints .

Pierwszy przykład na stronie dokumentów jest dokładnie tym, czego potrzebujesz. Jest to funkcja zwracająca zestaw, więc nie tylko zrzuca punkty, ale także pewne informacje (tablica ścieżki), które odnoszą je do oryginalnej geometrii. Ponieważ zależy Ci tylko na punktach, możesz spróbować czegoś takiego:

SELECT (dp).geom FROM (
  SELECT ST_DumpPoints(geom) AS dp
    FROM linestrings
)
kprist
źródło
2

ad 1.

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

ad 2. Wybierz Duplicate Points 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
źródło
To nie działa, produkuje pustych geometrie i PostgreSQL wystawianiu ostrzeżenia dla każdego wiersza przetwarzanego: OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this. Możesz po prostu ST_AsEWKB()całkowicie pominąć , ale nadal nie miałoby to sensu, zobacz ostatni przykład w ST_PointFromWKB
kprist
Zwracane jest NULL, jeśli bajt wejściowy nie reprezentuje geometrii PUNKTU.
Vladimir
2

Aby zrzucić tylko unikalne punkty, możesz użyć kilku podkwerend z SELECT DISTINCT ONwyrażeniem :

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.
źródło