1. 程式人生 > >ArcGIS Runtime SDK for iOS開發之-顯示你的位置

ArcGIS Runtime SDK for iOS開發之-顯示你的位置

       在地圖上顯示你的位置

       許多iOS裝置如iPod touch、iPad和iPhone提供了裝置的位置資訊。我們知道iOS包含了一個大家都很熟悉的CoreLocation框架,該框架為我們提供了位置獲取的功能,無論是通過Wi-Fi、蜂窩網路還是GPS。這個框架同時也為開發人員提供了API,使得他們能夠將定位功能整合到他們的應用程式中去。

       AGSmapView元件提供了一個簡單的方法來顯示和追蹤裝置的位置資訊。與地圖相關聯的AGSlocationDisplay物件提供了CoreLocation框架的門戶,從而使得利用位置服務進行工作變得更加容易。

       開啟顯示位置功能

       對於早期的作業系統如iOS7或是早期版本,在地圖上展示裝置的位置資訊的話,在地圖已經完成載入後,只用呼叫AGSLocationDisplay物件的startDataSource方法即可。

-(void) mapViewDidLoad:(AGSMapView*)mapView {
 	[self.mapView.locationDisplay startDataSource];
}
       從iOS8之後,apps必須明確的請求授權來訪問裝置的位置服務。這裡有兩種授權方式可用:whenInuse 和Always取決於app是否只想在前景訪問位置,或是前景和背景都想訪問。在預設情況下,地圖請求WhenInUse授權。你需要在你app的info.plist檔案中新增NSLocationWhenInUseUsageDescription關鍵字以及對應的值。

      

       在預設情況下,地圖使用藍色、圓形符號來展示你的裝置位置。地圖總是試圖獲取最準確的位置,但是這取決與訊號的強度、衛星的位置和其它因素,而且地圖報告的位置可能只是真實位置的近似。地圖通常會用一個圍繞位置的圓圈來指示定位的精度範圍。

       位置資料來源

       AGSLocationDisplay 僅僅管理地圖上位置資訊的顯示,它並不主動去檢索任何位置資訊。相反,它依賴位置的資料來源來提供頻繁的位置更新。你可以使用它提供的任何資料來源,或者你可以插入你自己的資料來源來滿足地圖的位置更新。

       AGSLocationDisplay在沒有任何提供的情況下,預設為AGSCLLocationManangerLocationDisplayDataSource。

       AGSCLLocationManangerLocationDisplayDataSource

       該資料來源使用iOS的CoreLocation框架,通過GPS、WiFi 或是蜂窩網路來獲取位置的更新。它會試圖儘可能頻繁的獲取更精確的資訊。

       AGSSimulatedLocationDisplayDataSource

       該資料來源可以使你基於任何線狀幾何體來模擬位置更新。線中的每個頂點被用來發射位置更新。

//The polyline geometry along which location updates should be simulated
AGSPolyline* route = ...;

//Create the data source. Assign the geometry.
AGSSimulatedLocationDisplayDataSource* simulatedDS = [[AGSSimulatedLocationDisplayDataSource alloc] init];
[simulatedDS setLocationsFromPolyline:route];

//Set data source 
self.mapView.locationDisplay.dataSource = simulatedDS;

        AGSGPXLocationDataSource

        該資料來源使用GPS檔案中的第一條蹤跡或是道路來模擬位置更新。

//Create the data source using a GPX file on the web
NSURL* url = [NSURL URLWithString:@"http://www.topografix.com/fells_loop.gpx"];
AGSGPXLocationDataSource* gpxDS = [[AGSGPXLocationDataSource alloc] initWithURL:url];

//Or, create the data source using a GPX file on the device
NSString* pathToGPXOnDevice = ...;
AGSGPXLocationDataSource* gpxDS = [[AGSGPXLocationDataSource alloc] initWithPath:pathToGPXOnDevice];

