6 ответов:
сначала вы должны добавить eventlistener
google.maps.event.addListener(map, 'click', find_closest_marker);затем создайте функцию, которая проходит через массив маркеров и использует формула гаверсинуса для расчета расстояния каждого маркера от щелчка.
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); }это отслеживает ближайшие маркеры и предупреждает его название.
у меня есть мои маркеры в виде массива на моей карте объекта
вы можете использовать метод computeDistanceBetween () в google.карты.геометрия.сферическая пространство имен.
Я хотел бы расширить на Леора предложение для тех, кто запутался в том, как вычислить ближайшее местоположение и фактически обеспечить рабочее решение:
я использую маркеры в
markersмассив, например,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что выскакивает ваш ближайший маркер
формула выше не работает для меня, но я использовал это без каких-либо проблем. Передайте свое текущее местоположение функции и пройдите через массив маркеров, чтобы найти ближайший:
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?
вы могли бы использовать что-то вроде 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; }
Comments