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 Script
Ficha
Evento
Post 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.