Ortalama enlem ve boylam koordinatlarını hesaplama


19

Çeşitli enlem ve boylam noktaları arasındaki ortalamayı nasıl hesaplayabilirim?

Sadece lat ve lng için Aritmetik ortalamasını hesaplamalı mıyım?


3
Ortalama almanın uygunluğunun kullanım durumunuza bağlı olduğunu düşünüyorum. Bir web haritası için sadece şehir restoranı konumlarını kümeliyorsanız, ortalamaların çoğu zaman işe yarayacağından emin olun. Ancak bazı yerlerde hata alacaksınız ... bir prototip veya düşük bütçeli uygulama için belki sorun değil. Ancak, daha ciddi bir şey yapıyorsanız veya geniş bir alanı kaplıyorsanız, muhtemelen projeksiyon nüanslarını dikkate almanız gerekir.
Glenn

1
Bu puanlar nasıl toplandı? Koordinatların nasıl ortalanacağını sormak yerine, ortalamanın ölçüm hatalarını telafi etmek için uygun bir yol olup olmadığını sorabilirsiniz. Bu e-kitabın birçok hata tanımı var.
Kirk Kuykendall

Bir 'ortalama noktanın' iyi tanımlanmadığı bazı uç durumlar olduğunu not edin: örneğin ekvator boyunca herhangi bir yer N. ve S. kutuplarının "ortalaması" olabilir.
Dan

Yanıtlar:


15

Basit bir ortalama için, boylam ve enlem koordinatlarını ortalamak istemezsiniz. Bu, daha düşük enlemlerde oldukça işe yarayabilir, ancak daha yüksek enlemlerde kötü sonuçlar vermeye ve kutupların yakınında tamamen parçalanmaya başlayacaktır.

Bu tür bir şey için kullandığım yöntem, boylam / enlem koordinatlarını 3d kartezyen koordinatlara (x, y, z) dönüştürmektir. Bunları ortalayın (kartezyen bir vektör vermek için) ve sonra tekrar dönüştürün. Muhtemelen vektörü normalleştirmeniz gerekmediğini unutmayın, bu nedenle gerçek ortalama işlem basit bir toplam olabilir.


Düzenle, işte benim kodu:

Aşağıdaki kartezyen koordinatları enlem / boylam (derece RAD2DEGcinsinden ) olarak dönüştürür: Radyanlar için sabitleri kaldırın .

Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);

Ve burada enlem / boylamdan (radyan cinsinden belirtilir) kartezyen koordinatları hesaplıyoruz:

private void CalcCartesianCoord()
{
    _x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
    _y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
    _z = Math.Cos(LatitudeRadians); 
}

Her ikisi de gerçek koddan kesilir ve yapıştırılır, dolayısıyla derece ve radyan karışımı. Burada bazı dönüşümleri yapan özellikler vardır (örneğin LatitudeRadians, radyan değeri döndüren bir özelliktir).

Optimizasyonun mümkün olduğuna dikkat edin: örneğin yinelenen sinüs hesaplamaları. Ayrıca çok fazla çağırırsanız, trig hesaplamaları önbelleğe alınabilir.


1
harika bir nokta. Bahsetmeyi unuttuğuma inanamıyorum .. kutupların ve tarih çizgisinin yakınında ortalamam beni daha önce ısırdı.
Glenn

3
(+1) Sorun kutuplarla ve + -180 derece meridyenle sınırlı değildir: ortalaması alınacak noktaların enlemleri önemli ölçüde değiştiğinde, enlem / boylam koordinatlarının düz bir ortalaması, bir Plaka Carree projeksiyonu kullanmakla eşdeğerdir. enlem ile artan değişken bir metrik bozulma getirir. Sayısal bir sorun yok, ancak ortalama sadece yanlış konumda. Bu nedenle @ Glenn'in cevabında önerilen lat / lon hesaplamaları, nispeten küçük polar olmayan bölgeler dışında nadiren kabul edilebilir.
whuber

@winwaed teşekkürler, bunu yapmak için bazı (Java) kod snippet'i veya iyi bir öğretici önerebilir misiniz?
aneuryzm

