Menghapus ruang kecil (sliver) di antara poligon? [Tutup]


51

Saya memiliki satu set poligon yang mewakili distrik administratif. Distrik-distrik itu didigitalkan dengan tangan, dan ada ruang-ruang kecil (sliver) antara poligon di mana poligon harus bersentuhan.

Bagaimana saya bisa menyatukan poligon, menghilangkan spasi?

QGIS lebih disukai, tetapi ArcGIS dan pemrograman umum juga merupakan opsi.

Jawaban:


27

Gunakan Eliminate (Diperlukan Lisensi ArcInfo)

Hilangkan poligon dengan menggabungkannya dengan poligon tetangga yang memiliki area terbesar atau perbatasan bersama terpanjang. Eliminate sering digunakan untuk menghilangkan poligon sliver kecil yang merupakan hasil dari operasi overlay, seperti Intersect atau Union.

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

masukkan deskripsi gambar di sini

Pengguna ArcGIS 10 Perhatikan ada Fitur BARU di Opsi untuk Alat ini.

Sekarang dimungkinkan untuk mempertahankan POLYGON atau POLYLINE asli dengan opsi> ex_features (Opsional) Input polyline atau kelas fitur atau lapisan polygon yang mendefinisikan batas-batas poligon, atau bagian-bagiannya, yang tidak boleh dihilangkan.


3
Apakah itu berhasil dalam kasus kebun binatang? Tampaknya tidak ada sliver dalam dataset, hanya ada celah di antara poligon.
underdark

3
Saya telah menggunakan alat ini dengan sukses untuk menghilangkan celah di antara poligon. Ada masalah dengan menggunakan alat ini. Ketika itu memecahkan poligon selama geoproses, itu lebih umum dari poligon yang baru dibuat. Jadi, kurva tidak akan sehalus, melainkan memiliki garis "bergerigi" yang tajam. Ymmv.
amasephy

3
@underdark Poin bagus. Namun, kita selalu bisa memperkenalkan sliver melalui penyatuan data dengan poligon sekitarnya monolitik (seperti kotak pembatas dari dataset). Sebuah pertanyaan yang menarik adalah bagaimana "Eliminasi" memilih poligon mana untuk menggabungkan sliver. Ini bisa membiaskan hasil (meskipun saya ragu bias akan menjadi penting di sebagian besar aplikasi). Dalam situasi khusus ini, solusi ideal akan memecah belah sliver, atau rata-rata kesalahan keluar.
whuber

Salah satu opsi alat ini adalah menggabungkan sliver dengan poligon tetangga dengan batas terpanjang (opsi default) atau area terbesar.
kenbuja

4
Jika Anda tidak memiliki lisensi ArcInfo, ada skrip di arcscripts.esri.com/details.asp?dbid=14672 yang mengotomatisasi ini melalui Python. Saya menggunakannya dengan sukses beberapa tahun yang lalu.
Stephen Lead

20

Untuk melakukan ini dengan tangan di QGIS, buka Settings|Project Properties...Pada Generaltab di bagian bawah adalah Snapping options...Periksa lapisan yang ingin Anda jepret, atur mode ke to vertexdan atur toleransi ke beberapa nilai kurang dari jarak terdekat antara dua titik yang Anda miliki. Jika Anda tidak yakin, atur unit ke pixelsdan toleransi ke sesuatu seperti 5 sehingga jika ada beberapa detail fiddly Anda dapat memperbesar langsung dan pastikan bahwa Anda tidak mengambil titik yang salah.

Kemudian edit layer vektor Anda, pilih alat simpul, dan pindahkan titik yang salah ke rekan-rekan mereka.

Melakukannya secara otomatis agak sulit. AFAIK QGIS tidak memiliki plugin untuk mengotomasinya, dan meskipun PostGIS dibangun di atas GEOS yang memang memiliki fungsi gertakan, mereka tidak terpapar ke PostGIS. Dimungkinkan untuk menulis kueri untuk memeriksa setiap titik poligon untuk tetangga dalam jarak gertakan, tetapi saat ini di luar akal saya untuk memperluas.

GRASS memiliki v.clean.snap yang dapat Anda akses melalui QGIS, tetapi ada langkah ekstra untuk membuat dataset GRASS.


Anda selalu bisa menggunakan kotak alat pemrosesan QGIS dan menerapkan v.clean.snap langsung ke shapefile Anda.
SAnderka

v.clean.snap tidak tersedia. saya menggunakan v.clean dan kemudian memilih alat snap dan memberi lapisan kosong. Dokumentasi mengatakan bahwa snap adalah menggabungkan garis ke vertex. Saya ingin bergabung dengan simpul ke simpul lain dalam ambang pintu.
neogeomat

17

Jika Anda terbiasa dengan QGIS: Pada trunk QGIS 1.9 (dapat diinstal sebagai qgis.dev melalui installer OSGEO, lihat homepage qgis) adalah fungsi baru dalam menu vektor yang disebut "Eliminate sliver polygons", yang melakukan apa yang Anda inginkan. ingin. Anda dapat memilih poligon yang bermasalah dan menggabungkannya ke poligon yang berdekatan berdasarkan batas umum atau proposisi area. Cobalah!


