lunes, 11 de noviembre de 2013

Convertir latlong GPRMC a grados decimales (WGS84).

Continuando con el post anterior resulta muy útil saber la forma de convertir las coordenadas GPRMC a un formato conocido como el que utilizan mapas como Here de Nokia o Google Maps. Retomando la trama GPRMC del post anterior ($GPRMC,055956.00,A,2029.49050,N,10316.32055,W,000.00,000.0,111113,08.0,E,D*27), tenemos la siguiente información para latitud: 2029.49050,N y para longitud tenemos: 10316.32055,W.

El proceso para obtener la latitud en grados decimales es el siguiente:

1.- Se divide la latitud entre 100, quedando como resultado 20.294905.
2.- Se obtiene la parte entera del resultado del punto anterior, en este caso sería 20.
3.- A la latitud original (2029.49050) se le resta la parte entera que se obtuvo en el punto anterior multiplicada por 100, dando como resultado 29.4905.
4.- El resultado del punto anterior se divide entre 60, quedando 0.4915083333333333.
5.- Se suman los resultados obtenidos del punto 2 (20) y del punto 4 (0.4915083333333333), resultando 20.49150833333333.
6.- Si el hemisferio es sur (S), el resultado del punto anterior se debe multiplicar por -1 para obtener la latitud, si el hemisferio es norte (N), la latitud es el valor obtenido en el punto 5.

El proceso para obtener la longitud en grados decimales es el siguiente:

1.- Se divide la longitud entre 100, quedando como resultado 103.1632055.
2.- Se obtiene la parte entera del resultado del punto anterior, en este caso sería 103.
3.- A la longitud original (10316.32055) se le resta la parte entera que se obtuvo en el punto anterior multiplicada por 100, dando como resultado 16.32055.
4.- El resultado del punto anterior se divide entre 60, quedando 0.2720091666666667.
5.- Se suman los resultados obtenidos del punto 2 (103) y del punto 4 (0.2720091666666667), resultando 103.2720091666667.
6.- Si el hemisferio es oeste (W), el resultado del punto anterior se debe multiplicar por -1 para obtener la longitud (-103.2720091666667), si el hemisferio es este(E), la longitud es el valor obtenido en el punto 5.

De acuerdo a lo anterior tenemos que latlong en grados decimales WGS84 es 20.49150833333333,-103.2720091666667.

Parseo de una trama GPRMC.

Muchos dispositivos GPS transmiten tramas en el formato GPRMC, que es un formato creado por NMEA (National Marine electronics Association). La trama GPRMC contiene información acerca de la ubicación del dispositivo GPS y ciertas variables calculadas por los satélites GPS. Aunque puede variar un poco, la siguiente es una muestra de una trama GPRMC:

$GPRMC,055956.00,A,2029.49050,N,10316.32055,W,000.00,000.0,111113,08.0,E,D*27

Como se aprecia, la trama GPRMC separa la información por medio de comas, por lo que cada dato que se encuentra entre comas representa una variable calculada por los satélites GPS. A continuación desglosaré la trama anterior y diré el significado de cada parte de la trama:

$GPRMC       - Esta variable indica el formato de la trama, en este caso es GPRMC.
055956.00      - Hora UTC en la que se obtuvo la posición del GPS (hhmmss).
A                    - Estatus de la trama A significa que es una trama válida, 9 que es una trama de caché y V significa que es una trama inválida.
2029.49050    - Latitud.
N                    - Hemisferio (N: Norte, S: Sur).
10316.32055  - Longitud.
W                   - Hemisferio (E: Este, W: Oeste).
000.00            - Velocidad en nudos.
000.0              - Rumbo en grados (0° a 360°).
111113           - Fecha UTC en la que se obtuvo la posición del GPS (DDMMAA).
08.0,E             - Variación magnética.
D*27               - Checksum.

viernes, 8 de febrero de 2013

Como obtener el resultado de una consulta en MySQL como Cadena.


Hace un par de semanas me enfrenté con un pequeño problema que resolví de buena manera. Dicho problema fue el siguiente: Necesitaba obtener un reporte de todos los usuarios de un sistema, además de ello necesitaba obtener las fechas de inicio de sesión de cada usuario de los últimos 30 días. En pocas palabras, requería algo como lo siguiente:

-----------------------------------------------------------------
| Nombre de Usuario    | Fechas de Inicio de sesión                    |
-----------------------------------------------------------------
| correo1@mail.com     | 2012-15-24,2012-15-25,2012-15-26 |
| correo2@mail.com     | 2012-15-20,2012-15-25,2012-15-27 |
| correo3@mail.com     | 2012-15-24,2012-15-25,2012-15-26 |
| correo4@mail.com     | 2012-15-24,2012-15-25                     |
-----------------------------------------------------------------

Esto es un problema sencillo de resolver, bastaría con ejecutar 2 consultas y algo de programación. Pero es más rápido y eficiente ejecutar una sola consulta. Esto se podría hacer gracias a la función de MySQL GROUP_CONCAT, la cual permite obtener los resultados de una consulta como una cadena.

Para el caso de este problema supongamos que se tienen 2 tablas, una llamada Usuario con idUsuario(Pk) y nombreUsuario y la otra llamada AccessLog con idUsuario(Fk) y FechaInicio (Se que esta tabla debería llevar una llave primaria , pero para el ejemplo la omití). La tabla AccessLog almacena las fechas de inicio de sesión de los usuarios de los últimos 30 días.

La consulta para obtener la talba de arriba sería la siguiente:

SELECT Usuario.nombreUsuario AS Usuario,
               GROUP_CONCAT(AccessLog.FechaInicio) AS Fechas
FROM   Usuario, AccessLog
WHERE  Usuario.idUsuario = AccessLog.idUsuario

Con esta consulta nos ahorramos hacer una consulta que traiga a todos los usuarios y otra que además por cada usuario traiga las fechas de inicio de sesión, aunado a los ciclos necesarios para construir la tabla de arriba.