Vérifier notre position GPS
Dans cet exemple vous pouvez voir comment extraire la position GPS actuelle de votre portable et vérifier que votre opérateur soit bien là où il devrait être. Pendant l’enregistrement se son rapport de travail nous verrons s’il se trouve effectivement à proximité du client.
Groupe Script
Fiche
Événement
Après Enregistrement
-- calculation of the distance between 2 points
function get_distance(A,B)
local latA = (A["lat"] * math.pi) / 180
local lonA = (A["lon"] * math.pi) / 180
local latB = (B["lat"] * math.pi) / 180
local lonB = (B["lon"] * math.pi) / 180
local R = 6372.795477598
local dist = (R * math.acos(math.sin(latA) *
math.sin(latB) + math.cos(latA) * math.cos(latB) * math.cos(lonA-lonB)))*1000
return dist
end
-- check if the past position is on the construction site
function in_dockyard(coordA, coordB, radius)
if (get_distance(coordA, coordB)<=radius) then
return true
end
return false
end
D’abord nous créons deux fonctions qui seront appelées par le script pour mesurer les distances entre le point GPS actuel et, dans ce cas, les points GPS des chantiers.
local dockyard = database.getsql("SELECT * FROM coord_dockyard WHERE latitude<>0 AND longitude<>0 AND latitude IS NOT NULL AND longitude IS NOT NULL")
local rows_dockyard = dockyard.getrows()
-- retrieve GPS coordinates
local coord = program.geolocation()
local curr_lat = 0
local curr_lon = 0
curr_lat = coord[1]
curr_lon = coord[2]
Nous lisons tous les chantiers présents dans la base de données en prenant seulement ceux avec une coordonnée GPS valide. Nios4 ne considère pas les valeurs de latitude et longitude si les deux sont à zéro.
Après nous interrogeons le téléphone pour récupérer la position.
--coordinates not found
if (curr_lat==0 and curr_lon==0) then
errorn.errorcode = "ERR-FL"
errorn.errormessage = "Unable to recover GPS coordinates, try again in a second moment"
dataview.setvalue(fieldname,"To check
(GPS not found)")
do return end
end
Au cas où vous ne pourriez pas récupérer le point GPS, vous pouvez donner erreur et quitter le script. Ceci est le système le plus radical.
La méthode meilleure il serait de donner un message et permettre quand même l’enregistrement, éventuellement en définissant une valeur d’un champ à données non confirméesC’est pour éviter qu’un opérateur ne puisse pas enregistrer les données si le GPS ne marche pas.
for i, c in pairs(rows_dockyard) do
-- site coordinates
local lat = c.getvalue("latitude")
local lon = c.getvalue("longitude")
local dockyard_coord = {lat = lat, lon = lon}
if in_dockyard(current_coord, dockyard_coord, c.getvalue("radius"))==true) then
dataview.setvalue("state","GPS
found")
set_dockyard_report(c.getvalue("gguidp"))
do return end
end
end
dataview.setvalue("state","To check (GPS not found)")
Nous commençons à tourner tous les chantiers et, avec les fonctions créées au début, nous vérifions si la distance entre notre position actuelle et celle des chantiers est inférieur au rayon donné. Dans le cas positif nous sommes effectivement sur le chantier, au contraire vous définirez le rôle du champ afin de signaler que les valeur n’ont pas été confirmées par la position GPS.