Google Maps Api v3 - en yakın işaretçileri bulun


89

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.


1
Markörlerin koordinatlarını saklamak için herhangi bir veritabanı kullanıyor musunuz?
Argiropoulos Stavros

elbette, işaretçilerin konumları mysql veri tabanında saklanır.
user198003

Yanıtlar:


113

Ö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


2
Eski bir iş parçacığı açmamaya çalıştım ama bunu uygulamaya çalıştım ve görünüşe göre en yakınını bulmak yerine doğuya doğru arama yapıyor. Bu yüzden, bir konumu ararsam, doğuya doğru arama yapacak ve batıda GERÇEK bir yakın olsa bile bu yöne en yakın olanı bulacaktır. bu mantıklı mı?
LeeR

@Lee - mantıklı, ancak sorunu tekrarlayamıyorum
Galen

1
Evet, bu benim için hiç işe yaramadı - beni Kaliforniya lokasyonumuza koyun ve NY'deyim. Ve konumumda bir işaretçi var. Yine de bir işaretçi buldu!
mheavers

@mheavers - Kodda bir hata var. (i = 1'den (i = 0'a) değiştirin. İlk işaretçi dahil değildi.
Galen

1
@Magico javascript'i php koduna çeviremezsiniz. yanıttaki gibi javascript kodu üreten bir php sarmalayıcı yazabilirsiniz. Kendi başınıza yapamazsanız, php kullanmayın ...
Daniel W.


30

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


1
harika cevap!
Cesar Alonso

Düzgün ve temiz cevap!
TheeBen

Bu, işaretçileri sadece bir tane döndürmek yerine mesafeye göre sıralamak için kullanılabilir mi?
Louis W

Elbette @Louis, filtre yöntemine bakın. Bunları sıralamak için bunu kullanabilirsiniz
Jonathan

1
Konum nesnesi üzerindeki konumu kaldırarak çalıştırdım; şöyle: computeDistanceBetween (location, prev.position) ... çünkü location zaten bir LatLng nesnesi.
holm50

9

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

1
markersDiziyi nasıl dolduruyorsunuz? Kullanarak bir marker oluşturarak var marker1 = new google.maps.Marker({ ... })mı?
ENCHANCE

1
@enchance Bunu yapmak zorundaydım: map.markers = map.markers || [];sonra her işaretçi içinmap.markers.push(marker);
travis


4

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

3

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

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.