您的位置:首页 > 移动开发 > IOS开发

ArcGIS for iOS 开发系列(4) – 基础篇-地图组件

2012-10-10 19:03 323 查看
    在“Hello World Map”里我们已经成功加载了地图,以前没接触过GIS的同学先得补一补功课,起码要了解空间对象和数据模型的基本概念。常见的地图服务,其背后都有一个地图文档(*.mxd或*.msd),文档中有很多页(图层Layer),每页上又有许多空间要素(点、线、面)可能对应了现实世界中的水井、道路、绿地等等,同时地图文档中还保存了可见性、符号化、比例尺等很多配置信息,用于控制地图的最终呈现效果。    

    MapView是地图最基本的容器,负责地图展示和用户交互,因此AGSMapView也是最重要的类,它提供了一系列接口帮助开发者轻松叠加不同的空间数据、漫游地图、显示信息等等。

1.加载图层

    “Hello World Map”示例中叠加了两个图层,分别是基础底图图层(切片地图服务)和人口分布地图图层(动态地图服务),添加的方法很简单,其中Name参数是Layer的唯一标示,不能重名:

//按+1顺序添加图层
[self.mapView addMapLayer:tiledLyrwithName:@"TiledLayer"];
//按指定顺序插入图层
[self.mapView insertMapLayer:tiledLyrwithName:@"TiledLayer0" atIndex: 0];
//按名称删除指定图层
[self.mapViewremoveMapLayerwithName:@"TiledLayer"];

    看得出来,MapView中图层绘制的顺序是自下而上,第一个加载的图层意义比较特殊,常称为BaseMapLayer,它将初始化整个地图容器的空间参考(Spatial reference)、初始范围(Initial extent)和全图范围(Full extent),这很关键,因为如果接下来添加的图层空间参考不同,该图层就显示不出来(动态图层除外,可以重投影),那怎么知道是否加载成功?需要引用一个重要的协议:AGSMapLayerDelegate,图层消息委托,会在下一节中详细介绍。

    目前支持的图层类型包括了:

·         切片地图服务图层(AGSTiledMapServiceLayer)

·         动态地图服务图层(AGSDynamicMapServiceLayer)

·         影像服务图层(AGSImageServiceLayer)

·         要素服务图层(AGSFeatureLayer)

·         微软Bing服务图层(AGSBingMapLayer)

·         OSM服务图层(AGSOpenStreetMapLayer)

·         WMS服务图层(AGSWMSLayer)

·         离线切片服务图层(AGSLocalTiledLayer)

·         自定义切片服务图层(OfflineTiledLayer)

·         图形图层(AGSGraphicLayer)

·         草图绘制图层(AGSSketchLayer)

    这里先了解一下ArcGIS for iOS支持的图层类型,具体都干嘛使的,下一章再详细介绍;此外还有一种新型的智能地图类型:WebMap,也会单独介绍。

2.图层控制

    地图每添加一个图层,MapView容器里就对应添加一个子视图,如果你希望控制该图层的可见性、透明度等参数,可以自己显式声明一个UIView,让其引用AGSLayerView协议,然后控制这个UIView就行了,如下:

//获取图层视图引用
UIView<AGSLayerView> *LyrView =[self.mapViewaddMapLayer: LyrwithName:@"PopulationLayer"];
//设置图层透明度
LyrView.alpha = 0.3;
//设置图层可见性
LyrView.hidden = NO;
//操作地图的同时允许绘制数据,会增加CPU消耗,建议仅对基础地图图层使用
LyrView.drawDuringPanning = YES;
LyrView.drawDuringZooming = YES;


3.显示范围

    地图显示范围,默认是BaseMapLayer的全图范围,预先可以构建一个AGSEnvelope对象,并直接放大到该范围:

//设定地图初始化显示范围为中国
AGSEnvelope *chinaEnv = [AGSEnvelopeenvelopeWithXmin:7800000.00
ymin:44000.00
xmax:15600000.00
ymax:7500000.00
spatialReference:self.mapView.spatialReference];
[self.mapViewzoomToEnvelope:chinaEnvanimated:YES];


 *缩放到的几何区域其空间参考必须和地图一致

  地图还可以按指定点进行居中显示://居中显示
AGSPoint *newPoint = [AGSPoint pointWithX:-93.032201 y:49.636213 spatialReference:self.mapView.spatialReference];
[self.mapView centerAtPoint:newPoint animated:NO];

    另外属性visibleArea(取代了原来的envelope)返回结果是当前地图的外接矩形:

AGSPolygon* mapExtent = self.mapView.visibleArea;


    而属性MaxEnvelope可以设定地图的最大显示范围,所有操作都无能超该范围:

self.mapView.maxEnvelope = mapExtent.envelope;


4 支持的手势

    MapView默认会响应以下手势操作:

表3-2-1 地图支持的手势

手势
地图响应
轻划(Swipe)

平移
撑开(Pinch-Out)

放大
捏合(Pinch-In)

缩小
点击(Tap)

查看
常按(Long Press)

启用放大镜
双击(Double Tap)

放大
两点点击(Two finger Tap)

缩小
两点转动(Two finger Twist)*

旋转
*地图旋转前提是MapView的allowRotationByPinching属性为YES。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