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?
Je moet het op het frontend controleren, dan filter je automatisch alles weg wat je niet nodig hebt.
Hoe lastig is dat?
Alles is makkelijk als je weet hoe.Ik kan hier geen goede oplossing voor vinden zonder een overhead.
Heb je advies?
Hoezo niet? Je slaat in je callback functie op wat de laatst bekende positie was. Wanneer deze gelijk is aan de huidige positie return je uit de callback zonder een request te doen. Hetzelfde geldt voor afstand, gewoon vergelijken met de laatst bekende positie. Dit hoeft niet in PHP (al is het handig om het daar ook te doen) en kan gewoon in je callback functie.
Ik ben geeen query expert, mijn vraag is dus, hoe doe ik dit in jquery/js ? Alvast bedankt
zonder de code verder te controleren:


var options = {enableHighAccuracy: false,timeout: 5000,maximumAge: 0,desiredAccuracy: 0, frequency: 1 };

watchID = navigator.geolocation.watchPosition(callback, error, options);
var prevlat = 0;
var prevlng = 0;

      function callback(position) {
        var lat = position.coords.latitude;
        var lng = position.coords.longitude;
        if(prevlat != lat || prevlng != lng) {
          prevlat = lat;
          prevlng = lng;
          $.post('<?=HTML_ROOT?>inc/addcurrentloc.php', 'lat=' + lat + '&lng=' + lng, function(response)
          {
            console.log(response);
          }
        }
       );
      } 
Basisopzetje, het maakt niet uit "hoe goed" je bent, je moet de logica gewoon doorgronden.


var options = {enableHighAccuracy: false,timeout: 5000,maximumAge: 0,desiredAccuracy: 0, frequency: 1 };
var oldlat = 0;
var oldlng = 0;

watchID = navigator.geolocation.watchPosition(callback, error, options);

function callback(position) {
  var lat = position.coords.latitude;
  var lng = position.coords.longitude;
  if (lat == oldlat && lng == oldlng) {
    return;
  }
  oldlat = lat;
  oldlng = lng;
  $.post('<?=HTML_ROOT?>inc/addcurrentloc.php', 'lat=' + lat + '&lng=' + lng, function(response) 
    {
     console.log(response);
    }
  );
}
vrijwel gelijk :-)
Dit is niet wat ik bedoel.Op deze manier kijk je gewoon of de oude coordinates exact hetzeflde zijn en de nieuwe.

ik wil erachter komen, hoe ik de afstand van de oude en nieuwe coordinaten in meters kan berekenen.
Als de nieuwe locatie 1 meter is, dan wil ik die call naar addcurrentloc.php niet uitvoeren. Zoals ik aangaf is de watchposition niet foutloos. Hij blijft aangeven dat mijn locatie een aantal centimeters wellciht veranderd, terwijl hij niets veranderd. Als de afstand min 5 meter is, dan wil ik die call uitvoeren.

ik denk dat deze wel juist is



Alleen als de site verniewd word en oldlat,oldlng dan leeggehaald? hoe lang blijf hij dat onthouden? Wellicht beter in php sessies opslaan...
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; // Distance in km
  return d / 1000;
}


Het ging om een basisopzet, zodat je de logica zou snappen. Het ging er niet om dat het de perfecte oplossing zou zijn, dat wordt ook nergens beweerd.

Reageren