วิธีดึง POINT จาก [LINE | MULTILINE] STRING


10

ฉันต้องการสร้าง vectorLayer QGISเพื่อแสดงจุดทั้งหมดที่เป็นแบบฟอร์มLINESTRINGหรือMULTILINESTRINGเก็บไว้ในPostGISฐานข้อมูล

ฉันคิดว่าฉันต้องการที่จะเปลี่ยนทุกจุดของLINESTRING(หรือMULTILINESTRING) POINTเพื่อ

คำถามแรก :

มีPostGISฟังก์ชั่นที่จะทำเช่นนั้น?

คำถามที่สอง :

หากฉันต้องการแยกคะแนนที่ซ้ำกันออกจากPOINTตารางผลลัพธ์ฉันจะทำอย่างไร


ขอบคุณทุกคน. คำตอบทั้งหมดของคุณช่วยฉันได้มาก ผมต้องคิดนิด ๆ หน่อย ๆ เพื่อที่จะตัดสินใจว่าควรจะทำเครื่องหมายว่าเป็นหนึ่งที่ถูกต้อง :)
Heisenbug

คำตอบ:


7

เพื่อให้ได้จุดตามลำดับและลิงก์ไปยังการใช้รูปทรงเรขาคณิตแบบดั้งเดิม

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

และลบ dublicates ออกจาก http://wiki.postgresql.org/wiki/Deleting_duplicates

โปรดจำไว้ว่าคุณต้องมี ID ที่ไม่ซ้ำใครสำหรับการลบแบบไม่ระบุชื่อหากคุณไม่มีคุณจำเป็นต้องสร้างมันขึ้นมา


สวัสดีมีการพิมพ์ผิดคุณควรลบวงเล็บสุดท้าย ไวยากรณ์ที่ถูกต้องควรเป็นSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso

5

เท่าที่คำถามแรกเป็นห่วงมีฟังก์ชั่น PostGIS เพียงสำหรับการที่ST_DumpPoints

ตัวอย่างแรกในหน้าเอกสารเป็นสิ่งที่คุณต้องการอย่างแท้จริง มันเป็นฟังก์ชั่น set-return ดังนั้นมันจึงไม่เพียงแค่ลบจุด แต่ยังรวมถึงข้อมูลบางอย่าง (อาเรย์พา ธ ) ที่เกี่ยวข้องกับรูปทรงเรขาคณิตดั้งเดิม เนื่องจากคุณสนใจเฉพาะประเด็นคุณสามารถลองดังนี้:

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

2

โฆษณา 1

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

โฆษณา 2. เลือกทำซ้ำคะแนน 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;

นี้ไม่ได้ทำงานจะผลิตรูปทรงเรขาคณิตที่ว่างเปล่าและ PostgreSQL OGC WKB expected, EWKB provided - use GeometryFromEWKB() for thisคำเตือนปัญหาสำหรับแต่ละแถวประมวลผล: คุณสามารถข้ามST_AsEWKB()ไปได้ทั้งหมด แต่ก็ยังไม่สมเหตุสมผลโปรดดูตัวอย่างสุดท้ายในST_PointFromWKB
kprist

NULL จะถูกส่งกลับหาก bytea อินพุตไม่ได้เป็นตัวแทนของเรขาคณิต POINT
Vladimir

2

หากต้องการทิ้งเฉพาะจุดที่ไม่ซ้ำคุณสามารถใช้แบบสอบถามย่อยสองสามข้อในSELECT DISTINCT ONนิพจน์ :

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.