Har försökt läsa lite om problemet men inte riktigt blivit klar över hur jag löser det, jag använder geo coding av min adresser för att visa dom på google maps.. Detta funkar bra men jag vill samla upp de adresser som inte hamnar på kartan och kunna lista dom i efterhand för efterbearbetning.. Som det är nu har jag bara en alert("") som säger att adressen inte finns, jag försökte skriva adressen till en variabel istället men får då bara undefined när jag försöker skriva ut den på sidan.. Läste att det har något med "Callback" att göra i hur Geo coding arbetar?
Försökte rensa ut en liten del av scriptet här under, hela finns längre ner..
Tacksam om någon kan förklarar detta på ett busenkelt sätt?
<script type="text/javascript">
var geocoder;
geocoder = new google.maps.Geocoder();
function getAddress(address, tId, door, size, isDelivered,infoWindowData, plan, activePlan) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
icon: stdIcon,
title: address,
tId:tId,
plan: plan,
activePlan: activePlan,
testId:testId
});
});
}
else {
alert(address);
}
});
};
</script>
<script type="text/javascript">
var geocoder;
var map;
geocoder = new google.maps.Geocoder();
var zoomLimit = 2;
var deliver_markers = <%=varAddresses %>
var myPoints = Array();
var iconBooked = new google.maps.MarkerImage("http://www.coloradodot.info/content/programs/bikeped/saferoutes/prodkml/marker-google-green.png");
iconBooked.size = new google.maps.Size(35, 35);
iconBooked.anchor = new google.maps.Point(0, 35);
var iconNotBooked = new google.maps.MarkerImage("http://www.coloradodot.info/content/programs/bikeped/saferoutes/prodkml/marker-google-red-default.png");
iconNotBooked.size = new google.maps.Size(35, 35);
iconNotBooked.anchor = new google.maps.Point(0, 35);
var iconDelivered = new google.maps.MarkerImage("http://www.coloradodot.info/content/programs/bikeped/saferoutes/prodkml/marker-google-green.png");
iconNotBooked.size = new google.maps.Size(35, 35);
iconNotBooked.anchor = new google.maps.Point(0, 35);
function initialize() {
var mapOptions = {
center: new google.maps.LatLng(52.041213, -1.325532),
streetViewControl: false,
zoom:zoomLimit,
mapTypeControl: false,
navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
}
var j = 0;
// ====== Geocoding ======
function getAddress(address, tId, door, size, isDelivered,infoWindowData, plan, activePlan) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
if(plan.length >0) {
stdIcon = iconBooked;
testId = 1;
}
else{
stdIcon = iconNotBooked;
testId=0;
};
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
icon: stdIcon,
title: address,
tId:tId,
plan: plan,
activePlan: activePlan,
testId:testId
});
google.maps.event.addListener(marker, 'click', function (e) {
if (!this.getMap()._infoWindow) {
this.getMap()._infoWindow = new google.maps.InfoWindow();
}
this.getMap()._infoWindow.close();
this.getMap()._infoWindow.setContent(infoWindowData);
this.getMap()._infoWindow.open(this.getMap(), this);
});
google.maps.event.addListener(marker, 'rightclick', function () {
$('#list').load('mapChanges.asp?do=add&tid='+tId + '&activeplan=' + activePlan + '&plan='+ plan + '&testid=' + marker.testId);
marker.setIcon(iconBooked);
if(marker.testId==0) {
marker.testId=1;
}
else{
marker.testId=0;
marker.setIcon(iconNotBooked);
}
});
}
else {
alert(address);
}
});
};
for (var a = 0; a < deliver_markers.length; a++) {
var tmptId = deliver_markers[a].tId;
var tmpCust = deliver_markers[a].customer;
var tmpDoor = deliver_markers[a].door;
var tmpAdr = deliver_markers[a].address + ' '+ deliver_markers[a].postal + ' ' + deliver_markers[a].city + ' Sverige';
var tmptpPlan = deliver_markers[a].tpPlan;
var tmpactivePlan = deliver_markers[a].activePlan;
var tmpSize = deliver_markers[a].size;
var tmpisDelivered = deliver_markers[a].isDelivered;
var tmpInfoWindowData = '<b>' +deliver_markers[a].customer + '</b> <br>' + deliver_markers[a].address + ' <br>' + deliver_markers[a].postal + ' ' + deliver_markers[a].city + ' <br><br>' + deliver_markers[a].door + ' <br>' + deliver_markers[a].size + ' flk/m';
getAddress(tmpAdr, tmptId, tmpDoor, tmpSize, tmpisDelivered, tmpInfoWindowData,tmptpPlan,tmpactivePlan);
};
google.maps.event.addDomListener(window, 'load', initialize);
</script>
Du är inne på rätt spår. Mitt förslag är att använda AJAX för att göra ett anrop till ett script som fångar upp adressen och behandlar den på något vis, exempelvis lägger den i en tabell i en databas.
<script type="text/javascript">
var geocoder;
geocoder = new google.maps.Geocoder();
function getAddress(address, tId, door, size, isDelivered,infoWindowData, plan, activePlan) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
icon: stdIcon,
title: address,
tId:tId,
plan: plan,
activePlan: activePlan,
testId:testId
});
});
}
else {
var req;
if (window.XMLHttpRequest) {
req=new XMLHttpRequest();
} else {
req=new ActiveXObject("Microsoft.XMLHTTP");
};
req.onreadystatechange=function() {
if (req.readyState==4 && req.status==200) {
//här hanterar du utdatan från "dittscript.php"
};
};
req.open("GET", "dittscript.php?adress=" + address, true);
req.send();
}
});
};
</script>
Jag får i tid och otid skit för att att jag använder mig av denna "förlegade" metod, men den har hittills fungerat felfritt för mig!
Tack för svaret...
Dock känns det rätt omständigt att behöva skicka det till en databas elller liknande..
Tanken var att användaren gör lite val och utefter det ritas adresser ut på kartan, jag hade önskat att på ett enkelt sätt få med de som inte gick att hitta i en liten inforutan på sida jämte kartan..
Ska inte behandla dessa adresser på något mer sätt..
Jag var lite inne på din idee fast istället för ajaxanropet gjorde jag en vanlig funktion som anropades där jag bara ville akkumulera varje adress som inte hittades i en variabel men det fungerade inte heller...
Förstår inte vad som händer i geocode delen eftersom man inte kan få ut information?
Detta funkar bra men jag vill samla upp de adresser som inte hamnar på kartan och kunna lista dom i efterhand för efterbearbetning
Jag måste misstolkat dig, då. Vad är det egentligen du vill göra med adresserna som geocodern inte hittar? Bara visa dem på sidan besökaren är på och inget mera?
Grejen är att som det är nu så används alert(address) och det poppar upp ett meddelande för varje adress som inte hittas, nu hade jag viljat spara alla adresser som inte hittas i en varibael för att sedan kunna skriva ut dom på sidan..
Istället för alert(address) prövade jag med
varFailedAddresses = varFailedAddresses + address
Men den variabel blir bara undefined när jag senare ska skriva ut den på sidan..
Jag måste misstolkat dig, då. Vad är det egentligen du vill göra med adresserna som geocodern inte hittar? Bara visa dem på sidan besökaren är på och inget mera?
Det är faktiskt så enkelt att jag faktiskt bara vill skriva ut adresserna på sidan för att visa för användaren. Grejen är att du var ett steg före mig :) Det kanske blir så att jag senare vill spara de felaktiga i databasen för rättning osv.. Till börja med ville jag bara göra det enkelt och presentera adresserna på sidan för användare, men redan där tog det stopp ...
Det ser inte ut att vara ett korrekt format på objekt, men det är inte så dina objekt ser ut (vad jag kan se i din JS kod).
skapa upp en array och pushar in varje gång du få ett felmeddelande och sen har du ju en array av adresser som inte blev funna?
om du bara vill bygga på som en sträng:
var FailedAddresses = "";
//.... annan kod....
FailedAddresses =+ address;
getAddress är din egna metod, men geocoder.geocode gör ett async anrop så du kan inte köra något direkt efter och förvänta dig att geocode har hunnit köras vad vill du EXAKT göra om det misslyckas? skriva ut det i en HTML element?
Yes, det är exakt det jag vill göra, skriva ut alla felaktiga adresser i ett HTML element:)
Om jag fattade det rätt så går koden vidare när gro anropad gjorts utan att det faktiskt returnerat kordinaterna?
Den körs och när den få svar från google med informationen då kör den vidare och triggar callback funktionen (function (results, status) {...}).
Jag skrev om lite i din kod och den _bör_ fungera. Vad den gör nu är kolla längden på arrayn deliver_markers och varje gång geocoder.geocode få ett svar (oavsett om den är lyckad eller inte så räknas räknaren deliverCount ner och när den är nere till 0.
Om du få ett fel så lägger vi addressen in i arrayn wrongAddress.
När deliverCount är 0 så kollar den om wrongAddress innehåller några felaktiga adresser, om den gör det så sätter vi ihop arrayn till en sträng och radbryter varje adress med en <br> och lägger in strängen i elementet med id #wrong.
var geocoder = new google.maps.Geocoder();
var map;
var deliver_markers = <%=varAddresses %>
var deliverCount = deliver_markers.length;
var wrongAddress = [];
var iconBooked = new google.maps.MarkerImage("http://www.coloradodot.info/content/programs/bikeped/saferoutes/prodkml/marker-google-green.png");
iconBooked.size = new google.maps.Size(35, 35);
iconBooked.anchor = new google.maps.Point(0, 35);
var iconNotBooked = new google.maps.MarkerImage("http://www.coloradodot.info/content/programs/bikeped/saferoutes/prodkml/marker-google-red-default.png");
iconNotBooked.size = new google.maps.Size(35, 35);
iconNotBooked.anchor = new google.maps.Point(0, 35);
// ====== Geocoding ======
var getAddress = function(address, tId, door, size, isDelivered,infoWindowData, plan, activePlan) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
if(plan.length > 0) {
stdIcon = iconBooked;
testId = 1;
} else {
stdIcon = iconNotBooked;
testId = 0;
}
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
icon: stdIcon,
title: address,
tId:tId,
plan: plan,
activePlan: activePlan,
testId:testId
});
google.maps.event.addListener(marker, 'click', function (e) {
if (!this.getMap()._infoWindow) {
this.getMap()._infoWindow = new google.maps.InfoWindow();
}
this.getMap()._infoWindow.close();
this.getMap()._infoWindow.setContent(infoWindowData);
this.getMap()._infoWindow.open(this.getMap(), this);
});
google.maps.event.addListener(marker, 'rightclick', function () {
$('#list').load('mapChanges.asp?do=add&tid=' + tId + '&activeplan=' + activePlan + '&plan=' + plan + '&testid=' + marker.testId);
marker.setIcon(iconBooked);
if(marker.testId == 0) {
marker.testId = 1;
} else{
marker.testId = 0;
marker.setIcon(iconNotBooked);
}
});
} else {
wrongAddress.push(address);
}
--deliverCount;
if(deliverCount <= 0 && wrongAddress.length) {
document.getElementById("wrong").innerHTML(wrongAddress.join("<br>"));
}
});
};
var initialize = function() {
var mapOptions = {
center: new google.maps.LatLng(52.041213, -1.325532),
streetViewControl: false,
zoom: 2,
mapTypeControl: false,
navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
for (var a = 0; a < deliver_markers.length; a++) {
var tmpAdr = deliver_markers[a].address + ' '+ deliver_markers[a].postal + ' ' + deliver_markers[a].city + ' Sverige';
var tmptId = deliver_markers[a].tId;
var tmpDoor = deliver_markers[a].door;
var tmpSize = deliver_markers[a].size;
var tmpisDelivered = deliver_markers[a].isDelivered;
var tmpInfoWindowData = '<b>' +deliver_markers[a].customer + '</b> <br>' + deliver_markers[a].address + ' <br>' + deliver_markers[a].postal + ' ' + deliver_markers[a].city + ' <br><br>' + deliver_markers[a].door + ' <br>' + deliver_markers[a].size + ' flk/m';
var tmptpPlan = deliver_markers[a].tpPlan;
var tmpactivePlan = deliver_markers[a].activePlan;
getAddress(tmpAdr, tmptId, tmpDoor, tmpSize, tmpisDelivered, tmpInfoWindowData, tmptpPlan, tmpactivePlan);
}
};
google.maps.event.addDomListener(window, 'load', initialize);
148 ms totalt · 3 externa anrop · v20260731065814-full.232057fb