Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 求一组板条的质心(简单平均值)_Javascript_Google Maps_Geospatial_Latitude Longitude - Fatal编程技术网

Javascript 求一组板条的质心(简单平均值)

Javascript 求一组板条的质心(简单平均值),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

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

我看到类似的问题以前在堆栈溢出问题上被问过很多次,但我找不到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; 
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:我已经更新了解决方案,以包含多个值。