multiple marcadores google example eliminar añadir google-maps google-maps-api-3

example - Google Maps Api v3-encuentre los marcadores más cercanos



google.maps.marker label (6)

Cuando hago clic en el mapa, ¿cuál es la mejor manera de encontrar el marcador o los marcadores más cercanos? ¿hay algunas funciones en api que me ayuden a hacer eso?

es google map api v3.



Aquí hay otra función que funciona muy bien para mí, devuelve la distancia en kilómetros:

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


La fórmula anterior no funcionó para mí, pero la usé sin ningún problema. Pase su ubicación actual a la función y recorra una matriz de marcadores para encontrar la más cercana:

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]); }


Me gustaría ampliar la sugerencia de Leor para cualquiera que esté confundido sobre cómo calcular la ubicación más cercana y ofrecer una solución de trabajo:

Estoy usando marcadores en una matriz de markers por ejemplo var markers = []; .

Entonces, tengamos nuestra posición como algo así como var location = new google.maps.LatLng(51.99, -0.74);

Entonces, simplemente reducimos nuestros marcadores contra la ubicación que tenemos así:

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

Lo que aparece es el objeto LatLng marcador más cercano.


Primero tienes que agregar el eventlistener

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

Luego crea una función que recorre la matriz de marcadores y usa la fórmula de haversine para calcular la distancia de cada marcador desde el clic.

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); }

Esto hace un seguimiento de los marcadores más cercanos y alerta su título.

Tengo mis marcadores como una matriz en mi objeto de mapa