Google Maps Api v3 – 查找最近的标记

当我点击地图,这将是最好的方式来find最近的标记或标记? 是否有一些函数可以帮助我做到这一点?

这是谷歌地图api v3。

首先你必须添加eventlistener

google.maps.event.addListener(map, 'click', find_closest_marker); 

然后创build一个循环遍历标记数组的函数,并使用haversine公式计算每个标记距离点击的距离。

 function rad(x) {return x*Math.PI/180;} function find_closest_marker( event ) { var lat = event.latLng.lat(); var lng = event.latLng.lng(); var R = 6371; // radius of earth in km var distances = []; var closest = -1; for( i=0;i<map.markers.length; i++ ) { var mlat = map.markers[i].position.lat(); var mlng = map.markers[i].position.lng(); var dLat = rad(mlat - lat); var dLong = rad(mlng - lng); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; distances[i] = d; if ( closest == -1 || d < distances[closest] ) { closest = i; } } alert(map.markers[closest].title); } 

这跟踪最近的标记并提醒其标题。

我有我的标记作为我的地图对象上的数组

您可以使用google.maps.geometry.spherical命名空间中的computeDistanceBetween()方法。

我想对Leor的build议进一步说明:如何计算最近的位置,实际上提供一个工作解决scheme:

我在markers数组中使用标记,例如var markers = [];

那么让我们把我们的位置,如var location = new google.maps.LatLng(51.99, -0.74);

然后,我们简单地将我们的标记减less到我们喜欢的位置:

 markers.reduce(function (prev, curr) { var cpos = google.maps.geometry.spherical.computeDistanceBetween(location.position, curr.position); var ppos = google.maps.geometry.spherical.computeDistanceBetween(location.position, prev.position); return cpos < ppos ? curr : prev; }).position 

popup的是您最接近的标记LatLng对象。

上面的公式不适合我,但我没有任何问题使用这个。 将当前位置传递给函数,并通过一系列标记循环find最接近的位置:

 function find_closest_marker( lat1, lon1 ) { var pi = Math.PI; var R = 6371; //equatorial radius var distances = []; var closest = -1; for( i=0;i<markers.length; i++ ) { var lat2 = markers[i].position.lat(); var lon2 = markers[i].position.lng(); var chLat = lat2-lat1; var chLon = lon2-lon1; var dLat = chLat*(pi/180); var dLon = chLon*(pi/180); var rLat1 = lat1*(pi/180); var rLat2 = lat2*(pi/180); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(rLat1) * Math.cos(rLat2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; distances[i] = d; if ( closest == -1 || d < distances[closest] ) { closest = i; } } // (debug) The closest marker is: console.log(markers[closest]); } 

你知道Mysql Spatial扩展吗?

你可以使用像MBRContains(g1,g2)的东西 。

这里是另一个对我很好的函数,返回距离(以公里为单位):

  function distance(lat1, lng1, lat2, lng2) { var radlat1 = Math.PI * lat1 / 180; var radlat2 = Math.PI * lat2 / 180; var radlon1 = Math.PI * lng1 / 180; var radlon2 = Math.PI * lng2 / 180; var theta = lng1 - lng2; var radtheta = Math.PI * theta / 180; var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); dist = Math.acos(dist); dist = dist * 180 / Math.PI; dist = dist * 60 * 1.1515; //Get in in kilometers dist = dist * 1.609344; return dist; }