Comprobar nuestra ubicación GPS

En este ejemplo, vemos cómo extraer la posición GPS actual del teléfono y verificar que nuestro operador esté realmente donde debería estar. En la práctica, mientras guardamos su informe de trabajo, veremos si realmente está cerca del cliente.

Grupo ScriptEvento
FichaPost Guardado
  -- 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

Primero creamos dos funciones que serán llamadas por el script para medir las distancias entre el punto GPS actual y, en este caso, los puntos GPS de los sitios de construcción (dockyards).

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]

Leemos todos los sitios en la base de datos tomando solo aquellos con una coordenada GPS válida. Nios4 no considera los valores de latitud y longitud si ambos son cero.

Luego interrogamos al teléfono para recuperar la posición.

--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

Si el punto GPS no se puede recuperar, puede dar un error y salir del script. Este es el sistema más drástico.

El mejor método sería dar un mensaje y aún permitir guardar, quizás estableciendo un valor de campo en datos no confirmados. Esto es para evitar que un operador pueda guardar datos si el GPS no funciona.

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)")

Empezamos a girar todos los sitios y, a través de las funciones creadas al principio, verificamos si la distancia entre nuestra posición actual y la de los sitios es menor que el radio dado. Si es así, en realidad estamos en el sitio de construcción, de lo contrario, la función del campo se establecerá para indicar que los valores no han sido confirmados por la posición del GPS.