Bug watchposition
Die zou zomaar iets van + of - 5 meter kunnen zijn.
Zeker als je het over verplaatsingen over korte afstanden hebt, is onduidelijk of je je van -5 naar +25 meter of van +5 naar +15 meter hebt verplaatst.
dus 30 of 10 meter verplaatsing.
In dat licht zou ik de afstandsberekening die rekening houdt met de kromming van de aarde een overkill vinden.
Dat geldt minder als je het over verplaatsing over de snelweg hebt (over langere tijd) of mogelijk zelfs per vliegtuig, maar als je kijkt naar iemand die rond loopt, is het te precies.
Wat denk je dat het beste is om geen overkill te genereren? geen afstandsberekening? De watchposition zelf geen geen ingebouwde functionaliteit om hetzelfde te bereiken.
Als je meerdere clients wilt ondersteunen, zou ik daarom in twee opzichten aan 'throttling' doen om te voorkomen dat de boel op hol slaat:
• Gebruik een timer die het aantal requests beperkt tot 1 per x seconde.
• Sla de geolocatie op afgerond op y meter en voer alleen een request uit als de nieuwe, afgeronde locatie daarvan afwijkt.
Bijvoorbeeld: voer pas na 5 seconde een request uit bij een afwijking van meer dan 15 meter. Hamvraag daarbij is uiteindelijk natuurlijk hoe nauwkeurig de locatie moet zijn voor je toepassing.
Je zou dan proefondervindelijk kunnen kijken hoeveel cijfers genoeg is voor jou.
de absolute afstand zou ik niet steeds berekenen
1) In het begin gaf ik aan dat de timer een setinterval was en daarbij meerdere malen de watchposition werd aangeroepen.
En ik kan er maar niet achter komen hoe je een timer aangeeft in de watchposition dat om de 5 seconden bekijkt of een positie is veranderd of niet.
2) 10 - 15 meter is prima, hoeft neit zodanig op de meter nauwkeurig te zijn.
Toevoeging op 15/03/2017 14:28:39:
Uiteindelijk heb ik er dit van gemaakt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
var lat, lng, accuracy,gm;
var oldlat = 0;
var oldlng = 0;
function setGeolocation() {
var geolocation = window.navigator.geolocation.watchPosition(
function ( position ) {
lat = position.coords.latitude.toFixed(2);
lng = position.coords.longitude.toFixed(2);
if (lat == oldlat && lng == oldlng) {// niks doen als de coordinaten gelijk zijn op 2 decimalen}
else {
gm = getmeters(oldlat,oldlng,lat,lng);
accuracy = position.coords.accuracy;
document.getElementById( 'result' ).innerHTML +=
'lat: ' + lat + ', '
+ 'lng: ' + lng + ', '
+ 'accuracy: ' + accuracy + ' meters' + gm + '<br />';
if ( (gm < 10) && (oldlat!= 0 && oldlng != 0) ) { // wanneer de afstand tussen 2 coordinates kleiner is dan 10meter.. niks doen
return;
}
oldlat = lat;
oldlng = lng;
$.post('http://localhost/test/inc/addcurrentloc.php', 'lat=' + lat + '&lng=' + lng, function(response)
{
console.log(response);
});
}
},
function () { /*error*/ }, {
maximumAge: 250,
enableHighAccuracy: true
}
);
window.setTimeout( function () {
window.navigator.geolocation.clearWatch( geolocation )
},
5000 //stop na 5 secondde
);
};
setGeolocation();
window.setInterval( function () {
setGeolocation();
},
15000 //controleert elke 15 sec
);
function getmeters(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 deg2rad(deg) {
return deg * (Math.PI/180)
}
var oldlat = 0;
var oldlng = 0;
function setGeolocation() {
var geolocation = window.navigator.geolocation.watchPosition(
function ( position ) {
lat = position.coords.latitude.toFixed(2);
lng = position.coords.longitude.toFixed(2);
if (lat == oldlat && lng == oldlng) {// niks doen als de coordinaten gelijk zijn op 2 decimalen}
else {
gm = getmeters(oldlat,oldlng,lat,lng);
accuracy = position.coords.accuracy;
document.getElementById( 'result' ).innerHTML +=
'lat: ' + lat + ', '
+ 'lng: ' + lng + ', '
+ 'accuracy: ' + accuracy + ' meters' + gm + '<br />';
if ( (gm < 10) && (oldlat!= 0 && oldlng != 0) ) { // wanneer de afstand tussen 2 coordinates kleiner is dan 10meter.. niks doen
return;
}
oldlat = lat;
oldlng = lng;
$.post('http://localhost/test/inc/addcurrentloc.php', 'lat=' + lat + '&lng=' + lng, function(response)
{
console.log(response);
});
}
},
function () { /*error*/ }, {
maximumAge: 250,
enableHighAccuracy: true
}
);
window.setTimeout( function () {
window.navigator.geolocation.clearWatch( geolocation )
},
5000 //stop na 5 secondde
);
};
setGeolocation();
window.setInterval( function () {
setGeolocation();
},
15000 //controleert elke 15 sec
);
function getmeters(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 deg2rad(deg) {
return deg * (Math.PI/180)
}
Hij kijkt dus om de 15 sec, en voert een clearwatch uit, dus ik heb een timer om de 15 sec. Denk dat ik nu niet een serveroverload zal creeeren met bijv 1000 gebruikers.
Zie ik iets over het hoofd om de serverload nog meer te minimaliseren?