ArcGIS Runtime SDK for iOS之利用代码添加图层(Layers)

来源:互联网 发布:压缩感知 知乎 编辑:程序博客网 时间:2024/05/29 04:13

       注:本篇文章翻译于点击打开链接。

     这篇文章将向大家描述地图中的图层类型,并向你展示其在地图中的具体添加过程。同时概述当一个图层被加载到地图中时哪些代理会被调用。

       理论上,地图是由一系列图层构成的。地图在AGSMapView的组建中显示并能够被添加为应用程序的接口,所以,地图更像是一块儿空的画布,在上面可以进行一个或多个图层的绘制。图层以从底层到顶层的有序方式排列,从而使得后续图层渲染在先前的层上。每一层的引用数据存储在地图服务、瓦片服务等服务中,而不是存储地理数据。该API支持多种图层类型:瓦片层(tiled layers)、动态层(dynamic layers)、属性层(feature layers)、图层层(graphic layers)以及其他诸如图像层(image layers)、WMS 层(WMS layers)、Bing地图层等。

     在地图中添加图层

       要在地图中添加一个图层,需要做以下工作:

        1)初始化图层。如果该图层依托于网路服务,那就提供该服务的URL即可。如果该网络服务需要安全认证,那么就要获取相关凭证。

    URLWithString: @"http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"]; //url服务    AGSTiledMapServiceLayer* layer = [AGSTiledMapServiceLayer tiledMapServiceLayerWithURL: url]; 
         2)添加图层。利用addMapLayer:withName  的方法将图层添加到地图中去。由于不同图层在地中的绘制顺序是自下而上的,所以若想在特定的位置绘插入图层,你可以利用insertMapLayer:withName:atIndex:的方法实现。其中index为0时表示将图层插入到最底层。在添加或是插入图层时应保证图层名字的唯一性,后面你就可以利用该名字作为标识来追踪该图层。

   [mapView addMapLayer:layer withName:@"Streets"];

          验证图层被添加

          图层链接网络服务的过程是在后台进行的,这并不会妨碍图层被添加到地图中的进程。取决于网络连接情况,图层连接上网络服务器并获取需要的数据可能需要一段时间。

       当图层被成功加载后或是遇到错误时,它会通知它的代理(delegate)。代理得到这些事件中的任何一个通知时都会采用AGSLayerDelegate协议。

@interface MyViewController : UIViewController <AGSLayerDelegate>    ...@end
         代理(delegate)必须实现正在执行的操作的协议中定义的一个或多个方法。例如,当图层被成功加载时,代理(delegate)必须实现layerDidLoad:方法。类似的,当图层加载遇到错误时,代理将会被通知去实现didFailToLoadwithError:的方法。

@implementation MyViewController  - (void) layerDidLoad: (AGSLayer*) layer{  NSLog(@"Layer added successfully");     }   - (void) layer : (AGSLayer*) layer didFailToLoadwithError:(NSError*) error {     NSLog(@"Error: %@",error);  //Inspect the error and then either ...  //A. Remove the layer if it's not essential  if (layer !== self.mapView.baseLayer)    [self.mapView removeMapLayerWithName:@"the layer name"];  //B. Or, try resubmitting the layer, with different URL or credentials perhaps  AGSTiledMapServiceLayer* tiledLyr = (AGSTiledMapServiceLayer*)layer;  [tiledLyr resubmitWithURL:url credential:cred];  }@end
         最后,类的实例应被设置为图层的代理,这将建立类和图层之间的联系,在适当的时候这些代理方法将会在该类中被实现。
layer.delegate = self;
        一旦图层被成功加载,它的的内容就会显现在地图上,然后你就可以安全的访问图层的属性信息了。


 

      

0 0