Saya mencoba menemukan semua poligon yang dilintasi oleh satu baris (trek GPS). Saya menggunakan perpustakaan OGR (dari python) untuk menghitung ini, tetapi saat ini agak 'kasar' (dan lambat). Untuk setiap titik lintasan saya, saya memanggil metode intersect dengan semua poligon. Optimalisasi yang jelas adalah dengan memeriksa hanya dengan poligon yang berdekatan. Tapi saya rasa ini adalah masalah klasik, dengan solusi yang sudah diketahui (yang saya tidak dapat menemukan ...).
Saya ingin menghindari menggunakan database khusus karena saya mencoba menulis perangkat lunak mandiri (spasial adalah pilihan jika DB adalah cara untuk pergi).
(FYI, kode sumber saat ini tersedia di sini: https://github.com/dkm/airspace-checker )
Alih-alih berpotongan ekspansif , Anda dapat melakukan pra-pemilihan poligon berdasarkan perbandingan kotak pembatas. Dengan kata lain, cari semua poligon yang tumpang tindih / berdekatan dengan MBR segmen trek Anda. Kemudian lakukan pengujian terperinci pada subset poligon.
sumber
Proposal mloskot dan Nicklas untuk membandingkan kotak pembatas memang benar.
Jika Anda menggunakan shapefile Anda juga dapat mempertimbangkan untuk memanggil modul saga ini: http://www.saga-gis.org/saga_modules_doc/shapes_transect/index.html
sumber
Apa yang dilakukan database seperti PostGIS untuk mempercepat ini adalah pertama-tama melakukan indeks, membandingkan kotak. Pertama-tama ia menemukan semua poligon yang memiliki kotak pengikat saling berhubungan dengan kotak pengikat garis. Masalah dalam kasus Anda mungkin adalah linestring yang panjang dan akan memiliki kotak pembatas yang sangat besar memotong banyak poligon yang tidak menarik.
Jika garis sangat panjang Anda mungkin harus bekerja dengan fungsi geodetik yang jauh lebih kompleks dan lambat daripada fungsi planar.
Mungkin cukup rumit untuk membuat segalanya berjalan mulus.
Mengapa Anda tidak ingin mengandalkan database? Itu tidak akan menyelesaikan semua masalah Anda, tetapi ada banyak optimisasi bawaan di PostGIS misalnya. Di sana Anda juga memiliki perhitungan geodetik persimpangan jika Anda membutuhkannya.
Pembaruan: Saya membaca pertanyaan Anda lagi dan menyadari bahwa Anda tidak menggunakan linestring bentuk trac tetapi setiap titik.
Saya pikir Anda berada di trac yang salah;)
Keduanya karena Anda tidak memeriksa untuk memeriksa apakah ujung antara titik sudut memotong poligon dan karena Anda memindahkan iterasi antara titik titik ke python daripada beberapa implementasi C yang menurut saya jauh lebih cepat . Maka Anda memiliki masalah dengan indeks. Untuk membuat segalanya lebih cepat, Anda harus membangun dan menangani semacam indeks spasial.
Di sisi lain, jika Anda melakukan banyak pekerjaan dalam kode Anda sendiri, mengapa Anda tidak melakukan tes persimpangan juga. Tes itu hanya titik dalam tes poligon jika Anda berurusan dengan titik titik. Google untuk "titik dalam poligon" dan Anda akan menemukan beberapa algoritma.
Tapi, saya akan menggunakan pendekatan berbasis data. Itu akan memberi Anda kemungkinan untuk menggunakan indeks spasial.
/ Nicklas
sumber