取得和使用位置資料

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 時,此方法所使用的方式類似 Objective-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 開發人員可使用取得位置資料的替代技術:網頁瀏覽器式的 navigator.geolocation 方法,其詳細資訊,請參閱部落格文章:比較 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 範例

 

 

顯示:
© 2015 Microsoft