Membagi shapefile kompleks menjadi kisi-kisi


11

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:

  1. Itu benar. Semuanya ada di WGS84 Lat / Lon
  2. 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.
  3. Tidak ada bidang atribut yang disimpan selama proses, saya hanya tertarik pada geometri.
  4. 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.
  5. 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:

masukkan deskripsi gambar di sini

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.


Dari mana Anda mendapatkan bentuk dunia atau Australia? Saya menduga bahwa geometri file itu mungkin memiliki beberapa masalah (coba Vector | Geometry Tools | Check Geometry Validity di QGIS). Baru saja mencoba persimpangan pada shapefile dunia yang lebih kecil dan ubin 5 derajat dan berfungsi sempurna di QGIS.
Simbamangu

1
Mencoba ini dengan garis pantai 100K Australia dari Geoscience Australia (20MB) dan ubin 4 derajat, juga berfungsi dengan baik (QGIS 1.7.4, OSX 10.7). Bisakah Anda menjelaskan lebih detail data Anda dan apa yang Anda lakukan?
Simbamangu

Terima kasih atas semua informasi tambahan. Saya curiga ada yang aneh dengan data OSM; coba dengan dataset yang saya sebutkan dan lihat apakah Anda mendapatkan hasil yang lebih baik. Saya sepertinya ingat mengalami keanehan dengan data danau OSM di masa lalu, akan mencoba mencarinya.
Simbamangu

Bisakah Anda membagikan dataset, atau bahkan bagian yang terpotong darinya (seperti pada contoh Anda di atas)?
Simbamangu

Jawaban:


7

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:

masukkan deskripsi gambar di sini

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


Kode tertaut tidak lagi tersedia :-(
Shaun McDonald

Saya memindahkan repositori ke github.com/preet/scratch/tree/master/gis/polytoolkit . Bergantung pada apa yang sebenarnya ingin Anda capai, Anda mungkin menemukan github.com/preet/scratch/tree/master/gis/shapefiles/shptk agar lebih berguna.
Pris

Yang selanjutnya lebih bermanfaat. Saya sekarang telah menemukan metode yang menggunakan PostGIS, meskipun akan tertarik untuk mencari tahu apakah ini lebih cepat. Apakah Anda memiliki readme untuk mengkompilasi dan menginstal?
Shaun McDonald

Bisakah Anda mengedit jawaban untuk memperbaiki tautan? Terima kasih
Afr

4

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.


+1 Sangat menarik - seberapa besar pengaruhnya terhadap kecepatan proses geoproses jika Anda menyimpan bidang ID, atau multi-bagian, dalam data?
Simbamangu

1
Saya tidak pernah benar-benar mencoba mengukur perbedaan. Saya hanya dapat berbicara dari pengalaman di mana operasi geoproses secara umum gagal dan ini adalah hal-hal yang membantu menyelesaikan masalah.
Brent Edwards

Saya tidak berhasil mendapatkan (2) bekerja sama sekali. Memilih fitur dan mencoba menggabungkan mereka menggunakan QGIS pada dasarnya tampaknya mengunci sistem saya - mungkin masih memproses hal-hal, tetapi pada tingkat itu tidak praktis: Saya meninggalkan sistem saya pada semalam dengan QGIS masih mencoba untuk menggabungkan beberapa fitur di dataset dan itu masih berlangsung di pagi hari.
Pris

1
Seharusnya tidak ada penggabungan yang terlibat. Tujuannya adalah untuk meledakkan fitur multi bagian. Misalnya, dalam tangkapan layar ubin yang gagal, tujuannya adalah untuk meledakkan semua catatan Anda yang berisi poligon yang dikelompokkan secara spasial seperti fitur pulau di sepanjang pantai BC dan Alaska, menjadi catatan poligon satu bagian yang terpisah. Ini dapat dicapai dalam QGIS menggunakan alat "Multipart ke singleparts" di bawah menu Vector> Geometry Tools.
Brent Edwards

Setelah Anda mengonversi ke fitur bagian tunggal, Anda harus memvalidasi ulang geometri Anda, hanya untuk memastikan bahwa semuanya bersih.
Brent Edwards

0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.