ค้นหาโหนดหลอกในซอฟต์แวร์ GIS ฟรีหรือไม่


16

ซอฟต์แวร์ gvSIG OA Digital Edition 2010 มีเครื่องมือในการค้นหาโหนดหลอกในเรขาคณิตเชิงเส้น ฉันตั้งค่าความคลาดเคลื่อนที่ยอมรับได้ของคลัสเตอร์ 0.00002 และจำนวนข้อผิดพลาดสูงสุด -10000 สำหรับการเชื่อมโยงเชิงเส้นนับ 20,000 เรขาคณิต แต่ผลลัพธ์ไม่สำเร็จ

มีวิธีแก้ไขปัญหาใดบ้างที่ค้นหาโหนดปลอมในซอฟต์แวร์ GIS ฟรี

ฉันต้องการเลเยอร์โหนด pseudo (วิธีหนึ่งในการแก้ไขปัญหานี้ - เพื่อใช้ทอพอโลยีเครื่องมือของ ArcInfo แต่สิ่งสำคัญสำหรับฉันคือการใช้ซอฟต์แวร์ฟรี) เรขาคณิตเชิงเส้นสร้างผู้ใช้หลายคนใน QGIS 1.8.0 ในฐานข้อมูล PostGIS (v. 2.0.1)

เพิ่มภาพใหม่: คุณลักษณะเชิงเส้น 12 คุณลักษณะพร้อมโหนดหลอกสามรายการใน A (บรรทัด 4/5), B (บรรทัด 6/7), C (บรรทัด 9/10) โหนดเทียมควรเป็นจุดแทน - คุณลักษณะเชิงเส้นสองจุดพร้อมจุดตัดในจุดเดียว (โหนด) ควรเป็นลักษณะเชิงเส้นเดียว (บรรทัด 4/5 - บรรทัด 4, ... )

เป็นไปได้ไหมที่จะทำการร้องขอใน PostGIS ซึ่งจะส่งผลให้เลเยอร์ของโหนดหลอกหรือไม่?

เพิ่มอิมเมจใหม่ของตัวอย่างโหนดหลอก: ถ้าฉันได้รับสำหรับโหนดเลเยอร์ปลอมของเลเยอร์จุดเชิงเส้น (สี่เหลี่ยมสีฟ้า) ฉันแก้ไขข้อผิดพลาดดังต่อไปนี้ในเลเยอร์เชิงเส้น: - เพิ่มเรขาคณิตที่ขาดหายไป

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


2
ใน GRASS มีอยู่คำสั่ง rmdangle แต่ในผลลัพธ์ shp-file โดยไม่มีโหนดหลอก ผลลัพธ์ควรเป็นไฟล์ shp (หรืออื่น ๆ ) ของโหนดหลอก (เช่น gvSIG OA Digital Edition 2010)
— HasT

คุณใช้ PostGIS 2.0 หรือไม่ ถ้าใช่ลองใช้ฟังก์ชัน Is_Valid และ Makevalid
— Giovanni Manghi

ใช่ฉันใช้ PostGIS 2.0 ฉันควรใช้ฟังก์ชันเหล่านี้เพื่อค้นหาโหนดหลอกได้อย่างไร เป็นไปได้หรือไม่ที่จะพบพวกเขาด้วย "PgQuery for QGIS"
— HasT

ใช่คุณสามารถใช้พวกมันภายใน QGIS ในเครื่องมือใด ๆ ที่อนุญาตให้คุณเรียกใช้แบบสอบถาม PostGIS เช่นตัวอย่างเช่น DB Manager (ที่รองรับการเน้นไวยากรณ์และการทำให้สมบูรณ์อัตโนมัติ)
— Giovanni Manghi

จุดสีแดงในภาพที่สองเป็นจุดตัดของรูปทรงเรขาคณิตที่ถูกต้องสองจุดใช่ไหม?
— vinayan

คำตอบ:


8

นี่เป็นการแก้ปัญหาทั่วไปที่คุณสามารถบังคับใช้กับ PostGIS หรือซอฟต์แวร์ที่สอดคล้องกับ OGC อื่น ๆ

หมายเหตุ: ตามที่ผมบอกว่าก่อนที่จะเป็นแนวคิดที่สำคัญในฟอสส์และระบบสารสนเทศภูมิศาสตร์เป็นมาตรฐาน : โซลูชั่นที่ดีที่สุดนำมาใช้มาตรฐานเช่นOGCคน


ปัญหาของคุณคือ "ค้นหาโหนดหลอก" ... แต่ฉันคิดว่ามันเป็นอีกเล็กน้อย "ค้นหาโหนดที่ไม่ใช่หลอกและเข้าร่วมสายของโหนดหลอก" โซลูชันของฉันสามารถใช้ได้ทั้งคู่

