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];