回答
首先,你必须添加事件侦听
google.maps.event.addListener(map, 'click', find_closest_marker);
然后创建通过标记列阵循环和使用haversine formula从点击计算每个标志物的距离的函数。
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);
}
这跟踪最近的标记并提醒其标题。
我有我的标志作为数组我的地图对象
很好的例子,但是,如果我点击芝加哥附近的标记,我会在警报窗口中看到纽约。是一个小错误,所以芝加哥没有正确列出,或其他? – user198003 2010-10-31 12:52:50
是的,这是一个错误,我修正了它=) – Galen 2010-10-31 18:50:15
不开放一个旧的线程,但我试图实现这一点,它似乎向东搜索,而不是找到最接近。因此,如果我搜索一个位置,它将向东搜索并找到最接近的位置,即使西面有一个REAL关闭。那有意义吗? – LeeR 2011-05-23 22:35:55
您可以使用类似MBRContains(g1,g2)的东西。
页面未找到配对,所以您需要重新编辑第回答 – Val 2012-04-19 14:39:22
@Val Done.Thanks – 2012-04-19 15:49:20
上面的公式并不适用于我,但我没有任何问题。通过您的当前位置的功能,并遍历标记的数组找到最接近:
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]);
}
可以在google.maps.geometry.spherical命名空间中的computeDistanceBetween()方法。
+1这是迄今为止的最佳答案。 – bruchowski 2014-09-02 23:17:43
这完全适合我 – ChrisRich 2014-10-21 00:28:33
这个答案应该标记为 – 2016-03-30 07:03:19
这里是我的伟大工程的另一个函数,返回公里距离:
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;
}
我想对雷欧的建议扩大对任何人对如何计算最近的位置和实际提供迷茫一个工作解决方案:
我在markers
阵列中使用标记eg var markers = [];
。
然后让我们像下面的var location = new google.maps.LatLng(51.99, -0.74);
我们的立场,然后我们只是减少我们对标记我们有像这样的位置:
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
什么弹出是你最亲密的标志LatLng
对象。
- 1. Google Maps API v3标记坐标
- 2. Google Maps API V3上的限制标记
- 3. Google maps api v2 - 在地图上找到最近/最近的标记/点数?
- 4. Google Maps API v3:标记未被删除
- 5. 刷新标记 - Google Maps JavaScript API v3
- 6. 多标记问题(Google Maps API v3)
- 7. Google maps api v3删除标记时dragstart
- 8. 在Google Maps API V3中绘制标记
- 9. Google Maps API v3 SVG标记消失
- 10. Google Maps JS API v3标记颜色
- 11. Google Maps API v3多个标记Infowindow
- 12. Google Maps API V3 - 检查坐标是否靠近后端的DirectionRoute
- 13. Google Maps API V3:fromContainerPixelToLatLng
- 14. Google Maps API v3 - maxZoomService
- 15. Google Maps API v3 BrowserIsCompatible
- 16. Google Maps v3中的弹性标记
- 17. Google Maps API v2 vs Google Maps API v3?
- 18. 如何在Google Maps API v3中将标记添加到标记
- 19. Google Maps API V3 - Internet Explorer
- 20. Google maps api v3 + marker clusterer:centering map?
- 21. google maps api v3 + infoBubble in markerClusterer
- 22. Google Maps API标记标题
- 23. 获取相对于屏幕的标记坐标Google Maps API v3
- 24. Google Maps API v3 MouseEvent标记不是鼠标的返回位置
- 25. Google地图标记不显示(Google Maps API v3)
- 26. Google Maps API:查找指定点的最近点并对其进行分组
- 27. Google Maps API v3,删除标记图标或更改为“空白”?
- 28. Google Maps API v3,点击时如何更改标记图标
- 29. Google Maps API v3:如何动态更改标记图标?
- 30. Google Maps API V3返回610,0,0,0
您是否使用任何数据库来存储标记的坐标? – 2010-10-30 08:14:45
当然,标记位置存储在MySQL数据库中。 – user198003 2010-10-31 11:11:46