Wenn ich auf die Karte klicke, welcher Weg ist der beste, um den nächsten Marker oder die nächsten Marker zu finden? Gibt es einige Funktionen in API, die mir dabei helfen?
Es ist Google Map API v3.
Wenn ich auf die Karte klicke, welcher Weg ist der beste, um den nächsten Marker oder die nächsten Marker zu finden? Gibt es einige Funktionen in API, die mir dabei helfen?
Es ist Google Map API v3.
Antworten:
Zuerst müssen Sie den Ereignislistener hinzufügen
google.maps.event.addListener(map, 'click', find_closest_marker);
Erstellen Sie dann eine Funktion, die das Array von Markern durchläuft und mithilfe der Haversine-Formel den Abstand jedes Markers vom Klick berechnet.
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);
}
Dadurch werden die nächstgelegenen Markierungen verfolgt und der Titel angezeigt.
Ich habe meine Markierungen als Array auf meinem Kartenobjekt
Sie können die Methode computeDistanceBetween () im Namespace google.maps.geometry.spherical verwenden .
Ich möchte Leors Vorschlag für alle erweitern, die sich nicht sicher sind, wie sie den nächstgelegenen Standort berechnen und tatsächlich eine funktionierende Lösung anbieten sollen:
Ich verwende Marker in einem markers
Array, z var markers = [];
.
Dann lassen Sie uns unsere Position als so etwas haben var location = new google.maps.LatLng(51.99, -0.74);
Dann reduzieren wir einfach unsere Markierungen 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 Ihr nächstgelegenes Markierungsobjekt LatLng
.
Die obige Formel hat bei mir nicht funktioniert, aber ich habe sie ohne Probleme verwendet. Übergeben Sie Ihren aktuellen Standort 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]);
}
markers
Array? Ist es durch Erstellen eines Markers mit var marker1 = new google.maps.Marker({ ... })
?
map.markers = map.markers || [];
dann für jeden Markermap.markers.push(marker);
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 Google Map-API computeDistanceBetween () Methode zwischen Ihrem Standort und der Markierungsliste auf zu berechnen.
Schritte:-
Erstellen Sie eine Markierung auf 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
});
}
Klicken Sie bei der Maus auf Ereignis erstellen, um lat, long von Ihrem Standort abzurufen, und übergeben Sie dieses 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());
}
Besuchen Sie diesen Link und folgen Sie den Schritten. Sie können näher an Ihren Standort gelangen.