Ç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?
Ç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?
Yanıtlar:
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 c # kodu:
Aşağıdaki kartezyen koordinatları enlem / boylam (derece RAD2DEG
cinsinden ) 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.
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.
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.