Saya mencoba melakukan penyatuan pada bidang yang sama setelah menggabungkan dua bentuk yang berdekatan. Shapefile berakhir dengan setidaknya satu irisan tipis ruang di antara mereka. Ketika saya mencoba serikat pekerja saya mendapatkan kesalahan lubang yatim berikut:
Kesalahan pada createPolygonsComment (p): rgeos_PolyCreateComment: lubang yatim, tidak dapat menemukan mengandung poligon untuk lubang di indeks 17
Saya telah mengunggah contoh yang dapat direproduksi ke Dropbox di tautan ini .
Berikut adalah kode untuk membuat ulang masalah:
#loading required packages
require(sp)
require(rgdal)
require(maptools)
require(rgeos)
#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")
#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)
Pengembalian:
Kesalahan pada createPolygonsComment (p): rgeos_PolyCreateComment: lubang yatim, tidak dapat menemukan mengandung poligon untuk lubang di indeks 17
Mencoba perbaikan yang diusulkan di sini dan di sini :
slot(example, "polygons") <- lapply(slot(example, "polygons"), checkPolygonsHoles)
Ini mengembalikan kesalahan yang sama yang berasal dari upaya serikat tetapi dengan nomor indeks berbeda:
rgeos_PolyCreateComment: lubang yatim, tidak dapat menemukan mengandung poligon untuk lubang pada indeks 30
Mencoba perbaikan yang diusulkan dalam tutorial bermanfaat Roger Bivand
fix <- slot(example, "polygons")
fixa <- lapply(fix, checkPolygonsHoles)
Mengembalikan kesalahan yang sama pada indeks 30 seperti di atas.
Yang lain telah mengangkat masalah ini di sini dan di sini , dan sementara solusi yang diajukan di atas tampaknya bekerja untuk beberapa kasus, kasus lain tidak terselesaikan. Satu pengguna menggunakan QGIS untuk mengatasi masalah, dan yang lain memiliki 2 dari 3 item yang diperbaiki, tetapi tidak ada resolusi untuk yang terakhir.
Tampaknya orang terus mengalami masalah meskipun kode ini berfungsi dari waktu ke waktu. Adakah yang menemukan solusi dalam R?
Saya telah melakukan "perbaikan geometri" alat di ArcGIS, dan itu memperbaiki masalah, tetapi sepertinya harus ada perbaikan di R.
Jawaban:
Saya telah menganalisis masalah geometri pada data terlampir, dan sepertinya tidak HANYA dimiliki
orphaned holes
tetapi jugageometry validity issues
. Memang benar bahwaorphaned hole
entah bagaimana masalah validitas geometri, tetapi rgeos tidak menanganinya dengan cara yang sama, seperti untuk lubang yatim, kesalahan muncul, bukannya peringatan sederhana. Seperti yang Anda tunjukkan, itu adalah petunjuk untuk memeriksa lubang poligon, tetapi itu tidak selalu berhasil ketika diterapkan untuk memperbaiki lubang yatim.Jadi ayo:
bersihkan data Anda (yang diperlukan jika Anda ingin melakukan geoproses seperti gabungan)
gunakan data yang dibersihkan dengan proses penyatuan Anda
1. Membersihkan geometri Memperbaiki geometri dalam R terkadang sulit, jadi saya telah mencoba membuat paket R eksperimental (lihat https://github.com/eblondel/cleangeo ) yang bermaksud memfasilitasi pembersihan
sp
objek (saat ini terbatas pada bentuk poligonal). Anda dapat menginstal paket dengan:Untuk memulai, ada baiknya Anda melihat apa saja masalah geometri dengan data sumber Anda. Untuk ini, Anda dapat menjalankan yang berikut ini (data Anda besar sehingga dapat memakan waktu):
Dengan ini, Anda akan melihat bahwa data Anda memiliki 2 jenis masalah:
orphaned holes
dangeometry validity issues
. Baik (dan tidak hanya lubang yatim) cenderung membuatunion
proses gagal, sehingga data harus dibersihkan sebelumnya, dengan cara otomatis jika memungkinkan. Untuk reproduksi cepat, kode sampel pertama di bawah ini hanya mengambil subset fitur yang ditandai sebagai mencurigakan (kecuali yang terbaru, dengan indeks = 9002 dalam data asli - lihat catatan saya di bawah ini tentang ini)Jika
clgeo_Clean
berhasil dengan baik, Anda harus mendapatkan semua geometri yang valid sekarang. Anda dapat menerapkan ini pada dataset lengkap (kecuali indeks fitur = 9002)2. Proses penyatuan Sekarang, mari kita lihat apakah
union
bekerja pada dataset ini:Catatan: seperti yang dikatakan sebelumnya, saya telah menghapus satu fitur (indeks = 9002). Dengan memplotnya:,
plot(sp[9002,])
Anda akan melihat bahwa fitur ini sangat (sangat) kompleks. Saya telah mengecualikannya dari sampel hanya karena memeriksa lubang terlalu banyak memakan waktu. Mari kita lihat sekarang jika masalah yang sama terjadi menggunakanreadShapePoly
(darimaptools
) untuk membaca data ...3. Beralih ke readShapePoly vs. readOGR untuk membaca data (PEMBARUAN)
readOGR
bukan satu-satunya fungsi yang tersedia untuk membaca shapefile. Anda juga dapat menggunakanreadShapePoly
darimaptools
paket, umumnya lebih berkinerja daripada yang pertama:Selain berjalan lebih cepat:
jika Anda menggunakan kode di atas berdasarkan
clgeo_CollectionReport
, tidak ada masalah lubang yatim, tetapi masih masalah geometri.Membersihkan geometri dengan
clgeo_Clean
juga berjalan dengan baik, dan sekarang tidak terjebak dengan indeks fitur 9002Dan ... proses persatuan bekerja.
Lihat di bawah hasil plot:
Kesimpulan : lebih suka maptools untuk membaca data shapefile Anda, dan pertimbangkan untuk menggunakan cleangeo untuk membersihkan data Anda sebelum melakukan geoproses.
sumber
Solusi mudah yang terus bekerja untuk saya di R adalah menerapkan buffer nol lebar :
unionSpatialPolygons membutuhkan beberapa saat dengan kumpulan data ini, tetapi tampaknya berfungsi dengan baik.
sumber