Obtener y usar datos de ubicación

Applies to Windows and Windows Phone

Busca la ubicación del usuario y traza su posición en un mapa.

Si has desarrollado aplicaciones para iOS probablemente hayas usado el marco CoreLocation para determinar tu ubicación, y después MapKit para mostrar la posición en un mapa. Con Windows 8.1 y Windows Phone 8.1 puedes usar la clase Geolocation para obtener las ubicaciones y Bing Maps para proporcionar los datos del mapa. (Casualmente, Bing Maps puede proporcionar otros datos, como actualizaciones del tráfico e indicaciones sobre cómo llegar).

Usar el control Bing para mostrar un mapa alrededor de una ubicación específica

Obtener una ubicación en C#

El código C# para obtener una ubicación es corto y fácil, pero observa el uso de la palabra clave async. Cuando se especifica async, el método actúa de una forma similar a un block de Objective-C, e impide que el código que le sigue se ejecute (sin bloquear el subproceso principal) hasta que el método await vuelve; en este caso, vuelve con un objeto Geoposition. Consulta Inicio rápido: llamadas a API asincrónicas en C# o Visual Basic para obtener más información.


       // Add these:
        // using Windows.Devices.Geolocation;
        // using System.Threading.Tasks;
        // using System.Diagnostics;

        Geolocator geo = null;

        // Notice the use of async
        private async void FindLocation()
        {
            if (geo == null)
            {
                geo = new Geolocator();
            }

            try
            {
                Geoposition pos = await geo.GetGeopositionAsync();         
                Debug.WriteLine("Latitude: " + pos.Coordinate.Latitude.ToString() + " Longitude: " + pos.Coordinate.Longitude.ToString() + " Accuracy: " + pos.Coordinate.Accuracy.ToString());
            }

            catch (System.UnauthorizedAccessException)
            {
                // Failed - location capability not set in manifest, or user blocked location access at run-time.
            }

            catch (TaskCanceledException)
            {
                // Cancelled or timed-out.
            }


        }

Obtener una ubicación en JavaScript

El código JavaScript es muy similar al código C#. Es importante tratar los posibles errores si el usuario ha elegido no permitir datos de ubicación, o si no se pueden obtener los datos de ubicación.


    var loc = null;

    function FindLocation() {
        if (loc == null) {
            loc = new Windows.Devices.Geolocation.Geolocator();
        }
        if (loc != null) {
            loc.getGeopositionAsync().then(getPositionHandler, errorHandler);
        }
    }

    function getPositionHandler(pos) {
        console.log("Latitude: " + pos.coordinate.latitude + " Longitude: " + pos.coordinate.longitude + " Accuracy: " + pos.coordinate.accuracy );
    }

    function errorHandler(e) {
        console.log("Error = " +  e.message);
    }


Los desarrolladores de JavaScript disponen de una técnica alternativa para obtener los datos de ubicación: el enfoque navigator.geolocation similar al de los exploradores web, tal y como se detalla en una publicación de blog que compara las API de ubicación geográfica de HTML5 y WinRT.

Obtener una ubicación en C++

De nuevo, el código C++ necesario para encontrar la ubicación actual es corto. Como el método se ejecuta asincrónicamente, debes incluir compatibilidad de C++ para subprocesamiento, incluyendo ppltask.h y el espacio de nombres concurrency. Consulta Tiempo de ejecución de simultaneidad para obtener más información.


// Add the following:
#include <ppltasks.h> 
using namespace Windows::Devices::Geolocation;
using namespace concurrency; 

Geolocator ^geo ;
concurrency::cancellation_token_source geopositionTaskTokenSource;

 void WinLog(const wchar_t *text, int n)
	 // Helper function to display debugging information to output console
	{
		wchar_t buf[1024];
		_snwprintf_s(buf, 1024, _TRUNCATE, L"%s %d\n", text, n);
		OutputDebugString(buf);
	}


void MainPage::FindLocation()
{
	geo = ref new Geolocator();
	task<Geoposition^> geopositionTask(geo->GetGeopositionAsync(), geopositionTaskTokenSource.get_token());
    geopositionTask.then([this](task<Geoposition^> getPosTask)
    {
        try
        {
            Geoposition^ pos = getPosTask.get();

			WinLog(L"Latitude",pos->Coordinate->Latitude);
			WinLog(L"Longitude",pos->Coordinate->Longitude);
			WinLog(L"Accuracy",pos->Coordinate->Accuracy);
        }
        catch (AccessDeniedException^)
        {
			// 
        }
        catch (task_canceled&)
        {
           // Cancelled or timed-out
        }

	});
}

Trazar una ubicación

El enfoque recomendado para mostrar los datos de ubicación en un mapa es usar Bing Maps. Como se explica en el tema Introducción a Mapas de Bing, hay varias maneras de acceder a estos datos de mapas, incluido el uso de una solución web sin API y un control de Windows 8 dedicado. La solución web más sencilla puede mostrar un mapa personalizado, pero carece de interactividad, incluye otros controles en pantalla y no proporciona una experiencia fluida con la aplicación. Merece la pena el esfuerzo adicional de crear el control personalizado.

Para acceder al control Bing Maps dedicado o para usar las características más avanzadas del servicio Bing Maps debes registrarte para obtener una clave especial que te identifique a ti y a tu aplicación. Consulta el tema sobre cómo obtener una clave de mapas de Bing si quieres obtener más detalles. Una vez que tengas la clave, usar el control es muy sencillo, como se explica en este tema: Cómo mostrar la ubicación usando Mapas de Bing (aplicaciones de la Tienda Windows con C#/VB/C++ y XAML), que contiene un vídeo útil.

Además, tu aplicación de la Tienda Windows puede iniciar la aplicación Mapas integrada siguiendo el esquema URI que permite, entre otras cosas, abrir la aplicación centrada en una ubicación específica. Consulta Esquema URI para aplicaciones de mapas para obtener más información.

Cosas que deben recordarse

  • Debes configurar la aplicación para que admita la ubicación en el archivo de manifiesto; de lo contrario, iniciará una excepción. Abre Package.appxmanifest, selecciona la pestaña Funcionalidades y activa Ubicación.
  • El usuario puede elegir no proporcionar los datos de ubicación y, en este caso, la aplicación debe responder correctamente (consulta los controladores de excepciones y los controladores de errores en el código de ejemplo).
  • No solicitudes datos de ubicación hasta que de verdad los necesites, y no lo hagas con más frecuencia de la necesaria.
  • Los datos de ubicación son información personal y debes tener cuidado con ellos. Consulta este tema de privacidad para obtener una mayor orientación.

Temas relacionados

Obtener ubicación
Muestra de ubicación geográfica
Directrices para aplicaciones con reconocimiento de ubicación (aplicaciones de la Tienda Windows con JavaScript y HTML)
Detectar la ubicación geográfica (aplicaciones de la Tienda Windows con JavaScript y HTML)
Inicio rápido: Detectar la ubicación de un usuario (aplicaciones de la Tienda Windows con C#/VB/C++ y XAML)
Geolocator.GetGeopositionAsync() | getGeopositionAsync() method
Trazar ubicación
Cómo mostrar tu ubicación con Mapas de Bing (aplicaciones de la Tienda Windows con C#/VB/C++ y XAML)
Muestras del SDK de Mapas de Bing para aplicaciones de la Tienda Windows

 

 

Mostrar:
© 2014 Microsoft