Er is een bug want watchposition werkt niet zoals staat beschreven.
Hij laad de functie elke keer weer, zonder dat het apparaat veranderd van locatie. Zelfs via mijn laptop.
window.setInterval(function() {
showlocation();
}
, 2000); // 2000==2 seconds
function showlocation() {
navigator.geolocation.watchPosition(callback);
}
function callback(position) {
var lat = position.coords.latitude;
var lng = position.coords.longitude;
$.post('<?=HTML_ROOT?>inc/addcurrentloc.php', 'lat=' + lat + '&lng=' + lng, function(response) {
console.log(response);
}
);;
}
om de 2 seconde word de callback geladen. Hij hoort zo te werken dat hij hem alleen laad als de positie wijzigd.
Weet iemand waarom?
Ik heb alle oplossingen daar geprobeert, maar er veranderd niks.
Als ik van tab verwissel en weer terug ga dan laad hij het meerdere keren hoe langer ik dus niet op de tab ben gefocussed, hoe meer hij dat inhaalt.
UPDATE
Firefox doet nog veel erger. om de 1 MS worden er ruim 10 calls aangeroepen. ONgelofelijk veel.
Is hier geen normale oplossing voor?
Ik denk dat mensen beter "getCurrentPosition" kunnen gebruiken om de x aantal sseconden, want anders word je server overloaded, erg slecht die watch position dus.
Als ik wat options erbij die:
var options = {enableHighAccuracy: false,timeout: 5000,maximumAge: 0,desiredAccuracy: 0, frequency: 1 };
function showlocation() {
navigator.geolocation.watchPosition(callback,error,options);
}
Ik krijg dan steeds ERROR(3): Timeout expired
als ik van tab 1 seconde wissel en terug kom, dan zijn er 100den calls gedaan.
Als je iedere keer een nieuwe watchposition maakt met setInterval, waarom verwacht je dan dat hij echt kan watchen? Je stelt 1 keer een callback in, niet elke 2 seconden. Zo te zien ligt de bug niet in watchposition, maar in het feit dat je het niet als watch gebruikt maar om direct de locatie op te vragen. Dat geeft uiteraard initieel altijd een resultaat, en niet alleen wanneer de positie verandert.
De reden is omdat wanneer ik deze wijze niet gebruik, zelfs met mijn laptop, dan blijft hij de watchposition functie aanroepen, terwijl ik niet van locatie verander.
Ik zoek dus een manier dat ik watchposition kan instellen om de positie om de x aantal sec te bekijken en de callback functie uitvoert. Ik wil geen serveroverload als 1000 gebruikers deze functie gebruiken op deze manier
Deze functie zet de coordinaten in de database alleen als het verschil met de vorige locatie groter is dan 10 meter.
Maar als ik die eisen in de callback functie wil zetten, hoe doe ik dat dan anders als setinterval of settimeout ?
UPDATE,
ook al gebruik ik die setinterval niet,dus
var options = {enableHighAccuracy: false,timeout: 5000,maximumAge: 0,desiredAccuracy: 0, frequency: 1 };
watchID = navigator.geolocation.watchPosition(callback, error, options);
function callback(position) {
var lat = position.coords.latitude;
var lng = position.coords.longitude;
$.post('<?=HTML_ROOT?>inc/addcurrentloc.php', 'lat=' + lat + '&lng=' + lng, function(response)
{
console.log(response);
}
);
}
het blijft net zo buggy, elke keer als ik van tab verwissel en weer terug ga, dan word de call 5 keer aangeroepen binnen 1 seconde.
watchposition ziet dus niet goed of een apparaat beweegt of niet.
Ik doe dat nu in de backend met php, maar hij blijft de callback aanroepen. Ik zoek een manier om de callback niet zo vaak aan te roepen, dus om de 10 seconde bijv. Of als er een manier in om de controleren in de clintside wat de laatste positie is, wat voor minder overhead zorgt, dat ga ik daarvoor.
Hij bekijkt nu dus al in addcurrentloc.php of de positie veranderd is, dat zit in de callback functie, maar ik probeer de overhead te minimaliseren.