ArcGIS for iOS 100.8.0 安裝使用教程

序言

ArcGis是“計算機制圖”應用,包含了全球范圍內的底圖、地圖數據、應用程序,以及可配置的應用模板和開發人員使用的 GIS 工具和 API,可用于創建 Web 地圖、發布GIS服務、共享地圖、數據和應用程序,以及管理組織的內容和多個用戶。類似百度地圖和高德地圖。

準備工作

1.去ArcGis 官網ArcGis開發者中心注冊賬號
2.下載SDK 選擇對應的應用平臺ArcGIS Runtime SDK for iOS下載SDK
3.申請License key 去除水印

ArcGIS Online試用入口:https://www.arcgis.com/home/signin.html
Runtime 100 許可政策官方說明:https://developers.arcgis.com/arcgis-runtime/licensing/
使用前一步注冊的online賬戶登陸,點擊lite下方的sign up按鈕登錄成功進去就可以看到 Runtime Lite license key(有時間的完全去除水印就得購買)

SDK下載界面下載

image.png

安裝和設置

  • 使用CocoaPods將SDK直接安裝到您的Xcode項目中。
  • 手動安裝SDK并配置Xcode項目。
    1、CocoaPods

1、將pod 'ArcGIS-Runtime-SDK-iOS', '100.8' 添加到項目的Podfile中
2、使用終端應用程序在Podfile上運行命令pod install。這會將ArcGIS框架下載到您的計算機上,并將其放置在項目的Pod目錄中。它還將對項目的構建設置進行必要的更改,以正確引用ArcGIS框架并創建一個新的Xcode工作區(.xcworkspace文件)
3、要使用ArcGIS API,請打開新創建的Xcode工作區,并將以下導入語句添加到您的Objective-C標頭(.h)或實現(.m)代碼文件中的任何一個:#import <ArcGIS/ArcGIS.h>

2、手動安裝SDK

  1. 下載頁面下載SDK軟件包安裝程序
  2. 確保您具有$ {HOME} / Library文件夾的寫權限。
  3. 如果您在此計算機上安裝了iOS的早期版本的ArcGIS Runtime SDK,請卸載它。否則,先前的安裝將被覆蓋。要卸載,請在終端應用程序中運行$ {HOME} / Library / Application Support / AGSiOSRuntimeSDK / uninstallAGSiOSSDK腳本。
  4. 下載SDK之后,雙擊下載的.pkg文件。在顯示的安裝向導中,按照屏幕上的說明逐步操作面板。
  5. 默認情況下,SDK安裝在$ {HOME} / Library / SDKs / ArcGIS / iOS中。該文件夾包含兩個子文件夾-Frameworks和Samples。您可以轉到Samples文件夾并運行Objective-C或Swift示例,以確保所有內容均已正確安裝在您的計算機上。

注意:
在$ {HOME} /庫文件夾默認是隱藏的。您可以通過在終端應用程序中發出命令chflags nohidden?/ Library /取消隱藏它。

配置您的Xcode項目

如上所述手動安裝SDK后,必須配置每個Xcode項目,以便它可以使用API??。

  1. 將ArcGIS框架添加到項目中
  2. 添加運行腳本階段
    將ArcGIS框架添加到項目中
    在左側導航器窗格中選擇項目節點,選擇一個目標節點,然后選擇“ 常規”選項卡。單擊“ 框架,庫和嵌入式內容”部分中的加號(+),然后導航到$(HOME)/ Library / SDKs / ArcGIS / iOS / Frameworks / Dynamic目錄。選擇ArcGIS.framework文件將其添加,如下所示
    image.png

    添加運行腳本階段
    切換到目標設置的 Build Phases選項卡,單擊+并選擇New Run Script Phase。然后粘貼以下文本:

bash“ {BUILT_PRODUCTS_DIR} / {FRAMEWORKS_FOLDER_PATH} /ArcGIS.framework/strip-frameworks.sh”

image.png

地圖使用

在應用程序中顯示地理信息的主要方法是通過地圖視圖。該API提供了一個稱為地圖視圖(AGSMapView)的用戶界面(UI)組件,可用于顯示地圖的內容。該地圖由AGSMap對象表示,該對象可用于定義地圖的底圖和操作圖層,或者您可以從ArcGIS Online或本地門戶打開現有地圖。

[AGSArcGISRuntimeEnvironment setLicenseKey:@"申請的license key" error:&erro];
self.mapView.map = [[AGSMap alloc] initWithBasemapType:AGSBasemapTypeImageryWithLabels latitude: 34.056295  longitude: -117.195800 levelOfDetail: 16];

地圖指定了地理數據的組織方式以及應如何將其傳達給您的應用程序用戶。每個地圖實例(AGS Map)代表一個可以為用戶顯示的單獨地圖。要顯示地圖,您必須將其分配給地圖視圖(AGS MapView)。在MVC架構中,地圖代表模型層,而地圖視圖代表視圖層。地圖和地圖視圖一起工作以在屏幕上可視化地理數據。