//Set data source 
self.mapView.locationDisplay.dataSource = gpxDS;
       自動掃描模式

       地圖在接收到位置更新時,提供了一些預設來定義地圖的行為。

       關閉模式

       在這種模式下,地圖僅更新在地圖上的位置符號的位置,它並不重新進行中心定位。因此,位置符號可能在相應位置更新時移出螢幕。

       預設模式

       在這種模式下,當定位符號移動到一個“漫遊程度”時,地圖會試圖通過重新中心化位置符號來儘量保持其在螢幕上。因此,定位符號可能在漫遊範圍內自由移動。但是隻要定位符號退出漫遊模式,地圖就會重新使其中心化。

       預設情況下,漫遊範圍通常是地圖可視範圍的一半大小,但是你也可以通過修改AGSLocationDisplay中的wanderExtentFactor屬性來自定義漫遊範圍。如果值為1,意味著漫遊範圍等於地圖的可視範圍,並且定位符號可能在地圖重新中心化之前移動到地圖邊緣。如果值為0,則意味著無止境的漫遊範圍,而地圖也會在任何一個位置更新處進行中心化。

self.mapView.locationDisplay.autoPanMode = AGSLocationDisplayAutoPanModeDefault ;
self.mapView.locationDisplay.wanderExtentFactor = 0.75; //75% of the map's viewable extent
       導航模式

       這種模式最適合於車載導航。在這種模式下,定位符號被固定在螢幕的一個點,並且總是指向裝置的頂端邊緣方向。地圖根據位置更新來移動和旋轉,並且指向裝置的移動行駛的方向。因此,雖然定位符號看起來像是靜止的,但是在它下面的地圖卻是在移動和旋轉著。

        定位符號的位置可以通過改變AGSLocationDisplay中的navigationPointHeightFactor屬性來進行調整。如果其值為0,意味著定位符號應被放在地圖的底部邊緣,如果值為1則放在頂部邊緣。而如果是0和1之間的值,定位符號就會處於從底部邊緣到頂部邊緣中心線的某個位置。

self.mapView.locationDisplay.autoPanMode = AGSLocationDisplayAutoPanModeNavigation ;
self.mapView.locationDisplay.navigationPointHeightFactor  = 0.25; //25% along the center line from the bottom edge to the top edge
        羅盤導航模式

        這種模式適用於使用者行走的情況。和在導航模式中一樣,定位符號也是被固定在螢幕上的一個點,並總是指向裝置的邊緣。然而,地圖的旋轉是根據使用者相對於磁北的方位,而不是裝置的移動方向。因此,當用戶圍繞他們的位置轉動時,地圖上會反映出處在使用者前面的東西。

       定位符號的位置也可以像導航模式中的那樣通過修改navigationPointHeightFactor來調整。

self.mapView.locationDisplay.autoPanMode = AGSLocationDisplayAutoPanModeCompassNavigation ;
self.mapView.locationDisplay.navigationPointHeightFactor  = 0.5; //50% along the center line from the bottom edge to the top edge
       終止位置展示

       要終止裝置位置的展示,呼叫stopDataSource方法。

[self.mapView.locationDisplay stopDataSource];
       自定義定位符號

       SDK提供了三種預設的影象供定位符號使用,這些影象為:LocationDisplay.png、LocationDisplayCourse.png和LocationDIsplayHeading.png,它們都包含在在ArcGIS.bundle中。


        根據所使用的模式和位置更新所提供的資訊型別,這三種預設的影象將會被應用於定位符號。

       在關閉模式、預設模式和導航模式下,LocationDisplay.png影象在位置資訊可用情況下才會被使用。LocationDisplayCourse.png影象在位置和路線(移動方向)都可用的情況下才會被使用。在關閉和預設模式下,LocationDisplayCourse.png影象會適度的旋轉來顯示裝置的移動方向,而在導航模式種,則是地圖進行旋轉。

        注意:路線資訊只有當裝置以較快速度移動時才可用。這就是為什麼只有裝置在行駛的車輛中移動時,地圖上才會展示LocationDisplayCourse.png影象。

        在羅盤導航模式下,LocationDisplayHeading.png影象被用來展示裝置的位置的方位。

        當然,你也可以利用你自己的PNG影象來改變定位符號。並且你的圖片必須具有與預設圖片相同的名稱並作為Xcode專案的一部分。這些影象在您的Xcode專案中會優先於ArcGIS.bundle中預設的圖片。如果可能的話,建議你的工程也包含高解析度的影象來供視網膜顯示裝置使用,並命名這些高解析度版本為[email protected], [email protected], and [email protected]

        注意:影象名字是區分大小寫的。

        在callout中展示位置資訊

        你可以利用AGSCallout物件來展示地圖上的位置資訊。要展示一個callout,你需要設定callout的代理。你可以通過使你的類(一般為view controller)遵從<AGSCalloutDelegate> 協議來實現這個功能。

@interface ViewController : UIViewController <AGSCalloutDelegate>
...
}
        接下來,設定callout的代理
