序言
ArcGis是“計(jì)算機(jī)制圖”應(yīng)用胰坟,包含了全球范圍內(nèi)的底圖因篇、地圖數(shù)據(jù)、應(yīng)用程序笔横,以及可配置的應(yīng)用模板和開(kāi)發(fā)人員使用的 GIS 工具和 API竞滓,可用于創(chuàng)建 Web 地圖、發(fā)布GIS服務(wù)吹缔、共享地圖商佑、數(shù)據(jù)和應(yīng)用程序,以及管理組織的內(nèi)容和多個(gè)用戶(hù)厢塘。類(lèi)似百度地圖和高德地圖茶没。
準(zhǔn)備工作
1.去ArcGis 官網(wǎng)ArcGis開(kāi)發(fā)者中心注冊(cè)賬號(hào)
2.下載SDK 選擇對(duì)應(yīng)的應(yīng)用平臺(tái)ArcGIS Runtime SDK for iOS下載SDK
3.申請(qǐng)License key 去除水印
ArcGIS Online試用入口:https://www.arcgis.com/home/signin.html
Runtime 100 許可政策官方說(shuō)明:https://developers.arcgis.com/arcgis-runtime/licensing/
使用前一步注冊(cè)的online賬戶(hù)登陸,點(diǎn)擊lite下方的sign up按鈕登錄成功進(jìn)去就可以看到 Runtime Lite license key(有時(shí)間的完全去除水印就得購(gòu)買(mǎi))
SDK下載界面下載
安裝和設(shè)置
- 使用CocoaPods將SDK直接安裝到您的Xcode項(xiàng)目中晚碾。
- 手動(dòng)安裝SDK并配置Xcode項(xiàng)目抓半。
1、CocoaPods
1格嘁、將pod 'ArcGIS-Runtime-SDK-iOS', '100.8' 添加到項(xiàng)目的Podfile中
2笛求、使用終端應(yīng)用程序在Podfile上運(yùn)行命令pod install。這會(huì)將ArcGIS框架下載到您的計(jì)算機(jī)上糕簿,并將其放置在項(xiàng)目的Pod目錄中探入。它還將對(duì)項(xiàng)目的構(gòu)建設(shè)置進(jìn)行必要的更改,以正確引用ArcGIS框架并創(chuàng)建一個(gè)新的Xcode工作區(qū)(.xcworkspace文件)
3懂诗、要使用ArcGIS API蜂嗽,請(qǐng)打開(kāi)新創(chuàng)建的Xcode工作區(qū),并將以下導(dǎo)入語(yǔ)句添加到您的Objective-C標(biāo)頭(.h)或?qū)崿F(xiàn)(.m)代碼文件中的任何一個(gè):#import <ArcGIS/ArcGIS.h>
2响禽、手動(dòng)安裝SDK
- 從下載頁(yè)面下載SDK軟件包安裝程序
- 確保您具有$ {HOME} / Library文件夾的寫(xiě)權(quán)限徒爹。
- 如果您在此計(jì)算機(jī)上安裝了iOS的早期版本的ArcGIS Runtime SDK,請(qǐng)卸載它芋类。否則隆嗅,先前的安裝將被覆蓋。要卸載侯繁,請(qǐng)?jiān)诮K端應(yīng)用程序中運(yùn)行$ {HOME} / Library / Application Support / AGSiOSRuntimeSDK / uninstallAGSiOSSDK腳本胖喳。
- 下載SDK之后,雙擊下載的.pkg文件贮竟。在顯示的安裝向?qū)е欣龊福凑掌聊簧系恼f(shuō)明逐步操作面板较剃。
- 默認(rèn)情況下,SDK安裝在$ {HOME} / Library / SDKs / ArcGIS / iOS中技健。該文件夾包含兩個(gè)子文件夾-Frameworks和Samples写穴。您可以轉(zhuǎn)到Samples文件夾并運(yùn)行Objective-C或Swift示例,以確保所有內(nèi)容均已正確安裝在您的計(jì)算機(jī)上雌贱。
注意:
在$ {HOME} /庫(kù)文件夾默認(rèn)是隱藏的啊送。您可以通過(guò)在終端應(yīng)用程序中發(fā)出命令chflags nohidden?/ Library /取消隱藏它。
配置您的Xcode項(xiàng)目
如上所述手動(dòng)安裝SDK后欣孤,必須配置每個(gè)Xcode項(xiàng)目馋没,以便它可以使用API??。
- 將ArcGIS框架添加到項(xiàng)目中
-
添加運(yùn)行腳本階段
將ArcGIS框架添加到項(xiàng)目中
在左側(cè)導(dǎo)航器窗格中選擇項(xiàng)目節(jié)點(diǎn)降传,選擇一個(gè)目標(biāo)節(jié)點(diǎn)篷朵,然后選擇“ 常規(guī)”選項(xiàng)卡。單擊“ 框架婆排,庫(kù)和嵌入式內(nèi)容”部分中的加號(hào)(+)声旺,然后導(dǎo)航到$(HOME)/ Library / SDKs / ArcGIS / iOS / Frameworks / Dynamic目錄。選擇ArcGIS.framework文件將其添加泽论,如下所示
image.png
添加運(yùn)行腳本階段
切換到目標(biāo)設(shè)置的 Build Phases選項(xiàng)卡艾少,單擊+并選擇New Run Script Phase。然后粘貼以下文本:
bash“
{FRAMEWORKS_FOLDER_PATH} /ArcGIS.framework/strip-frameworks.sh”
image.png
地圖使用
在應(yīng)用程序中顯示地理信息的主要方法是通過(guò)地圖視圖翼悴。該API提供了一個(gè)稱(chēng)為地圖視圖(AGSMapView)的用戶(hù)界面(UI)組件缚够,可用于顯示地圖的內(nèi)容。該地圖由AGSMap對(duì)象表示鹦赎,該對(duì)象可用于定義地圖的底圖和操作圖層谍椅,或者您可以從ArcGIS Online或本地門(mén)戶(hù)打開(kāi)現(xiàn)有地圖。
[AGSArcGISRuntimeEnvironment setLicenseKey:@"申請(qǐng)的license key" error:&erro];
self.mapView.map = [[AGSMap alloc] initWithBasemapType:AGSBasemapTypeImageryWithLabels latitude: 34.056295 longitude: -117.195800 levelOfDetail: 16];
地圖指定了地理數(shù)據(jù)的組織方式以及應(yīng)如何將其傳達(dá)給您的應(yīng)用程序用戶(hù)古话。每個(gè)地圖實(shí)例(AGS Map)代表一個(gè)可以為用戶(hù)顯示的單獨(dú)地圖雏吭。要顯示地圖,您必須將其分配給地圖視圖(AGS MapView)陪踩。在MVC架構(gòu)中杖们,地圖代表模型層,而地圖視圖代表視圖層肩狂。地圖和地圖視圖一起工作以在屏幕上可視化地理數(shù)據(jù)摘完。
使用網(wǎng)絡(luò)地圖網(wǎng)址
@property (nonatomic, strong) AGSMap *map;
…
self.map = [[AGSMap alloc] initWithURL:[NSURL URLWithString:@"https://....."]];
在地圖視圖中顯示地圖
self.mapView.map = self.map;
使用web地址服務(wù)地圖
可以自己定制展示內(nèi)容 也可以找ArcGis官方購(gòu)買(mǎi)服務(wù)
//設(shè)置證書(shū)鑰匙 去官網(wǎng)申請(qǐng)
[AGSArcGISRuntimeEnvironment setLicenseKey:Arc_GIS_License_Key error:nil];
//加載地圖底圖圖層
AGSArcGISTiledLayer *tiledLayer = [[AGSArcGISTiledLayer alloc] initWithURL:[NSURL URLWithString:@"地圖地址"]];
//去除圖片水印
self.mapView.attributionTextVisible = NO;
//設(shè)置網(wǎng)格 顏色和寬度 以及方格的大小
self.mapView.backgroundGrid = [[AGSBackgroundGrid alloc] initWithColor:[UIColor colorWithRGBHex:0xD1D7DD] gridLineColor:[UIColor colorWithRGBHex:0xD1D7DD] gridLineWidth:0.0 gridSize:10.0];
//創(chuàng)建地圖
AGSBasemap *basemap = [[AGSBasemap alloc] initWithBaseLayer:tiledLayer];
self.map = [[AGSMap alloc] initWithBasemap:basemap];
//加載顯示地圖
self.mapView.map = self.map;
將地圖分配給地圖視圖會(huì)啟動(dòng)地圖的加載周期。該周期完成后傻谁,地圖視圖會(huì)在地圖圖層上啟動(dòng)加載周期以進(jìn)行繪制孝治。有關(guān)加載資源(加載周期)的更多信息,請(qǐng)參見(jiàn) 異步資源的可加載模式。您可以 使用地圖視圖的layerViewStateChangedHandler 監(jiān)視各個(gè)圖層的 加載 谈飒。
__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;
}
}];
增強(qiáng)用戶(hù)的地圖交互
當(dāng)您的用戶(hù)使用地圖視圖的觸摸委托方法與地圖交互時(shí)岂座,您可以提供其他功能。每個(gè)委托方法都在用戶(hù)與屏幕交互的位置返回屏幕坐標(biāo)和地圖坐標(biāo)杭措。您只需要在委托方法中添加代碼即可使用這些坐標(biāo)费什。
對(duì)于iOS,地圖視圖觸摸代表可用于在設(shè)備屏幕上點(diǎn)擊手素,長(zhǎng)按吕喘,移動(dòng)和強(qiáng)制觸摸。要啟用觸摸代表刑桑,您需要:
1、采用 AGSMapViewTouchDelegate協(xié)議募舟。
@interface ViewController : UIViewController <AGSMapViewTouchDelegate>
self.mapView.touchDelegate = self;
2祠斧、實(shí)現(xiàn)協(xié)議中定義的一種或多種方法。在此示例中拱礁,實(shí)現(xiàn)了地圖視圖的抽頭委托以顯示點(diǎn)在地圖上的位置琢锋。
#pragma - AGSGeoViewTouchDelegate
- (void)geoView:(AGSGeoView *)geoView didTapAtScreenPoint:(CGPoint)screenPoint mapPoint:(AGSPoint *)mapPoint {
//設(shè)置點(diǎn)擊周邊的范圍 為0代表只有點(diǎn)在圖標(biāo)上才能觸發(fā)
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) {
//獲取點(diǎn)擊圖標(biāo)傳參數(shù)
NSLog(@"***%@", graphic.attributes);
}
}
}];
}
顯示用戶(hù)的當(dāng)前位置
[self.mapView.locationDisplay startWithCompletion:^(NSError * _Nullable error) {
if (error != nil) {
NSLog(@"%@",error.localizedDescription);
}
else {
NSLog(@"Location Display Started");
}
}];
用戶(hù)定位,也可以通過(guò)蘋(píng)果api獲取經(jīng)緯度呢灶,通過(guò)點(diǎn)繪制的方式吴超,展示在Gis地圖上⊙炷耍可參考點(diǎn)制作方法鲸阻。
作為開(kāi)發(fā)人員,您可以通過(guò)調(diào)用地圖視圖的許多setViewpoint方法之一缨睡,以編程方式在應(yīng)用程序中設(shè)置地圖的可見(jiàn)區(qū)域
地圖上繪制點(diǎn) 線(xiàn)
/// 地圖繪制渲染層
- (AGSGraphicsOverlay *)graphicsOverlay {
if (!_graphicsOverlay) {
_graphicsOverlay = [[AGSGraphicsOverlay alloc] init];
[self.mapView.graphicsOverlays addObject:_graphicsOverlay];
}
return _graphicsOverlay;
}
要繪制的點(diǎn)和線(xiàn)添加在上面的圖層
//添加
AGSGraphic *grcphic = [JXArcGisHelper createBigMapPointMarkGraphic:tage];
[self.graphicsOverlay.graphics addObject:grcphic];
//移除
[self.graphicsOverlay.graphics removeAllObjects];
點(diǎn)的創(chuàng)建
//確定大頭針位置
AGSPoint *point = [AGSPoint pointWithX:[post.lng doubleValue] y:[post.lat doubleValue] spatialReference:[AGSSpatialReference WGS84]];
//要展示的圖片
UIImage *image = [UIImage imageNamed:pionImageName];
AGSPictureMarkerSymbol *pictureMarkerSymbol = [AGSPictureMarkerSymbol pictureMarkerSymbolWithImage:image];
//設(shè)置屬性值 用于傳參 在代理方法中可以獲取到
AGSGraphic *graphic = [[AGSGraphic alloc] initWithGeometry:point symbol:pictureMarkerSymbol attributes:@{@"ID":[WTTool removeNull:taget.projectId],@"markType":@"point"}];
線(xiàn)段繪制
//創(chuàng)建線(xiàn)段構(gòu)建
AGSPolylineBuilder *boatRoute = [AGSPolylineBuilder polylineBuilderWithSpatialReference:[AGSSpatialReference WGS84]];
//添加線(xiàn)段點(diǎn)
for (JXTaskTargetPostion *post in postArr) {
AGSPoint *point = [AGSPoint pointWithX:[post.lng doubleValue] y:[post.lat doubleValue] spatialReference:[AGSSpatialReference WGS84]];
[boatRoute addPoint:point];
}
//線(xiàn)段對(duì)象 線(xiàn)段寬度和顏色
AGSSimpleLineSymbol *lineSymbol = [AGSSimpleLineSymbol simpleLineSymbolWithStyle:AGSSimpleLineSymbolStyleSolid
color:[UIColor colorWithHexString:[WTTool removeNull:taget.color]]
width:2.0];
//線(xiàn)段圖層 可以設(shè)置線(xiàn)段樣式 實(shí)線(xiàn) 虛線(xiàn) 也可以設(shè)置參數(shù)attributes
AGSGraphic *graphic = [[AGSGraphic alloc] initWithGeometry:[boatRoute toGeometry] symbol:lineSymbol attributes:@{@"ID":[WTTool removeNull:taget.projectId],@"markType":@"line"}];
設(shè)置點(diǎn)和線(xiàn)的最佳視野展示
//計(jì)算展示點(diǎn)的范圍 分別取最大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];
//設(shè)置展示的地圖范圍
[self.mapView setViewpointGeometry:envelope padding:20 completion:^(BOOL finished) {
}];
地圖進(jìn)行縮放處理
//設(shè)定縮放比例
// self.mapView.mapScale 獲取當(dāng)前地圖比例 只讀參數(shù)
[self.mapView setViewpointScale:self.mapView.mapScale * 2.0 completion:^(BOOL finished) {
}];
注意:對(duì)于地圖的比例值鸟悴,值越小地圖在放大 ,值越大地圖在縮小
設(shè)定地圖的中心和比例
[self.mapView setViewpointCenter:[[AGSPoint alloc] initWithCLLocationCoordinate2D:BDManager.shareBDManager.coordinate] scale:self.mapView.mapScale completion:^(BOOL finished) {
}];
地圖縮放比例的監(jiān)聽(tīng)
//監(jiān)聽(tīng)縮放地圖
[self.mapView setViewpointChangedHandler:^{
NSLog(@"%f", selfWeak.mapView.mapScale);
}];
點(diǎn)聚合功能
百度地圖有api接口夕膀,目前沒(méi)發(fā)現(xiàn)Gis有掀淘,我采用本地組合聚合點(diǎn)绿贞,導(dǎo)出圖片填充方式,監(jiān)聽(tīng)地圖縮放比例震贵,實(shí)現(xiàn)展示聚合點(diǎn)還是詳細(xì)點(diǎn)。
坐標(biāo)系轉(zhuǎn)換問(wèn)題
1.地球坐標(biāo) (WGS84)
國(guó)際標(biāo)準(zhǔn)水评,從GPS設(shè)備中取出的數(shù)據(jù)的坐標(biāo)系
國(guó)際地圖提供商使用的坐標(biāo)系
2.火星坐標(biāo) (GCJ-02) 也叫國(guó)測(cè)局坐標(biāo)系
中國(guó)標(biāo)準(zhǔn)猩系,從國(guó)行移動(dòng)設(shè)備中定位獲取的坐標(biāo)數(shù)據(jù)使用這個(gè)坐標(biāo)系
國(guó)家規(guī)定: 國(guó)內(nèi)出版的各種地圖系統(tǒng)(包括電子形式),必須至少采用GCJ-02對(duì)地理位置進(jìn)行首次加密之碗。高德地圖蝙眶、騰訊地圖使用
3.百度坐標(biāo) (BD-09)
百度標(biāo)準(zhǔn),百度 SDK,百度地圖幽纷,Geocoding 使用
百度在火星坐標(biāo)上進(jìn)行了二次加密
根據(jù)你使用地圖底圖采用的坐標(biāo)系式塌,進(jìn)行相應(yīng)的坐標(biāo)系轉(zhuǎn)換處理。不會(huì)展示會(huì)有偏差友浸。