webForumDet fria alternativet

Några sena kvällar med google Geocoding

10 svar · 1 592 visningar · startad av evilaid

evilaidMedlem sedan apr. 2009433 inlägg
#1

Hej

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>
prplxrMedlem sedan juni 2012582 inlägg
#2

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!

evilaidMedlem sedan apr. 2009433 inlägg
#3

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?

voigtann1Medlem sedan juni 20019 519 inlägg
#4

vad innehåller variablen deliver_markers ? Om den inte hittar det så kan du väl bara säga hitta meddelandet och presentera det?

prplxrMedlem sedan juni 2012582 inlägg
#5

evilaid skrev:

Tack för svaret...
Dock känns det rätt omständigt att behöva skicka det till en databas elller liknande..

evilaid skrev:

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?

evilaidMedlem sedan apr. 2009433 inlägg
#6

voigtann1 skrev:

vad innehåller variablen deliver_markers ? Om den inte hittar det så kan du väl bara säga hitta meddelandet och presentera det?

Jag hämtar ordrar från en databas så det är med asp jag fyller på den stränger så den har följande format.

{12,'storgatan 12', '600 21 Norrköpping'},{12,'gata 11', '590 53 Linköping'}

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..

prplxr skrev:

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 ...

voigtann1Medlem sedan juni 20019 519 inlägg
#7

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;
evilaidMedlem sedan apr. 2009433 inlägg
#8

Konstiga är ju att allt funkar klockrent med variabler osv förutom just att plocka med information ut ifrån gecode funktionen..

Även om jag lägger alla adresser som är felaktiga i en array så finns den inte utanför funktionen..
Jag får ju inte med information ut från denna

function getAddress(address, tId, door, size, isDelivered,infoWindowData, plan, activePlan)

Hittade ett inlägg här som antagligen svarar på det men jag förstår f*n inte hur dom menar och varför det inte går?

You can't return the value from the function, the value doesn't exist yet when the function returns.

The geocode method makes an asynchonous call and uses a callback to handle the result, so you have to do the same in the codeLatLng function:

http://stackoverflow.com/questions/2993563/how-do-i-return-a-variable-from-google-maps-javascript-geocoder-callback

voigtann1Medlem sedan juni 20019 519 inlägg
#9

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?

evilaidMedlem sedan apr. 2009433 inlägg
#10

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?

voigtann1Medlem sedan juni 20019 519 inlägg
#11

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);
142 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)