[LINE | MULTILINE] STRING üzerinden POINT nasıl ayıklanır


10

QGISBir LINESTRINGveya MULTILINESTRINGbir PostGISveritabanında depolanan tüm noktaları görüntülemek için bir vectorLayer oluşturmak istiyorum .

Sanırım tüm LINESTRING(veya MULTILINESTRING) noktalarını dönüştürmem gerekiyor POINT.

İlk soru :

PostGISBunu yapmak için herhangi bir işlev var mı ?

İkinci Soru :

Yinelenen noktaları sonuç POINTtablosundan hariç tutmak istersem bunu nasıl yapabilirim?


Herkese teşekkürler. Tüm cevaplarınız bana çok yardımcı oldu.
Hangisinin

Yanıtlar:


7

Sırayla nokta almak ve orijinal geometri ile bağlantı kurmak için

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

ve http://wiki.postgresql.org/wiki/Deleting_duplicates adresinden cumhuriyetleri kaldırın

cumhuriyet kaldırması için benzersiz bir kimliğiniz olması gerektiğini unutmayın, yoksa sahip olmanız gerekir


Merhaba bir yazım hatası var, son braketi kaldırmalısınız. Doğru sözdizimiSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso

5

İlk soru söz konusu olduğunda, sadece bunun için bir PostGIS fonksiyonu var, ST_DumpPoints .

Dokümanlar sayfasındaki ilk örnek tam olarak ihtiyacınız olan şeydir. Bu bir set döndüren işlevdir, bu yüzden sadece noktaları dökmekle kalmaz, aynı zamanda onları orijinal geometri ile ilişkilendiren bazı bilgileri (yol dizisi). Sadece noktaları önemsediğiniz için, böyle bir şey deneyebilirsiniz:

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

2

reklam 1.

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

ad 2. GIS Sonrası Yinelenen Noktalar'ı seçin

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;

Bu işlenen her satır için boş geometri ve PostgreSQL uyarı göndermektedir üretir, çalışmaz: OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this. Sadece atlayabilirsiniz ST_AsEWKB(), ancak yine de bir anlam ifade etmiyor, ST_PointFromWKB
kprist

Girdi bytea bir POINT geometrisini temsil etmiyorsa NULL döndürülür.
Vladimir

2

Yalnızca benzersiz noktaları dökmek için, SELECT DISTINCT ONifadeli birkaç alt sorgu kullanabilirsiniz :

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.