ข้อเสนอมาตรฐาน OGC:

  • ST_Boundary (geom) : เพื่อตรวจจับโหนดของเส้น

  • ST_Dump (geom) : เพื่อวางแต่ละโหนดเดียวในระเบียน SQL ตาราง

  • ST_D ภายใน ST_Equals, ST_SnapToGrid, ST_Snap สามารถใช้สำหรับการยอมรับการเปลี่ยนแปลง ฉันใช้ ST_D ภายใน

เราสามารถสมมติว่าปัญหาหลักของคุณสามารถระบุได้ด้วยวัตถุและคุณสมบัติเหล่านี้

  • มีเพียงส่วนของเส้นตรง (ของเส้นตารางส่วนหนึ่ง ) ที่แสดงโดยรูปทรงเรขาคณิตของ LINESTRING ... ฉันไม่ได้ทดสอบกับ MULTILNE ถ้าคุณมีรูปทรงเรขาคณิต = MULTIPOINT คุณสามารถแยกและใช้ MULTILINE ด้วย ST_Dump และ ST_LineMerge;

  • ส่วนของเส้นแต่ละคนมี (ID เรขาคณิต) GIDและ (รหัสสี) idline

ดังนั้นขั้นตอนแรกคือการรับโหนดที่มาจากการรวมสาย

CREATE TABLE cache_bounds AS
  SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
         gid as color 
         -- if you not have something for "color label" of lines, use gid.
  FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;

CREATE TABLE cache_joinnodes AS
  -- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
  SELECT *, array_length(colors,1) as ncolors FROM (
   SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
    SELECT 
      a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
      , st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
    FROM cache_bounds a, cache_bounds b 
    WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
    -- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
    GROUP BY a.gid, a.the_geom
   ) as t
  ) as t2;

หมายเหตุ: การใช้แคชเพราะเร็วกว่าการดู ใช้ "อธิบายเลือก ... " เพื่อตรวจสอบเวลา CPU ซึ่งอาจใช้เวลานาน

ที่นี่รอบและเส้น (สีเดียวกัน) อย่างต่อเนื่องตรวจพบเป็นncolors=1จุดและโหนดหลอกโดยncolors=2จุดดังนั้นคุณมีชั้นที่มีจุดที่

ตารางของ "โหนดที่ดี" ของคุณนั้นคือ "จุดเชื่อมต่อ" ดั้งเดิมและไม่มี "โหนดหลอก"

CREATE VIEW vw_joinnodes_full AS
  SELECT b.*, j.ncolors
  FROM cache_joinnodes j INNER JOIN cache_bounds b 
       ON j.gid=b.gid;

CREATE TABLE cache_good_nodes AS
  SELECT *  
  FROM vw_joinnodes_full 
  WHERE ncolors=1 OR ncolors>2;

-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ... 

ขอบคุณสำหรับการแก้ปัญหา! ฉันลองเรียกใช้การสืบค้น (ใน pgAdmin) แต่ฉันได้รับการยกเว้น: "function array_distinct (จำนวนเต็ม []) ไม่มีอยู่" ผมทำอะไรผิดหรือเปล่า?
— HasT

ขออภัยไม่อ้างถึงarray_distinctฟังก์ชั่นจากห้องสมุด postgres.cz ข้อผิดพลาดอื่น ๆ โปรดรายงานฉันสามารถเพิ่มคำอธิบายเพิ่มเติมได้ที่นี่
— Peter Krauss

ฉันเพิ่มฟังก์ชั่น array_distinct ในเลเยอร์เชิงเส้นฐานข้อมูลมีชื่อคอลัมน์เรขาคณิต "the_geom" (แทน "geom" ในแบบสอบถาม) ฉันแทนที่ "geom" เป็น "the_geom" สำหรับ "ST_Boundary (the_geom)" หลังจากเรียกใช้แบบสอบถามฉันได้รับข้อความ "คอลัมน์" geom "ไม่มีอยู่" ใน "เป็นสี geom จาก" สถานที่ ฉันแทนที่ "เป็นสี, geom FROM" เป็น "เป็นสี, the_geom FROM" แต่ฉันได้รับข้อความอีกครั้ง "คอลัมน์" the_geom "ไม่มีอยู่"
— HasT

ตกลงเปลี่ยน (ดูคำตอบแก้ไข) เพื่อgeom (ST_Dump (x))อยู่ในลักษณะ geom ไม่ใช่แอตทริบิวต์ของฐานข้อมูล the_geom
— Peter Krauss

