2010-03-21 4 views
2

может кто-нибудь помочь мне с этим, пожалуйста? Я не знаю, что пошло не так с моими кодами, я хочу отобразить адрес местоположения в информационном окне, но каждый раз он отображает предыдущий результат вместо текущего. например, когда я сначала нажимаю местоположение, он добавляет маркер, но отображаемый адрес не определен (это предыдущий результат). затем я нажимаю другое место, на котором отображается адрес первого.Отображение информации о карте Google в предыдущем геоданных вместо текущего результата

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

var map; 
var marker; 
var markersArray = []; 

var infoWindow; 
var buffer; 

var geocoder, regeocoder; 

function initialize() { 

window.onunload = google.maps.Unload; 

// Creating an option object for the map 

    var myOptions = { 
      zoom: 16, 
      center:COUNTRY, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 

// Initializing the map 

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

// Add onClick event to the map 

    google.maps.event.addListener(map, 'click', function(event) { placeMarker(event.latLng, true); }); 
} 

function placeMarker(location, flag) { 

// Get clicked location <Latitude, Longtitude> 

var clickedLocation = location; 

    if (markersArray) { 
     for (i in markersArray) { 
       markersArray[i].setMap(null); 
     } 
     markersArray.length = 0; 
    } 

    // Create a new marker 

    marker = new google.maps.Marker({ 
     position: clickedLocation, 
      map: map, 
      icon: 'image/blue-dot.png', 
      title: "Select this location", 
      clickable: true 
    }); 

    if (flag == true) { 

     // Start reverse Geocode 

     regeocoder = new google.maps.Geocoder(); 

     if (regeocoder) { 
       regeocoder.geocode({'latLng': clickedLocation, 'region': region}, function(results, status){ 

       if (status == google.maps.GeocoderStatus.OK) { 
       if (results[0]) { buffer = results[0].formatted_address; } 
       } 
      else { } 
       }); 
     } 

    setHiddenValue(buffer); 

    setMarkerInfo(buffer, clickedLocation); 

    } 

    // Attach mouseover event to a marker that will trigger the markerInfo 

    google.maps.event.addListener(marker, 'mouseover', function() { infowindow.open(map,marker); }); 

    // Attach mouseout event to the marker that will delete the markerInfo 

    google.maps.event.addListener(marker, 'mouseout', function() { if (infowindow) infowindow.close(); }); 

    markersArray.push(marker); 

    map.setCenter(clickedLocation); 
} 


function setMarkerInfo(title, textbody) { 

    // Initialize the contentString 

    var contentString = '<div id="content">'+'<div id="siteNotice">'+'</div>'+ 
    '<br/><h3 id="firstHeading" class="firstHeading">' + title + '</h1>'+ 
    '<div id="bodyContent">'+ 
    '<p>Map Coordinates: <br/>' + textbody + '</p>'+ 
    '</div>'+ 
    '</div>'; 

    infowindow = new google.maps.InfoWindow({ content: contentString }); 
    infosArray.push(infowindow); 
} 

function setHiddenValue(data) { 
    var hiddenVal = document.getElementById('getLoc'); 
    if (hiddenVal) { hiddenVal.value = data; } 
} 

function searchMap(info) { 

var address = info; 
var loc; 
var addr; 

    geocoder = new google.maps.Geocoder(); 

    if (geocoder) { 
      geocoder.geocode({'address': address, 'region': region}, function(sresults, sstatus){ 
       if (sstatus == google.maps.GeocoderStatus.OK) { 

        if (sresults[0]) { 

        loc = sresults[0].geometry.location; 

        geocoder.geocode({'latLng': loc}, function(results, status){ 
          if (status == google.maps.GeocoderStatus.OK) { 
          if (results[0]) { addr = results[0].formatted_address; } 
          } 
         else { alert("No Matching Results"); } 
         }); 

       } 

      }else { alert("No Matching Results"); } 

      }); 
    } 

    if (geocoder) { 
      geocoder.geocode({'address': address, 'region': region}, function(sresults, sstatus){ 
       if (sstatus == google.maps.GeocoderStatus.OK) { 

        if (sresults[0]) { 

        loc = sresults[0].geometry.location; 

        geocoder.geocode({'latLng': loc}, function(results, status){ 
          if (status == google.maps.GeocoderStatus.OK) { 
          if (results[0]) { addr = results[0].formatted_address; } 
          } 
         else { alert("No Matching Results"); } 
         }); 

       } 

      }else { alert("No Matching Results"); } 

      }); 
    } 

    setHiddenValue(addr); 

    setMarkerInfo(addr, loc); 

    placeMarker(loc, false); 

} 

ответ

1

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

geocoder.geocode({'latLng': loc}, function(results, status){ 
          if (status == google.maps.GeocoderStatus.OK) { 
           if (results[0]) { addr = results[0].formatted_address; } 
          } 
          else { alert("No Matching Results"); } 
       }); 

I предложить, чтобы связать все в вызове комбинированной функции:

google.maps.event.addListener(marker, 'mouseover', function() { 

и вместо:

infowindow.open(map,marker); }); 

вы звоните:

new google.maps.InfoWindow({ content: 

и вместо:

contentString }); 

вы звоните:

geocoder.geocode({'latLng': loc}, function(results, status){ 
    if (status == google.maps.GeocoderStatus.OK) { 
     if (results[0]) { addr = results[0].formatted_address; } 
    } else { 
     * alert("No Matching Results"); */ 
    } 
}); 

и здесь, получить отформатированный результат в виде CSS вы хотите и вернуть его как строка.

Таким образом, всякий раз, когда вы передаете свой маркер, вы запрашиваете относительный адрес и создаете инфоопределение на лету.

Надеюсь, это поможет.