Vamos a aprender a guardar un punto en el mapa para poder recuperarlo más tarde.
Un waypoint es un conjunto de coordenadas
que identifican un punto en un mapa o espacio físico. Para localizar un
punto sobre la superficie terrestre se usan los valores de latitud y
longitud. Para la navegación aérea y otras aplicaciones también se usa
el valor altitud.
El programa que vamos a hacer ahora nos permite guardar
waypoints (coordenadas) de nuestra posición actual en una base de datos
con el nombre que queramos. Podemos usar esta aplicación si vamos
andando por la calle y encontramos algo interesante que queremos guardar
para poder volver más tarde usando una ruta hasta ese punto.
1 Desde el Diseñador crea un nuevo proyecto y llámalo "waypoints"
2 Desactiva la propiedad Scrollable del componente Screen.
3 Coge dos etiquetas y pon una debajo de la otra.
4 A la primera llámala etiqueta_coordenadas y cambia el texto por: "sin coordenadas"
5 A la segunda llámala etiqueta_dirección y cambia el texto por "sin dirección"
El componente LocationSensor que usaremos más adelante nos
devolverá las coordenadas de nuestra posición actual que usaremos para
actualizar estar etiquetas. Mientras este componente no nos de esta
información mostraremos el mensaje "sin coordenadas"-
6 Coge un componente HorizontalArrangement y pon dentro, en este orden, los siguientes componentes:
7Un botón. Llámalo boton_posición_actual y cambia el texto por "Posición actual"
8 Otro botón. Llámalo boton_guardar. Cambia el texto por "Guardar".
9 Un componente ListPicker. Llámalo boton_mis_waypoints. Cambia el texto por "Mis Waypoints"
10 Cambia el tamaño de los fonts a 10 y la propiedad Height a 30 de todos estos componentes para que quepa el mapa en la pantalla.
11 Añade otro componente HorizontalArragement debajo del anterior y cambia su nombre a menu_guardar.
12 Mete dentro de este nuevo componente HorizontalArragement un textbox y un botón a la derecha.
13 Al textbox llámalo textbox_nombre_waypoint y en la propiedad Hint escribe "nombre del waypoint"
14 Al botón llámalo boton_guardar_waypoint y en el texto escribe: "Guardar"
15 Cambia el tamaño del font y la propiedad Height de ambos componentes como antes.
16 Y cambia la propiedad Visible del componente menu_guardar a Hidden (oculto)
17 Queremos que este menú sólo aparezca cuando el usuario ha pulsado el botón de guardar. Así ahorramos espacio en la pantalla.
18 Añade ahora un componente
WebViewer. Cambia sus propiedades Width y Height a "Fill parent". Si
quieres puedes hacer este componente más grande para que el mapa sea más
grande también.
19 Añade un componente LocationSensor.
20 Añade un componente TinyDB.
21 Finalmente añade un
componente ActivityStarter con las siguientes propiedades (puedes copiar
y pegar el texto desde esta misma página):
22 Action - android.intent.action.VIEW
23 ActivityClass - com.google.android.maps.MapsActivity
24 ActivityPackage - com.google.android.apps.maps
El diseño final tiene que quedar así:
El funcionamiento del programa será el siguiente:
Al pulsar el botón "Posición actual" nuestro programa nos
dará nuestras coordenadas actuales que podremos localizar en el mapa de
debajo o en la aplicación Google Maps pulsando el botón "Google".
Si pulsamos el botón "Guardar" aparecerá un campo de texto
para que las coordenadas actuales se guarden en la base de datos con el
nombre que queramos.
Al pulsar el botón "Mis Waypoints" aparecerá una lista con
las localizaciones que hayamos guardado con anterioridad. Al
seleccionar una de ellas se actualizará el mapa o pulsando el botón
"Google" se abrirá la aplicación de mapas de Google con la localización
guardada. Con las coordenadas guardadas podemos iniciar una ruta hasta
esa posición desde nuestra posición actual.
25 Vamos al Editor de bloques
26 Vamos a empezar definiendo todas las variables que vamos a usar en nuestro programa.
27 codigo_google - "http://www.google.com/maps/?q=" Esta variable la utilizamos para comunicarnos con Google Maps.
28 nivel_zoom - "&z=18". Esta variable nos permite cambiar el nivel del zoom de los mapas de Google.
29 lista_coordenadas - make a list. Esta es la lista donde vamos a guardar las coordenadas de cada localización (waypoint) que guardemos.
30 lista_waypoints - make a list. En esta lista guardaremos los nombres de los waypoints.
31 coordenadas_actuales - "". Variable de texto vacía donde guardaremos las coordenadas actuales.
32 localizado -
false. Esta variable booleana nos dirá si tenemos ya las coordenadas de
nuestra posición actual o todavía no. Recuerda que el sensor de
localización de posición (LocationSensor / GPS) tarda un tiempo en
determinar nuestra posición actual. Esta variable nos dirá si tenemos ya
la información.
33 Coge el evento Screen.Initialize.
Recuerda que el primer paso es siempre recuperar la
información que tenemos en la base de datos tal y como hemos aprendido
antes. De esta forma recuperamos los waypoints que tuviésemos guardados.
Nuestra base de datos contendrá dos listas.
lista_waypoints con el tag "waypoints" y lista_coordenadas con el tag
"coordenadas". La lista_waypoints contendrá los nombres de los waypoints
y la lista_coordenadas las coordenadas. Tal y como hemos aprendido
antes usaremos el índice para relacionar el nombre del waypoint con las
coordenadas correspondientes a ese waypoint.
Como siempre también nos vamos a asegurar de que existen
datos antes de asignarlos a la variable correspondiente de lo contrario
se produciría un error en nuestro programa.
34 Coge un bloque de control if then-do.
35 En el espacio test coloca
un bloque lógico not, un bloque de texto "is text empty?" y un
procedimiento "call TinyDB.GetValue" con el tag "waypoints" así:
Estamos pidiendo a la base de datos algún dato con el tag
"waypoints". Si nos devuelve algún dato (no está vacía la respuesta)
entonces podemos continuar porque significa que tenemos algún waypoint
guardado.
En el espacio then-do recuperamos los datos de las dos listas y se las asignamos a las variables que tenemos preparadas.
36 Coge un bloque "set global lista_waypoints" y pégale un procedimiento "call TinyDB.GetValue" con el tag "waypoints".
De esta forma cogemos de la base de datos el valor que
corresponde con el tag "waypoints" y como se supone que es una lista, se
la asignamos a la variable lista_waypoints.
Ahora hacemos lo mismo con la lista de coordenadas.
37 Coge un bloque "set global lista_coordenadas" y pégale un procedimiento "call TinyDB.GetValue" con el tag "coordenadas".
Ya tenemos las dos listas con los datos que hemos obtenido
de la base de datos. Si no hubiésemos encontrado nada, las listas
estarían vacías.
Vamos con el botón para mostrar en el mapa nuestra posición actual.
38 Coge el evento boton_posicion_actual.Click
Primero comprobamos que tenemos las coordenadas de nuestra posición actual.
39 Coge un bloque de control if then.
En el espacio if comprobamos la variable localizado.
40 Pega la variable "global localizado" en el espacio if
Si la variable es verdadera (la condición se cumple) significa que tenemos las coordenadas.
41 Coge un bloque "call WebViewer.GoToUrl" y ponlo dentro del espacio then.
42 Crea un bloque de text join y pégalo al bloque anterior.
43 En el primer espacio pon la variable "global codigo_google"
44 En el segundo espacio pon la variable "global coordenadas_actuales"
Este bloque le pide al visor web que nos muestre la URL
que le estamos pasando y que contiene las coordenadas de la posición
actual.
45 Coge el evento LocationSensor.LocationChanged.
Este evento se activa cuando cambiamos la localización de
nuestro dispositivo, es decir, cuando nos movemos. Por lo tanto, cada
vez que se activa, nos dice las nuevas coordenadas de nuestra posición.
Vamos a usar este evento para actualizar nuestra variable
coordenadas_actuales y mostrar la información en las etiquetas de la
pantalla.
46 Coge el bloque "set global coordenadas_actuales"
47 Crea un bloque "join" y pégalo al bloque anterior.
48 Pega al bloque "join" la variable LocationSensor.Latitude
49 En el segundo espacio text pega un bloque de texto con una coma, así ","
50 En el siguiente espacio text pega la variable LocationSensor.Longitude
Ahora nuestra variable coordenadas_actuales contendrá un valor, p. eje.: "40.343421,-3.334344"
Vamos con las etiquetas.
51 Coge el bloque "set etiqueta_coordenadas.Text" y pégale un bloque "text join".
52 En el primer espacio pon un bloque de texto que diga: "Coordenadas actuales: "
53 En el segundo pon nuestra variable coordenadas_actuales
54 Coge el bloque "set etiqueta_direccion.Text" y pégale un bloque LocationSensor.CurrentAddress
Este bloque busca la dirección que corresponde a las coordenadas actuales.
Por último, como tenemos las coordenadas de la posición actual, vamos a cambiar la variable lógica localizado.
55 Pon un bloque "set global localizado" y pégale un bloque lógico true.
56 Ahora que tenemos las coordenadas de nuestra posición actual vamos a aprender a guardarlas.
57 Coge el evento boton_guardar.Click.
58 Vamos a comprobar si realmente tenemos las coordenadas.
59 Coge un bloque de control if then
60 En el espacio if comprobamos la variable localizado.
60 Pega la variable "global localizado" en el espacio if
Si tenemos las coordenadas primero limpiamos el textbox y mostramos el menú para guardar.
61 Coge un bloque "set textbox_nombre_waypoint" y pégale un bloque de texto vacío: "".
62 Coge un bloque "set
menu_guardar.Visible" y pégale un bloque lógico true. Así mostramos el
menú para guardar con el textbox y el botón para guardar.
Recuerda que este menú corresponde con el componente
HorizontalArragement menu_guardar que contiene a su vez el
textbox_nombre_waypoint y el botón boton_guardar_waypoint. Cuando el
usuario haya puesto un nombre al waypoint pulsará el botón
boton_guardar_waypoint así que necesitamos controlar este evento.
63 Coge el evento boton_guardar_waypoint.Click
En este punto tenemos dos datos. Por una parte tenemos las
coordenadas actuales en la variable coordenadas_actuales y por otra
parte el nombre que queremos usar en la variable
textbox_nombre_waypoint.Text. Vamos a añadir cada dato a su lista
correspondiente.
64 Coge dos bloques "add items to list" y ponlos dentro.
65 En el espacio list del primer bloque pon nuestra lista "global lista_waypoints"
66 En el espacio item pon un bloque "textbox_nombre_waypoint.Text
Con esto añadimos el nombre a la lista de waypoints.
67 En el espacio list del segundo bloque pon nuestra lista "global lista_coordenadas"
68 En el espacio item pon la variable "global coordenadas_actuales"
69 Con esto añadimos las coordenadas a nuestra lista.
Ahora que hemos actualizado las listas con los nuevos datos sólo tenemos que guardarlas en la base de datos.
70 Coge dos procedimientos "call TinyDB.StoreValue" y ponlos debajo.
71 En el espacio tag del primer bloque por un bloque de texto con el texto: "waypoints"
72 En el espacio valueToStore pon nuestra lista "global lista_waypoints"
73 En el espacio tag del segundo bloque por un bloque de texto con el texto: "coordenadas"
74 En el espacio valueToStore pon nuestra lista "global lista_coordenadas"
Con esto guardamos ambas listas en la base de datos usando el tag correspondiente a cada lista.
Sólo queda ocultar el menú.
75 Coge un bloque "set menu_guardar.Visible" y pégale un bloque lógico false.
Vamos a recuperar waypoints para mostrarlos en el mapa.
76 Coge el evento boton_mis_waypoints.BeforePicking
77 Dentro pon un bloque "set boton_mis_waypoints.Elements" y pégale la variable "global lista_waypoints"
78 Con esto el componente ListPicker mostrará los nombres de los waypoints que tengamos en nuestra lista.
79 Coge ahora un evento boton_mis_waypoints.AfterPicking
80 Pon dentro un procedimiento "call WebViewer.GoToUrl"
81 Pega al bloque anterior un bloque de texto join.
82 En el primer espacio pon la variable "global codigo_google"
83 En el segundo espacio pon un bloque "select list item"
84 En el espacio list pon la variable "global lista_coordenadas"
85 En el espacio index pon la variable boton_mis_waypoints.SelectionIndex
Al hacer esto estamos seleccionando de la lista de
coordenadas aquellas cuyo índice coincide con el nombre que ha
seleccionado el usuario de la lista de waypoints.
En este caso estamos mostrando las coordenadas en el mapa
dentro del componente WebViewer. Para mostrar las coordenadas en la
aplicación de Google Maps en lugar de usar este bloque
"WebViewer.GoToUrl" tendríamos que usar los dos siguientes bloques:
Un bloque "set ActivityStarter.DataUri" más la misma cadena de texto que hemos usado antes.
Y un bloque ActivityStarter.StartActivity
Tu programa completo debe de quedar así:
A esta aplicación sólo le faltaría un botón para borrar
waypoints que ya no necesitamos. ¿Te atreves a hacerlo? Una pista:
necesitamos otro componente ListPicker.
Rutas
Vamos
a completar nuestro programa de waypoints para que podamos mostrar la
ruta desde nuestra posición actual hasta el waypoint que queramos de los
que tenemos guardados.
1 Recupera el programa "waypoints" y grábalo (Save as) con el nombre "rutas"
2 Desde el Diseñador vamos a
añadir un componente ListPicker dentro del componente
HorizontalArragement a la derecha del botón Mis Waypoints.
3 A este ListPicker le vamos a llamar boton_rutas
4 Cambia el texto del componente por: "Rutas" y ajusta su tamaño.
5 Vamos al Editor de bloques.
Lo primero que vamos a hacer es definir un par de
variables más que vamos a necesitar para informar a Google Maps de que
queremos que nos muestre una ruta en lugar de una posición en el mapa.
6 Crea la variable codigo_google_ruta_origen con un bloque de texto con el texto: "http://maps.google.com/ maps?saddr="
Esta variable contiene la URL que necesita Google Maps
además de las coordenadas de origen de la ruta que queremos. En nuestro
caso contendrá nuestra posición actual desde la que comenzaramos la ruta
hasta nuestro waypoint.
7 Crea otra variable llamada codigo_google_ruta_destino con un bloque de texto con el texto: "&daddr="
Esta variable contendrá las coordenadas del destino de la
ruta que queremos. Juntando ambos bloques construímos la URL definitiva
que necesitamos pasar a Google Maps.
8 Ahora coge el evento boton_rutas.BeforePicking
Necesitamos tener la coordenadas actuales para poder hacer
la ruta, así que necesitamos asegurarnos primero de que la variable
localizado es verdadera.
9 Coge un bloque de control if then y en el campo test pon la variable localizado.
10 Ahora dentro del evento pon un bloque "set boton_rutas.Elements" y pégale la variable "global lista_waypoints"
11 Coge el evento boton_rutas.AfterPicking y copia dentro los bloques del evento boton_mis_waypoints.AfterPicking.
La URL que tenemos que montar consiste en los bloques
codigo_google_ruta_origen + coordenadas_actuales +
codigo_google_rutas_destino + coordenadas del destino. Este último dato
lo sacamos de la lista de coordenadas uando el índice de la lista de
waypoints, tal y como hemos hecho antes.
12 Crea un bloque de texto join y haz que tenga cuatro espacios.
13 En el primer espacio pon la variable codigo_google_ruta_origen
14 En el segundo la variable coordenadas_actuales.
15 En el tercero la variable codigo_google_ruta_destino.
16 En el último coge el bloque "select list item" que teníamos antes.
17 Pruébalo!
Recuerda que puedes usar el componente ActivityStarter para abrir Google Maps tal y como hemos aprendido antes.