Haritaya tıkladığımda, en yakın işaretçi veya işaretçileri bulmanın en iyi yolu hangisidir? api'de bunu yapmama yardımcı olacak bazı işlevler var mı?
bu google harita api v3.
Haritaya tıkladığımda, en yakın işaretçi veya işaretçileri bulmanın en iyi yolu hangisidir? api'de bunu yapmama yardımcı olacak bazı işlevler var mı?
bu google harita api v3.
Yanıtlar:
Önce olay dinleyiciyi eklemelisiniz
google.maps.event.addListener(map, 'click', find_closest_marker);
Ardından, işaretçi dizisi boyunca döngü yapan ve haversine formülünü kullanarak her işaretçinin tıklamadan uzaklığını hesaplayan bir işlev oluşturun .
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);
}
Bu, en yakın işaretçileri takip eder ve başlığını uyarır.
Harita nesnemde işaretçilerim bir dizi olarak var
You computeDistanceBetween () yöntemini kullanabilirsiniz google.maps.geometry.spherical ad.
En yakın konumun nasıl hesaplanacağı ve gerçekte çalışan bir çözümün nasıl sağlanacağı konusunda kafası karışan herkes için Leor'un önerisini genişletmek istiyorum :
markers
Örneğin bir dizide işaretler kullanıyorum var markers = [];
.
Öyleyse konumumuz şöyle bir şey olsun var location = new google.maps.LatLng(51.99, -0.74);
Ardından, işaretlerimizi sahip olduğumuz konuma göre azaltırız:
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
Ortaya çıkan en yakın işaret LatLng
nesnenizdir.
Yukarıdaki formül benim için işe yaramadı, ancak bunu herhangi bir sorun olmadan kullandım. Mevcut konumunuzu işleve aktarın ve en yakınını bulmak için bir dizi işaretçi arasında döngü yapın:
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
Diziyi nasıl dolduruyorsunuz? Kullanarak bir marker oluşturarak var marker1 = new google.maps.Marker({ ... })
mı?
map.markers = map.markers || [];
sonra her işaretçi içinmap.markers.push(marker);
Mysql Spatial uzantılarının farkında mısınız ?
MBRContains (g1, g2) gibi bir şey kullanabilirsiniz .
İşte benim için harika çalışan, kilometre cinsinden mesafeyi döndüren başka bir işlev:
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;
}
Google haritasındaki konumunuz ile işaretçi listesi arasındaki yakın işaretleyiciyi hesaplamak için computeDistanceBetween () Google harita API yöntemini kullanın.
Adımlar: -
Google haritasında işaretçi oluşturun.
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
});
}
Farede, konumunuzun enlem ve uzunluğunu almak için olay oluştur'a tıklayın ve bunu find_closest_marker () öğesine iletin.
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());
}
bu bağlantıyı ziyaret edin adımları izleyin. Konumunuza daha yakın işaretçi alabileceksiniz.