使用網絡地圖網址

@property (nonatomic, strong) AGSMap *map;
…
self.map = [[AGSMap alloc] initWithURL:[NSURL URLWithString:@"https://....."]];

在地圖視圖中顯示地圖

self.mapView.map = self.map;

使用web地址服務地圖

image.png

可以自己定制展示內容 也可以找ArcGis官方購買服務

   //設置證書鑰匙 去官網申請
    [AGSArcGISRuntimeEnvironment setLicenseKey:Arc_GIS_License_Key error:nil];
  //加載地圖底圖圖層
    AGSArcGISTiledLayer *tiledLayer = [[AGSArcGISTiledLayer alloc] initWithURL:[NSURL URLWithString:@"地圖地址"]];
  //去除圖片水印
    self.mapView.attributionTextVisible = NO;
//設置網格 顏色和寬度 以及方格的大小
    self.mapView.backgroundGrid = [[AGSBackgroundGrid alloc] initWithColor:[UIColor colorWithRGBHex:0xD1D7DD] gridLineColor:[UIColor colorWithRGBHex:0xD1D7DD] gridLineWidth:0.0 gridSize:10.0];
//創建地圖
    AGSBasemap *basemap = [[AGSBasemap alloc] initWithBaseLayer:tiledLayer];
    self.map = [[AGSMap alloc] initWithBasemap:basemap];
//加載顯示地圖
    self.mapView.map = self.map;

將地圖分配給地圖視圖會啟動地圖的加載周期。該周期完成后,地圖視圖會在地圖圖層上啟動加載周期以進行繪制。有關加載資源(加載周期)的更多信息,請參見 異步資源的可加載模式。您可以 使用地圖視圖的layerViewStateChangedHandler 監視各個圖層的 加載 。

__weak __typeof(self) weakSelf = self;

[self.map loadWithCompletion:^(NSError * _Nullable error) {
 if (error != nil) {
  NSLog(@"%@",error.localizedDescription);
 }
 else {
  if (weakSelf.map.bookmarks.count > 0) {
   //display the bookmarks
  }
  weakSelf.mapView.map = weakSelf.map;
 }
}];

增強用戶的地圖交互

當您的用戶使用地圖視圖的觸摸委托方法與地圖交互時,您可以提供其他功能。每個委托方法都在用戶與屏幕交互的位置返回屏幕坐標和地圖坐標。您只需要在委托方法中添加代碼即可使用這些坐標。

對于iOS,地圖視圖觸摸代表可用于在設備屏幕上點擊,長按,移動和強制觸摸。要啟用觸摸代表,您需要:

1、采用 AGSMapViewTouchDelegate協議。

@interface ViewController : UIViewController <AGSMapViewTouchDelegate>
self.mapView.touchDelegate = self;

2、實現協議中定義的一種或多種方法。在此示例中,實現了地圖視圖的抽頭委托以顯示點在地圖上的位置。

#pragma - AGSGeoViewTouchDelegate
- (void)geoView:(AGSGeoView *)geoView didTapAtScreenPoint:(CGPoint)screenPoint mapPoint:(AGSPoint *)mapPoint {
  //設置點擊周邊的范圍   為0代表只有點在圖標上才能觸發
  double tolerance = 44;
  BIWeakObj(self)
 [self.mapView identifyGraphicsOverlay:self.graphicsOverlay
      screenPoint:screenPoint
      tolerance:tolerance
      returnPopupsOnly:false
      completion:^(AGSIdentifyGraphicsOverlayResult * _Nonnull identifyResult) {
         if (identifyResult.error) {
             NSLog(@"Error while identifying : %@", identifyResult.error);
         } else {
             for (AGSGraphic *graphic in identifyResult.graphics) {
                 //獲取點擊圖標傳參數
                 NSLog(@"***%@", graphic.attributes);
             }
         }
     }];
}

顯示用戶的當前位置

[self.mapView.locationDisplay startWithCompletion:^(NSError * _Nullable error) {
 if (error != nil) {
  NSLog(@"%@",error.localizedDescription);
 }
 else {
  NSLog(@"Location Display Started");
 }
}];

用戶定位,也可以通過蘋果api獲取經緯度,通過點繪制的方式,展示在Gis地圖上。可參考點制作方法。

作為開發人員,您可以通過調用地圖視圖的許多setViewpoint方法之一,以編程方式在應用程序中設置地圖的可見區域

地圖上繪制點 線

/// 地圖繪制渲染層
- (AGSGraphicsOverlay *)graphicsOverlay {
    if (!_graphicsOverlay) {
        _graphicsOverlay = [[AGSGraphicsOverlay alloc] init];
        [self.mapView.graphicsOverlays addObject:_graphicsOverlay];
    }
    return _graphicsOverlay;
}

