Javascript 求一组板条的质心(简单平均值)
我想使用客户端JavaScript,通过简单的平均值计算,找到一组纬度+经度(实际上是Google Latling对象)的质心 我看到类似的问题以前在堆栈溢出问题上被问过很多次,但我找不到JavaScript的直接答案。(这可能是我谷歌搜索的失败,如果这是重复的,我深表歉意。) 我有类似的东西,但它不适用于平均纬度179和-179的情况,所以质心应该是180,而不是0Javascript 求一组板条的质心(简单平均值),javascript,google-maps,geospatial,latitude-longitude,Javascript,Google Maps,Geospatial,Latitude Longitude,我想使用客户端JavaScript,通过简单的平均值计算,找到一组纬度+经度(实际上是Google Latling对象)的质心 我看到类似的问题以前在堆栈溢出问题上被问过很多次,但我找不到JavaScript的直接答案。(这可能是我谷歌搜索的失败,如果这是重复的,我深表歉意。) 我有类似的东西,但它不适用于平均纬度179和-179的情况,所以质心应该是180,而不是0 var avg_lat, avg_lng; for (var i = 0; i < google_latlngs.leng
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;
var avg_lat,avg_lng;
对于(var i=0;i
我需要在客户端JavaScript中高效地完成这项工作,而且我的点之间的距离不可能超过几公里,所以在这种情况下,大的圆距离或任何花哨的东西都是不必要的
谢谢你的帮助
更新:好的,任何在JavaScript中查找质心的方法都可以 我不确定自己是否正确理解了算法,但我会尝试:
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;
var avg_lat,avg_lng;
对于(var i=0;i0?谷歌纬度[0].lat():360+谷歌纬度[0].lat());
平均液化天然气+=(谷歌液化天然气[1].lng()>0?谷歌液化天然气[1].lng():360+谷歌液化天然气[1].lng());
}
avg_lat=avg_lat/google_latlngs.length;
avg_lng=avg_lng/google_latlngs.length;
如果这是正确的,那么-44和+45之间的平均值是180.5,这就是我所关心的。我认为-44和+45的平均值是0.5。如果我错了,请纠正我。如果您只处理2个点,请在应用函数之前确保两个纬度点之间的差值小于或等于180。你可以通过加360或减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;
179
和-179
的平均值为零;您的代码工作正常。如果你只想有正数,请看一下。啊,对不起,我指的是经度179和-179,这里的质心应该是180,而不是0,这是地球的一半。我应该编辑这个问题吗?谢谢。不过,我不确定这将如何扩展到三个或更多的值?@Richard:我已经更新了解决方案,以包含多个值。