ArcGIS Runtime SDK for iOS开发之地图图层-动态地图服务层

本文深入探讨了ArcGIS中的动态地图服务层如何展示地图内容,并介绍了地图文档的概念及其在ArcGISServer中的应用。通过示例展示了如何使用URL创建动态图层,并说明了地图文档在发布地图服务时的重要作用。文章还提供了创建动态图层的两种方法,以及如何通过调整图层属性来自定义地图内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         ArcGIS中的动态地图服务层主要展示ArcGIS Server 地图服务中的地图内容。地图服务不能被缓存(或是被切片)。服务被图层请求时会生成地图图像。当用户对地图进行导航操作时,图层会请求显示新的地图图像。因为地图图像被动态创建,所以地图图像的内容可以通过修改某些层的属性来进行自定义。如果动态层的空间参考系和地图的不匹配,动态层将会自动重投影它的地图内容,使得其与地图的空间参考系相匹配。

       ArcGIS 地图服务是基于地图文档的(.mxd或.msd文件),而地图文档包含了地图中需要展示的要素。要素是世界的实体,如建筑物、管道和和包裹。要素被整合到图层中,如一个国家公园的地图文档可能包含远足旅行、野餐区、露营地和主要道路等图层。地图文档同时也包含了控制地图外观的信息,如符号、可视度、图层的比例范围等等。地图文档可以发布到ArcGIS Server中去创建地图服务。

       ArcGIS Server地图服务在SOAP网和REST网站服务上被访问。

       要实例化一个AGSDynamicMapServiceLayer,你需要给地图服务器的REST网络服务站点提供URL。URL的格式通常为:http://<服务器:端口>/实例/rest/services/<services>/MapServer.

NSURL* url = [NSURL URLWithString: @"http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer"];

AGSDynamicMapServiceLayer* layer = [AGSDynamicMapServiceLayer dynamicMapServiceLayerWithURL: url];

       另一种创建动态图层的方法是利用AGSMapServiceInfo对象来创建。首先要创建AGSMapServerInfo,然后用它创建一个图层。如果你想在创建图层前查看地图服务的属性,或者是想使图层具有不同的缺省设置,如图层的定义的可见度,那么显然这种方法是对你很有帮助的。 

NSURL* url = [NSURL URLWithString: @"http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/ Specialty/ESRI_StateCityHighway_USA/MapServer"];
NSError *error = nil; 
AGSMapServiceInfo *info = [AGSMapServiceInfo mapServiceInfoWithURL:url error:&error];

//inspect or modify the info object if you want
...;

AGSDynamicMapServiceLayer* layer = [AGSDynamicMapServiceLayer dynamicMapServiceLayerWithMapServiceInfo: info];

       创建AGSMapServerInfo 的过程是同步的,这意味着它会阻止线程的调用。所以你不应该在主线程上调用该方法,因为它会阻止你的应用程序响应用户的输入操作,使其显得呆滞。相反,应该在后台线程调用该方法。

创建图层后,你可以将其添加到地图中来显示其内容。当图层准备就绪后,它所包含的属性也将被开启。然后你就可以访问这些属性了。

if(layer.loaded){ 
 NSLog(@"Initial Envelope : %@", layer.initialEnvelope); 
}

        你可以通过改变一些属性来改变图层的地图内容,例如,你可以通过修改“visibleLayer”属性来指定服务中的哪些图层会被显示。

//only display ‘ushigh’ (id=0) and ‘states’ (id=1) layer 
layer.visibleLayers = @[@0,@1];

       你也可以通过指定图层的定义来选择仅显示你数据集中属性的子集。

//only display states beginning with 'C' 
int layerID = 1 ; 
NSString* defString = @"STATE_NAME like 'C%'";
AGSLayerDefinition* layerDef = [AGSLayerDefinition  layerDefinitionWithLayerId:layerID definition:defString];

layer.layerDefinitions = [NSArray arrayWithObject: layerDef];









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值