Arcgis for iOS开发笔记(一)

        前段时间开发了一个小项目,其中用到了arcgis地图,之前没怎么接触过,但是项目得继续,没办法,现买现卖,期间也遇到了好多问题,在这里整理一下个人开发过程中遇到的问题,也希望能帮助一些朋友少走弯路。事先声明,由于个人能力有限,其中肯定会有错误疏漏的地方,欢迎大神批评指正。

        如果在项目想用arcgis,首先得安装AGSRuntimeSDKiOSv10.2.4.pkg,这个是在官网有下载,不过可能得翻墙,我在我的资源下载里面有,这是链接地址http://download.csdn.net/detail/luthan/8313475

        安装完成之后还需要配置一下开发环境,CSDN有一个叫“Esri中国”的大牛写得关于Arcgis for iOS的系列教程,写得非常好,本人当初正是学习了人家的教程,哈哈,这个是关于环境配置的文章http://blog.csdn.net/arcgis_all/article/details/8232880,我就不画蛇添足了。

一 图层筛选

          关于图层的加载和显示其实都很简单,我遇到的第一个问题是如果对已经加载的动态图层进行查询筛选显示。说通俗一下就是,比如动态图层是全国人口分布图,现在我只想要显示某个省份的人口分布图,这种情况下就需要为AGSDynamicMapServiceLayer定义一个AGSLayerDefinition参数

        NSURL *dynamicURL =[NSURL URLWithString:XXX]; //这个url是动态图层的urlAGSDynamicMapServiceLayer *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是动态图层的urlself.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 = [[IdentifyObject alloc]init];//此处的IdentifyObject是自己定义的实体类。[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];

这就显示出来了


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部