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.