self.mapView.callout.delegate = self;
        最後,呼叫協議中的 callout:willshowForLocationDisplay:方法。
-(BOOL)callout:(AGSCallout *)callout willShowForLocationDisplay:(AGSLocationDisplay *)locationDisplay {
    
    callout.title = @"<title text>";
    callout.detail = @"<detail text>";

    return YES;
}

        訪問位置資訊

       AGSLocationDisPlay以兩種方式提供了裝置的位置:

       1)location屬性包含了由底層資料來源提供的資訊。位置座標將會是在資料來源選擇的空間參考系下。例如,如果資料來源的型別是AGSCLLocationManagerLocationDisplayDataSource,那麼座標系為WGS84座標系。

       2)mapLocation方法提供了相同的位置資訊,但是,而其座標被投影到了地圖的空間參考系下。

       監聽位置更新

        AGSLocationDisplay種的位置屬性是相容KVO模式的。你可以將一個觀察器跟位置屬性相關聯,以此來監聽位置的更新。

- (void)registerAsObserver {
  [ self.mapView.locationDisplay addObserver:self
                      forKeyPath:@"location"
                         options:(NSKeyValueObservingOptionNew)
                         context:NULL];
}

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
  if ([keyPath isEqual:@"location"]) {
   NSLog(@"Location updated to %@", [self.mapView.locationDisplay mapLocation]);
  }
}

相關推薦

ArcGIS Runtime SDK for iOS開發顯示位置

       在地圖上顯示你的位置        許多iOS裝置如iPod touch、iPad和iPhone提供了裝置的位置資訊。我們知道iOS包含了一個大家都很熟悉的CoreLocation框架,該框架為我們提供了位置獲取的功能,無論是通過Wi-Fi、蜂窩網路還是GPS

ArcGIS Runtime SDK for IOS 開發啟程篇

   從事GIS學習有幾年的時間,而將IOS和GIS結合起來進行學習和研究正是筆者工作這半年多來所做的事情。其實剛開始就想以部落格的形式來記錄自己學習的心得和體會,但是總是被各種事情和藉口所耽誤,對於這種行為樓主也只能是無奈的呵呵了,不過本人有個特點,就是永遠堅信這麼一個原

ArcGIS Runtime SDK for iOS開發地圖圖層圖形圖層

       建立圖形圖層        圖形圖層可以使你在地圖上動態的展示圖形。圖形圖層可以用來儲存使用者繪製的多邊形、線條,或者展示例如查詢或是地理編碼結果的屬性資訊。下圖中,圖形圖層用於突出展示每平方里超過200人的人口密度狀態:               當你想

ArcGIS Runtime SDK for iOS開發系列教程(1)——開發前準備

      眾說周知,ArcGIS10.1徹底架起了端到雲的橋樑,使得空間資訊的創造者與使用者緊密相連。它給使用者帶來了更加簡易的操作方式,能夠實現隨時隨地對空間資訊的獲取和共享,可以讓任何人在任何地點以任何方式享用ArcGIS Online這個雲GIS平臺所提供的智

一、ArcGIS Runtime SDK for iOS 100.2.1教程系列底圖與動態圖層載入

        由於arcgis的官網被牆,所以特意留了一個SDK包的下載地址:https://download.csdn.net/download/qq_31672459/10301377,安裝完成後的最後一步會有SDK所在目錄,以及demo的目錄。一般如下:~/Libra

ArcGIS Runtime SDK for .NET開發筆記》--線上編輯

介紹 實現 1.主介面 其中OutFields控制著屬性的編輯,*代表都可以寫入,也可以只填寫你需要編輯的屬性欄位。 <Grid> <esri:MapView x:Name="MyMapView"

ArcGIS Runtime SDK for .NET開發筆記》 --Hello Word

這裡我們將建立第一個用於顯示地圖的APP。 1.新建一個WPF程式 首先我們開啟Visual Studio,選擇新建專案。 選擇已安裝——模板——Windows桌面——WPF應用程式 2.新增Runtime SDK for .NET的引用

ArcGIS Runtime SDK for Android開發筆記》——(6)、基於Android Studio的ArcGIS Android工程結構解析

1、前言 Android Studio 是第一個Google官方的 Android 開發環境。其他工具,例如 Eclipse,在 Android Studio 釋出之前已經有了大規模的使用。為了幫助開發者轉向 Android Studio,谷歌已經寫出一套遷移指南。Google 同時也釋出宣告稱,在接下來的

