Saya memiliki shapefile yang terinci dengan fitur polygon / multipolygon (file sekitar 500mb). Ini sebenarnya adalah shapefile dari seluruh dunia, dengan fitur yang mewakili garis pantai. Saya perlu membagi data ini menggunakan kisi. Agar jelas, saya tidak ingin 'mengurutkan' data, tetapi sebenarnya memotong poligon menjadi ubin. Saya menyadari pertanyaan ini telah ditanyakan sebelumnya tetapi solusi yang saya temukan tidak berhasil untuk saya.
Saya sudah mencoba:
Menggunakan QGIS dan memotong konten shapefile saya dengan kotak vektor - hasilnya mengerikan. Sebagian besar daratan utama secara ajaib menghilang, meskipun sepertinya bongkahan tanah yang lebih kecil terkadang membuatnya. Saya harus mencatat bahwa metode ini bekerja sangat baik dengan data yang lebih sederhana (mis. Kurang poin)
Menggunakan alat titik-temu OGR. Saya mencoba keduanya melalui ogr2ogr dan bahkan dengan menggulir alat C ++ saya sendiri. Keduanya memiliki masalah yang sama dengan QGIS. Mereka juga tidak menunjukkan masalah ini untuk file sederhana, tetapi gagal yang lebih kompleks. Sebagai referensi, saya menggunakan shapefile dari Australia dan Selandia Baru, di bawah 20mb dalam ukuran, dan baik QGIS dan OGR gagal untuk 'memoleskannya'.
Seseorang menyarankan menggunakan PostGIS pada satu titik, karena ia memiliki fungsi persimpangan - tetapi ST_Intersect PostGIS menggunakan GEOS back end yang sama seperti OGR. Sebenarnya mereka berdua memanggil fungsi yang sama sejauh yang saya tahu, jadi saya tidak berpikir bahwa PostGIS akan menghasilkan hasil yang berbeda.
Saya mencari saran tentang apa lagi yang bisa saya coba. Saya membutuhkan aplikasi atau toolkit yang kuat yang dapat membagi shapefile yang sangat rinci menjadi ubin.
EDIT: Menambahkan beberapa informasi lebih lanjut
Menanggapi Simbamangu:
Shapefile pada dasarnya adalah data garis pantai dari OpenStreetMap. Ini adalah versi gabungan dari file 'diproses_p' (jadi tidak terpecah menjadi ubin) yang saya dapatkan dengan mengirim email ke daftar dev mereka. Perhatikan bahwa pemisahan ubin (menjadi potongan 100km x 100 km dengan tumpang tindih) tidak selalu seperti yang saya inginkan - saya tidak ingin tumpang tindih, dan saya ingin kebebasan memilih ukuran kisi, atau saya hanya menggunakan olahan_p default.
Secara default, data garis pantai memiliki kesalahan geometri yang dilaporkan oleh QGIS. Saya memperbaiki kesalahan ini dengan alat kecil yang saya kumpulkan menggunakan beberapa kode yang saya temukan dirancang untuk secara khusus mengatasi masalah ini (memperbaiki kesalahan geometri dalam data garis pantai: https://github.com/tudelft-gist/prepair ). Menjalankan file dengan alat ini memperbaiki hampir semua kesalahan yang diambil QGIS. Saya hanya mencoba melakukan persimpangan setelah membersihkan file.
Persis seperti yang saya lakukan menggunakan QGIS: Buka data untuk memastikannya terlihat baik di QGIS. Cobalah membaginya menjadi ubin dengan membuat lapisan ubin menggunakan Vector Grid dengan spasi yang ditentukan, dan kemudian memotong dua lapisan - no go. Coba gunakan kumpulan data yang lebih kecil - pilih fitur di Oceania (Aus, NZ) untuk mencoba kumpulan data yang lebih kecil - file bentuk ini berukuran <20mb. Sekali lagi cobalah membaginya, tidak berhasil.
Apa yang saya lakukan dengan OGR: ogr2ogr langsung menggunakan opsi '-spat' dan '-clipsrc' dengan spat_extent. Juga menulis alat C ++ kecil yang berfungsi pada WKT, jadi saya mengonversi shapefile ke WKT menggunakan ogr2ogr, kemudian memberi makan file teks ke aplikasi saya. Itu berjalan melalui file dan memanggil metode titik-temu () yang didokumentasikan di sini: http://www.gdal.org/ogr/classOGRGeometry.html . Saya pikir akhirnya melakukan hal yang sama persis seperti menggunakan ogr2ogr secara langsung.
Menanggapi Brent:
- Itu benar. Semuanya ada di WGS84 Lat / Lon
- Saya akan berpikir bahwa yang sebaliknya adalah benar - bahwa untuk satu set kotak kisi tertentu, akan membutuhkan waktu lebih lama untuk memotong satu multipoligon raksasa daripada sekelompok fitur terfragmentasi yang bisa lebih spasial secara lokal untuk setiap ubin, tetapi ini adalah saran yang menarik - Saya akan mencobanya dan melaporkan kembali.
- Tidak ada bidang atribut yang disimpan selama proses, saya hanya tertarik pada geometri.
- Saya tidak yakin, tapi saya pikir Anda mengatakan saya harus memilih poligon yang tumpang tindih kotak petak yang diberikan dan kemudian melakukan persimpangan. Ini terlalu rumit secara manual dengan QGIS. Alat saya sudah melakukan ini sampai batas tertentu dengan centang kotak terikat. Ada sedikit peningkatan, tetapi hasil akhirnya masih buruk dan tidak terlalu berbeda.
- Ini bukan pilihan. Saat ini saya sedang mencoba untuk membagi data sehingga 1 deg lat x 1 deg lon, dan saya sedang mencari metodologi umum / kuat yang bekerja dengan semua case. Saya telah mencoba meningkatkan ukuran kisi (yaitu 10x10) untuk melihat apakah saya akan mendapatkan hasil yang lebih baik dan saya tidak melihat adanya korelasi antara ukuran kisi dan kualitas output.
Edit # 2:
Saya sudah mencoba bermain-main dengan ini lebih banyak dan secara umum sepertinya hasilnya tidak dapat diandalkan baik menggunakan GEOS dan dengan QGIS (yang menggunakan fTools, saya tidak tahu apakah itu pada gilirannya menggunakan GEOS lagi). Saya salah dalam menyatakan ukuran grid tidak ada hubungannya dengan hasil - semakin besar grid, semakin baik hasilnya (itu bagus untuk diketahui tetapi masih bukan solusi). Berikut adalah tangkapan layar dari kotak yang benar-benar spasi yang sebagian besar berfungsi, tetapi gagal sebagian dalam satu ubin:
Geometri bersih - QGIS menunjukkan 0 kesalahan dengan alat "Periksa Validitas". Saya tidak ingin mendekati masalah ini secara bertahap; memverifikasi apakah fitur tertentu gagal persimpangan pada dataset sebesar ini ketika tidak terlihat secara visual (dan tidak akan dengan ubin yang lebih kecil) tidak praktis.
Jawaban:
Saya akhirnya membuat alat sendiri untuk melakukan ini.
Saya menggunakan perpustakaan Clipper ( http://www.angusj.com/delphi/clipper.php ) bersama dengan OGR untuk membagi pengaturan data saya. Sesuatu yang perlu dicatat adalah melakukan persimpangan secara naif dengan lib ini membutuhkan waktu sangat lama, jadi saya malah menggunakan pendekatan quadtree ... yaitu, bagi menjadi empat sel kisi, bagi masing-masing menjadi empat lagi, dll, hingga Anda mendapatkan resolusi yang Anda inginkan. Lib bekerja dengan baik, saya telah memasang tangkapan layar yang menunjukkan hasil di belahan bumi timur:
Hasil di atas memakan waktu 4,5 jam pada prosesor 1,33GHz.
Berikut adalah alat jika seseorang mengalami masalah serupa di masa depan. Harap perhatikan bahwa mereka diretas bersama-sama sebagai pembuktian konsep dan Anda mungkin tidak boleh menggunakannya secara langsung (mungkin merupakan titik awal yang baik untuk sesuatu):
https://github.com/preet/scratch/tree/master/gis/polytoolkit
https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk
sumber
Pasti terdengar seperti Anda memiliki masalah geometri. Sepertinya tidak akan dapat menghasilkan hasil bersih dari file input kotor terlepas dari perangkat lunak yang digunakan, kecuali Anda terlebih dahulu mengatasi masalah geometri Anda. Setelah menyelesaikan masalah geometri, Anda dapat mencoba yang berikut jika masih mengalami masalah:
1) Pastikan bahwa dataset grid Anda memiliki proyeksi yang sama dengan dataset poligon dunia Anda. Jika tidak, buat ulang dalam proyeksi yang tepat.
2) Ubah semua fitur menjadi satu bagian - lebih mudah untuk diproses
3) Hapus semua bidang asing yang hanya menyimpan bidang id yang akan memungkinkan Anda untuk menggabungkan atribut Anda kembali setelah persimpangan dilakukan - lagi jauh lebih mudah untuk diproses
4) Alih-alih memotong seluruh dataset grid dengan seluruh dunia polygon dataset, coba loop di atas polygon grid Anda, memilih poligon berpotongan dalam dataset dunia Anda dan melakukan klip berdasarkan pada poligon grid Anda. Ini akan memungkinkan Anda untuk mengisolasi masalah dan pada akhirnya Anda dapat menggabungkan hasil bersama untuk mencapai tujuan awal Anda.
5) Coba gunakan poligon kotak yang lebih besar.
sumber
Pendekatan lain mungkin untuk mencoba konversi vektor-ke-raster untuk membuat dataset titik & kemudian menggunakan dataset titik sebagai dasar untuk menulis beberapa kode untuk membuat petak Anda.
sumber