Menyederhanakan poligon yang berdekatan menggunakan alat QGIS Simplify Geometries

10

Saya memiliki Shapefile besar dengan 200.000 poligon tetapi file tersebut terlalu besar untuk aplikasi yang akan menggunakannya. Saya ingin menggeneralisasi poligon ini dan membuat file yang jauh lebih kecil.

Saya telah mencoba melakukan ini di QGIS menggunakan alat "Simplify Geometries". Saya telah mencoba ini pada sebagian kecil Shapefile saya dan saya senang dengan hasilnya tetapi memiliki masalah kecil yang saya tidak tahu bagaimana menyelesaikannya. Saya telah menambahkan gambar untuk menunjukkan masalah.

Batas WHITE adalah batas sebelum penyederhanaan. Batas RED adalah setelah penyederhanaan. Area bermasalah dilingkari dengan warna oranye. Seperti yang Anda lihat "batas yang disederhanakan" berisi beberapa area yang setelah penyederhanaan tidak termasuk dalam salah satu poligon sebelumnya.

Bagaimana cara menyederhanakan Shapefile ini dan menjaga batas umum antara poligon sebagai satu baris dan menghilangkan area yang telah dibuat setelah penyederhanaan?

Poligon Sederhana di QGIS

INFORMASI TAMBAHAN:

Setelah mengikuti instruksi yang disarankan

  1. Ubah poligon menjadi garis
  2. Sederhanakan garis
  3. Konversikan garis kembali ke poligon

Saya mendapatkan hasil sebagai berikut. Ini sedikit lebih baik dari sebelumnya tetapi saya masih mendapatkan area di luar poligon asli (lihat area putih pada gambar di bawah).

@Andrew menyarankan agar saya mengaitkan setiap baris dengan poligon yang berdekatan tetapi saya tidak tahu bagaimana melakukannya di QGIS.

masukkan deskripsi gambar di sini

Saya masih mencoba untuk menyelesaikan proses penyederhanaan poligon. Saya telah mengikuti instruksi yang disarankan dalam posting ini dan ketika saya pikir saya mendapat hasil yang dapat diterima satu masalah lagi muncul. Di bawah ini adalah ringkasan dari apa yang saya lakukan dengan gambar hasil. Semua langkah telah dilakukan menggunakan toolbox PENGOLAHAN di QGIS.

  1. Pertama, saya mengonversi poligon menjadi garis
  2. Kedua, saya membersihkan baris menggunakan v.clean dengan opsi break. Ini menghasilkan LAPTOR VEKTOR BERSIH dan LAPANGAN KESALAHAN. Layer Kesalahan (titik-titik hijau pada gambar yang disediakan) memiliki titik hijau di setiap persimpangan garis. Aku tidak tahu apa artinya ini.
  3. Ketiga, saya menyederhanakan garis menggunakan alat "SIMPLIFY GEOMETRY" (menghasilkan garis merah pada gambar). Membandingkan garis merah yang disederhanakan dan garis oranye asli Saya senang dengan hasilnya.
  4. Keempat, saya ingin mengubah garis kembali ke poligon menggunakan alat "Polygonize" di "PROCESSING" dan mendapatkan hasil yang tidak saya harapkan (gambar kedua dengan poligon warna zaitun gelap yang diarsir). Ini terlihat seperti persimpangan lapisan kesalahan yang terhubung dengan polygonizer dan membuat kumpulan poligon yang sama sekali berbeda dengan mengabaikan garis yang disederhanakan.

Bisakah seseorang menjelaskan apa yang salah di sini?

Mengapa garis yang disederhanakan merah tidak dikonversi dengan benar ke poligon yang disederhanakan?

Seperti yang Anda lihat, saya bukan ahli GIS tetapi perlu melakukan ini sendiri. Saya tidak tahu apakah saya terlalu jauh dari solusi, tetapi saya merasa frustasi karena saya dapat melihat garis yang disederhanakan yang menurut saya dapat diterima untuk apa yang ingin saya lakukan tetapi tidak dapat mengubahnya menjadi poligon.

Berikut adalah dua gambar dengan hasil dua langkah terakhir dari proses:

Garis Sederhana dan Garis Asli

Hasil dari garis yang disederhanakan Plygonized

David
sumber
@nhopton Pada situs web Polygonizer plugins.qgis.org/plugins/Polygonizer dikatakan "Membuat poligon dari garis yang berpotongan". Ini menunjukkan bahwa poligon akan dibuat setiap kali ada persimpangan garis (tapi mungkin interpretasi saya salah). Yang saya butuhkan adalah untuk menghilangkan celah-celah yang dibuat ketika menggunakan alat "simplify geometries" dan jika Polygonizer dapat melakukannya saya akan sangat senang.
David
Kalau dipikir-pikir, lapisan poligon asli Anda seharusnya disederhanakan tanpa masalah. Jika tidak melakukan ini saya pikir itu mungkin berarti Anda memiliki poligon buruk dalam data asli. Poligon yang sedikit tumpang tindih atau yang memiliki ruang kecil di antara mereka. Coba perbesar pada bidang masalah untuk melihat apakah Anda dapat menemukan hal seperti ini. N.
nhopton
Cara yang baik untuk menjaga topologi terdiri dari alur kerja yang disarankan oleh @radouxju (kecuali perhitungan centroid yang tidak perlu) dan diwakili dalam model Pemrosesan dalam jawaban saya. Atau, saya pikir GRASS v.generalizeadalah pilihan hebat lainnya. Semoga ini membantu.
Antonio Falciano
Pertanyaan terkait: gis.stackexchange.com/questions/20799/…
simon04

