Bagaimana saya bisa membuat bungkus polyline di seluruh dunia?


14

Saya menggunakan peta selebaran untuk membuat representasi dari tantangan keliling dunia. Saya ingin menambahkan polyline yang mengarah ke timur dari tokyo dan kemudian muncul di sebelah barat Amerika Selatan di peta - tetapi sebaliknya saya mendapatkan garis yang melintasi peta di arah yang berlawanan (lihat garis kuning).

masukkan deskripsi gambar di sini

Saya pikir ini mungkin terkait dengan sistem data dan / atau sistem koordinat tetapi saya agak kurang detail. Adakah yang bisa menjelaskan teori di balik apa yang perlu saya lakukan agar ini berhasil? Saya menggunakan proyeksi bluemarble dari NASA:

var bluemarble = new L.TileLayer.WMS("http://demo.opengeo.org/geoserver/wms", {
layers: 'bluemarble',
attribution: "Data © NASA Blue Marble, image service by OpenGeo",
minZoom: 2,
maxZoom: 5
});

2
Anda harus memecah polyline di meridian + -180 derajat. Ini membutuhkan penemuan garis lintang di mana polyline melintasi meridian itu. GIS Anda mungkin memiliki metode untuk melakukan pemecahan. Jika tidak, solusi sederhana dapat diturunkan dari kode yang ditampilkan di utas terkait . Apakah Anda dapat mengeksekusi kode seperti ini di platform Anda?
Whuber

Saya setuju dengan whuber. Saya harus melakukan tugas yang sama dengan melintasi poligon + - 180. Anda harus membaginya menjadi beberapa polyline / poligon setiap kali Anda melewati + -180.
Steve

Jawaban:


13

Anda harus memecah polyline di meridian + -180 derajat. Ini membutuhkan penemuan garis lintang di mana polyline melintasi meridian itu. GIS Anda mungkin memiliki metode untuk melakukan pemecahan. Jika tidak, solusi sederhana dapat diturunkan dari kode yang ditampilkan di utas terkait . Berikut ini beberapa detailnya.

  • Polyline direpresentasikan sebagai urutan simpul , masing-masing diberikan dalam bentuk (lat, lon), dengan -180 <= lon <= 180. Anda perlu memeriksa setiap pasangan berturut-turut untuk melihat apakah itu melintasi meridian + -180. Ada tes cepat: jika nilai absolut dari perbedaan bujur adalah 180 atau lebih besar, ada persimpangan.

  • Di dalam setiap segmen (lat0, lon0) -> (lat1, lon1) yang melintasi meridian + -180, Anda harus memecah polyline menjadi dua bagian di mana ia bersilangan.

Kuncinya adalah menemukan garis lintang break point dengan akurasi yang masuk akal. Ini paling mudah dilakukan dengan model bumi bulat: kesalahan (dibandingkan dengan model ellipsoidal yang lebih akurat) akan terlalu kecil untuk diperhatikan.

Biarkan segmen yang dimaksud beralih dari titik 0 di (lat0, l0) ke titik 1 di (lat1, lon1). Break point dapat ditemukan dengan menjalankan segmen garis lurus dalam 3D antara dua titik sebagaimana diwakili dalam koordinat Cartesian dan menemukan di mana koordinat y adalah nol. The koordinat Cartesian adalah

(x0, y0, z0) = (cos(lon0)*sin(lat0), sin(lon0)*sin(lat0), cos(lat0))

dan pemberian ekspresi yang serupa (x1, y1, z1) untuk poin 1. Memecahkan persamaan

t * y0 + (1-t) * y1 = 0

untuk t; itu adalah,

t = y1 / (y1 - y0).

Koordinat persimpangan karena itu

(x, y, z) = (t * x0 + (1-t) * x1, 0, t * z0 + (1-t) * z1)

Titik ini (yang terletak di bawah permukaan bumi di suatu tempat di bawah + -180 meridian) memiliki garis lintang sama dengan

lat2 = ATan(z/x).

Break point perlu diwakili dalam dua cara. Ketika melampirkannya setelah (lat0, lon0) untuk mengakhiri bagian pertama dari polyline yang rusak, gunakan (lat2, -180) jika lon0 negatif dan sebaliknya gunakan (lat2, 180). Saat melampirkannya sebelumnya (lat1, lon1) untuk memulai bagian kedua dari polyline yang rusak, ikuti aturan yang sama.

Dalam kasus luar biasa, satu atau keduanya dari titik 0 dan titik 1 mungkin berada di + -180 meridian. Mengikuti prosedur ini akan menyebabkan Anda menempatkan segmen panjang nol di salah satu potongan polyline yang Anda buat. Jika ini dapat menyebabkan masalah dengan SIG, uji untuk kondisi ini.

Perhatikan bahwa polyline dapat melewati meridian ini lebih dari sekali. Karena itu, setelah menemukan istirahat pertama dan memecah polyline menjadi dua bagian, Anda perlu memproses bagian kedua dengan cara yang sama.


1
Apa yang dikatakan whuber baik-baik saja tetapi saya pikir ada kesalahan ketik pada kalimat berikut:> Ketika melampirkan setelah (lat0, l00) untuk mengakhiri bagian pertama dari polyline yang rusak, gunakan (lat2, -180) jika lat0 negatif dan jika tidak gunakan (lat2, 180). Saya pikir itu pasti:> use (lat2, -180) jika lon0 negatif dan sebaliknya use (lat2, 180)
Georgi

@Georgi Terima kasih telah menangkap itu; Saya pikir Anda benar dan saya akan melakukan perubahan.
Whuber

Saya harus menerapkan ini di Leaflet.js, ini kode saya: gist.github.com/mikeatlas/0b69b354a8d713989147
Mike Atlas

Terima kasih, @Mike. Saya suka ilustrasi zig-zag: persis seperti keadaan yang saya bayangkan ketika saya menulis jawaban ini. Jika Anda ingin tes yang sangat parah, lihat apa yang terjadi pada polyline yang membentang sepanjang + -180 derajat meridian itu sendiri (dan melintasi kedua kutub)!
whuber

@whuber Saya mungkin perlu mencobanya: / Akan memposting hasil
Mike Atlas

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.