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.
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 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
Pourquoi ne pas utiliser la méthode computeDistanceBetween () dans l'espace de noms google.maps.geometry.spherical ?
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 des extensions de Mysql Spatial ?
Vous pouvez utiliser quelque chose comme MBRContains (g1, g2) .
Ces formules ci-dessus sont le calcul de la distance linéaire entre les marqueurs et retourner le marqueur le plus proche, mais je pense que ce ne sont pas réalistes. Je veux dire la plupart d'entre nous besoin de calculer la direction de l'itinéraire distance entre les marqueurs.
si il y a une rivière entre deux marqueurs de la formule de calcul de 10 km, mais aussi dans les "travelMode: google.cartes.TravelMode.La CONDUITE d'une voiture, il peut-être sera de 50 km et il ne sera pas le point le plus proche.
computeDistanceBetween() de votre marqueur et les autres et de décider lequel est le plus proche. Mais que signifie trop de DirectionService.Route (la) demande et c'est cher.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.