共用方式為


第 28 章的摘要。 位置與地圖

注意

這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。

Xamarin.FormsMap支援衍生自View的專案。 由於使用地圖所涉及的特殊平臺需求,它們會在個別的元件 Xamarin.Forms中實作。對應,並涉及不同的命名空間: Xamarin.Forms.Maps

地理座標系統

地理座標系統會識別球面(或幾乎球面)物件上的位置,例如地球。 座標是由 以角度表示的緯度經度 所組成。

一個叫 的 equator 偉大圓形是兩極之間的中途,地球軸在概念上延伸。

平行和緯度

從地球中心向北或向南測量的赤道角度,會將稱為 平行緯度的等緯度線標示為平行線。 這些範圍從赤道的0度到北極和南極的90度不等。 根據慣例,赤道以北的緯度是正值,赤道以南的緯度是負值。

經度和經線

從北極到南極的大圓圈中,有一半是相等經度的線,也稱為 經線。 這些是相對於英格蘭格林威治的黃金經線。 根據慣例,Prime Meridian 以東的經度是從 0 度到 180 度之間的正值,而 Prime Meridian 以西的經度是從 0 度到 –180 度之間的負值。

等光投影

地球的任何平面地圖都引入扭曲。 如果緯度和經度的所有線條都是直線的,而且如果緯度和經度角度相等的距離對應到地圖上的相等距離,則結果是 等號投影。 此地圖會扭曲靠近極點的區域,因為它們水準伸展。

Mercator 投影

流行的 Mercator 投影 嘗試通過垂直伸展這些區域來補償水準伸展。 這會產生一張地圖,其中極點附近的區域看起來比它們真的大得多,但任何局部區域都與實際區域非常貼近。

地圖服務和圖格

地圖服務會使用稱為 Web Mercator的 Mercator 投影變化。 地圖服務會根據位置和縮放層級,將點陣圖磚傳遞給用戶端。

取得使用者的位置

類別 Xamarin.FormsMap 不包含用來取得使用者地理位置的設施,但使用地圖時通常很理想,因此相依性服務必須處理它。

注意

Xamarin.Forms 應用程式可以改用 Geolocation 中包含的 Xamarin.Essentials類別。

位置追蹤器 API

Xamarin.FormsBook.Platform 解決方案包含位置追蹤器 API 的程式代碼。 結構 GeographicLocation 會封裝緯度和經度。 介面 ILocationTracker 會定義兩種方法來啟動和暫停位置追蹤器,以及在有新位置可用時的事件。

iOS 位置管理員

的 iOS 實 ILocationTracker 作是使用 LocationTracker iOS CLLocationManager的類別。

Android 位置管理員

ILocationTracker Android 實作是使用 LocationTracker Android LocationManager 類別的類別。

UWP 地理定位器

的 通用 Windows 平台 實ILocationTracker作是使用 LocationTracker UWPGeolocator的類別。

顯示手機的位置

WhereAmI 範例會使用位置追蹤器,在文字和等形地圖上顯示手機的位置。

所需的額外負荷

WhereAmI 使用位置追蹤器需要一些額外負荷。 首先,WhereAmI 方案中的所有專案都必須參考 Book.Platform 中的Xamarin.Forms對應專案,而且每個 WhereAmI 專案都必須呼叫 Toolkit.Init 方法。

需要一些額外的平臺特定額外負荷,以位置許可權的形式。

iOS 的位置許可權

針對 iOS,info.plist 檔案必須包含包含問題文字的專案,要求用戶允許取得該使用者的位置。

Android 的位置許可權

取得使用者位置的Android應用程式在AndroidManifest.xml檔案中必須具有ACCESS_FILE_LOCATION許可權。

UWP 的位置許可權

通用 Windows 平台 應用程式必須具有 location Package.appxmanifest 檔案中標示的裝置功能。

使用 Xamarin.Forms。地圖

使用類別 Map 涉及數個需求。

NuGet 套件

Xamarin.Forms地圖 NuGet 連結庫必須新增至應用程式解決方案。 版本號碼應該與 Xamarin.Forms 目前安裝的套件相同。

初始化地圖服務套件

應用程式項目必須在呼叫 之後呼叫 Xamarin.FormsMaps.Init Xamarin.Forms.Forms.Init方法。

啟用地圖服務

Map因為 可以取得使用者的位置,因此應用程式必須以本章稍早所述的方式取得用戶的許可權:

啟用 iOS 地圖

使用 Map 的 iOS 應用程式需要 info.plist 檔案中的兩行。

啟用Android地圖

使用Google地圖服務需要授權金鑰。 此金鑰會插入 AndroidManifest.xml 檔案中。 此外, AndroidManifest.xml 檔案需要 manifest 標籤,以取得使用者的位置。

啟用UWP地圖

通用 Windows 平台 應用程式需要使用 Bing 地圖服務的授權金鑰。 這個索引鍵會當做自變數傳遞至 Xamarin.FormsMaps.Init 方法。 應用程式也必須針對位置服務啟用。

未繪製的地圖

MapDemos 範例是由 MapsDemoHomePage.xaml 檔案和MapsDemoHomePage.xaml.cs程式代碼後置檔案所組成,可讓您瀏覽至各種示範程式。

BasicMapPage.xaml 檔案會示範如何顯示Map檢視。 根據預設,它會顯示羅馬市,但使用者可以操作地圖。

