web-dev-qa-db-fra.com

Google Maps Api v3 - trouver les marqueurs les plus proches

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.

85
user198003

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

107
Galen

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

75
Leor

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.

24
Jonathan

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

Êtes-vous au courant de extensions spatiales Mysql ?

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

5

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: -

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

  2. 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.

1
vikesh