Algoritma titik-temu yang dengan benar menangani 180 ° meridian dan kutub?


9

Apakah ada algoritma persimpangan terkenal yang menangani 180 meridian dan kutub dengan benar?

Sebagai contoh, katakanlah kita memiliki daftar nilai lintang dan bujur yang mewakili Antartika. Katakanlah kita juga memiliki poligon sederhana yang mewakili pesawat terbang. Kami ingin tahu apakah pesawat itu melewati Antartika.

Persimpangan 2D poligon generik tidak berfungsi dalam kasus ini jika Anda cukup menggunakan lintang untuk y dan bujur untuk x, karena sistem koordinat datar akan memiliki tepian pada -180 dan 180 bujur, dan -90 dan 90 lintang. Antartika akan membuka halaman pada tiga sisi.

Jawaban:


14

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!)


5

Saya sebenarnya mencari solusi umum yang akan bekerja untuk banyak poligon besar.

Sebagian besar jawaban yang saya baca sejauh ini secara alami berfokus pada menemukan proyeksi yang cocok untuk fitur Anda. Ini mungkin kontra-intuitif, tetapi di sini Anda harus mempertimbangkan di mana proyeksi gagal berfungsi, bukan di mana ia bekerja dengan baik.

Beberapa proyeksi gagal berfungsi hanya pada satu titik: ini adalah di antara yang disebut proyeksi "global". Contoh yang baik adalah azimuth equidistant: satu-satunya titik yang tidak dapat Anda proyeksikan adalah yang secara diametrik berlawanan dengan titik asalnya. (Sebenarnya, itu tidak sepenuhnya benar bahwa Anda tidak dapat memproyeksikan poin terakhir; Saya membahas masalah teknis. Cukuplah bahwa proyeksi mengalami masalah parah di kutub yang berlawanan.)

Dengan demikian, jika Anda dapat menemukan satu titik P di luar gabungan semua poligon yang Anda rencanakan untuk dikerjakan, maka yang perlu Anda lakukan adalah bekerja dalam proyeksi global yang gagal hanya pada titik tunggal ini. ( Misalnya , gunakan azimut miring berjarak sama yang berpusat pada titik diametris berlawanan P. )

(Anda dapat menemukan titik seperti itu secara otomatis. Misalnya, buat poligon yang menutupi bumi, sedikit penyangga penyatuan semua fitur Anda, hapus penyangga ini dari poligon bumi, dan pilih sembarang titik sembarang di dalam yang tersisa. Alasan penyanggaan adalah bahwa yang terbaik adalah menjauh dari titik-titik tunggal di mana proyeksi gagal, semakin jauh lebih baik: ini adalah masalah akurasi komputasi.)

Ada banyak proyeksi global dengan sifat-sifat yang diinginkan, termasuk yang sama, konformal ( misalnya , stereografi), dan luas yang sama. Jadi, memilih proyeksi global untuk analisis Anda bukanlah batasan yang berat.

