Google Maps Api v3 – trouver les marqueurs les plus proches

Lorsque je clique sur la carte, quel sera le meilleur moyen de trouver le marqueur 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.

Tout d’abord, vous devez append le listlister

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 

Cela garde trace des marqueurs les plus proches et alerte son titre.

J'ai mes marqueurs comme tableau sur mon object cartographique

Vous pouvez utiliser la méthode computeDistanceBetween () dans l’espace de noms google.maps.geometry.spherical .

Je voudrais développer la suggestion de Leor pour quiconque est confus sur la façon de calculer l’emplacement le plus proche et de fournir une solution efficace:

J’utilise des marqueurs dans un tableau de markers , par exemple var markers = []; .

Alors, prenons notre position comme quelque chose comme var location = new google.maps.LatLng(51.99, -0.74);

Ensuite, nous réduisons simplement nos marqueurs par rapport à l’emplacement que nous avons ainsi:

 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 LatLng est votre object LatLng le plus proche.

La formule ci-dessus n’a pas fonctionné pour moi, mais je l’ai utilisée sans aucun problème. Passez 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 

Êtes-vous au courant des extensions de Mysql Spatial ?

Vous pouvez utiliser quelque chose comme MBRContains (g1, g2) .

Voici une autre fonction qui fonctionne très bien pour moi, 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; }