2011-12-19 14 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。如我错了请纠正我。