ขอบคุณ! คำค้นหาใช้งานได้ ฉันแทนที่ ST_D ภายใน ST_equals และสำหรับ ST_Buffer ให้ความอดทน 0.00002 DD ในผลลัพธ์ฉันได้รับโหนดที่ถูกต้อง (ซึ่งในหนึ่งโหนดตัดกัน 3 และคุณสมบัติเชิงเส้นเพิ่มเติม) ฉันต้องการรับผลลัพธ์ที่ในหนึ่งโหนดตัดกัน 2 คุณสมบัติเชิงเส้น (จาก vw_joinnodes_full WHERE ncolors = 2;) แต่ได้รับชั้นจุดที่ในหนึ่งโหนดตัดกัน 2 และคุณสมบัติเชิงเส้นเพิ่มเติม รับผลลัพธ์อย่างไรในหนึ่งโหนดตัดกันเพียง 2 คุณสมบัติเชิงเส้น
— HasT

7

การวิจัยการหักเหของแสงได้ทำเครื่องมือ Line Cleanerที่ดูเหมือนจะทำสิ่งที่คุณต้องการ

Line Cleaner ทำความสะอาดเครือข่ายโดยทำให้รูปทรงเรขาคณิตที่ซับซ้อนรอบสั้นและยาวเป็นศูนย์ลดความซับซ้อนและทำให้การลบโหนดปลอมและจุดยอดที่ไม่มีนัยสำคัญ ที่สำคัญที่สุดในขั้นตอนการทำความสะอาดจะสามารถตรวจสอบให้แน่ใจว่าคุณสมบัติการจับคู่ได้รับการพิจารณาโดยอัตโนมัติ

ป้อนคำอธิบายรูปภาพที่นี่

รหัสที่มาสามารถพบได้ที่ GitHub


ขอบคุณสำหรับคำตอบ แต่เป็นผลมาจากข้อผิดพลาดโหนดหลอกต้องการเลเยอร์จุด ผู้ใช้จะต้องแก้ไขข้อผิดพลาดเหล่านี้ด้วยตนเองเนื่องจากมีบางครั้งที่ในหนึ่งโหนดควรตัดกันสามบรรทัด
— HasT

ดูเหมือนว่าควรใช้งานได้ มีปัญหาในการทำความเข้าใจสิ่งที่คุณกำลังจะพูดที่นี่ "เนื่องจากข้อผิดพลาด pseudo node ต้องการเลเยอร์จุด" ฉันไม่เข้าใจสิ่งที่คุณหมายถึง คุณต้องการเลเยอร์จุดที่มีจุดที่ต่อท้ายแต่ละบรรทัดเพื่อให้ทำงานได้หรือไม่
— Rayner

@ เรย์เนอร์, เพิ่มอิมเมจใหม่ของตัวอย่าง pseudo nodes (3): ถ้าฉันได้รับสำหรับเลเยอร์เชิงเส้นจุด pseudo โหนด (rects สีฟ้า) ฉันแก้ไขด้วยตนเอง (ไม่อัตโนมัติ) ข้อผิดพลาดต่อไปในชั้นเชิงเส้น: A - เพิ่มเรขาคณิตที่ขาดหายไป บรรทัดในสี่แยก C - ลบโหนดเทียม หากฉันแก้ไขโหนดหลอกโดยอัตโนมัติฉันทิ้งข้อผิดพลาดไว้ใน A, B
— HasT

ตกลงฉันเข้าใจ B และ C เมื่อคุณพูดว่า "A - เพิ่มรูปทรงเรขาคณิตที่หายไป" นั่นหมายความว่าอย่างไร มีจุดที่ต้องเพิ่มเมื่อพบ 2 บรรทัดหรือไม่?
— Rayner

@ เรย์เนอร์มันหมายถึงสิ่งที่ใน 'A' ควรจะเพิ่มคุณสมบัติเชิงเส้น (ถนน / ถนนตามภาพ) ในА - node ได้เตรียมที่จะเพิ่มรูปทรงเรขาคณิตใหม่ตามภาพ แต่ไม่ได้เพิ่มรูปทรงเรขาคณิต (ใช้เลเยอร์ pseudo nodes ฉันพบว่าไม่ได้ทาสีเรขาคณิต)
— HasT

2

วิธีแก้ปัญหาฟรี: หม้อแปลง FME + MRF + SmartCleaner

โซลูชันฟรี GRASS v.clean (QGIS ล่าสุด 1.8.0 พร้อมเครื่องมือ GRASS เป็นวิธีที่ง่ายที่สุดในการใช้งาน) และเครื่องมือทำความสะอาดโทโพโลยีอื่น ๆ


