Windows Phone 7 – Tutorial XXXV – Localización Tutorial II

En el anterior articulo vimos como detectar los cambios de estado del GPS de nuestro teléfono, en este nos vamos a centrar en como recoger nuestra posición en todo momento. Como todos sabéis la localización GPS se mide a partir de tres valores Latitud, Longitud y Altitud, estos tres valores se encuentran en la propiedad Position del objeto GeoCoordinateWatcher, estos valores solo aparecerán si el estado es Ready, sino es así y se tomo la posición en otro momento aparecerán los datos de Latitud, Longitud y Altitud  aunque también se nos indicará junto a la propiedad TimeStamp que hora se tomo la posición.

Lo que nos interesa muchas veces es ir recogiendo la posición cada vez que cambie, por ejemplo, para un programa de rutas de bici…. Para ello debemos utilizar el evento PositionChanged que se lanzara cada vez que el usuario cambie de posición. Es importante recordar que si queremos cambiar elementos visuales de la UI tendremos que utilizar el objeto Dispatcher.

Como siempre es mejor verlo en líneas de código os la dejo aquí.

 

1 GeoCoordinateWatcher geowatcher; 2 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 3 { 4 geowatcher = new GeoCoordinateWatcher(); 5 geowatcher.PositionChanged += geowatcher_PositionChanged; 6 } 7 private void geowatcher_PositionChanged(object sender, 8 GeoPositionChangedEventArgs<GeoCoordinate> e){ 9 var locationText = PositionString(e.Position.Location); 10 this.Dispatcher.BeginInvoke(() = > this.GeoLocationText.Text = locationText); 11 } 12 private string PositionString(GeoCoordinate position) 13 { 14 return "Latitude: " + position.Latitude.ToString() + Environment.NewLine + 15 "Longitude: " + position.Longitude.ToString() + Environment.NewLine + 16 "Altitude: " + position.Altitude.ToString(); 17 } 18

Generalmente queremos coger la posición del GPS cada cierto tiempo y no siempre, por ejemplo, coger la posición cada 100 metros, para ello tendremos que utilizar la propiedad MovementThreshold donde le indicaremos cada cuantos metros como mínimo debe de ejecutarse el evento PositionChanged.

 

Ahora viene la pregunta del millo, como probamos en nuestro emulador?. La repuesta en estos momentos no es tan sencilla ya que tendremos que elegir entre la versión 7.0 o Mango, en este articulo vamos a ver las dos empezando por la primera versión 7.0

Como en nuestro emulador no disponemos de los sensores debemos de utilizar Mock para simular el GPS, para ello Microsoft nos provee de la interfaz IGeoPositionWatcher < GeoCoordinate > para que creemos nuestro Mock, en este articulo no vamos a ver como crear nuestro Mock sino utilizar uno ya hecho. Si hay que decir que esto es valido para cuando desarrollemos para la versión 7.0, ya que Mango nos va a proporcionar las herramientas de simulación integradas con el emulador que veremos en el siguiente articulo.

Yo utilizo Windows Phone GPS Emulator una pequeña aplicación hecha en WPF que nos va a permitir probar nuestra aplicación en el emulador aunque no tengamos GPS. Con esta herramienta podemos enviar tanto un punto simulando nuestra localización, como una ruta con puntos intermedios.

La herramienta incluye

  • Una aplicación windows que emula el GPS
  • el assembly Windows Phone GPS Emulator
  • Una simple aplicación de test
  • Una aplicación completa utilizando BingMaps

Para usarlo en nuestra aplicación debemos de seguir unos sencillos pasos. El paquete de descarga nos ofrece la dll GPSEmulatorClient, esta dll contiene la clase GeoCoordinateWatcher que cumple la interfaz IGeoPositionWatcher < GeoCoordinate > de la clase System.Device.Location.GeoCoordinateWatcher, de manera que programaticamente nos va a dar igual utilizar una que otra ya que solo se diferencian en el namespace.

Debemos de crear una variable de compilación en debug y la llamamos GPS_EMULATOR , de esta manera distinguiremos las llamadas a los métodos de la dll “real” con la de “mock”, por ejemplo.

1 #if GPS_EMULATOR 2 _Watcher = new GpsEmulatorClient.GeoCoordinateWatcher(); 3 #else 4 _Watcher = new System.Device.Location.GeoCoordinateWatcher(); 5 #endif

De esta manera podemos probar todo nuestro código que afecte a la localización en el emulador perfectamente, además las llamadas a métodos de localización de la dll de mock se comunican con la aplicación WPF a través de WCF, mostrándonos información en el plano y pudiendo enviar información de la aplicación al GPS, por ejemplo si solicitamos una posición en la aplicación del teléfono cogerá la posición que tenga la aplicación WPF, de manera que la aplicación WPF hace las veces de GPS

Debemos de recordar que para ejecutar la aplicación en WPF tiene que tener permisos de administrador, sino no será capaz de crear los canales de WCF, es una herramienta muy útil cuando desarrollamos contra el GPS, pero nunca debemos olvidarnos de probar contra un dispositivo físico

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *