Cara mengekstrak POINT dari STRING [LINE | MULTILINE]

10

Saya ingin membuat vectorLayer QGISuntuk menampilkan semua titik yang membentuk LINESTRINGatau MULTILINESTRINGdisimpan dalam PostGISDB.

Saya pikir saya perlu mengubah semua poin LINESTRING(atau MULTILINESTRING) menjadi POINT.

Pertanyaan pertama :

Apakah ada PostGISfungsi untuk melakukan itu?

Pertanyaan kedua :

Jika saya ingin mengecualikan poin duplikat dari POINTtabel hasil , bagaimana saya bisa melakukannya?

Heisenbug
sumber
terimakasih untuk semua. Semua jawaban Anda banyak membantu saya. Saya harus berpikir sedikit untuk memutuskan mana yang harus ditandai sebagai yang benar :)
Heisenbug

Jawaban:

7

Untuk mendapatkan poin dalam urutan dan tautan ke penggunaan geometri asli

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

dan hapus dublicate dari http://wiki.postgresql.org/wiki/Deleting_duplicates

ingat bahwa Anda perlu memiliki satu id unik untuk menghapus dublicate, jika Anda tidak memilikinya, Anda harus membuatnya

simplexio
sumber
Hai ada salah ketik, Anda harus menghapus braket terakhir. Sintaks yang tepat adalahSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso
5

Sejauh pertanyaan pertama yang bersangkutan, ada fungsi PostGIS hanya untuk itu, ST_DumpPoints .

Contoh pertama di halaman dokumen adalah persis apa yang Anda butuhkan. Ini adalah fungsi set-return, jadi tidak hanya membuang titik, tetapi juga beberapa info (larik jalur) yang menghubungkannya dengan geometri asli. Karena Anda hanya peduli pada poin, Anda dapat mencoba sesuatu seperti ini:

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

iklan 1.

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

iklan 2. Pilih Duplikat Poin 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
sumber
Ini tidak bekerja, menghasilkan geometri kosong dan PostgreSQL masalah peringatan untuk setiap baris diproses: OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this. Anda bisa saja melewatkan ST_AsEWKB()semuanya, tetapi masih tidak masuk akal, lihat contoh terakhir di ST_PointFromWKB
kprist
NULL dikembalikan jika bytea input tidak mewakili geometri TITIK.
Vladimir
2

Untuk hanya membuang poin unik, Anda bisa menggunakan beberapa subqueries dengan SELECT DISTINCT ONekspresi :

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
sumber