[EDIT: solusi untuk ini adalah hanya menggunakan OGR untuk membaca shapefile. Lihat contoh geografi.]
Dalam bentuk ESRI, tidak ada perbedaan antara Poligon dan MultiPoligon. Lebih jauh lagi, tidak ada perbedaan eksplisit antara lubang interior dan cincin eksterior (selain "kidal" dari poligon tertentu).
Jadi setelah membaca sebuah shapefile, saya memiliki daftar urutan koordinat yang menggambarkan cincin, tetapi tanpa proses yang lebih intensif, saya tidak dapat membedakan cincin mana yang merupakan cincin eksterior, lubang interior, atau poligon tambahan.
Tampaknya untuk rupawan 's Polygon dan MultiPolygon konstruktor, harus ada perbedaan yang jelas antara eksterior dan cincin interior, jadi bagaimana saya harus pindah dari daftar yang tidak jelas dari cincin untuk set memerintahkan poligon terpisah, dengan interior jelas ditunjuk dan cincin eksterior ?
Untuk meringkas: jika saya memiliki daftar cincin poligon, tetapi saya tidak tahu cincin mana yang lubang di bagian dalam atau merupakan poligon yang terpisah, bagaimana sebaiknya saya mengurutkannya menjadi poligon yang terpisah dengan lubang bagian dalam yang ditunjuk?
Saya mencari solusi algoritmik sederhana yang dapat saya terapkan dalam python, dapat digunakan untuk memproses ratusan poligon dalam ~ satu menit atau kurang, dan saya melakukan ini untuk melakukan sejumlah besar persimpangan.
Jawaban:
Selanjutnya untuk mengembalikan jawaban tentang cara mendapatkan poligon individu, Anda kemudian dapat menjalankan persimpangan pada semua poligon untuk membuat lubang. Jika dataset Anda berisi poligon yang tumpang tindih meskipun Anda kurang beruntung.
Jelaskan lagi apa yang salah dengan pembaca shapefile yang ada?
Tidakkah lebih mudah untuk mengekspor ID fitur dan nilai M dari shapefile dan kemudian bergabung kembali ke poligon setelah menggunakan pembaca shapefile yang ada?
Untuk multipatch, Anda dapat menggunakan teknik yang sama dalam menetapkan ID poligon ke "patch ID" dan kemudian menambahkan atribut ini kembali ke fitur.
Sunting: Sementara Anda mengatakan Anda tidak ingin menggunakan OGR, kalau-kalau Anda berubah pikiran ..
Geometri harus berupa output sebagai berikut:
Braket pertama berisi koordinat cincin eksterior, kemudian tanda kurung cincin interior. Jika Anda memiliki nilai Z poin harus dalam format 79285 57742 10 (di mana coord terakhir adalah ketinggian).
Kalau tidak, Anda bisa menggunakan fungsi Shapely Contains dan Within untuk menilai setiap poligon satu sama lain dan menerapkan indeks spasial sebelumnya - http://pypi.python.org/pypi/Rtree/ untuk mempercepat pemrosesan.
sumber
Pertama, gunakan ogr untuk membuka shapefile:
mengubah geometri shapefile menjadi geometri bentuk
Untuk poligon dalam multipolygon:
Dan sekarang, Anda dapat menggunakan semua fungsi shapely ( rupawan )
sumber
Saya tidak terlalu terbiasa dengan bagaimana sebenarnya poligon disimpan dalam file bentuk, tetapi - bukankah seharusnya cincin poligon menjadi loop tertutup jika dan hanya jika koordinat awal diulang? Jadi, jika Anda membandingkan setiap koordinat berikutnya dengan koordinat awal, Anda akan menemukan titik pertama di mana poligon ditutup. Jika itu adalah koordinat terakhir dari poligon, itu adalah poligon sederhana, jika tidak, itu adalah multipoligon dan membutuhkan pemrosesan loop lainnya.
Itu mungkin 'pemrosesan lebih intensif' yang ingin Anda hindari, tetapi itu sebenarnya hanya iterasi melalui koordinat yang datang secara gratis ketika Anda harus membacanya.
sumber
Seperti ditunjukkan oleh @ inc42 , pada halaman 8 ESRI Shapefile Deskripsi Teknis: Buku Putih ESRI - Juli 1998 (halaman 12 dari 34 dalam PDF) ada diskusi tentang konten rekaman poligon yang mungkin seperti apa yang Anda cari:
sumber