การลบช่องว่างเล็ก ๆ (slivers) ระหว่างรูปหลายเหลี่ยม? [ปิด]


51

ฉันมีชุดรูปหลายเหลี่ยมที่เป็นตัวแทนของเขตการปกครอง หัวเมืองถูกทำสำเนาด้วยมือและมีช่องว่างเล็ก ๆ (slivers) ระหว่างรูปหลายเหลี่ยมที่รูปหลายเหลี่ยมควรสัมผัส

ฉันจะให้รูปหลายเหลี่ยมจัดชิดกันโดยลบช่องว่างได้อย่างไร

แนะนำให้ใช้ QGIS แต่ ArcGIS และการเขียนโปรแกรมทั่วไปก็มีให้เลือกเช่นกัน

คำตอบ:


27

ใช้กำจัด (ต้องมีใบอนุญาต ArcInfo)

กำจัดรูปหลายเหลี่ยมด้วยการรวมเข้ากับรูปหลายเหลี่ยมที่อยู่ใกล้เคียงซึ่งมีพื้นที่ที่ใหญ่ที่สุดหรือชายแดนที่ใช้ร่วมกันที่ยาวที่สุด กำจัดมักจะใช้เพื่อลบรูปหลายเหลี่ยมเศษไม้ขนาดเล็กที่เป็นผลมาจากการดำเนินการซ้อนทับเช่นตัดหรือสหภาพ

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000005p000000.htm

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

ผู้ใช้งาน ArcGIS 10 ทราบว่ามีฟีเจอร์ใหม่ในตัวเลือกสำหรับเครื่องมือนี้

ตอนนี้เป็นไปได้ที่จะรักษา POLYGON ดั้งเดิมหรือ POLYLINE ด้วยตัวเลือก> ex_features (เป็นทางเลือก) คลาสโพลีไลน์หรือรูปหลายเหลี่ยมอินพุทหรือเลเยอร์คุณลักษณะที่กำหนดขอบเขตรูปหลายเหลี่ยมหรือส่วนที่ไม่ควรถูกกำจัด


3
มันใช้งานได้ในกรณีของสวนสัตว์หรือไม่? ดูเหมือนจะไม่มีตัวคั่นในชุดข้อมูลเพียงแค่ช่องว่างระหว่างรูปหลายเหลี่ยม
underdark

3
ฉันใช้เครื่องมือนี้เพื่อลบช่องว่างระหว่างรูปหลายเหลี่ยมเรียบร้อยแล้ว มีปัญหาในการใช้เครื่องมือนี้แม้ว่า เมื่อมีการแตกรูปหลายเหลี่ยมในระหว่างการประมวลผลทางภูมิศาสตร์มันเป็นรูปหลายเหลี่ยมทั่วไปที่สร้างขึ้นใหม่ ดังนั้นเส้นโค้งจะไม่ราบรื่นเหมือนมีเส้นคม "ขรุขระ" YMMV
amasephy

3
@underdark จุดที่ดี อย่างไรก็ตามหนึ่งสามารถแนะนำ slivers ผ่านการรวมกันของข้อมูลที่มีรูปหลายเหลี่ยมเสาหินล้อมรอบ (เช่นกล่องขอบเขตของชุดข้อมูล) คำถามที่น่าสนใจคือวิธี "กำจัด" เลือกรูปหลายเหลี่ยมที่จะรวม slivers ลงใน สิ่งนี้อาจมีอคติต่อผลลัพธ์ (แม้ว่าฉันสงสัยว่าอคติจะมีความสำคัญในแอปพลิเคชันส่วนใหญ่) ในสถานการณ์เฉพาะนี้ทางออกที่ดีที่สุดจะแยก slivers หรือหาข้อผิดพลาดโดยเฉลี่ย
whuber

หนึ่งในตัวเลือกของเครื่องมือคือการรวมเศษไม้กับรูปหลายเหลี่ยมที่อยู่ใกล้เคียงกับเส้นขอบที่ยาวที่สุด (ตัวเลือกเริ่มต้น) หรือพื้นที่ที่ใหญ่ที่สุด
kenbuja

4
หากคุณไม่มีใบอนุญาต ArcInfo มีสคริปต์อยู่ที่arcscripts.esri.com/details.asp?dbid=14672ซึ่งทำหน้าที่นี้โดยอัตโนมัติผ่าน Python ฉันใช้มันสำเร็จไม่กี่ปีที่ผ่านมา
สตีเฟ่นนำ

20

