2011-12-19 18 views
3

我想使用客戶端JavaScript通過簡單的平均值計算來查找一組緯度+經度(實際上是Google LatLng對象)的質心。查找一組緯度的質心(簡單均值)

我看到類似的問題在堆棧溢出之前已經被問了很多次,但是我找不到一個簡單直接的JavaScript答案。 (這可能只是我的谷歌搜索失敗,如果這是一個重複道歉)

我有這樣的事情,但它不適用於你的平均情況,比如緯度179和-179,所以重心應該是180,而不是0

var avg_lat, avg_lng; 
for (var i = 0; i < google_latlngs.length; i++) { 
    avg_lat += google_latlngs[0].lat(); 
    avg_lng += google_latlngs[1].lng(); 
} 
avg_lat = avg_lat/google_latlngs.length; 
avg_lng = avg_lng/google_latlngs.length; 

我需要在客戶端JavaScript有效地做到這一點,我的觀點是不太可能比相隔幾公里多,所以great-在這種情況下,圓距或任何幻想真的沒有必要。

感謝您的幫助。

更新:好的,任何在JavaScript中查找質心的方法都可以。

+0

'179'和'-179'的平均值_is_零;你的代碼工作正常。如果你想只有正數,請看['Math.abs()'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math/abs)。 – Bojangles 2011-12-19 16:53:45

+0

很抱歉,我的意思是經度179和-179,其中質心應該是180,而不是0,這是世界的一半。我應該編輯這個問題嗎? – Richard 2011-12-19 16:55:49

回答

5

如果您僅處理2分,請在應用您的功能之前確保兩個緯度點之間的差值小於或等於180。你可以通過增加或減少360來做到這一點,這將改變-179到181(或179到-181)。當你得到你的最終結果時,加/減360,直到最終值在你想要的範圍內。

更新

如果你想這與兩個以上的點上班,我們就必須做一些幾何。我們將每個緯度點作爲單位圓上以一定的距離xy從原點和某個角度a(緯度)的點:

Latitude on a unit circle

我們必須平均所有x的和y然後從所得到的角度得出我們最後一個質心的緯度。這裏是JavaScript:

var latXTotal = 0; 
var latYTotal = 0; 
var lonDegreesTotal = 0; 

var currentLatLong; 
for (var i = 0; currentLatLong = google_latlngs[i]; i++) { 
    var latDegrees = currentLatLong.lat(); 
    var lonDegrees = currentLatLong.lng(); 

    var latRadians = Math.PI * latDegrees/180; 
    latXTotal += Math.cos(latRadians); 
    latYTotal += Math.sin(latRadians); 

    lonDegreesTotal += lonDegrees; 
} 

var finalLatRadians = Math.atan2(latYTotal, latXTotal); 
var finalLatDegrees = finalLatRadians * 180/Math.PI; 

var finalLonDegrees = lonDegreesTotal/google_latlngs.length; 
+0

謝謝。但我不確定這將如何擴展到三個或更多的值,但? – Richard 2011-12-19 17:27:17

+0

@Richard:我已經更新了包含多個值的解決方案。 – Briguy37 2011-12-19 18:44:48

-1

我不知道,我已經正確地理解算法,但我會嘗試:

var avg_lat, avg_lng; 
for (var i = 0; i < google_latlngs.length; i++) { 
    avg_lat += (google_latlngs[0].lat() > 0 ? google_latlngs[0].lat() : 360 + google_latlngs[0].lat()); 
    avg_lng += (google_latlngs[1].lng() > 0 ? google_latlngs[1].lng() : 360 + google_latlngs[1].lng()); 
} 
avg_lat = avg_lat/google_latlngs.length; 
avg_lng = avg_lng/google_latlngs.length; 

如果這是正確的,那麼平均-44和+45之間是180.5 - 這就是我關注。我會說平均-44和+45是0.5。如我錯了請糾正我。