Quand je clique sur la carte, quel sera le meilleur moyen de trouver le ou les marqueurs les plus proches? Y a-t-il des fonctions dans api qui m'aideront à le faire?
c'est google map api v3.
Vous devez d'abord ajouter le eventlistener
google.maps.event.addListener(map, 'click', find_closest_marker);
Créez ensuite une fonction qui parcourt le tableau de marqueurs et utilise la formule formule de haversine pour calculer la distance de chaque marqueur à partir du 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);
}
Ceci garde une trace des marqueurs les plus proches et alerte son titre.
J'ai mes marqueurs sous forme de tableau sur mon objet carte
Vous pouvez utiliser la méthode computeDistanceBetween () dans l'espace de noms google.maps.geometry.spherical .
J'aimerais développer la suggestion de Leor's pour ceux qui ne savent pas comment calculer l'emplacement le plus proche et proposer une solution efficace:
J'utilise des marqueurs dans un tableau markers
, par exemple. var markers = [];
.
Alors avons notre position comme quelque chose comme var location = new google.maps.LatLng(51.99, -0.74);
Ensuite, nous réduisons simplement nos repères par rapport à l'emplacement que nous avons comme suit:
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
Ce qui apparaît est votre marqueur le plus proche, LatLng
.
La formule ci-dessus n'a pas fonctionné pour moi, mais je l'ai utilisée sans problème. Transmettez votre position actuelle à la fonction et parcourez un tableau de marqueurs pour trouver le plus proche:
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]);
}
Êtes-vous au courant de extensions spatiales Mysql ?
Vous pouvez utiliser quelque chose comme MBRContains (g1, g2) .
Voici une autre fonction qui fonctionne très bien pour moi, retourne la distance en kilomètres:
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;
}
Utilisez la méthode computeDistanceBetween () API Google Map pour calculer le marqueur de proximité entre votre emplacement et la liste des marqueurs sur Google Map.
Étapes: -
Créer un marqueur sur google map.function addMarker(location) { var marker = new google.maps.Marker({ title: 'User added marker', icon: { path: google.maps.SymbolPath.BACKWARD_CLOSED_ARROW, scale: 5 }, position: location, map: map }); }
Sur la souris, créez un événement pour obtenir la latitude, la longueur de votre emplacement et transmettez-le à find_closest_marker ().
function find_closest_marker(event) {
var distances = [];
var closest = -1;
for (i = 0; i < markers.length; i++) {
var d = google.maps.geometry.spherical.computeDistanceBetween(markers[i].position, event.latLng);
distances[i] = d;
if (closest == -1 || d < distances[closest]) {
closest = i;
}
}
alert('Closest marker is: ' + markers[closest].getTitle());
}
visitez ce lien suivez les étapes. Vous pourrez vous rapprocher de votre position.