若要停用水平和垂直捲動,請將 HasScrollEnabled 屬性設定為 false。 若要停用縮放功能,請將 設定 HasZoomEnabledfalse。 這些屬性可能無法在所有平台上運作。

街道和地形

您可以藉由設定 Map 類型的 MapType屬性MapType來顯示不同類型的地圖,這是具有三個成員的列舉:

MapTypesPage.xaml 檔案會示範如何使用單選按鈕來選取地圖類型。 它會使用 Book.Toolkit 連結庫中的 RadioButtonManagerXamarin.Forms類別,以及根據 MapTypeRadioButton.xaml 檔案的類別。

地圖座標

程式可以透過 VisibleRegion 屬性取得 所顯示的目前區域Map。 此屬性不受可系結屬性支援,而且沒有通知機制可指出何時變更,因此想要監視屬性的程式應該使用該用途的定時器。

VisibleRegion 類型為 MapSpan,類別具有四個唯讀屬性:

PositionDistance 都是結構。 Position透過建構函式定義兩個Position唯讀屬性:

Distance 旨在藉由在計量和英文單位之間轉換來提供獨立單位的距離。 Distance您可以透過數種方式來建立值:

值可從三個屬性取得:

MapCoordinatesPage.xaml 檔案包含數Label個元素來顯示MapSpan資訊。 MapCoordinatesPage.xaml.cs程式代碼後置檔案會使用定時器,在使用者操作地圖時保留資訊更新。

位置延伸模組

此書名為 Xamarin.FormsBook.Toolkit.Maps 的新文檔庫包含地圖特定但與平台無關的類型。 類別 PositionExtensions 具有 ToString 的方法 Position,以及用來計算兩 Position 個值之間距離的方法。

設定初始位置

您可以呼叫 MoveToRegion 的 方法來 Map 以程式設計方式設定地圖上的位置和縮放層級。 自變數的類型為 MapSpan。 您可以使用下列其中一項 MapSpan 來建立 物件:

您也可以使用 方法或 WithZoom,從現有的方法ClampLatitude建立新的 MapSpan

WyomingPage.xaml 檔案和WyomingPage.xaml.cs程式代碼後置檔案示範如何使用 MoveToRegion 方法來顯示 Wyoming 的狀態。

或者,您可以使用 建 Map 構函式 搭配 MapSpan 物件來初始化地圖的位置。 XamarinHQPage.xaml 檔案示範如何在 XAML 中完全執行此動作,以顯示 Xamarin 在舊金山的總部。

動態縮放

您可以使用 Slider 來動態縮放地圖。 RadiusZoomPage.xaml 檔案和RadiusZoomPage.xaml.cs程序代碼後置檔案會示範如何根據值變更地圖的Slider半徑。

LongitudeZoomPage.xaml 檔案和LongitudeZoomPage.xaml.cs程式代碼後置檔案顯示較適用於 Android 的替代方法,但兩種方法在 Windows 平臺上都無法正常運作。

電話的位置

IsShowingUser 屬性 Map 在每個平臺上的運作方式稍有不同,如 ShowLocationPage.xaml 檔案所示:

  • 在iOS上,藍色點表示手機的位置,但您必須手動流覽該處
  • 在Android上,圖示會顯示在推送時將地圖移至手機位置
  • UWP 類似於 iOS,但有時會自動巡覽至位置

MapDemos 專案會先根據 MyLocationButton.xaml 檔案定義圖示型按鈕,並MyLocationButton.xaml.cs程式代碼後置檔案,嘗試模擬 Android 方法。

GoToLocationPage.xaml 檔案和GoToLocationPage.xaml.cs程序代碼後置檔案會使用此按鈕瀏覽至手機的位置。

針腳和科學博物館

最後,類別 MapPins 定義 類型的 IList<Pin>屬性。 類別 Pin 會定義四個屬性:

  • Labelstring別為 ,必要屬性
  • Addressstring別為 的 ,這是選擇性的人類可讀取位址
  • PositionPosition別為 ,表示圖釘在地圖上顯示的位置
  • TypePinType別 為 ,但未使用列舉型別

MapDemos 專案包含檔案ScienceMuseums.xml,其中列出 美國 中的科學博物館,以及LocationsSite還原串行化此數據的類別。

ScienceMuseumsPage.xaml 檔案和ScienceMuseumsPage.xaml.cs地圖中這些科學博物館的程式碼後置檔案顯示釘選。 當使用者點選釘選時,它會顯示博物館的位址和網站。

兩點之間的距離

類別 PositionExtensions 包含方法,其中簡化了兩個 DistanceTo 地理位置之間的距離計算。

這用於 LocalMuseumsPage.xaml 檔案,並 LocalMuseumsPage.xaml.cs 程式代碼後置檔案來顯示與使用者位置之間的博物館距離:

本機博物館頁面的三重螢幕快照

程式也會示範如何根據地圖的位置動態限制針腳數目。

地理編碼和返回

Xamarin.Forms地圖 元件也包含類別 Geocoder ,其方法 GetPositionsForAddressAsync 會將文字地址轉換成零或更多可能的地理位置,以及另一個方向轉換的方法 GetAddressesForPositionAsync

GeocoderRoundTrip.xaml 檔案和GeocoderRoundTrip.xaml.cs程序代碼後置檔案會示範這項功能。