我有一个纬度和经度的多维数组,另一个是单个标记“m”。我需要从阵列中获得两个最接近“m”的点,以创建另外两个标记。任何帮助都将受到高度赞赏。
这是lats and lons的数组
var locations= [
['loc1', 54.1121824,-1.3983992],
['loc2', 54.2121824,-1.4323992],
['loc3', 54.4121824,-1.5993992],
['loc4', 54.3871874,-1.6773992],
['loc5', 54.1963824,-1.5983992]
];
我希望得到m = 54.1143824,-1.4963992
最近的两个点,用于从中创建两个标记
答案 0 :(得分:3)
其中一个组件是使用geometry
库函数computeDistanceBetween(from:LatLng, to:LatLng, radius?:number)
,其中radius
是可选的(地球半径)。
您必须使用geometry
参数包含libraries
和JS API:
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false"></script>
现在,您可以遍历数据,保存每个坐标与特殊标记m
之间的计算距离。默认情况下,结果将以米为单位(更改半径可选择提供不同的单位)
对于坐标数据中的每一行,请创建rowLatLng = new google.maps.LatLng(row[1], row[2])
google.maps.geometry.spherical.computeDistanceBetween(rowLatLng, m.getPosition())
然后,我能想到提取两个最近点的最佳方法是使用对象{ locationname: "loc1", distance: 20 }
来保存哪个点与标记“m”进行比较,以及计算出的距离是多少。更好的方法是,可以从locations变量中保存“row”索引,以便轻松拉动坐标。
然后可以按距离对这些对象的数组进行排序。我在这里找到了一个帖子:Sorting an array of JavaScript objects,其中包含以下价格分类房屋的答案:
homes.sort(function(a,b) { return parseFloat(a.price) - parseFloat(b.price) } );
答案 1 :(得分:0)
我的主计算机上有一些代码,但基本上就是你需要做的事情:
宾果
编辑:
计算Haversine的一些代码:
Number.prototype.toRad=function() {
return this * (Math.PI / 180);
}
function Haversine=function(lat1, lon1, lat2, lon2) {
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d;
}