第 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
。 若要停用縮放功能,請將 設定 HasZoomEnabled
為 false
。 這些屬性可能無法在所有平台上運作。
街道和地形
您可以藉由設定 Map
類型的 MapType
屬性MapType
來顯示不同類型的地圖,這是具有三個成員的列舉:
MapTypesPage.xaml 檔案會示範如何使用單選按鈕來選取地圖類型。 它會使用 Book.Toolkit 連結庫中的 RadioButtonManager
Xamarin.Forms類別,以及根據 MapTypeRadioButton.xaml 檔案的類別。
地圖座標
程式可以透過 VisibleRegion
屬性取得 所顯示的目前區域Map
。 此屬性不受可系結屬性支援,而且沒有通知機制可指出何時變更,因此想要監視屬性的程式應該使用該用途的定時器。
VisibleRegion
類型為 MapSpan
,類別具有四個唯讀屬性:
- 型別
Center
的Position
LatitudeDegrees
型double
別為 ,表示地圖顯示區域的高度LongitudeDegrees
型double
別為 ,表示地圖顯示區域的寬度Radius
型Distance
別為 ,表示地圖上可見的最大圓形區域大小
Position
和 Distance
都是結構。 Position
透過建構函式定義兩個Position
唯讀屬性:
Distance
旨在藉由在計量和英文單位之間轉換來提供獨立單位的距離。 Distance
您可以透過數種方式來建立值:
Distance
以公尺為單位的建構函式Distance.FromMeters
static 方法Distance.FromKilometers
static 方法Distance.FromMiles
static 方法
值可從三個屬性取得:
- 型別
Meters
的double
- 型別
Kilometers
的double
- 型別
Miles
的double
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程序代碼後置檔案會使用此按鈕瀏覽至手機的位置。
針腳和科學博物館
最後,類別 Map
會 Pins
定義 類型的 IList<Pin>
屬性。 類別 Pin
會定義四個屬性:
Label
型string
別為 ,必要屬性Address
型string
別為 的 ,這是選擇性的人類可讀取位址Position
型Position
別為 ,表示圖釘在地圖上顯示的位置Type
型PinType
別 為 ,但未使用列舉型別
MapDemos 專案包含檔案ScienceMuseums.xml,其中列出 美國 中的科學博物館,以及Locations
Site
還原串行化此數據的類別。
ScienceMuseumsPage.xaml 檔案和ScienceMuseumsPage.xaml.cs地圖中這些科學博物館的程式碼後置檔案顯示釘選。 當使用者點選釘選時,它會顯示博物館的位址和網站。
兩點之間的距離
類別 PositionExtensions
包含方法,其中簡化了兩個 DistanceTo
地理位置之間的距離計算。
這用於 LocalMuseumsPage.xaml 檔案,並 LocalMuseumsPage.xaml.cs 程式代碼後置檔案來顯示與使用者位置之間的博物館距離:
程式也會示範如何根據地圖的位置動態限制針腳數目。
地理編碼和返回
。 Xamarin.Forms地圖 元件也包含類別 Geocoder
,其方法 GetPositionsForAddressAsync
會將文字地址轉換成零或更多可能的地理位置,以及另一個方向轉換的方法 GetAddressesForPositionAsync
。
GeocoderRoundTrip.xaml 檔案和GeocoderRoundTrip.xaml.cs程序代碼後置檔案會示範這項功能。