1
Matematik en.wikipedia.org/wiki/Spherical_coordinates adresinde 'Kartezyen Koordinatlar' altındadır. (benim uygulama C # ve kısmen optimize - artı ben bunu diş hekimlerine
yazıyorum

1
Kesin mühendislik kullanım durumları için çok doğru olduğunu düşünüyorum. Bununla birlikte, aşırı hassasiyet gerekmedikçe, WGS84 lat, şehir ve hatta bölgesel bölgelerdeki ortalama koordinatların ortalaması oldukça iyi çalışır ve ortalamanın kullanılacağı çoğu kullanım için kabul edilebilir derecede doğru sonuçlar verir.
Glenn

3

Kümeleme Seçenekleri : Bence bu tür işlemleri kapsayan kavramsal vızıltı kelimesi "kümeleme" dir. Ortalama alma uygulaması en basit olanıdır ve çoğu amaç için iyi çalışır. Başka bir şey kullanacağım tek zaman, aykırı değerlerden [Düzenle] -> veya kutuplardan veya uluslararası datelinden endişeleniyorsanız. [Düzenle] -> ayrıca ortalama, kümenin merkezine yakın görünen bir şey verirken, derece latn her zaman aynı mesafe olmamasından kaynaklanan projeksiyon yanlışlıkları nedeniyle biraz kapalı olacaktır km / mil cinsinden ayrı. Ortaladığınız alan büyüdükçe çarpıklık artar.

İşte birkaç kümeleme seçeneğinin karşılaştırması

Ortalama (kolay, en hızlı, yanlış): sadece lat değerlerini toplayın ve sayıya bölün ve aynı değerleri lng değerleri için yapın. Bir Int32 kullanıyorsanız taşmaya dikkat edin, bazı sistemler (özellikle c #) sessizce düşük sayılara taşacaktır. Toplam akümülatörünüz için kayan nokta hassasiyeti kullanarak bu hataları önleyebilirsiniz. Bu yöntemle ilgili bir sorun, aykırı değerlerin konumunuzu çarpıtabilmesidir. [Düzenle] -> Başka bir kutupları ve uluslararası tarih çizgisi yakınındaki matematik iyi ortalama ve yerleri kötü eğri olacaktır.

En Yakın Komşu (biraz daha sert, yavaş, aykırı eğilimli değil) Ortalamadan ziyade, tüm komşularına en küçük ortalama mesafeye sahip gerçek lat konumu ile gidebilirsiniz. Bu bir tür "medyan" almak gibi. Aşağı tarafı, bunun hesaplama açısından pahalı olmasıdır, çünkü her noktayı diğer noktalarla karşılaştırır ve aralarındaki mesafeyi hesaplarsınız. Örneğin, 10.000 puanın kümelenmesi 100 milyon mesafe hesaplaması gerektirecektir. O kadar yavaş değil ama kesinlikle iyi ölçeklenmiyor.

Izgara Hücresi (biraz daha fazla kurulum gerektirir, çok daha hızlı, aykırı şekilde yanlı değil) Bu, en yakın komşuya benzer, ancak çok daha hızlıdır. Örneğin, 0,01 derece latince (kabaca kalabalık enlemlerde yaklaşık 1 km) keyfi bir hassasiyet seviyesi seçebilir ve puanlarınızı 0,01 x 0,01 derece kovalara gruplayabilirsiniz. Daha sonra içinde en fazla puanı olan kovayı seçebilir ve bu puanların ortalamasını alabilir veya sadece bu noktalarda en yakın komşu analizini çalıştırabilirsiniz. Bu yöntemi çok büyük veri kümeleriyle (yüz milyarlarca kayıt) çok kullanıyorum ve hassasiyet ve hız arasında güzel bir denge buluyorum.

Konveks Gövde Centroid (sert, yavaş, düzgün sonuçlar): Ayrıca, hepsini kapsayan bir şekil tanımlamak için noktalarınıza bir bant çizebilirsiniz ( wikipedia'ya bakın ) ve sonra bu şeklin merkez noktasını hesaplayabilirsiniz. Tipik centroid işlevleri merkez ağırlıklı değildir, bu nedenle kenarlardan en uzak olanı bulana kadar şeklin içindeki örnek noktaları kullanarak bir tür en yakın komşu analizini yapmanız gerekir. Bu yöntem, ne hızlı ne de özellikle hassas olan gerçek merkez bulma algoritmasından ziyade dışbükey gövdenin kendisi nedeniyle gerçekten daha ilginçtir ... ancak gövde şekli verilerinizle başka yararlı uygulamalara sahip olabilir.


@winwaed, kutupların yakınındaki koordinatların ortalaması hakkında büyük bir noktaya değiniyor ve ben de uluslararası tarih çizgisini ekleyeceğim. Örneğin, bir tarafta bir, diğerinde bir puan varsa, bazı kötü ortalamalar (ve ayrıca sınırlayıcı kutular) alırsınız. Bu nadiren ortaya çıkar, ancak yapıldığında hata ayıklamak için gerçek bir acıdır
Glenn

@whuber ortalamada merkezin sürüklenmesi hakkında iyi bir noktaya değiniyor. Ortalama alma, kümenin merkezine yakın görünen bir şey verirken, enlem derecesinin km / mil cinsinden her zaman aynı mesafede olmaması nedeniyle ortaya çıkan projeksiyon yanlışlıkları nedeniyle biraz kapalı olacaktır. Ortaladığınız alan büyüdükçe çarpıklık artar.
Glenn

0

Neyi başarmaya çalıştığınızdan emin değilsiniz, ancak enlemi orijinal nokta kümesinin enlem ve boylamı orijinal nokta kümesinin boylamı olan nokta, orijinal nokta kümesinin ortalama noktası olacaktır. [GÜNCELLEME]: Yukarıda, avg aritmetik ortalamadır.


Cevabınızda avg = Aritmetik ne demek?
aneuryzm

1
Evet doğru. Anlaşılmadığı için üzgünüm demek istedim. Cevabı güncelledim. Ama buradaki tabloya çok faydalı bir şey getirdiğimden emin değilim ...
GuillaumeC
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.