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.
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
Sie können die computeDistanceBetween () -Methode im Namespace google.maps.geometry.spherical verwenden.
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
.
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]);
}
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: -
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 }); }
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.