Геокодирование и маркеры Google Maps V3 в цикле - PullRequest
4 голосов
/ 13 марта 2011

У меня есть некоторые проблемы с моим кодом, у меня есть список аэропортов в базе данных sql, и я хочу создать маркеры для каждого 1 из этих аэропортов.

Для адреса, по которому я получил коды ИКАО для каждого аэропорта, ИКАО уникальна для каждого аэропорта

Я получаю данные из базы данных в виде массива

он сохраняется в "temp" с помощью функции split и с помощью цикла for получает их 1 на 1

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

вот страница, последняя запись в базе данных ZBAA.

И все маркеры размещены в правильном месте, но заголовок неверен: s

http://mizar.lte.lu/~pr1011_meteo/projet/cartemonde4.php

Проблема с «адресом», я думаю, но я не уверен.

for (var i = 0; i < temp.length; ++i){

     var address=temp[i];

     geocoder.geocode({ 'address': address}, function(results){            
          var marker  = new google.maps.Marker({
              map: map, 
              position: results[0].geometry.location,
              title:address
          });

          google.maps.event.addListener(marker, 'click', function() {
               window.open ('infomonde.php?icao='+address+'&language=fr', 'Informations météo', config='height=400, width=850, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, directories=no, status=no')});
     });  
};

Ответы [ 2 ]

10 голосов
/ 14 марта 2011

Вот демоверсия JSFiddle с использованием "фиктивных" адресов и предупреждений для отображения правильных данных, связанных с каждым маркером:

У вас есть типичная проблема закрытия / области действия в течениепетля.Чтобы решить эту проблему, используйте замыкание, чтобы локализовать переменную temp[i] перед переходом в геокод и функцию обратного вызова внутри нее:

    for (var i = 0; i < temp.length; ++i) {
        (function(address) {
            geocoder.geocode({
                'address': address
            }, function(results) {
                var marker = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location,
                    title: address
                });

                google.maps.event.addListener(marker, 'click', function() {
                    //alert(address);  //use alert to debug address
                    window.open('infomonde.php?icao=' + address + '&language=fr', 'Informations météo', config = 'height=400, width=850, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, directories=no, status=no')
                });
            });
        })(temp[i]);  //closure passing in temp[i] and use address within the closure
    }
0 голосов
/ 13 марта 2011

я думаю, потому что

geocoder.geocode({ 'address': address}, function(results){ ... });

обратный вызов выполняется в том же контексте.

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

var results = {};
var waiting = temp.length;

while(temp.length > 0){

  var fetching = temp.pop();

  geocoder.geocode(
    { address: fetching}, 
    function(response){
      results[fetching] = response[0].geometry.location;
      --waiting;
      if(waiting == 0) // wait for everything to finish
        setMarker();
    }
  );
}
var setMarker = function(){
  for(var element in results){
    var marker  = new google.maps.Marker({
              map: map, 
              position: results[element],
              title: element
              });

    google.maps.event.addListener(marker, 'click', function() {
    window.open ('infomonde.php?icao='+element+'&language=fr', '', 'configs')});
  }
}

ps window.open, если я не ошибаюсь, какой-то браузер отклоняет заголовок всплывающего окна (и может вызвать невозможность открыть всплывающее окно).я всегда оставляю пустым.

...