เมื่อต้องการทำสิ่งนี้ด้วยมือใน QGIS ให้ไปที่Settings|Project Properties...บนGeneralแท็บด้านล่างคือSnapping options...ตรวจสอบเลเยอร์ที่คุณต้องการถ่ายตั้งโหมดto vertexและตั้งค่าความอดทนเป็นค่าที่น้อยกว่าระยะทางที่สั้นที่สุดระหว่างสองจุดที่คุณมี หากคุณไม่แน่ใจให้ตั้งค่าหน่วยเป็นpixelsและความอดทนต่อบางอย่างเช่น 5 เพื่อให้มีรายละเอียดเที่ยวยุ่งยิ่งคุณสามารถซูมเข้าและตรวจสอบให้แน่ใจว่าคุณไม่ได้ชิดกับจุดสุดยอดที่ผิด

จากนั้นแก้ไขเลเยอร์เวกเตอร์ของคุณเลือกเครื่องมือโหนดและย้ายจุดที่หลงทางไปยังคู่ของพวกเขา

การทำโดยอัตโนมัตินั้นค่อนข้างจะยุ่งยาก AFAIK QGIS ไม่มีปลั๊กอินที่จะทำการทำให้เป็นอัตโนมัติและแม้ว่า PostGIS จะถูกสร้างขึ้นบน GEOS ซึ่งมีฟังก์ชั่นการหักมุม อาจเป็นไปได้ที่จะเขียนแบบสอบถามเพื่อตรวจสอบแต่ละจุดของรูปหลายเหลี่ยมเพื่อหาเพื่อนบ้านที่อยู่ในระยะทางที่หักมุม แต่ตอนนี้มันเกินความสามารถของฉันในการขยาย

GRASS มี v.clean.snap ซึ่งคุณสามารถเข้าถึงผ่าน QGIS แต่มีขั้นตอนพิเศษในการสร้างชุดข้อมูล GRASS


คุณสามารถใช้กล่องเครื่องมือประมวลผล QGIS และใช้ v.clean.snap โดยตรงกับ shapefile ของคุณ
SAnderka

v.clean.snap ไม่พร้อมใช้งาน ฉันใช้ v.clean แล้วเลือกเครื่องมือ snap และให้เลเยอร์ที่ว่างเปล่า เอกสารบอกว่า snap คือการเข้าร่วมสายกับจุดสุดยอด ฉันต้องการเข้าร่วมจุดสุดยอดกับจุดสุดยอดอื่นภายในขีด จำกัด
neogeomat

17

หากคุณคุ้นเคยกับ QGIS: ใน QGIS trunk 1.9 (สามารถติดตั้งเป็น qgis.dev ผ่านตัวติดตั้ง OSGEO ได้ที่หน้าแรกของ qgis) เป็นฟังก์ชั่นใหม่ในเมนูแบบเวกเตอร์ที่เรียกว่า "กำจัดรูปหลายเหลี่ยม" ต้องการ. คุณสามารถเลือกรูปหลายเหลี่ยมที่มีปัญหาและรวมเข้ากับรูปหลายเหลี่ยมที่อยู่ติดกันโดยยึดตามขอบเขตทั่วไปหรือการเคลื่อนที่ของพื้นที่ ลอง!


3
หากต้องการอัปเดตคำตอบนี้ใน QGIS 2.18.1 'Eliminate Sliver Polygons' มีอยู่ในแพ็คเกจที่เสถียรและพบได้ใน Vector -> เครื่องมือประมวลผลทางภูมิศาสตร์
Valerie Anderson

สิ่งนี้ใช้กับรูปหลายเหลี่ยมเศษไม้หลงทางที่มีอยู่ในระหว่างวัตถุหลักไม่ใช่ในกรณีของช่องว่างระหว่างรูปหลายเหลี่ยม
stragu

15

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

เปิด mapset และนำเข้าเลเยอร์สกปรกของคุณด้วย v.in.ogr: เล่นกับพารามิเตอร์ขั้นสูงสองอย่าง "snapping threshold สำหรับขอบเขต" และ "ขนาดขั้นต่ำของพื้นที่ที่จะนำเข้า"

คุณยังสามารถใช้ตัวเลือกที่โมดูล v.clean จัดให้


10

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

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

จากนั้นใช้เครื่องมือตรวจสอบข้อผิดพลาดและเครื่องมือแก้ไขข้อผิดพลาดโทโพโลยีคุณสามารถเลือกข้อผิดพลาดที่คุณต้องการแก้ไขเป็นรายบุคคลหรือเป็นกลุ่มและวิธีที่คุณต้องการแก้ไข (เช่น - สร้างรูปหลายเหลี่ยมใหม่เพื่อเติมช่องว่างหรือผสานด้วยรูปหลายเหลี่ยมขนาดใหญ่) .