要繪制的點和線添加在上面的圖層

//添加
 AGSGraphic *grcphic = [JXArcGisHelper createBigMapPointMarkGraphic:tage];
 [self.graphicsOverlay.graphics addObject:grcphic];
//移除
[self.graphicsOverlay.graphics removeAllObjects];

點的創建

//確定大頭針位置
AGSPoint *point = [AGSPoint pointWithX:[post.lng doubleValue] y:[post.lat doubleValue] spatialReference:[AGSSpatialReference WGS84]];
//要展示的圖片
UIImage *image = [UIImage imageNamed:pionImageName];
AGSPictureMarkerSymbol *pictureMarkerSymbol  = [AGSPictureMarkerSymbol pictureMarkerSymbolWithImage:image];
//設置屬性值  用于傳參  在代理方法中可以獲取到
    AGSGraphic *graphic = [[AGSGraphic alloc] initWithGeometry:point symbol:pictureMarkerSymbol attributes:@{@"ID":[WTTool removeNull:taget.projectId],@"markType":@"point"}];

線段繪制

    //創建線段構建
    AGSPolylineBuilder *boatRoute = [AGSPolylineBuilder polylineBuilderWithSpatialReference:[AGSSpatialReference WGS84]];
   //添加線段點
    for (JXTaskTargetPostion *post in postArr) {
        AGSPoint *point = [AGSPoint pointWithX:[post.lng doubleValue] y:[post.lat doubleValue] spatialReference:[AGSSpatialReference WGS84]];
        [boatRoute addPoint:point];
    }
    //線段對象  線段寬度和顏色
    AGSSimpleLineSymbol *lineSymbol = [AGSSimpleLineSymbol simpleLineSymbolWithStyle:AGSSimpleLineSymbolStyleSolid
                                                                               color:[UIColor colorWithHexString:[WTTool removeNull:taget.color]]
                                                                               width:2.0];
//線段圖層  可以設置線段樣式 實線 虛線   也可以設置參數attributes
   AGSGraphic *graphic = [[AGSGraphic alloc] initWithGeometry:[boatRoute toGeometry] symbol:lineSymbol attributes:@{@"ID":[WTTool removeNull:taget.projectId],@"markType":@"line"}];

設置點和線的最佳視野展示

//計算展示點的范圍  分別取最大X 最小X  最大Y  最小Y
AGSEnvelope *envelope = [[AGSEnvelope alloc] initWithXMin:[JXArcGisHelper arcGetMinXWithArray:self.pointsArray] yMin:[JXArcGisHelper arcGetMinYWithArray:self.pointsArray] xMax:[JXArcGisHelper arcGetMaxXWithArray:self.pointsArray] yMax:[JXArcGisHelper arcGetMaxYWithArray:self.pointsArray] spatialReference:AGSSpatialReference.WGS84];
//設置展示的地圖范圍
[self.mapView setViewpointGeometry:envelope padding:20 completion:^(BOOL finished) {
        }];

地圖進行縮放處理

//設定縮放比例  
// self.mapView.mapScale  獲取當前地圖比例  只讀參數
[self.mapView setViewpointScale:self.mapView.mapScale * 2.0 completion:^(BOOL finished) {
        
    }];

注意:對于地圖的比例值,值越小地圖在放大 ,值越大地圖在縮小

設定地圖的中心和比例

[self.mapView setViewpointCenter:[[AGSPoint alloc] initWithCLLocationCoordinate2D:BDManager.shareBDManager.coordinate] scale:self.mapView.mapScale completion:^(BOOL finished) {
              
          }];

地圖縮放比例的監聽

//監聽縮放地圖
[self.mapView setViewpointChangedHandler:^{
        NSLog(@"%f", selfWeak.mapView.mapScale);
    }];

點聚合功能

百度地圖有api接口,目前沒發現Gis有,我采用本地組合聚合點,導出圖片填充方式,監聽地圖縮放比例,實現展示聚合點還是詳細點。

坐標系轉換問題

1.地球坐標 (WGS84)
國際標準,從GPS設備中取出的數據的坐標系
國際地圖提供商使用的坐標系
2.火星坐標 (GCJ-02) 也叫國測局坐標系
中國標準,從國行移動設備中定位獲取的坐標數據使用這個坐標系
國家規定: 國內出版的各種地圖系統(包括電子形式),必須至少采用GCJ-02對地理位置進行首次加密。高德地圖、騰訊地圖使用
3.百度坐標 (BD-09)
百度標準,百度 SDK,百度地圖,Geocoding 使用
百度在火星坐標上進行了二次加密

根據你使用地圖底圖采用的坐標系,進行相應的坐標系轉換處理。不會展示會有偏差。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374