GIS (sebagai bidang) tidak melakukan terlalu panas ketika datang untuk benar-benar bergulat dengan permukaan dunia.
Misalnya, masalah Anda tidak sepenuhnya ditentukan. Tidak seperti dalam 2D, di mana kita tahu ujung-ujung poligon terdiri dari garis lurus, apa yang ada di dunia? Lengkungan lingkaran besar, meminimalkan jarak antar simpul, adalah pilihan yang baik tetapi bukan satu-satunya. Contohnya, garis lurus (yang bergerak di bawah permukaan dunia) adalah pilihan lain. (Garis rumbia adalah pilihan juga tetapi berpotensi yang bisu, terutama di dekat kutub ...) Berikut ini tautan bagus masalah interpretasi tepi WRT: http://blog.opengeo.org/2010/08/10/shape-of -a-poligon /
Masalah besar lainnya dengan pendekatan project-to-2d-then-intersect, selain singularitas yang telah disebutkan, adalah bahwa setiap titik persimpangan yang baru dibuat (di mana ujung poligon bersilangan) akan tidak pada tempatnya dan tergantung pada proyeksi yang digunakan. (Saya yakin ini adalah asal usul untuk densifikasi: Dengan menambahkan satu ton simpul menengah, Anda mendapatkan pengurangan kesalahan dari proyeksi tengah-tengah tepi poligon.)
Dengan asumsi Anda tidak ingin membuat semua kompromi dan solusi proyeksi ke 2D dan mencari untuk memikirkan dan membuat kode sendiri, saya telah melakukan sedikit prototipe (dan hanya prototipe!) Kode untuk klien yang berurusan dengan ini.
Berikut ini sketsa pendekatannya. Anda harus tahu apa itu vektor dan juga arti dari produk titik dan silang . (Peringatan: wikipedia nyaman untuk tautan cepat, tetapi cukup jika ini merupakan pengantar pertama Anda pada topik. Tutorial grafik 3D yang baik akan membantu.)
- Mewakili titik pada bola dengan vektor satuan 3D Cartesian. Titik di permukaan bumi adalah di mana, jika Anda menjulurkan vektor ke dalam sinar yang panjangnya tak terhingga, itu akan memotong permukaan bumi.
- Mewakili lingkaran besar oleh pesawat melalui titik asal. (Dalam 3D vektor satuan tunggal cukup untuk mendefinisikan sebuah pesawat melalui asal; itu adalah normal ke pesawat.) Lingkaran besar adalah persimpangan seluruh bidang dengan permukaan bumi.
- Anda dapat menemukan titik persimpangan dua lingkaran besar dengan memotong dua pesawat mereka.
- Tentukan busur lingkaran besar dengan dua poin. Vektor yang mendefinisikan normal lingkaran besar adalah produk silang dari vektor titik awal dan titik akhir.
- Untuk menentukan apakah suatu titik yang kita tahu berada pada lingkaran besar yang terletak di dalam busur, buat dua bidang sedemikian rupa sehingga: mereka tegak lurus terhadap bidang lingkaran besar, satu berisi titik awal dan yang lain berisi titik akhir, dan mereka berorientasi saling berhadapan. Kemudian intinya ada di busur jika terletak di 'dalam' kedua pesawat. (Untuk membantu memvisualisasikan: Anda telah menciptakan senyum pac-man saat ia menginjak busur. Jika titik ujian berada di antara rahangnya, maka itu terletak di busur, seperti yang kita tahu itu ada di lingkaran besar.)
- Untuk menentukan apakah dua busur melintas: temukan dua titik persimpangan lingkaran besar mereka yang sesuai, lalu uji setiap titik untuk melihat apakah ada di dalam kedua busur.
- Definisi yang kurang ambigu: poligon adalah kumpulan titik, yang masing-masing dihubungkan oleh tepian yang terdiri dari busur lingkaran besar. Titik-titiknya diatur sedemikian rupa sehingga jika Anda berjalan di sepanjang permukaan bumi di sepanjang tepi poligon, 'bagian dalam' poligon akan terletak di sebelah kiri Anda. Mari kita tinggalkan poligon kompleks (pulau, lubang, dan persimpangan-diri) untuk saat ini.
- Anda dapat mengetahui apakah suatu titik berada di sisi kanan atau kiri pesawat melalui tanda titik produk dari vektor yang sesuai. (Ini setara dengan, saat Anda melakukan perjalanan mengelilingi lingkaran besar, apakah titik di permukaan bola terletak di kiri atau kanan Anda.)
- Tes yang akurat untuk menentukan apakah suatu titik berada di dalam poligon: Apakah terletak di sisi kiri semua tepi?
- Sekarang kita memiliki kemampuan untuk menguji apakah suatu titik berada di dalam poligon dan untuk menentukan penyilangan tepi: bahan-bahan untuk persimpangan poligon-poligon! Margin dari komentar ini terlalu kecil untuk menulis algoritma penuh tetapi langkah-langkah dasarnya adalah: (a) menemukan semua persimpangan, lalu (b) berjalan tepi, berganti-ganti poligon mana Anda berjalan saat Anda menemukan titik persimpangan.
- Setelah semua hal di atas bekerja, mulailah berpikir tentang strategi pengindeksan untuk membuatnya lebih cepat, karena titik-dalam-poligon I menguraikan adalah O (n) dalam jumlah tepi, dan perpotongan poligon O (m * n) dalam jumlah ujung-ujungnya.
Fiuh.
Ada beberapa keuntungan besar untuk pendekatan ini: Semua operasi di atas bermuara pada hanya perkalian dan penambahan. (Setelah mengonversi data ke representasi ini: mis. Lat / long terkoordinasi memerlukan beberapa pemicu untuk mendapatkan vektor XYZ Cartesian.) Tidak ada singularitas di kutub atau dalam sistem koordinat, dan tidak terlalu banyak kasus khusus yang perlu dikhawatirkan (contoh kasus khusus) : tepi yang tumpang tindih paralel).
Mengintip kode itu sepertinya paket Spheres yang ditautkan orang lain mengikuti beberapa pendekatan ini, walaupun itu juga terlihat agak setengah matang.
PostGIS juga dapat menggunakan pendekatan serupa pada datatype geografinya , tapi saya belum melihat di balik tenda. Saya tahu bahwa untuk pengindeksan spasial, setidaknya, mereka menggunakan R-tree di atas kartesian 3D.
(Catatan: jawaban ini menjadi cukup panjang sehingga saya mungkin akan mengeditnya menjadi posting blog ... Tanggapan / komentar sangat diterima!)