ArcGIS Runtime SDK for Android開發筆記》——資料製作篇:緊湊型切片製作(Server快取切片)

1、前言 在ArcGIS 10中出現了一種新的切片快取檔案格式:緊湊型儲存(Compact)。與之前的鬆散型儲存(Exploded)相比,它有遷移方便、建立更快、減少儲存空間等諸多優點,已經成為了現在建立切片快取的預設格式。 緊湊型切片儲存最主要的兩種檔案是bundle和b

ArcGIS Runtime SDK for Android開發筆記》——(2)、Android Studio基本配置與使用

1、前言  在上一篇文章《Android Studio下載與安裝》裡我們已經介紹了Android Studio的下載與安裝步驟,這一篇我們將針對Android Studio的基本常見使用做一個簡單介紹。 2、基本配置 2.1、主題設定 開啟File > Settings > Appearanc

ArcGIS Runtime SDK For iOS 去除水印

 對於 ArcGIS for iOS 地圖開發,這裡不再多提,網上很多教程. 在開發中,當一切部署完成,呈現地圖時,在我的地圖介面顯示了 "licensed for developer use onl

ArcGIS Runtime SDK for .NET (Quartz Beta)連線ArcGIS Portal (1)

1. 介紹 ArcGIS Portal作為ArcGIS平臺的中樞,在ArcGIS體系中起著至關重要的地位。在ArcGIS Runtime的新架構Quartz中添加了連線ArcGIS Portal(或ArcGIS Online),建立修改ArcG

ArcGIS Runtime SDK for Android功能概述

部署 編輯 最短路徑 設備 下載 用戶 系統 幾何 和平   使用ArcGIS Runtime SDK for Android,用戶能夠開發出功能強大的移動端GIS應用程序並將它們部署到Android系統的智能手機和平板上,主要功能可覆蓋: 地圖瀏覽:實現常見的地圖縮放、

ArcGIS Runtime SDK for Android 無法顯示釋出的地圖

通過ArcMap釋出瓦片圖層,可以通過js的api訪問地圖顯示,但無法使用Android API載入地圖,通過除錯發現缺少瓦片資訊 如圖所示,需要在arcgis/manager/service.html?name=服務名.MapServer頁面裡,修改快取設定,改為使用快取

ArcGIS Runtime SDK for .NET (WPF)實現三維場景

實現三維場景準備工作三維地圖被稱為場景。為在ArcGIS中實現三維場景展示,首先需安裝Esri公司ArcGIS_Runtime_SDK_DotNet_100_2_1地圖SDK。並在專案中引用Esri.ArcGISRuntime.dll。建立三維場景您可以使用XAML在設計時定

ArcGIS Runtime SDK for WPF 10.2.5下載

  Func<string, string> func = delegate(string s)                 {                     return Encoding.UTF8.GetString(Convert.FromBase64String(s).Rev

ArcGIS Runtime SDK for .NET 100.0中如何執行.gpk(二)

接上文,在編寫程式碼之前我們先回憶一下ArcMap中執行該指令碼工具的過程,首先我把一個Dem影像新增進來,然後我在該影像範圍內使用人機互動的方式畫了一條線,那麼我們在Runtime中也可以採用該思路:即首先載入該Dem影像(為了畫線時便於定位),然後map上畫

ArcGIS Runtime SDK for Android 入門(9):通過PictureMarkerSymbol建立點符號

    本文主要簡單講解如何通過本地或線上資源的方式使用SimpleMarkerSymbol建立簡單的圖片點符號。 實現步驟: 1.建立Android專案    2.新增Runtime SDK依賴 3.新增許可權及OpenGL ES支援 在AndroidMani

ArcGIS Runtime SDK for WPF 初始化

event obj env pub ebo als geb 還需要 art 安裝包 管理nuget包 Esri.ArcGISRuntime.WPF 也許還需要 Esri.ArcGISRuntime.Hydrography Esri.ArcGISRuntime.LocalSe

ArcGIS Runtime SDK for Android 授權(arcgis android 去除水印)

要下載和安裝 ArcGIS Runtime SDK for Android,您需要註冊開發者賬戶,進而便擁有了訪問所有功能的許可權,從而實現開發和測試目的。但是,這種情況下,應用程式中的所有地圖都具有水印,並且在debug訊息中顯示,您的應用程式僅可用於開發目的。