3
Untuk memperbarui jawaban ini, di QGIS 2.18.1 'Eliminate Sliver Polygons' tersedia dalam paket stabil dan ditemukan di bawah Vector -> Geoprocessing Tools.
Valerie Anderson

Ini berlaku untuk poligon sliver liar yang ada di antara yang utama, bukan dalam hal spasi antara poligon.
stragu

15

Jika Anda adalah pengguna QGIS daripada Anda mendapatkan semua kekuatan GRASS, karena itu adalah GIS sepenuhnya topologi. Di dalam QGIS aktifkan plugin GRASS, buat lokasi / mapset tempat mengimpor data Anda.

Buka mapset dan impor layer kotor Anda dengan v.in.ogr: mainkan dengan dua parameter lanjutan "snapping threshold for boundaries" dan "ukuran minimum area yang akan diimpor".

Anda juga dapat menggunakan opsi yang disediakan modul v.clean.


10

ArcGIS memiliki aturan topologi yang akan membantu Anda mengidentifikasi dan memperbaiki kesenjangan dalam data Anda seperti apa yang Anda maksud. Untuk membuat Aturan Topologi, Anda akan memerlukan lisensi ArcEditor atau ArcInfo dan menyimpan Kelas Fitur Anda dalam Dataset Fitur dalam geodatabase pribadi atau file.

Anda kemungkinan besar ingin menerapkan aturan " Must Not Have Gaps ". Setelah Anda membuat basis aturan dengan semua aturan yang menurut Anda perlu, Anda ingin memvalidasi topologi yang akan mengidentifikasi semua kesalahan dalam data Anda.

Kemudian, menggunakan Inspektur Kesalahan dan Perbaiki Kesalahan Topologi Alat , Anda dapat memilih secara individual atau massal kesalahan yang ingin Anda perbaiki dan bagaimana Anda ingin memperbaikinya (yaitu- membuat poligon baru untuk mengisi kekosongan atau bergabung dengan poligon yang lebih besar di dekatnya) .


7

Ada fungsi "Hilangkan sliver poligon" di QGIS 2.12 (Lyon) Toolbox. Saya yakin itu juga dalam beberapa versi sebelumnya.


2

Yah, saya telah menggunakan fungsi PostGIS (saya gunakan pada QGIS saya secara langsung) yang mengeksekusi snap rekursif untuk menyelesaikan masalah ini. Hasilnya cukup baik, itu hanya menuntut nilai toleransi toleransi yang bagus untuk mendapatkan hasil terbaik. Jika Anda bersedia untuk mencoba, periksa (dalam kasus saya geometri semua multi, maka st_multi dalam eksekusi saya):

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

Bukan solusi yang sempurna, tetapi salah satu dari dua hal ini bekerja untuk saya dalam banyak kasus:

  1. Dalam QGIS, simpan layer dalam format GEOJSON. Tetapi sebelum menyimpan, dalam kotak dialog "save layer as", atur presisi koordinat ke 3 (15 adalah default). Ini akan memiliki efek menyatukan simpul yang sangat dekat satu sama lain.

  2. Buka Mapshaper , unggah file, dan tekan "simplify." Di sudut kiri atas ia akan memberi tahu Anda berapa banyak persimpangan garis yang ditemukannya, dan akan memberi Anda opsi untuk memperbaikinya. Saya menemukan perbaikan ini berfungsi sekitar separuh waktu.


0

Saya belum pernah menggunakannya, tetapi ET Geowizards , yang membawa banyak alat pengolah ArcEditor dan ArcInfo hanya ke lisensi tingkat ArcView (alias Standar ArcGIS) memiliki Eliminate Wizard yang "Menghilangkan poligon (sliver) yang tidak diinginkan dengan menggabungkannya ke dalam poligon yang berdekatan atau menghapusnya " . Toolkit panduan akan memberi Anda $ 250 usd ( daftar harga ).


0

Saya menghadapi masalah yang sama, yang dengan mengeksplorasi alat-alat saya diselesaikan dengan mudah meskipun saya tidak tahu logikanya. ! [Pada alat buka kotak alat Manajemen Data, buka Kelas Fitur dan jalankan skrip Integrasi dengan klik dua kali] [1]

di jendela Script pilih kelas fitur yang memiliki masalah dan dalam toleransi XY tambahkan lembah dengan mengukur jarak dengan bantuan alat ukur di beberapa titik dan dapatkan lembah rata-rata menempatkan nilai itu di lingkungan toleransi dan menerapkan masalah diselesaikan Saya lakukan tidak sekarang bagaimana tetapi diselesaikan dengan akurasi sekitar 90%. ! [masukkan deskripsi gambar di sini] [2]

Saya mencoba semua metode lain yang dijelaskan dalam jawaban di atas tetapi sulit dan rumit untuk mendapatkan koreksi otomatis untuk kesenjangan antara poligon yang berdekatan.


1
Jika Anda menempelkan tautan ke gambar yang Anda maksud, saya dapat menambahkannya.
djq
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.