Jawaban:

7

Saya mendapat hasil yang cukup bagus menggunakan GRASS v.generalisasi dari Processing Toolbox menggunakan nilai default:

masukkan deskripsi gambar di sini

Beberapa garis tetap tidak tersentuh.

AndreJ
sumber
Berhasil dengan metode ini setelah menetapkan toleransi jepretan v.in.ogr dari -1 (tanpa jepret) menjadi 0,00001 seperti yang disarankan oleh @Kantan.
cm1
4

Saya mengalami masalah dengan Qgis2.16, tetapi tidak bisa mendapatkan GRASS untuk memberikan hasil yang benar secara topologi seperti @AndreJ.

Solusi yang bagus adalah mengubah toleransi snap v.in.ogr di parameter lanjutan alat v.generalize.simplify . Standarnya adalah -1, yang mencegah gertakan dalam GRASS.

Dengan meletakkan nilai kecil di sini (seperti 1e-05 m), gertakan diaktifkan dan GRASS mengenali batas bersama poligon. Penyederhanaan kemudian memberikan lapisan yang benar secara topologi, tanpa lubang.

Catatan: Dengan mengatur toleransi snap ke nilai yang lebih tinggi, bahkan dimungkinkan untuk mengubah poligon sehingga yang sangat tipis dapat dihapus jika Anda mau. Ikuti operasi itu dengan v.clean menggunakan rmarea dan ambang batas yang cukup besar untuk menghapus sisa-sisa kecil, dan selesai!

Kantan
sumber
3

pertama-tama ubah poligon Anda menjadi garis

gunakan v.clean untuk membersihkan topologi Anda (dengan opsi "break")

maka Anda menyederhanakan garis Anda

Akhirnya Anda mengubah garis Anda kembali ke poligon. (Menggunakan poligon)

EDIT: Untuk mendapatkan atribut poligon Anda, cara terbaik, jika Anda tidak memiliki multipart poligon dalam dataset asli , adalah untuk mendapatkan centroid yang lama dan dari poligon yang disederhanakan dan bergabung dengan mereka berdasarkan lokasi terdekat (centroid harus tidak banyak bergerak jika Anda hanya sedikit mengubah batas Anda)

radouxju
sumber
1
Bagi saya ini kelihatannya seperti Anda menghilangkan beberapa langkah, meskipun alur kerjanya mungkin berhasil pada akhirnya. Saat Anda mengonversi poligon menjadi garis, Anda mungkin perlu mengaitkan garis dengan semua poligon yang berdekatan. Kemudian setelah penyederhanaan, Anda perlu mengubah garis kembali menjadi poligon multi-bagian. Jika poligon asli adalah cembung, Anda mungkin dapat mencocokkan yang asli dengan yang disederhanakan menggunakan centroid (mis. Jika centroid yang asli terkandung dalam poli yang disederhanakan itu cocok). Jika tidak cembung, akan jauh lebih sulit.
Andy W
Hai, saya telah mengikuti prosedur yang disarankan oleh radouxju tetapi saya masih mendapatkan bagian dari poligon asli di luar batas aslinya. Bagaimana cara mengaitkan garis dengan semua poligon yang berdekatan di QGIS? Saya berencana untuk menggunakan poligon ini dalam aplikasi web dan perlu mengurangi jumlah node untuk pemuatan yang lebih cepat. Apa yang saya dapatkan sekarang adalah pengurangan yang baik tetapi saya tidak bisa menyingkirkan area kecil ini yang ada setelah penyederhanaan. Setiap ide untuk menyelesaikan ini akan sangat dihargai.
David
@ David. Saya pikir masalah Anda mungkin dengan Langkah 3, baris ke poligon. Di Toolkit Pemrosesan ada alat yang disebut "Polygonize" dan saya akan mencoba ini. Saya pikir ini masih membutuhkan paket Shapely dan Numpy untuk diinstal. Ini mengatakan, saya tidak bisa membuat "Polygonize" bekerja untuk saya di QGIS-Master pada saat itu. N.
nhopton
2

Anda dapat menyelesaikan masalah dengan model Pemrosesan (ex SEXTANTE) seperti ini:

masukkan deskripsi gambar di sini

Versi skrip:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

Catatan: satu-satunya kendala adalah bahwa bidang umum harus IDdi Join attributes table, karena merupakan satu-satunya bidang output dari Lines to polygons. Itu sebabnya bidang yang umum bukan input variabel dari model. Jadi suatu IDbidang harus tersedia di lapisan poligon input.

Antonio Falciano
sumber