在谷歌地图上找到更接近的点来创建标记

时间:2012-05-20 02:37:01

标签: google-maps google-maps-api-3 google-maps-markers

我有一个纬度和经度的多维数组,另一个是单个标记“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最近的两个点,用于从中创建两个标记

2 个答案:

答案 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)

我的主计算机上有一些代码,但基本上就是你需要做的事情:

  • 循环坐标并计算每个坐标与m(Haversine公式)之间的距离
  • 将每个距离与位置名称存储在一个数组中
  • 对数组进行排序

宾果

编辑:

计算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;
}