สแน็ปอินเส้นไปยังจุดโดยอัตโนมัติ?


19

ฉันมีสองรูปร่างเวกเตอร์: หนึ่งไฟล์คือจุดที่แสดงถึงบ่อพักและอีกอันคือไฟล์ polyline ซึ่งเป็นตัวแทนของท่อที่นำไปสู่และจากบ่อพัก ฉันจำเป็นต้องตะครุบเส้นภายในระยะที่กำหนดกับท่อระบายน้ำที่ใกล้ที่สุด

มีวิธีง่ายๆในการทำสิ่งนี้โดยไม่ทำด้วยตนเองหรือ

บรรทัด -> จุด

ปรับปรุง

ตาม Alexandre ฉันได้ส่งออกรูปร่างของฉันไปเป็นรูปแบบ spatialite ไม่แน่ใจว่าจะทำอะไรต่อไป

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

อัปเดต # 2 ฉันสร้างไฟล์ db ใหม่และนำเข้า shapefiles ไปยังฐานข้อมูลใหม่โดยใช้ spatialite-gui ฉันปรับคิวรี SQL ของฉัน แต่อย่างที่คุณเห็นฉันได้รับข้อผิดพลาด "ไม่มีคอลัมน์ดังกล่าว: f.geom"

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


ในตารางเชิงพื้นที่ (เลเยอร์) รูปทรงเรขาคณิตของคุณลักษณะจะถูกบันทึกไว้ในแอตทริบิวต์ ชื่ออาจแตกต่างกัน ในตาราง "ไพพ์" ที่แอตทริบิวต์นั้นเรียกว่าเรขาคณิต ฉันจะอัปเดตคำตอบของฉันโดยสมมติว่า mh นั้นเป็นคุณลักษณะทางเรขาคณิตด้วย
Alexandre Neto

ฉันพบข้อผิดพลาด "ไม่มีฟังก์ชั่นดังกล่าว: ST_Snap" ฉันใช้ QGIS 1.8 บน Windows 7 64 บิต
GreyHippo

คุณมี Spatialite อะไร? คุณสามารถตรวจสอบได้ใน QGIS> ความช่วยเหลือ> เกี่ยวกับ
Alexandre Neto

"ไม่มีคอลัมน์ดังกล่าว: f.geom" - ลองใช้ f.Geometry
vinayan

เวอร์ชั่น Spatialite ของฉันคือ 3.0.1
GreyHippo

คำตอบ:


26

หากคุณยินดีที่จะใส่ข้อมูลของคุณในPostgis (หรือSpatialite ) คุณสามารถใช้ST_Snapเพื่อทำสิ่งที่คุณต้องการ

เพียงแค่ใช้เส้นเลเยอร์ \ ตารางเป็นอินพุตและเลเยอร์จุดของคุณเป็นข้อมูลอ้างอิงและตั้งค่าความอดทน บางสิ่งเช่นนี้

SELECT
    f.gid as gid,
    ST_Snap(f.Geometry, g.Geometry, 2) as geom
FROM
    pipe as f,
    (SELECT ST_Collect(Geometry) as Geometry
     FROM mh) as g

ผลลัพธ์คือ:

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

จากนั้นคุณสามารถอัปเดตรูปทรงเรขาคณิตของคุณโดยใช้ตัวระบุคุณสมบัติ


ฉันจะใส่รหัส "เลือก ... จาก ... " ได้ที่ไหน "ใช้ตัวระบุคุณสมบัติ" หมายความว่าอย่างไร
GreyHippo

หลังจากนำเข้าไฟล์ของคุณในฐานข้อมูล (postgis หรือ spatialite) คุณสามารถใช้ตัวจัดการฐานข้อมูลเพื่อดูตารางฐานข้อมูลของคุณและเรียกใช้แบบสอบถาม SQL (รหัส) ในหน้าต่าง SQL แล้วโหลดลงในพื้นที่ทำงานของคุณ บอกฉันว่ามันเหมาะกับคุณหรือไม่แล้วเราจะทำส่วนอัพเดท
Alexandre Neto

โปรดอ่านอัปเดตด้านบน ฉันส่งออกไฟล์เป็นไฟล์ spatiallite สองไฟล์
GreyHippo

คุณควรวางทั้งสองไฟล์ไว้ในฐานข้อมูล Spatialite เดียวกันเพียงลากคำว่า "ไพพ์" ไปยังฐานข้อมูล "mh.sqlite" หลังจากนั้นอัปเดตรหัส SQL เพื่อเปลี่ยน "points" เป็น "mh" และ "lines" เป็น "pipe" ปรับ "gid" ให้สอดคล้องกับ id "pipe" ของคุณ หลังจากนั้นคุณสามารถดำเนินการและโหลดผลลัพธ์
Alexandre Neto

