0

我有一个纬度和经度的多维数组,以及另一个单个标记“m”。我需要从数组中获取最接近“m”的两个点,以创建另外两个标记。任何帮助将不胜感激。

这是纬度和经度的数组

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的两个点,以便从中创建两个标记

4

2 回答 2

3

其中一个组件是使用geometry库函数computeDistanceBetween(from:LatLng, to:LatLng, radius?:number),其中radius可选(地球半径)。

您必须使用以下参数包含geometry在 JS API 中:libraries

<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”进行比较,以及计算出的距离是多少。更好的是,可以从位置变量中保存“行”索引,以便您可以轻松地拉坐标。

然后可以按距离对这些对象的数组进行排序。我在这里找到了一篇文章:使用以下答案对JavaScript 对象数组进行排序,以按价格对房屋进行排序:

homes.sort(function(a,b) { return parseFloat(a.price) - parseFloat(b.price) } );
于 2012-05-20T02:55:20.543 回答
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;
}
于 2012-05-20T03:03:22.247 回答