Google Maps API - GDirections.getDuration () возвращает ноль в первый раз, работает во второй раз - PullRequest
1 голос
/ 07 августа 2009

У меня возникла дилемма в API Карт Google - я использую объект GDirections, чтобы получить время, необходимое для перемещения между двумя точками.

Я протестировал следующий код в Firebug, так что шансы остальной части моего кода, влияющие на этот один вызов, невелики (я не могу связаться с реальной картой; она на локальном компьютере).

var start = "NY, USA";
var end = "CA, USA";
var searchString = "from: " + start + " to: " + end;

C.console(searchString);

var myDir = new GDirections(); 

GEvent.addListener(myDir,"load",C.console(myDir,getDuration()));
myDir.load(searchString);

C.console - это просто функция, которую я написал для вывода ее аргументов в журнал отладки Firebug. Когда я запускаю этот код, он выводит searchString from: NY, USA to: CA, USA и вызывается функция обратного вызова. Однако он выводит null, а не длительность объекта GDirections.

Далее я бегу

C.console(myDir.getDuration())

и он выводит

Object seconds=157994 html=1 day 20 hours

по желанию. Кто-нибудь знает, почему для этого нужно два вызова? Я думаю, что это зависит от времени, потому что в коде, если я просто вызову его дважды, это даст мне ноль два раза подряд, что не было удивительно. Я уже использую обработчик событий, чтобы дождаться окончания загрузки. Я также пытался использовать событие addoverlay вместо события load, но это тоже не сработает.

Кто-нибудь видел это раньше или есть идеи, как я могу это исправить? Любая помощь будет принята с благодарностью!

Ответы [ 5 ]

2 голосов
/ 21 сентября 2009

Ваша проблема в том, что эта строка

GEvent.addListener(myDir,"load",C.console(myDir,getDuration()));

вызывает немедленное выполнение C.console, и все, что он возвращает, используется в качестве функции обратного вызова. Это не то, что вы хотите. Вы хотите, чтобы C.console вызывался при обратном вызове. Один из способов сделать это -

GEvent.addListener(myDir,"load",function() {
  C.console(myDir,getDuration())
});
0 голосов
/ 14 сентября 2011

> Как использовать GDirections

отвечая на вышеуказанный запрос, можно перейти по следующей ссылке, которая показывает использование G Направление на пенсию следующих вещей

а) Расстояние между двумя точками б) Продолжительность между двумя покрытиями.

перейдите по этой ссылке, чтобы узнать больше об использовании GDirection

0 голосов
/ 19 января 2010

Как использовать GDirections?

     var dir=new GDirections(map);
var queryString="from: "+ map.getCenter()+"to: "+marker.getLatLng();
dir.load(queryString);
alert(dir.getDistance().meters);

ошибка: dir.getDistance () не определена ....

0 голосов
/ 08 августа 2009

Это действительно ошеломило меня. Я играл с кодом, и это работает:

var start = "NY, USA";
var end = "CA, USA";
var searchString = "from: " + start + " to: " + end;

C.console(searchString);

var directions = new GDirections();
GEvent.addListener(directions,"load",function() {
    C.console(directions.getDuration());
});

directions.load(searchString);

Помимо изменения переменной (myDir теперь directions), я использовал анонимную функцию для функции обратного вызова. Кажется, раньше это была проблема с областью видимости, и, может быть, во второй раз переменная была определена, и это больше не было null. Во всяком случае, похоже, что теперь это работает правильно - надеюсь, это поможет и другим.

0 голосов
/ 07 августа 2009

Я вспомнил, что у меня была похожая проблема, но она была другой природы, однако структура проблемы была такой же.

