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Événement
FicheAprè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.