序言
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下载界面下载
安装和设置
- 使用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
- 从下载页面下载SDK软件包安装程序
- 确保您具有$ {HOME} / Library文件夹的写权限。
- 如果您在此计算机上安装了iOS的早期版本的ArcGIS Runtime SDK,请卸载它。否则,先前的安装将被覆盖。要卸载,请在终端应用程序中运行$ {HOME} / Library / Application Support / AGSiOSRuntimeSDK / uninstallAGSiOSSDK脚本。
- 下载SDK之后,双击下载的.pkg文件。在显示的安装向导中,按照屏幕上的说明逐步操作面板。
- 默认情况下,SDK安装在$ {HOME} / Library / SDKs / ArcGIS / iOS中。该文件夹包含两个子文件夹-Frameworks和Samples。您可以转到Samples文件夹并运行Objective-C或Swift示例,以确保所有内容均已正确安装在您的计算机上。
注意:
在$ {HOME} /库文件夹默认是隐藏的。您可以通过在终端应用程序中发出命令chflags nohidden〜/ Library /取消隐藏它。
配置您的Xcode项目
如上所述手动安装SDK后,必须配置每个Xcode项目,以便它可以使用API。
- 将ArcGIS框架添加到项目中
-
添加运行脚本阶段
将ArcGIS框架添加到项目中
在左侧导航器窗格中选择项目节点,选择一个目标节点,然后选择“ 常规”选项卡。单击“ 框架,库和嵌入式内容”部分中的加号(+),然后导航到$(HOME)/ Library / SDKs / ArcGIS / iOS / Frameworks / Dynamic目录。选择ArcGIS.framework文件将其添加,如下所示
添加运行脚本阶段
切换到目标设置的 Build Phases选项卡,单击+并选择New Run Script Phase。然后粘贴以下文本:
bash“ {FRAMEWORKS_FOLDER_PATH} /ArcGIS.framework/strip-frameworks.sh”
地图使用
在应用程序中显示地理信息的主要方法是通过地图视图。该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地址服务地图
可以自己定制展示内容 也可以找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 使用
百度在火星坐标上进行了二次加密
根据你使用地图底图采用的坐标系,进行相应的坐标系转换处理。不会展示会有偏差。