ค้นหาโหนดหลอกในซอฟต์แวร์ 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.