获取和使用位置数据

Applies to Windows and Windows Phone

找到用户的位置并在地图上绘制其位置。

开发 iOS 应用时,你可能使用过 CoreLocation 框架来确定位置,然后使用 MapKit 在地图上显示该位置。借助 Windows 8.1 和 Windows Phone 8.1,你可以使用 Geolocation 类来获取位置,并利用 Bing Maps 来提供地图数据。(有时,Bing Maps还可以提供其他数据,包括交通更新和路线。)

使用 Bing 控件显示指定位置周围的地图

以 C# 获取位置信息

利用 C# 代码获取位置信息可谓轻松、简单,但是需要注意 async 关键字的使用。指定 async 时,方法的操作行为类似于目标-C block,并且阻止执行它后面的代码(没有阻止主线程),直至 await 方法返回:这种情况下,它返回一个 Geoposition 对象。有关详细信息,请参阅快速入门:使用 C# 或 Visual Basic 调用异步 API


       // 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.
            }


        }

以 JavaScript 获取位置信息

JavaScript 代码与 C# 代码非常相似。当用户决定不允许使用位置数据,或者无法获得位置数据时,处理潜在的错误和故障就显得非常重要。


    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);
    }


JavaScript 开发人员可以使用其他技术来获取位置数据:Web 浏览器样式的导航仪.地理位置方法,详细信息,请参阅这个博客张贴的内容:比较 HTML5 和 WinRT 地理位置 API

以 C++ 获取位置信息

用来查找当前位置的 C++ 代码再度非常简短。由于方法是异步运行的,所以必须通过包含 ppltask.hconcurrency 命名空间,为线程处理提供 C++ 支持。有关详细信息,请参阅并发运行时


// 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
        }

	});
}

绘制位置

在地图上显示位置数据的推荐方法是使用 Bing Maps。如在主题 Bing 地图入门中所讨论的那样,可以通过几种方式来访问该数据,包括使用基于非 API Web 的解决方案和专用的 Windows 8 控件。较为简单的 Web 解决方案可以显示自定义的地图,但是缺乏交互性,它包括各种其他的屏幕控件,但是不能提供无缝的应用体验。我们值得付出更多的努力来利用自定义控件。

若要访问专用的 Bing Maps控件,或者使用 Bing Maps服务更多高级的功能,则需要你通过注册获得用于标识你和你的应用的特殊密钥。详细信息,请参阅获取 Bing 地图密钥。当你拥有密钥后,就可以直接使用该控件,具体情况请参阅主题:如何通过 Bing 地图(使用 C#/VB/C++ 和 XAML 开发的 Windows 应用商店应用)显示你的位置,其中包含一个有用的视频。

根据相关的注释,Windows 应用商店应用可以通过下面的 URI 方案启动内置的地图应用,从而允许在其他事务中,以特定位置为中心而打开该应用。更多信息,请参阅地图应用程序的 URI 方案

要记住的事项

  • 你必须配置应用,使其支持清单文件中的位置,否则它会抛出一个异常。 为此,打开 Package.appxmanifest,选择“功能”选项卡并选中“位置”
  • 用户可以选择不提供位置数据,当出现这种情形时,你的应用必须正常响应(请参阅示例代码中的异常处理程序和错误处理程序)。
  • 只有在真正需要位置数据的情况下才应发出请求,否则,若无必要,请不要经常使用。
  • 位置数据为个人信息,因此应谨慎处理。相关指南,请参阅此隐私主题

相关主题

获取位置
地理位置示例
位置感知应用指南(使用 JavaScript 和 HTML 的 Windows 应用商店应用)
检测地理位置(使用 JavaScript 和 HTML 的 Windows 应用商店应用)
快速入门:检测用户的位置(使用 C#/VB/C++ 和 XAML 开发的 Windows 应用商店应用)
Geolocator.GetGeopositionAsync() | getGeopositionAsync() method
绘制位置
如何使用 Bing 地图显示你的位置(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)
Windows 应用商店应用示例的 Bing 地图 SDK

 

 

显示:
© 2014 Microsoft