Google maps api v2 - найти ближайшие / ближайшие маркеры / точки на карте? - PullRequest
1 голос
/ 24 августа 2011

Привет, я пытаюсь сделать то, что кажется почти невозможным ... я пытаюсь получить три объекта маркера ближайшего местоположения ... это вообще возможно?... он не должен быть на 100% точным ... но чтобы сделать хоть что-то ... то, что я нашел в сети и попробовал, было так:

function find_closest_marker( lat1, lon1 ) {

        for(var y = 1; y < 4; y++){

            var pi = Math.PI;
            var R = 6371; //equatorial radius

            for(var i=0;i<markers.length; i++ ) {
                //alert(markers.length);
                var closest = -1;
                var distances = [];

                var lat2 = points[i].lat().toFixed(5);
                var lon2 = points[i].lng().toFixed(5);

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

            var markerImg = "";
            if(markers[closest].markerType == 1){
                markerImg="/files/billeder/../Templates/Designs/Ideal2011/images/Map/dot_red.jpg"
            } else if(markers[closest].markerType == 2){
                markerImg="/files/billeder/../Templates/Designs/Ideal2011/images/Map/dot_lblue.jpg"
            }else if(markers[closest].markerType == 3){
                markerImg="/files/billeder/../Templates/Designs/Ideal2011/images/Map/dot_dblue.jpg"
            }else if(markers[closest].markerType == 4){
                markerImg="/files/billeder/../Templates/Designs/Ideal2011/images/Map/dot_green.jpg"
            }

            $('.nearestPlace'+y).html(
                "<img src='"+markerImg+"' alt='"+markers[closest].address+"' />"+
                "<div class='CompanyName'><strong>"+markers[closest].title+"</strong></div>"+
                markers[closest].address+"<br/>"+
                markers[closest].postby+"<br/>"+
                "Tlf.: "+markers[closest].phone+"<br/>"+
                markers[closest].fax+
                markers[closest].web+
                markers[closest].email
            );
            //markers.pop(markers[closest]);
            //points.pop(points[closest]);
            //markers[closest] = "";
            //points[closest]= "";
            //alert(closest);
            //markers.slice(closest,closest+1);
            //points.slice(closest,closest+1);
            //alert(markers[closest].title)
            delete markers[closest];
            delete points[closest]
        }
    }

Как вы можете видеть из некоторых комментариевв коде я пробовал много разных вещей!ни один из них, кажется, не работает для меня!Это дает первое местоположение (даже не правильное), а затем просто ломается, ничего не делает для второго и третьего ...

Кто-нибудь может увидеть ошибки в этом?ИЛИ МОЖЕТ БЫТЬ ДАЖЕ ЛУЧШЕ ЗНАТЬ ИЛИ МОЖЕТЕ НАПИСАТЬ КОД, ЧТОБЫ ПОЛУЧИТЬ НУЖНУЮ ФУНКЦИОНАЛЬНОСТЬ?

lat1, lon1 - текущей точки!

У меня есть 300 маркеров в небольшой области, поэтому не должно быть затрудненийдля скрипта найти 3 ближайших.

1 Ответ

0 голосов
/ 01 марта 2012

если вы перебираете свои маркеры, вы можете вызывать этот метод для каждого, а затем сохранять результаты в массиве, который вы можете отсортировать в массиве. Это будет дорогостоящая операция ...

    /**
     * This will give you the distance in kilometers between 2 positions
     *
     * @param lat1 - The first positions latitude
     * @param lng2 - The first positions longitude
     * @param lat2 - The second positions latitide
     * @param lng2 - The second positions longitude
     *
     * @return int- The distance in kilometers between the 2 places
     */
    distanceFrom : function(lat1,lng1, lat2, lng2) {
        var R = 6371; // km
        var dLat = this._toRad((lat2-lat1));
        var dLon = this._toRad((lng2-lng1));
        var lat1 = this._toRad(lat1);
        var lat2 = this._toRad(lat2);

        var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        var d = R * c;

        return d;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...