Мне пришлось дважды щелкнуть по нему, чтобы оно заработало. Я наконец понял это, и вот код, Мой Оригинальный пост на Google API (http://groups.google.com/group/Google-AJAX-Search-API/browse_thread/thread/c6c46cc8a0435eb0/f697b028bbce18db#f697b028bbce18db)

<script type='text/javascript'>
google.load('search', '1');
google.load('maps', '2');

//Define our Globals
var map;                        //Map API
var gdir;                       //Direction API
var gFirstSearch;       //The From Local Search
var gSecondSearch;      //The To Local Search

var fromAddress;        //From Address The user inputs
var toAddress;          //To Address the user inputs

var first;                      //First Set of Results for From Search
var second;             //Second Set of Results for To Search

//On Load, Load all the Details Needed
function OnLoad(){

        //Set up the Map and the Globals
        //If the Browser Supports its
        if (GBrowserIsCompatible()) {
                map = new GMap2(document.getElementById("map"));
                map.setCenter(new GLatLng(52.037366,-0.703726), 7);
                map.removeMapType(G_HYBRID_MAP);

                var mapControl = new GMapTypeControl();
                map.addControl(mapControl);
                map.addControl(new GLargeMapControl());

                gdir = new GDirections(map);
                GEvent.addListener(gdir, "load", onGDirectionsLoad);
                GEvent.addListener(gdir, "error", handleErrors);

                gFirstSearch = new google.search.LocalSearch();
                gFirstSearch.setCenterPoint(map);
                gFirstSearch.setSearchCompleteCallback(null, FirstSearch);

                gSecondSearch = new google.search.LocalSearch();
                gSecondSearch.setCenterPoint(map);
                gSecondSearch.setSearchCompleteCallback(null, SecondSearch);
        }

}

//Run the From Search
//Runs after the gFirstSearch.execute has finished
//Reference: setSearchCompleteCallback
function FirstSearch(){

        if (!gFirstSearch.results.length){ alert("Could Not Find: " +
fromAddress + "\n Please Try Refining your 'From' Address Field");
return; }
        //Return the First Result into a Variable
        first = gFirstSearch.results[0];

        //Execute the Second
        gSecondSearch.execute(toAddress);

}

//Run the To Search
//Runs after the gSecondSearch.execute has finished
//Reference: setSearchCompleteCallback
function SecondSearch(){

        if (!gSecondSearch.results.length){ alert("Could Not Find: " +
toAddress + "\n Please Try Refining your 'To' Address Field");
return; }

        //Returns the Second results into a Variable
        second = gSecondSearch.results[0];

        //Plot our Graph
        gdir.load("from: " + (first.lat + ", " + first.lng) + " to: " +
(second.lat + ", " + second.lng));

}

//Use to Execite our Form Commands
function setDirections(ifromAddress, itoAddress) {

        //Initiate the inputs into our Global Variables
        fromAddress = ifromAddress;
        toAddress = itoAddress;

        //Execute our Search
        gFirstSearch.execute(fromAddress);

        //Return False so our broweser dosent Refresh
        return false;

}

//Set the Values in our HTML after Direction has loaded
function onGDirectionsLoad(){

        var miles = gdir.getDistance().meters * 0.000621371192; //Convert to
Miles
        document.getElementById("distance").innerHTML = "Distance: " + miles
+ " ml";

        // and yada yada yada...
}

</script>

Глядя на это, я вспоминаю, что первое направление «Get» - «Выполнить как поток», а затем «Второе» - также «поток». следовательно, значение по-прежнему равно нулю. Поэтому вам нужно как-то заставить gdirection подождать, пока первое и второе вернёт свое значение

Примечание: два callBacks в приведенном выше коде

gFirstSearch.setSearchCompleteCallback(null, FirstSearch);
gSecondSearch.setSearchCompleteCallback(null, SecondSearch);

Примечание: функция gSecondSearch.execute (toAddress) запускается внутри функции firstSearch ()

//Run the From Search
//Runs after the gFirstSearch.execute has finished
//Reference: setSearchCompleteCallback
function FirstSearch(){

    if (!gFirstSearch.results.length){ 
        alert("Could Not Find: " + fromAddress);
        return; 
    }

    //Return the First Result into a Variable
    first = gFirstSearch.results[0];

    //Execute the Second
    gSecondSearch.execute(toAddress);

}

Способ, которым я решил, состоял в том, чтобы поместить его в функцию обратного вызова. Функция обратного вызова вызывается, когда процесс завершается

Итак, вот шаги

  1. Получите первое местоположение (Нью-Йорк)
  2. После того, как вы получите первое местоположение (NY) Получите второе местоположение (CA), запустив функцию поиска внутри обратного вызова первого местоположения
  3. И, наконец, отобразите эти 2, которые у вас, кажется, хорошо работают, но единственное отличие состоит в том, что вы отображаете их в обратном вызове второй функции

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

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