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.