我想使用客户端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中查找质心的任何方法都可以。
答案 0 :(得分:6)
如果您只处理2个点,请确保在应用您的功能之前,您的两个纬度点之间的差异小于或等于180。您可以通过添加或减去360来完成此操作,这会将-179更改为181(或179到-181)。当您得到最终结果时,加/减360,直到最终值在您想要的范围内。
<强>更新强>
如果你希望这个有两个以上的点,我们必须做一些几何。我们将每个纬度点视为单位圆上的一个点,距离原点距离x
和y
以及某个角度a
(纬度):
我们必须平均所有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;
答案 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。如果我错了,请纠正我。