Bug watchposition
Hij laad de functie elke keer weer, zonder dat het apparaat veranderd van locatie. Zelfs via mijn laptop.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
}
);;
}
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?
Met welke browser probeer je dit uit?
Ik gebruik chrome.
Ik lees een vergelijkbaar probleem hier: http://stackoverflow.com/questions/6183463/when-using-setinterval-if-i-switch-tabs-in-chrome-and-go-back-the-slider-goes
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:
Code (php)
1
2
3
4
5
2
3
4
5
var options = {enableHighAccuracy: false,timeout: 5000,maximumAge: 0,desiredAccuracy: 0, frequency: 1 };
function showlocation() {
navigator.geolocation.watchPosition(callback,error,options);
}
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.
Gewijzigd op 14/03/2017 16:22:59 door Daniel van Seggelen
Chrome zou dat niet meer zonder willen accepteren. (geolocation is gevoelige info)
--------------
hij laadt
het apparaat verandert
etc
Ja het moet onder SSL idd, maar ik test het via localhost, dat word ook toegelaten door chrome, maar het probleem kan ik tot nu toe nog niet oplossen.
Gewijzigd op 14/03/2017 17:03:19 door Ben van Velzen
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.
Gewijzigd op 14/03/2017 17:08:18 door Daniel van Seggelen
Dan zet je die eisen in de callback functie, het gebruik van setInterval is nergens voor nodig en werkt averechts.
UPDATE,
ook al gebruik ik die setinterval niet,dus
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
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);
}
);
}
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.
Gewijzigd op 14/03/2017 17:23:41 door Daniel van Seggelen
Waarom controleer je dan niet in de callback functie of de positie veranderd is?
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.
Hoe lastig is dat?
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
}
}
);
}
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);
}
}
);
}
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);
}
);
}
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 :-)
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
}
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.
ok duidelijk :)