Keterbatasan utama adalah bahwa perangkat lunak paling populer di luar sana, ArcGIS, tidak mendukung banyak versi proyeksi global! :-(


3

Anda dapat menyelesaikan ini dengan proyeksi!

Hanya karena "ujung" dari skala berada pada -180 dan +180, tidak berarti Anda harus mempertimbangkan peta dengan ujung tersebut.

Gunakan EPSG: 32761 ( http://spatialreference.org/ref/epsg/32761/ )

Ubah nilai garis lintang dan bujur Anda menjadi koordinat dalam ruang UPS, dan kemudian Anda dapat menggunakan perhitungan geometri reguler untuk menentukan apakah pesawat Anda melebihi Antartika.

Informasi lebih lanjut tentang sistem koordinat Universal Polar Stereografis ada di sini: http://en.wikipedia.org/wiki/Universal_Polar_Stereographic_coordinate_system

Jika Anda hanya mencoba menentukan algoritme persimpangan untuk poligon raksasa, maka perlakukan bumi sebagai sebuah bola (atau bahkan bola) dan gunakan bola geometri untuk menganalisis poligon Anda.

Saya menemukan perpustakaan bernama Spheres yang GPLed, sehingga Anda dapat meninjau kode untuk melihat secara tepat algoritma apa yang mereka gunakan untuk intersecion busur dan "titik dalam poligon bulat".

Namun, ketika Anda ingin MENGGAMBAR poligon ini pada permukaan yang rata (seperti kertas, atau layar Anda) maka Anda harus memilih proyeksi , atau setidaknya gaya proyeksi.


Tetapi bagaimana saya menentukan proyeksi yang akan digunakan? Saya setuju bahwa dalam kasus khusus Antartika Anda dapat menggunakan UPS, tetapi bagaimana jika Anda hanya memiliki beberapa poligon yang menyilang yang melintasi belahan? Mungkin contoh yang lebih baik daripada Antartica adalah poligon yang mewakili di mana saat ini siang hari.
Sean

"Memilih proyeksi yang tepat" mungkin akan menjadi topik wiki komunitas yang hebat. Umumnya, begitu Anda memilih proyeksi, itu karena Anda sudah sampai pada kasus tertentu. Jika Anda tidak tahu di mana di dunia poligon Anda, maka saran saya adalah untuk mengubah asal bumi menjadi pusat poligon Anda, dan kemudian menggunakan koordinat Cartesian.
mwalker

Saya mencari solusi umum yang berfungsi dengan banyak poligon besar. Jika saya perlu menggunakan proyeksi khusus untuk setiap poligon, tampaknya kinerjanya akan lambat.
Sean

1

Meskipun ada masalah dengan menggunakan koordinat Cartesian, saya tidak melihat masalah dalam contoh yang Anda berikan. Begini menurut saya, dengan poligon yang menutupi Antartika yang dibatasi oleh tepi ruang koordinat:

Antartika
(sumber: geohack.net )

Perpotongan antara bidang dan benua dapat dengan aman dihitung tanpa melakukan transformasi kompleks.


Memang, ini akan berhasil dan Anda tidak perlu mengonversi ke proyeksi lain. Anda hanya perlu menutup poligon "Antartika" di sepanjang tiga sisi yang dilintasi. Saya juga menggunakan centroid poligon pesawat, karena lebih mudah untuk menentukan apakah suatu titik berada dalam poligon daripada melakukan persimpangan poligon.
mwalker

Saya tidak terlalu menyukai pendekatan ini. Distorsi berat akan terjadi dan persimpangan dapat terjadi sebagai benar, sedangkan tidak.
George Silva

Saya dapat memikirkan beberapa kasus di mana memproyeksikan ini akan menjadi masalah, seperti menghitung jarak lingkaran yang besar, atau area komputasi di dekat kutub. Mungkin saya melewatkan sesuatu, tetapi saya tidak melihat bagaimana persimpangan yang diminta di sini akan berubah dalam kondisi ini.
scw

Saya pikir contoh pesawat itu tidak sempurna; contoh yang lebih baik adalah awan besar.
Sean

Sebenarnya, scw, Anda benar. Untuk analisis titik, ini tidak masalah sama sekali, hanya untuk jarak dan area. Kesalahan saya: P
George Silva

0

Salah satu solusi untuk masalah ini adalah dengan menggunakan semacam sistem koordinat 3 dimensi untuk bumi alih-alih sistem koordinat dua dimensi. Jika poligon 2D diberi kedalaman virtual dalam jumlah besar, seperti setengah jalan ke pusat bumi, maka poligon tidak perlu dimodelkan sebagai kurva di permukaan bumi. Seharusnya cukup untuk hanya vertikal yang berada di permukaan.


0

Solusi yang mungkin adalah memotong poligon menjadi sub-poligon di semua sisi (180 meridian dan kutub). Perangkat lunak ini bahkan dapat mempertahankan semacam referensi antara poligon asli dan sub-poligon.


0

Ambil centroid pesawat dan gunakan itu sebagai titik singgung untuk untuk proyeksi azimut . Anda juga perlu memadatkan geometri sebelum memproyeksikannya untuk kasus-kasus seperti area bumi yang saat ini melihat siang hari.


Ini terdengar mahal. Bagaimana jika saya memiliki banyak pesawat terbang, atau lebih buruk, awan? Tolong jelaskan juga apa yang dimaksud dengan "densify"?
Sean

Ya, itu akan mahal. Untuk melakukan ini secara global, mungkin planar bukanlah cara yang harus ditempuh. Sepertinya pendekatan trigonometri bola dapat digunakan sebagai dasar untuk overlay poligon vektor kumpulan data di seluruh dunia (mis. Berapa persen bumi yang ditutupi oleh cahaya siang dan awan). Semua overlay poligon yang saya ketahui adalah berbasis planar. en.wikipedia.org/wiki/Spherical_trigonometry
Kirk Kuykendall
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.