找到一组latlng的质心(简单平均值)

时间:2011-12-19 16:51:43

标签: javascript google-maps geospatial latitude-longitude

我想使用客户端JavaScript来查找一组纬度+经度(实际上是Google LatLng对象)的质心,使用简单的平均值计算。

我发现Stack Overflow之前已经多次提出过类似的问题,但我找不到一个直截了当的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中有效地执行此操作,并且我的点数不可能超过几公里,因此在这种情况下,不需要大圆距离或任何花哨的东西。

感谢您的帮助。

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

2 个答案:

答案 0 :(得分:6)

如果您只处理2个点,请确保在应用您的功能之前,您的两个纬度点之间的差异小于或等于180。您可以通过添加或减去360来完成此操作,这会将-179更改为181(或179到-181)。当您得到最终结果时,加/减360,直到最终值在您想要的范围内。

<强>更新

如果你希望这个有两个以上的点,我们必须做一些几何。我们将每个纬度点视为单位圆上的一个点,距离原点距离xy以及某个角度a(纬度):

Latitude on a unit circle

我们必须平均所有xy,然后取结果点的角度来获得质心的最终纬度。这是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;

答案 1 :(得分:-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。如果我错了,请纠正我。