前段时间开发了一个小项目,其中用到了arcgis地图,之前没怎么接触过,但是项目得继续,没办法,现买现卖,期间也遇到了好多问题,在这里整理一下个人开发过程中遇到的问题,也希望能帮助一些朋友少走弯路。事先声明,由于个人能力有限,其中肯定会有错误疏漏的地方,欢迎大神批评指正。
如果在项目想用arcgis,首先得安装AGSRuntimeSDKiOSv10.2.4.pkg,这个是在官网有下载,不过可能得翻墙,我在我的资源下载里面有,这是链接地址http://download.youkuaiyun.com/detail/luthan/8313475
安装完成之后还需要配置一下开发环境,优快云有一个叫“Esri中国”的大牛写得关于Arcgis for iOS的系列教程,写得非常好,本人当初正是学习了人家的教程,哈哈,这个是关于环境配置的文章http://blog.youkuaiyun.com/arcgis_all/article/details/8232880,我就不画蛇添足了。
一 图层筛选
关于图层的加载和显示其实都很简单,我遇到的第一个问题是如果对已经加载的动态图层进行查询筛选显示。说通俗一下就是,比如动态图层是全国人口分布图,现在我只想要显示某个省份的人口分布图,这种情况下就需要为AGSDynamicMapServiceLayer定义一个AGSLayerDefinition参数
NSURL *dynamicURL =[NSURL URLWithString:XXX]; //这个url是动态图层的url
AGSDynamicMapServiceLayer *dynamicLyr =[AGSDynamicMapServiceLayer dynamicMapServiceLayerWithURL:dynamicURL];
NSString *str =@"WHERE province= ‘上海’;
AGSLayerDefinition *dif = [[AGSLayerDefinition alloc]initWithLayerId:0 definition:str];
dynamicLyr.layerDefinitions = [NSArray arrayWithObjects:dif, nil];
其中NSString *str =@"WHERE province= ‘上海’;这是个查询的sql语句,这个要根据服务器的数据库的具体字段情况而定。
二点击查询
还有一个问题就是实现点击查询,比如当点击地图上的某一点的时候,查询该点的人口分布数据。
这种情况下要用到AGSIdentifyTask这个查询类,声明实现AGSMapViewTouchDelegate这个代理。这里面可以查询当前点击的点位或者离当前点位最近的点位的数据。
self.identifyTask=[AGSIdentifyTask identifyTaskWithURL:[NSURL URLWithString:XXX]];这个url是动态图层的url
self.identifyTask.delegate = self;
#pragma AGSMapViewTouchDelegate
- (void)mapView:(AGSMapView *)mapView didClickAtPoint:(CGPoint)screen mapPoint:(AGSPoint *)mappoint features:(NSDictionary *)features
{
AGSIdentifyParameters *params = [AGSIdentifyParameters identifyParameters];
params.tolerance = 80;
params.dpi = 98;
params.layerIds = [NSArray arrayWithObject:[NSNumber numberWithInt:0]];这个layerid是根据图层的具体情况而定的
params.layerOption = AGSIdentifyParametersLayerOptionAll;
params.geometry = (AGSGeometry *)mappoint;
params.spatialReference = self.mapView.spatialReference;
params.size = self.mapView.frame.size;
params.mapEnvelope = self.mapView.visibleAreaEnvelope;
[self.identifyTask executeWithParameters:params];
}
#pragma AGSIdentifyTaskDelegate
- (void)identifyTask:(AGSIdentifyTask *)identifyTask operation:(NSOperation*)op didExecuteWithIdentifyResults:(NSArray *)results
{
NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];
for (AGSIdentifyResult *obj in results)
{
NSDictionary *dic=[obj.feature allAttributes];
IdentifyObject *result = [[<span style="font-family: 'Adobe Song Std'; -webkit-text-stroke-width: initial;">IdentifyObject </span>alloc]init];//此处的<span style="font-family: 'Adobe Song Std'; -webkit-text-stroke-width: initial;">IdentifyObject</span>是自己定义的实体类。
[result setupDataWithDictionary:dic];
[array addObject:result];
}
}
三 关键字查询
根据关键字查询地图上的地址等相关信息
这种情况下要用到AGSFindTask,并且是基于底图图层查询
NSURL *url_Dynamic =[NSURL URLWithString:KMapURL];
self.findTask = [AGSFindTask findTaskWithURL:url_Dynamic];
self.findTask.delegate = self;
AGSFindParameters *parameters = [[AGSFindParameters alloc]init];
parameters.layerIds = [NSArray arrayWithObjects:[NSNumber numberWithInt:0], [NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3],…nil];//此处可根据需要添加对应的图层
parameters.searchFields = [NSArray arrayWithObjects:@"address", nil];//这里是数据库中要查询的字段名称,可不添加
parameters.returnGeometry = YES;
parameters.searchText =“这里是要查询的关键字”;
[self.findTask executeWithParameters:parameters];
#pragma agsfindtaskdelegate
- (void)findTask:(AGSFindTask *)findTask operation:(NSOperation*)op didExecuteWithFindResults:(NSArray *)results { if (results.count) { [self.resultArray removeAllObjects]; [self.resultArray addObjectsFromArray:results]; } }
若要是想在地图上显示查询到的某个地点
AGSFindResult *obj= self.resultArray[i];
AGSGraphic *graphic = obj.feature;
AGSGeometry *geometry = graphic.geometry;
AGSEnvelope *envelope = geometry.envelope;
AGSPoint *point = envelope.center;
AGSPictureMarkerSymbol *markerSymbol = [AGSPictureMarkerSymbol pictureMarkerSymbolWithImageNamed:@"image"];
AGSGraphic *op = [[AGSGraphic alloc]initWithGeometry:point symbol:markerSymbol attributes:nil];
AGSGraphicsLayer *graphicsLayer = [[AGSGraphicsLayer alloc]initWithFullEnvelope:chinaenv];
[self.mapView addMapLayer:graphicsLayer withName:@"identify"];
[graphicsLayer addGraphic:op];
这就显示出来了