webentwicklung-frage-antwort-db.com.de

Google Maps Api v3 - nächstgelegene Markierungen finden

Wenn ich auf die Karte klicke, welcher Weg ist der beste, um die nächsten Marker zu finden? Gibt es einige Funktionen in API, die mir dabei helfen werden?

es ist Google Map API v3.

85
user198003

Zuerst müssen Sie den Eventlistener hinzufügen

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

Erstellen Sie dann eine Funktion, die das Array von Markern durchläuft und die Haversinus-Formel verwendet, um den Abstand der einzelnen Marker vom Klick zu berechnen.

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

Dies verfolgt die nächsten Markierungen und warnt den Titel.

Ich habe meine Markierungen als Array auf meinem Kartenobjekt

107
Galen

Sie können die computeDistanceBetween () -Methode im Namespace google.maps.geometry.spherical verwenden.

75
Leor

Ich möchte auf Leors Vorschlag für alle eingehen, die sich nicht sicher sind, wie sie den nächstgelegenen Standort berechnen und tatsächlich eine funktionierende Lösung finden sollen:

Ich verwende Marker in einem markers - Array, z. var markers = [];.

Dann lasst uns unsere Position als etwas wie var location = new google.maps.LatLng(51.99, -0.74); haben

Dann reduzieren wir einfach unsere Marker gegen den Ort, den wir so mögen:

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

Was herausspringt, ist das nächste Markierungsobjekt LatLng.

24
Jonathan

Die obige Formel hat bei mir nicht funktioniert, aber ich habe sie ohne Probleme verwendet. Übergeben Sie Ihre aktuelle Position an die Funktion und durchlaufen Sie eine Reihe von Markierungen, um die nächstgelegene zu finden:

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

Kennen Sie MySQL Spatial-Erweiterungen ?

Sie könnten so etwas wie MBRContains (g1, g2) verwenden.

Hier ist eine weitere Funktion, die für mich hervorragend funktioniert und die Entfernung in Kilometern zurückgibt:

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

Verwenden Sie die Methode computeDistanceBetween () Google Maps-API , um die Nahe-Markierung zwischen Ihrem Standort und der Markierungsliste auf Google Maps zu berechnen.

Schritte: -

  1. Marker auf Google Map erstellen.
    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. Klicken Sie mit der Maus auf "Ereignis erstellen", um Ihre Position zu ermitteln, und übergeben Sie das Ereignis an "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());
        }
    

besuche diesen link folge den schritten. Sie werden in der Lage sein, näher an Ihren Standort heranzukommen.

1
vikesh