Dünya çapında bir çoklu çizgi sargısını nasıl yapabilirim?


14

Ben dünya çapında bir meydan okuma temsili oluşturmak için broşür haritaları kullanıyorum . Tokyo'dan doğuya doğru giden ve daha sonra harita üzerinde güney amerikanın batısında görünen bir çoklu çizgi eklemek istiyorum - bunun yerine haritayı ters yönde geçen bir çizgi alıyorum (bkz. Sarı çizgi).

resim açıklamasını buraya girin

Bu muhtemelen datelines ve / veya koordinat sistemleri ile ilgili olduğunu düşünüyorum ama detay biraz kabataslak. Herkes bunun işe yaraması için yapmam gereken arkasındaki teoriyi açıklayabilir mi? Nasa'nın bluemarble projeksiyonunu kullanıyorum:

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
Çoklu hattı + -180 derece meridyende kırmanız gerekir. Bu, polyline'ın meridyeni geçtiği enlemi bulmayı gerektirir. CBS'nizin muhtemelen kırılma için yöntemleri vardır. Değilse, ilgili bir iş parçacığında gösterilen koddan basit bir çözüm elde edilebilir . Platformunuzda böyle bir kod yürütebiliyor musunuz?
whuber

Whuber'a katılıyorum. + - 180 geçişi çokgenleri ile benzer bir görev yapmak zorunda kaldım. + -180'i her geçtiğinizde birden çok çoklu çizgiye / çokgene bölmelisiniz.
Steve

Yanıtlar:


13

Çoklu hattı + -180 derece meridyende kırmanız gerekir. Bu, polyline'ın meridyeni geçtiği enlemi bulmayı gerektirir. CBS'nizin muhtemelen kırılma için yöntemleri vardır. Değilse, ilgili bir iş parçacığında gösterilen koddan basit bir çözüm elde edilebilir . İşte bazı detaylar.

  • Bir çoklu çizgi , her biri (lat, lon) formunda -180 <= lon <= 180 ile verilen bir köşe noktaları dizisi olarak temsil edilir . + -180 meridyeni geçip geçmediğini görmek için birbirini izleyen her çifti kontrol etmeniz gerekir. Hızlı bir test var: boylam farkının mutlak değeri 180 veya daha büyükse, bir geçiş var.

  • + -180 meridyeni geçen her segmentte (lat0, lon0) -> (lat1, lo11), çoklu çizgiyi geçtiği iki parçaya bölmeniz gerekir.

Anahtar, kırılma noktasının enlemini makul bir doğrulukla bulmaktır. Bu en kolay küresel bir toprak modeli ile yapılır: hata (daha doğru bir elipsoidal modele kıyasla) fark edilemeyecek kadar küçük olacaktır.

Söz konusu segmentin (lat0, lon0) 0 noktasından (lat1, lon1) 1 noktasına gitmesine izin verin. Kırılma noktası, Kartezyen koordinatlarında gösterildiği gibi iki nokta arasında 3D olarak düz bir çizgi segmenti çalıştırılarak ve y koordinatının nerede sıfır olduğunu bularak bulunabilir. Kartezyen koordinatlar olarak

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

ve nokta 1 için (x1, y1, z1) veren benzer bir ifade, denklemi çözün

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

kale; yani,

t = y1 / (y1 - y0).

Dolayısıyla kesişimin koordinatları

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

+ -180 meridyenin altında bir yerde yeryüzünün altında yer alan bu noktanın enlemi eşittir

lat2 = ATan(z/x).

Kırılma noktasının iki şekilde temsil edilmesi gerekir. Kırık çoklu çizginin ilk bölümünü sonlandırmak için (lat0, lon0) sonrasında takarken, lon0 negatifse (lat2, -180) kullanın, aksi takdirde (lat2, 180) kullanın. Kırık çoklu çizginin ikinci bölümünü başlatmak için daha önce takarken (lat1, lon1), benzer bir kural izleyin.

İstisnai durumlarda, 0 ve 1. noktalardan biri veya her ikisi + -180 meridyeni üzerinde olabilir. Bu yordamı izlediğinizde, oluşturduğunuz çoklu çizgi parçalarından birine sıfır uzunluklu bir segment yerleştirebilirsiniz. Bu CBS ile ilgili bir soruna neden olabilirse, bu durumu test edin.

Bir polyline'ın bu meridyeni bir kereden fazla geçebileceğini unutmayın. Bu nedenle, ilk molayı bulduktan ve çoklu çizgiyi iki parçaya böldükten sonra, ikinci parçayı aynı şekilde işlemeniz gerekir.


1
Whuber ne dedi tamam ama ben aşağıdaki cümle bir yazım hatası olduğunu düşünüyorum:> kırık (çoklu) ilk bölümünü sonlandırmak için (lat0, lon0) sonra eklerken, lat0 negatif ise (lat2, -180) kullanın aksi takdirde kullanın (lat2, 180). Ben öyle olmalı düşünüyorum:> kullanım (lat2, -180) eğer lon0 negatif ve aksi kullanım (lat2, 180) 'dir
Georgi

@Georgi Bunu yakaladığınız için teşekkür ederiz; Bence haklısın ve değişikliği yapacağım.
whuber

Bunu Leaflet.js'de uygulamak zorunda kaldım, işte kodum: gist.github.com/mikeatlas/0b69b354a8d713989147
Mike Atlas

Teşekkürler @Mike. Zig-zag illüstrasyonunu seviyorum: Bu yanıtı yazarken tam olarak düşündüğüm bir durum. Gerçekten ciddi bir test istiyorsanız, + -180 derece meridyen boyunca uzanan (ve her iki kutbu da kesen) bir çoklu hatta ne olduğunu görün!
whuber

@whuber Sadece denemek gerekebilir: / Sonuçları yayınlayacağım
Mike Atlas

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.