Ik was aan het experimenteren met de JS GoogleMaps API, en ik heb een script kunnen maken die elke 5 seconden uit een JSON-string de lat/lon coördinaten van een voertuig ophaalt, en steeds de bijbehorende marker van plaats ververst, zodat je het voertuig op de kaart ziet bewegen.

Echter loop ik even tegen één probleem aan, en dat is de beginwaarde, die ik voor het gemak nu even op 52.1238433333,5.18094166667 heb gezet.

Is het ook mogelijk om meteen de waarde uit de JSON-string waarde te gebruiken, in plaats van eerst 5000 ms. deze vaste lat/lon coördinaten te zien? Kan dit in JavaScript, of zou ik deze alleen maar via PHP eerst op moeten halen en als var moeten declareren?

Graag jullie advies!



<script>
      function init_map() {
        var myLatLng = new google.maps.LatLng(52.1238433333,5.18094166667);
        var mapOptions = {
          zoom: 8,
          center: myLatLng,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
	
	// Marker plaatsen in het midden, daarna wordt hij verplaatst naar juiste plek.
	map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
	marker = new google.maps.Marker({
	    position: myLatLng,
	    map: map,
	    draggable: false
	});
	
      } 
      google.maps.event.addDomListener(window, 'load', init_map);
	    
      function getCoords() {
	$(document).ready(function(){
	    $.ajax({
		url: "api.php",
		type: "GET",
		data: {
		    action : "vehiclenumber",
		    number : '1234'
		},
		dataType: "text",
		success: function(returnedData) {
		    var jsondata = jQuery.parseJSON(returnedData);
		      //console.log(returnedData);
		      var coords = jsondata.Latitude+','+jsondata.Longitude;
		      console.log(coords);
		      //console.log('Lat: '+jsondata.Latitude);
		      var coordsArray = coords.split(",");
		      moveMarkerMap(coordsArray[0], coordsArray[1]);
		}
	     });
	    }); 
	}
	
	function moveMarkerMap(lat,lon) {
	    var newLatLang = new google.maps.LatLng(lat,lon);
	    map.panTo(newLatLang);
	    marker.setPosition(newLatLang);
	}      
	
      setInterval(getCoords, 5000);
    </script>
Je (document).ready staat binnen een andere functie. Dat zou ik er uit halen. Dan direct getcoords aanroepen vanuit (document).ready de eerste keer. Na ontvangst van een ajax response een eenmalige timer zetten die weer dezelfde functie aanroept.
Dus eerst (document).ready doen.
Vervolgens de functie getCoords() daarna aanroepen.

Maar dan snap ik het nut van die timer niet zo? Want hij wordt toch al elke 5 seconden aangeroepen?
Aar dit lijkt mij echt gaaf. Ik zal je topic volgen!
Leuk dat je enthousiast bent Johan, ik kan op dit moment niet uit de doeken doen waar het script zijn data ophaalt (is ook niet relevant voor mijn vraagstuk). Maar het getoonde script zou bijv. interessant kunnen zijn voor rijdende voertuigen zoals koeriers, treinen, bussen etc...

Verder hoor ik graag Frank's reactie.
Dit bedoel ik:
<?php
function init_map() {
var myLatLng = new google.maps.LatLng(52.1238433333,5.18094166667);
var mapOptions = {
zoom: 8,
center: myLatLng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};

// Marker plaatsen in het midden, daarna wordt hij verplaatst naar juiste plek.
map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
marker = new google.maps.Marker({
position: myLatLng,
map: map,
draggable: false
});

}

google.maps.event.addDomListener(window, 'load', init_map);

function getCoords() {
$.ajax({
url: "api.php",
type: "GET",
data: {
action : "vehiclenumber",
number : '1234'
},
dataType: "text",
success: function(returnedData) {
var jsondata = jQuery.parseJSON(returnedData);
//console.log(returnedData);
var coords = jsondata.Latitude+','+jsondata.Longitude;
console.log(coords);
//console.log('Lat: '+jsondata.Latitude);
var coordsArray = coords.split(",");
moveMarkerMap(coordsArray[0], coordsArray[1]);
},
done: function( data ) {
setTimeout(getCoords, 5000);
}
});
}

function moveMarkerMap(lat,lon) {
var newLatLang = new google.maps.LatLng(lat,lon);
map.panTo(newLatLang);
marker.setPosition(newLatLang);
}

$(document).ready(function(){
getCoords();
});
?>
Ik begin het te begrijpen, maar waarom voldoet die setInterval dan niet die ik eerst had? Omdat die standaard pas laadt na die 5000 ms?
Ik wil niet zeggen dat die niet voldoet maar stel je hebt een slechte verbinding maar je blijft wel om de vijf seconden een request doen. na 15 seconden krijg je er dan ineens drie heel dicht op elkaar terug omdat je ineens weer bereik hebt. Dit kan je browser of server als het heel erg wordt ook niet zo leuk gaan vinden.

In mijn voorbeeld wacht je netjes tot een request/response afgehandeld is en dan ga je een timer zetten op vijf seconden. Doe er mee wat je denkt dat goed is :-)
Dat is inderdaad een betere optie. Ik ga het script straks even ombouwen.
Thanks voor je advies!
- Aar - op 18/05/2015 17:14:20

Leuk dat je enthousiast bent Johan, ik kan op dit moment niet uit de doeken doen waar het script zijn data ophaalt (is ook niet relevant voor mijn vraagstuk). Maar het getoonde script zou bijv. interessant kunnen zijn voor rijdende voertuigen zoals koeriers, treinen, bussen etc...

Verder hoor ik graag Frank's reactie.


Ik hoop dat je zal lukken tot dat in je smaak valt. Ik zal je tester zijn.
Bedankt voor je aanbod, maar voorlopig zal/kan ik het nog niet publiekelijk plaatsen en is het testen ook niet zo geheel complex.

Reageren