QGIS 1.8.0 ติดตั้งปลั๊กอิน SEXTANTE ใน C: \ Program Files \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins (1.0.7) โหลด linear shp-file ในโครงการ QGIS (ชั้น CRS และโครงการ WGS1984, 'on the fly' transform on) จากนั้นฉันจะใช้ 'กำหนดภูมิภาค GRASS บนผืนผ้าใบ' (คำสั่ง GRASS - เครื่องมือ) และเรียกใช้คำสั่ง v.clean - rmdangle (Thershold = 0 ใส่ dir / ชื่อเอาท์พุทเวกเตอร์ / ข้อผิดพลาด) หลังจากกระบวนการทำงานได้รับข้อผิดพลาด 'ไม่สามารถโหลดเลเยอร์: D: /error.shp ตรวจสอบบันทึก SEXTANTE เพื่อดูข้อผิดพลาด' ใน TOC เพิ่มเลเยอร์ใหม่เลเยอร์ที่มีข้อผิดพลาดไม่ได้โหลด
— HasT

1
ใน GRASS คำสั่ง v.build.polylines มีอยู่ - ฉันได้รับหนึ่งจากสองบรรทัดที่ตัดกันในหนึ่งจุดยอด (ลบโหนดเทียม) แต่คำสั่งนี้ฉันไม่พบในปลั๊กอิน
— SEXTANTE

@simplexio คุณช่วยกรุณาแนะนำตัวเลือกของ v.clean ที่สามารถใช้ในการระบุ pseudo-nodes
— osmjit

2

นี่คือขั้นตอนในการค้นหาโหนดเทียมของคุณโดยใช้ OpenJump ฟรี GIS
QGIS และ gvSIG มีปลั๊กอิน Sextante ดังนั้นขั้นตอนเดียวกันนี้ควรใช้งานได้เช่นกัน
Spatial Join อาจแตกต่างกันเล็กน้อย
ฉันใช้เวอร์ชัน 1.2 สำหรับการทดสอบ

- ประหยัดสายปลายทาง
กล่อง Sextante, โทโพโลยีสารสกัดจากจุดสิ้นสุดของเส้น -> endpt_0

- unsplit สายของคุณ
กล่อง Sextante เครื่องมือสำหรับชั้นสายเข้าสายที่อยู่ติดกัน

- ประหยัดปลายทางสาย Unsplit
กล่อง Sextante, โทโพโลยีสารสกัดจากจุดสิ้นสุดของ บรรทัด -> endpt_1

- จุดสิ้นสุดที่นำออกโดย "เข้าร่วมบรรทัดที่อยู่ติดกัน" คือโหนดปลอม

เครื่องมือ, แบบสอบถาม, Spatial Query,
เลเยอร์ต้นทาง "endpt_0"
Relation "Intersects"
Mask layer "endpt_1"

เปิดใช้งานหรือคลิก Complement Result


ขอบคุณสำหรับคำตอบ! ฉันพยายามทำขั้นตอนเหล่านี้ใน QGIS Sextante แต่ฉันไม่พบคำสั่ง "แยกจุดสิ้นสุดของบรรทัด" และ "เข้าร่วมบรรทัดที่อยู่ติดกัน" ที่นั่น มันเป็นไปได้เพิ่มใน QGIS Sextante (ในคำสั่ง gvSIG 1.12 มีอยู่) หรือคำสั่ง v.build.polylines?
— HasT

ฉันเพิ่งติดตั้งปลั๊กอิน QGIS sextante ฉันไม่เห็นฟังก์ชั่นเต็มรูปแบบเช่นกันหลายคนขาดหายไป มันควรจะง่ายต่อการทดสอบขั้นตอนใน gvSIG ในรูปร่างไฟล์
— klewis

ฉันเพิ่งตรวจสอบเวิร์กโฟลว์ด้านบนใน gvSIG 2.4.0.2834 และใช้งานได้ดี ฉันได้แทนที่ขั้นตอนสุดท้ายด้วย geoprocesses กล่องเครื่องมืออีกสองอัน: อันดับแรก gvSIG "Spatial Join"ที่สอง"ตัวกรองเวกเตอร์เลเยอร์"โดยใช้DIST > 0เป็นนิพจน์ นอกจากนี้ geoprocesses ทั้งหมดสามารถถูกล่ามโซ่ไว้ด้วยกันในรูปแบบ SEXTANTE เพื่อสร้างเครื่องมือใหม่เช่น"ค้นหา pseudonodes"
— Antonio Falciano


1

ด้วย PostGIS คุณสามารถใช้เวอร์ชันที่แก้ไขของเคียวรีเพื่อค้นหา dangles ที่กล่าวถึงในหัวข้อนี้เนื่องจาก pseudonode เป็นโหนดที่ดักจับ 2 linestrings และ dangles เป็นโหนดที่ดัก 1 linestring

WITH nodes AS 
(SELECT ST_StartPoint(geom) AS pt FROM
linestring_table UNION ALL 
SELECT ST_EndPoint(geom) AS pt FROM
linestring_table) 
SELECT pt FROM nodes
GROUP BY pt HAVING count(*) = 2;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.