2 Stimmen

Google Map Info-Fenster zeigt vorheriges Geo-Ergebnis anstelle des aktuellen Ergebnisses

Kann jemand mir mit diesem ziemlich bitte helfen? ich weiß nicht, was mit meinen Codes schief gegangen ist, ich möchte die Adresse des Standorts im Info-Fenster anzeigen, aber jedes Mal, wenn es das vorherige Ergebnis anstelle des aktuellen anzeigt. zum Beispiel, wenn ich zuerst auf einen Standort klicke, fügt es eine Markierung hinzu, aber die angezeigte Adresse ist undefiniert (was das vorherige Ergebnis ist). dann klicke ich auf einen anderen Punkt, den es die Adresse des ersten angezeigt.

Wie kann ich dies lösen, um Adresse für den aktuellen Standort zu zeigen, der markiert wird? bitte. danke viel. unten ist mein Code.

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

}

1voto

Claudio Klemp Punkte 11

Ihr Problem hängt damit zusammen, dass die Adressinformationen asynchron eintreffen, d. h. Sie führen den gesamten Code aus, bevor Sie die relativ formatierte Adresse erhalten:

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

Ich schlage vor, alles in einem kombinierten Funktionsaufruf zu verknüpfen:

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

und stattdessen:

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

rufen Sie an:

new google.maps.InfoWindow({ content:

und stattdessen:

contentString });

rufen Sie an:

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"); */
    }
});

und darin das formatierte Ergebnis in die gewünschte css-Form bringen und als String zurückgeben.

Auf diese Weise können Sie jedes Mal, wenn Sie über Ihre Markierung fahren, die relative Adresse abfragen und das Infofenster im Handumdrehen erstellen.

Ich hoffe, es hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X