3

ฉันไม่ค่อยรู้อะไรเกี่ยวกับ QGIS หรือ GRASS แต่ Google Googling ที่รวดเร็วบางอย่างให้v.cleanใน GRASS ควรทำเรื่องหลอกลวง

มีลักษณะที่โพสต์นี้และหนึ่งในนี้

ทางเลือกของ QGIS และ GRASS:

ถ้าฉันจะทำเช่นนี้ใน ArcGIS ฉันอาจจะเก็บข้อมูลของฉันในชุดข้อมูลคุณสมบัติในฐานข้อมูลไฟล์และสร้างโทโพโลยีเพื่อระบุพื้นที่ที่เลเยอร์จุดไม่ได้อยู่บนจุดสิ้นสุดของเส้น จากนั้นคุณสามารถแก้ไขข้อผิดพลาดโดยใช้ตรวจสอบข้อผิดพลาด

แต่อาจเป็นวิธีที่เร็วและง่ายที่สุดใน FME คุณอาจจะลองใช้เครื่องมือปลากะพงหรือยังดีกว่าที่เครื่องมือ AnchoredSnapper หากคุณใช้ AnchoredSnapper ต้องแน่ใจว่าประเภทการสแนปของคุณคือ End Point Snapping แน่นอนคุณจะต้องมีใบอนุญาตสำหรับ FME แต่คุณสามารถดาวน์โหลดทดลองใช้ 14 วันหากคุณไม่มี


ฉันดู v.clean แต่ใช้เพียงเลเยอร์เดียวฉันต้องเปรียบเทียบเลเยอร์หนึ่งกับอีกชั้นหนึ่ง นอกจากนี้ฉันยังมองหาตัวเลือก QGIS / opensource มากกว่า
GreyHippo

1
@GreyHippo, GRASS เป็น opensource
artwork21

1
ฉันรู้ว่า GRASS เป็น opensource แต่ตัวเลือกอื่นของคุณไม่ใช่
GreyHippo


-1

คู่มือวิธี

Qgis -> การตั้งค่า -> ตัวเลือกการสแนป (และฉันไม่แน่ใจ แต่อาจต้องใช้ส่วนขยาย CadTools) และเปิดใช้งานการแก้ไขโทโพโลยี

วิธีอัตโนมัติ

v.clean ซึ่งอยู่ในเครื่องมือ GRASS ในกล่องเครื่องมือ SEXTANTE ใน QGIS หากคุณมี PostGIS 2.0 แล้ว ST_Snap และ ST_SnapToGrid () (และไม่มีเหตุผลที่คุณไม่สามารถใช้มันเป็นเครื่องมือเชิงพื้นที่ที่ดีมาก)

วิธีการค้า

เครื่องมือ FME และ MRF (ส่วนขยายเพื่อการค้าฉันมีเวอร์ชันทดลองใช้แล้วดีมาก)

นอกจากนี้ฉันยังสนใจเกี่ยวกับการจัดการท่อน้ำ / ท่อระบายน้ำด้วยเครื่องมือโอเพนซอร์สคุณมีคำแนะนำหรือไม่?


ฉันคิดว่านั่นคือสิ่งที่ GreyHippo หมายถึงโดย เพียงแค่ใช้ตัวเลือกการสแนปคุณจะต้องย้ายทุกโหนดที่ห้อยด้วยมือเพื่อเปิดใช้งานสแนป หรือว่าฉันขาดอะไรไป?
Jake

ไม่ ฉันตาบอด
simplexio

Simplexio ฉันไม่ต้องการทำด้วยตนเอง ฉันหวังว่าจะมีปลั๊กอินหรือกระบวนการที่ฉันไม่รู้
GreyHippo

ฉันไม่คิดว่าคุณจะใช้ GRASS v.clean สองชั้นได้หรือไม่
GreyHippo

1
ถ้าฉันจำได้อย่างถูกต้องมันสามารถแก้ไขเส้นสั้นเกินไป คุณเห็นไหมว่าปัญหาที่คุณมีไม่ได้อยู่ที่บ่อพักของคุณไม่ถูกต้องเพราะที่เครือข่ายท่อระบายน้ำของคุณไม่ถูกต้องด้วยวิธีทอพอโลยี และนั่นต้องการเพียงแค่ท่อเลเยอร์เท่านั้น ทุกระบบเครือข่ายยูทิลิตี้ที่ฉันได้เห็นถือว่ามีท่อระบายน้ำในทุกแยกท่อระบายน้ำ offcourse นี้อนุมานว่าคุณต้องการมีโทโพโลยีที่ถูกต้อง
simplexio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.