ArcGIS影像服务层主要展示由ArcGIS Sever图像服务提供的图像和其它类型的栅格数据。
ArcGIS影像服务层是一个动态图层。当用户导航地图时,它将请求新的地图影像。由于当图层请求新的地图影像时,地图影像数据被动态创建,所以影像地图的内容可以通过修改一些图层属性来自定义。
关于影像服务
影像服务是基于栅格数据的。栅格数据实质上是由单元组成的网格。每个单元对应一个物理位置,单元的值表示有关位置的信息。栅格格式在表示连续数据(如降雨、地形)方面往往优于矢量格式,因为因为它可以更好的表现一个地区的数据粒度变化。栅格通常也存储图像和由卫星传感器捕获的其它格式的信息。
创建图层
要创建影像服务图层,你需要实例化AGSImageServiceLayer 类。当你实例化对象时,你需要为图像服务的REST 网络服务端点提供一个URL。
NSURL* url = [NSURL URLWithString: @"http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Portland/CascadeLandsat/ImageServer"];
AGSImageServiceLayer* layer = [AGSImageServiceLayer imageServiceLayerWithURL: url];
改变地图内容
影像地图服务图层允许你通过指定一些图层属性来改变地图所展示的内容。例如,你可以设置压缩率以达到降低地图影像大小的作用。这对于以低带宽访问高分辨率影像特别有用。
波段组合
栅格数据可以具有一个或是多个波段的信息。例如,高程模型通常包括一个波段的高程信息,而全色影像包括单一波段的灰度值。另一方面,航拍图片通常含有三个波段的信息,分别用于红色、绿色和蓝色波长。一些栅格数据可以是多光谱的,包含超过三个波段的信息,甚至超过可见光范围,如红外线。
影像服务图层提供了在影像服务中有多少个波段的信息,如下:
AGSImageServiceInfo* imageInfo = layer.imageServiceInfo;
int bandCount = imageInfo.bandCount;
如果波段数是n,那么每个波段被赋值为从0到n-1的ID值。
你可以指定在地图影像中所应包含的波段信息的组合方式如下:
//For a grayscale map image with band 0
NSArray* grayscaleBandIds = [NSArray arrayWithObject:[NSNumber numberWithInt:0] ];
layer.bandIds = grayscaleBandIds;
//Or, For a color image with band 2, band 5, and band 0 as Red, Green, and Blue respectively
NSArray* rgbBandIds = [NSArray arrayWithObjects:[NSNumber numberWithInt:2], [NSNumber numberWithInt:5], [NSNumber numberWithInt:0], nil ];
layer.bandIds = rgbBandIds;
注:即使影像服务中包含三个以上的波段,你也只能指定当中一个波段(灰度)或是三个波段(颜色)包含在地图影像中。
马赛克规则
基于马赛克数据集的影像服务包含多个重叠的栅格。马赛克规则定义了栅格数据被组合在一起创建地图的顺序。
下面是马赛克规则被应用到影像服务层中的例子
AGSMosaicRule* rule = [[[AGSMosaicRule alloc] init] autorelease];
rule.method = AGSMosaicMethodNadir;
rule.operation = AGSMosaicOperationTypeFirst;
layer.mosaicRule = rule;
渲染规则
渲染规则可以使你执行一些复杂的处理,如计算山体阴影和坡度,或是影像服务中的栅格数据。
影像服务中的web服务仅仅支持所有可用的栅格函数的子集。REST API文档列出了支持的光栅函数、jSON语法和所需要的参数。
下面的代码片段展示了如何应用ShadedRelief光栅函数:
/* JSON syntax of ShadedRelief
{
"rasterFunction" : "ShadedRelief",
"rasterFunctionArguments" : {
"Azimuth" : 215.0,
"Altitude" : 75.0,
"ZFactor" : 0.3,
"Colormap" : [
[0, 1, 2, 3],
[2, 45, 52, 13]
]
},
"variableName" : "Raster"
}
*/
//arguments
NSMutableDictionary* arguments = [[[NSMutableDictionary alloc] init] autorelease];
[arguments setObject:[NSNumber numberWithDouble:215.0] forKey:@"Azimuth"];
[arguments setObject:[NSNumber numberWithDouble:75.0] forKey:@"Altitude"];
[arguments setObject:[NSNumber numberWithDouble:0.3] forKey:@"ZFactor"];
NSMutableArray* colorMap = [[[NSMutableArray alloc] init] autorelease];
NSArray* row1 = [NSArray arrayWithObjects:[NSNumber numberWithInt:0], [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], nil];
NSArray* row2 = [NSArray arrayWithObjects:[NSNumber numberWithInt:2], [NSNumber numberWithInt:45], [NSNumber numberWithInt:52], [NSNumber numberWithInt:13], nil];
[colorMap addObject:row1];
[colorMap addObject:row2];
[arguments setObject:colorMap forKey:@"Colormap"];
//raster function
AGSRasterFunction* rasterFunction = [[[AGSRasterFunction alloc] init] autorelease];
rasterFunction.type = AGSRasterFunctionTypeShadedRelief;
rasterFunction.arguments = arguments;
layer.renderingRule = rasterFunction;