Larutkan poligon di QGIS (GEOS) dengan toleransi

11

Saya memiliki layer vektor poligon yang mewakili area yang tergenang banjir. Lapisan telah diproduksi sedemikian rupa sehingga beberapa area terdiri dari beberapa poligon menyentuh yang lebih kecil (lihat tangkapan layar di bawah, berlabel "data asli").

Saya ingin melarutkan poligon di mana mereka menyentuh. Jika saya menggunakan alat geoprocessing terlarut dalam fTools QGIS, yang menggunakan perpustakaan GEOS, saya mendapatkan beberapa hasil yang tidak terduga (lihat "larut dengan fGool QGIS"). Tampaknya GEOS tidak menggunakan ambang batas dalam menentukan apakah poligon bersentuhan, seperti yang disebutkan dalam masalah ini:

http://trac.osgeo.org/qgis/ticket/3126

http://trac.osgeo.org/qgis/ticket/3184

http://hub.qgis.org/issues/2806

Pendekatan yang sama di ArcGIS memberikan hasil yang diharapkan (lihat "larut dengan ArcGIS 10.1").

Rupanya ini adalah "fitur" GEOS, bukan bug. Apakah ada cara untuk memperbaiki data yang saya miliki untuk menghasilkan hasil yang diharapkan? Kehilangan presisi yang kecil (beberapa cm?) Dapat diterima untuk saya. Idealnya solusinya adalah sesuatu yang bisa saya tulis ke dalam plugin QGIS, sebagai langkah pra-pemrosesan.

Pertanyaan terkait (tanpa jawaban): Bagaimana cara menetapkan nilai toleransi alat Geoprocessing di QGIS?

Tautan ke sampel data sebagai shapefile: https://www.dropbox.com/s/c8ns7wwfv289ad0/sample.zip

melarutkan poligon v.diselesaikan

Snorfalorpagus
sumber
Solusinya adalah pertama-tama menumbuhkan dan kemudian mengecilkan poligon terlarut fTools (dengan buffering pertama dengan positif dan kemudian dengan buffer negatif).
Jake
Saya memang mencoba ini, tetapi saya berakhir dengan masalah lain (mis. I.stack.imgur.com/LnFJy.png ). Di sini, area biru dibuat ketika saya buffer / larut / neg-buffer, di mana seharusnya tidak. Ini tidak jauh lebih baik daripada masalah aslinya. Saya tidak bisa melihat bagaimana saya bisa memulihkan sudut "tajam" yang asli.
Snorfalorpagus

Jawaban:

14

Dalam hal ini, sepertinya Anda perlu membantu alat larut bersama dengan memperbaiki topologi terlebih dahulu. Inilah cara Anda dapat melakukan ini dalam GRASS.

Saat Anda memuat shapefile, beginilah GRASS melihatnya:

Setiap tanda silang menandai area. Anda dapat melihat bahwa ada beberapa persilangan pada garis batas: Ini adalah poligon sliver yang disebabkan oleh sedikit offset antara garis batas.

  1. Hapus poligon sliver yang dibentuk oleh celah antara poligon nyata:

    v.clean input=sample output=tempA --o tool=rmarea thresh=0.001
  2. Ambil garis batas:

    v.clean input=tempA output=tempB --o tool=snap thresh=0.001
  3. Hancurkan garis batas di persimpangan baru:

    v.clean input=tempB output=tempA --o tool=break thresh=0.001
  4. Hapus garis batas sekarang duplikat:

    v.clean input=tempA output=tempB --o tool=rmdupl thresh=0.001
  5. Larutkan poligon

    v.dissolve input=tempB output=cleaned --o column=ID

Et voilà:

Jake
sumber
Terima kasih @Jake. Ini jawaban yang sangat jelas. Sayangnya ketika saya mencoba menerapkan proses ke seluruh dataset saya (meliputi 2500km2), saya mendapatkan kesalahan dari alat snap "ERROR: G_realloc: tidak dapat mengalokasikan 144720024 byte memori di snap.c: 186". Saya kira saya harus memecahnya menjadi potongan-potongan kecil. Itu harus OK, karena saya sudah memecahnya menjadi 0,25km2 kotak untuk mempercepat persimpangan / pengindeksan spasial (ini adalah bidang "ID" dalam data sampel).
Snorfalorpagus
7

Gunakan perintah GRASS GIS v.dissolve (dalam plugin Sextante -> Perintah GRASS -> Vektor)

Misalnya saya cepat mereproduksi Anda: masukkan deskripsi gambar di sini

Hasilnya dengan v.dissolve:

masukkan deskripsi gambar di sini

Penjelasan

Masalahnya mudah dimengerti. Shapefile tidak memiliki topologi, jika dua area berbagi perbatasan bersama, perbatasan itu akan didigitalkan dua kali dan juga disimpan dalam rangkap dua.

Anda melihat ini dengan jelas ketika Anda mencoba mengedit shapefile:

masukkan deskripsi gambar di sini

GRASS GIS (sebagai ArcGIS) adalah suatu topologi gis. Ketika Anda mengimpor shapefile di GRASS, layer yang dihasilkan memiliki topologi: perbatasan umum antara dua area ada satu kali dan dibagi.

masukkan deskripsi gambar di sini

Untuk alasan ini, ketika Anda ingin membubarkan shapefile ( melarutkan dua batas ) Anda mungkin mengalami masalah (dalam QGIS, GvSIG, OpenJUMP, atau ArcView 3.x lama), lihat ArcUserI: Memahami Topologi dan Shapefile .

Dalam GRASS, v.dissolve dirancang untuk melarutkan batas umum antara area dengan nomor kategori yang sama

gen
sumber
1
Dugaan saya adalah bahwa ini adalah masalah numerik, dan saya ingin tahu apakah salinan geometri OP Anda yang cukup bagus, akan menangkap properti numerik yang sama?
Chau
@ Chau: v.dissolvememiliki parameter toleransi, yang mengatasi masalah OP.
Jake
Detail itu harus dimasukkan ke dalam jawaban di atas, terima kasih telah menjelaskan :)
Chau
Saya telah menambahkan tautan ke data asli sebagai shapefile dalam pertanyaan. Ketika saya menggunakannya v.dissolvetampaknya berfungsi, kecuali bahwa itu "mengisi" kotak kecil di tengah fitur. i.stack.imgur.com/AA59l.png
Snorfalorpagus
1
Saya mengusulkan penjelasan
gen