Bir dizi koordinat verildiğinde, minimum sınırları nasıl hesaplayabilirim?


13

Lon / lat içinde bir dizi koordinat var. Her zaman bir poli oluşturan en az 3 sıralı koordinat vardır (düz olarak yansıtılmışlarsa). Bu koordinatlar için minimum sınırları bir dizi geçerli boylam ve enlem aralığı olarak nasıl hesaplayabilirim? ('geçerli' ile, antimeridyanı açıkça açıklayan aralıkları kastediyorum). Aradığım şeyi açıklamak biraz zor yani bir resmim var.

resim açıklamasını buraya girin

Resimdeki durum önemsizdir; tüm noktalar için mutlak minimum ve maksimum değerleri bulursunuz. Ancak bu tüm durumlar için geçerli değildir. Genel bir çözüm var mı?

Düzenleme: 'Geçerli' ile ne demek istediğimi açıklığa kavuşturmak için, veri setimde üç boylam değerine sahip olduğumu söyleyin: -76, -135 ve 164. Değerler antimeridyanı geçiyor ve sonuçlanan aralıkların bölünmesini istiyorum: -76 -180 ve 164-180.

Biraz daha açıklama. Noktalar bir çokgen oluşturur, bu nedenle belirli durumlarda gerekli aralık -180 ila +180 (yani tam 360 derece) olabilir:

resim açıklamasını buraya girin

Soldaki resim Dünya'nın bir yarısında meydana gelen dört koordinatın boylamını göstermektedir. Kuzey kutbuna (siyah nokta) bakıyormuş gibi düşünün. Pembe, çokgeni kapsayan minimum uzunlamasına aralığı gösterir (çokgen mordaki dört nokta arasında gösterilir). Soldaki dava iki uzunlamasına aralığa sahip olacaktır: [-180 ila -120] ve [135 ila 180] (sadece görsel olarak tahmin ediyor)

Sağdaki resim, noktaların Dünya'nın her yerine gittiği başka bir durumu göstermektedir. Bu aralık [-180 ila 180] olacaktır.


1
Bu sorunu daha önce hiç düşünmedim, harika bir soru. Düz bir dünyanın işimizi kolaylaştıracağı bir başka örnek! Bunun için bazı çözümler görmek için sabırsızlanıyorum.
sgrieve

"('Geçerli' ile açıkça antimeridian açıklayan aralıkları anlamına gelir) hakkında daha açık olması gerektiğini düşünüyorum - Ben asgari kelime soru sınırların önüne gitmek gerekiyor tahmin ediyorum.
Ian Turton

resminizi yeniden ekleyebilir misiniz, sorununuzu açıklamanıza yardımcı olabilir.
Mapperz

1
iant: açıkça 'geçerli' olarak açıklandı Mapperz: yeniden ekle? görünmüyor mu? İyi görebiliyorum.
Pris

1
Koordinatlar lon / lat içindedir ve coğrafi verileri almak için bir veritabanını sorgulamak için kullanılır. Kesinlikle söylemek gerekirse, bunu saf bir matematik problemine dönüştürebilirsiniz (yine
Pris

Yanıtlar:


5

Umarım soruyu doğru anlarım ...

Boylam ve enlem için sorunu ayrı olarak çözebiliriz, bu yüzden örneğinizi boylamlarla alacağım: -76, -135 ve 164.

İlk ben onları sipariş:

-135, -76, 164

Sonra en soldaki koordinatı tekrar sağa eklerdim: -135 + 360 = 225

-135, -76, 164, 225

Şimdi koordinatlar arasındaki boşlukları hesaplayabiliriz:

-135 (59) -76 (240) 164 (61) 225
             .......

En büyük boşluk (240) , kutuya ait olmayan kısım olan minimum sınırlama kutusunun sınırı olmalıdır . Noktalı çizgi, dairenin ayırabileceğimiz en büyük parçasıdır. Bu, örneğimizde sınır kutusu 164 ile başlar, -135 içerir ve -76 ile biter.


Sanırım çoğu durumda bu işe yarıyor. Ama ek boylam (+60) ile [benim poli'de dördüncü nokta] olan örneğimi düşünün. Bu durumda -180 ile 180 arası bir değer isterim. Yönteminizi kullanarak 61 ile 180 ve -76 ile -180 arası bir değer elde ederim.
Pris

@Pris - Yani 180 / -180 boylamının (sonuçta aynı nokta), her durumda kutunun bir parçası olmasını istiyorsun, mümkün olan en küçük kutu olmasa bile?
martinstoeckli

Bence buradaki temel fark, noktaların çokgen oluşturması. Düzenlememe bakın.
Pris

@Pris - Ah, bu gerçekten zor görünüyor. İki nokta arasındaki bir kenarın her noktası, köşe noktası olarak sayılır.
martinstoeckli

1

Google Maps API ile Javascript'te bunu yapmak gerçekten çok kolay. İşte bu API ile istemci tarafında nasıl yapacağınız:

var bounds = new google.maps.LatLngBounds();

//Recursively loop through your coordinate list
    latLng = new google.maps.LatLng(<YourLat>, <YourLon>);
    bounds.extend(latLng);
//

extentBox = new google.maps.Rectangle({
    bounds: bounds,
    strokeColor: "#FF0000",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#FF0000",
    fillOpacity: 0.35
});
extentBox.setMap(map);

Hey, cevap için teşekkürler, ancak bir API çağırmak veya önceden var olan bir çözüm kullanmak yerine gerçek yöntemi arıyorum.
Pris

Bana bounds.extend yöntemini verdin, bu kesin çözümü arıyordum, bu yüzden teşekkürler!
Thomson Comer

Bu çokgenlerle çalışıyor mu? Seni Dikdörtgen kullanarak görüyorum.
Danny G

1

Sanırım bunu yapmanın bir yolunu bulmuş olabilirim. Ön uygulamam işe yarıyor, ancak kaçırdığım uç durumlar olup olmadığından emin değilim. Bu çözümde bir sorun varsa, lütfen belirtin.

Poligon için yalnızca onu içeren noktalar yerine lon / lat aralıklarını almakla ilgili olduğum göz önüne alındığında, problemi denemenin bir yolu aslında sıralı koordinatlar kümesi boyunca baştan sona yürümek. Bir başlangıç ​​noktası verildiğinde Dünya'nın merkezine göre ne kadar saat yönünde ve saat yönünün tersine seyahat ettiğinizi takip edersiniz ve çokgeni tamamlayana kadar devam edersiniz:

resim açıklamasını buraya girin

Başlangıç ​​noktanızdan CW ve CCW'ye ne kadar mesafe katettiğinizi görebilirsiniz ... Bu, normal durumda (resimde solda) doğru sınırlar elde etmek için yeterli bilgi sağlar. Çokgenin tamamen etrafına dolandığı veya merkez boyunca kesildiği durumlarda, geri dönüş açısı 360 derece olacaktır.

Bu yöntem aynı zamanda çokgenin, Dünya'nın yüzeyini kesmektense `` sarması '' durumunda da işe yarar. Bu nedenle, Toronto'nun (lon: -79) Londra'dan (lon: -5) Tokyo'ya (lon: 139) ve geri (aynı sırayla) Dünya yüzeyi boyunca seyahat eden birini gösteren bir çokgen varsa, [-79 ila 139] aralığını alın.

Çokgen merkez boyunca kesilirse (+90 ve -90'da iki bitişik nokta hayal edin), her iki yönde de gidebilmenize rağmen bunun tam bir tarama (360 derece) olduğunu düşünüyorum.

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.