7

มีฟังก์ชั่น "กำจัดรูปหลายเหลี่ยม" ในกล่องเครื่องมือ QGIS 2.12 (Lyon) ฉันแน่ใจว่ามันยังอยู่ในรุ่นก่อนหน้าบางส่วน


2

ดีฉันได้ใช้ฟังก์ชั่น PostGIS (ฉันใช้กับ QGIS ของฉันโดยตรง) ที่ดำเนินการ snap ซ้ำเพื่อแก้ปัญหานี้ ผลลัพธ์ค่อนข้างดีเพียงแค่ต้องการค่าความอดทนที่ดีเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด หากคุณยินดีที่จะลองตรวจสอบ (ในกรณีของฉันรูปทรงเรขาคณิตมีหลายแบบดังนั้น st_multi ในคำสั่งของฉัน):

CREATE OR REPLACE FUNCTION dsgsnap(tabela text, snap float) RETURNS void AS 
        $BODY$
            DECLARE
            id int;
            BEGIN
                FOR id in execute('select id from '||tabela)
                LOOP
                    EXECUTE     
                'update '||tabela||' as classe set geom = st_multi(res.geom) 
                from 
                    (
                        select st_snap(a.geom, st_collect(b.geom), '||snap||') as geom, a.id as id 
                        from '||tabela||' a, '||tabela||' b 
                        where a.id != b.id and a.id = '||id||' 
                        group by a.id, a.geom
                    ) as res 
                where res.id = classe.id';
                END LOOP;
                RETURN;                        
            END
        $BODY$
        LANGUAGE plpgsql;

1

ไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่อย่างใดอย่างหนึ่งในสองสิ่งนี้เหมาะกับฉันในกรณีส่วนใหญ่:

  1. ใน QGIS ให้บันทึกเลเยอร์ในรูปแบบ GEOJSON แต่ก่อนบันทึกในกล่องโต้ตอบ "บันทึกเลเยอร์เป็น" ให้ตั้งค่าความแม่นยำพิกัดเป็น 3 (15 เป็นค่าเริ่มต้น) สิ่งนี้จะมีผลกระทบจากการรวมจุดยอดที่ใกล้กับแต่ละคน

  2. ไปที่Mapshaperอัปโหลดไฟล์และกด "ลดความซับซ้อน" ที่มุมบนซ้ายมันจะบอกคุณว่ามีจุดตัดหลายบรรทัดที่ค้นหาและจะให้ตัวเลือกในการแก้ไข ฉันพบว่าการแก้ไขนี้ใช้งานได้ประมาณครึ่งหนึ่ง


0

ฉันไม่ได้ใช้ แต่ET Geowizardsซึ่งนำเครื่องมือการประมวลผล ArcEditor และ ArcInfo จำนวนมากมาใช้กับใบอนุญาตระดับ ArcView (หรือที่รู้จักในชื่อ ArcGIS Standard) มีตัวช่วยสร้างการกำจัดที่"กำจัดรูปหลายเหลี่ยมที่ไม่ต้องการ (slivers) ลบออก " . ชุดเครื่องมือตัวช่วยสร้างจะตั้งคุณกลับ $ 250 เหรียญสหรัฐ ( pricelist )


0

ฉันประสบปัญหาเดียวกันซึ่งโดยการสำรวจเครื่องมือที่ฉันตัดสินค่อนข้างง่ายแม้ว่าฉันจะไม่ทราบเหตุผล ! [ในเครื่องมือไปที่กล่องเครื่องมือ Data Management ไปที่ Feature Class และเรียกใช้สคริปต์รวมโดยดับเบิลคลิก] [1]

ในหน้าต่างสคริปต์เลือกคลาสคุณลักษณะที่มีปัญหาและในค่าเผื่อ XY เพิ่มหุบเขาโดยการวัดระยะทางด้วยความช่วยเหลือของเครื่องมือวัดที่หลายจุดและรับหุบเขาเฉลี่ยทำให้ค่านั้นอยู่ในสภาพแวดล้อมที่ยอมรับได้และแก้ไขปัญหาได้แล้ว ไม่ใช่ตอนนี้วิธี แต่แก้ไขด้วยความแม่นยำประมาณ 90% ! [ใส่คำอธิบายภาพที่นี่] [2]

ฉันลองวิธีอื่นทั้งหมดที่อธิบายไว้ในคำตอบข้างต้น แต่ยากและยุ่งยากที่จะได้รับการแก้ไขอัตโนมัติสำหรับช่องว่างระหว่างรูปหลายเหลี่ยมที่อยู่ติดกัน


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