【教程连载】ArcGIS for iOS 开发系列(8) – 基础篇-空间要素-符号渲染和属性信息

0
分享 2016-06-17
2 符号渲染
几何形状是地图的骨架,最后成图还需要制图,制图是另一个庞大的话题,这里不做展开,直接来介绍符号和渲染。符号面向的是空间要素,定义了点、线、面要素的颜色、透明度、边框大小等信息,而渲染面向的是图层,定义了整个图层的符号样式,其中的要素按照指定规则批量套用符号。
2.1 符号
符号(AGSSymbol)从形式上可以分为单一符号、文字符号和复合符号,下面来一一介绍。
2.1.1 点状符号
单一标记型符号(AGSSimpleMarkerSymbol),可设置其填充颜色、外边框、大小等。

图3-3-2-1 AGSSimpleMarkerSymbol主要属性和方法
默认提供了以下单一标记型符号样式(AGSSimpleMarkerSymbolStyle):圆(Circle)、十字(Cross)、菱形(Diamond)、方形(Square)和X型。
AGSSimpleMarkerSymbol* myMarkerSymbol = [AGSSimpleMarkerSymbol simpleMarkerSymbol]; myMarkerSymbol.color = [UIColor blueColor];
myMarkerSymbol.style = AGSSimpleMarkerSymbolStyleDiamond;
myMarkerSymbol.outline.color = [UIColor whiteColor];
myMarkerSymbol.outline.width = 3;
图片型符号(AGSPictureMarkerSymbol),则是用给定的图片来填充,可以设置其大小、旋转角度、偏移量等。

图3-3-2-2 AGSPictureMarkerSymbol主要属性和方法
默认情况下“图片压在点上”,即点坐标对应的是图片符号的像素中心点,如果使用指向型图标(如图钉、气泡等),需要设置合适的像素偏移量(xoffset/yoffset)。
AGSSimplePictureSymbol* myPictureSymbol = [AGSSimplePictureSymbol picMarkerSymbolWithImageNamed:@”myPic.png”];
//向右上方偏移5个像素
myPictureSymbol.xoffset = 5;
myPictureSymbol.xoffset = 5;
2.1.2 线状符号
单一线型符号(AGSSimpleLineSymbol),修改颜色、宽度和样式,其中样式默认包括:线间隔(Dash)、点间隔(Dot)、线点交替间隔(DashDot)、无间隔(Solid)等。

图3-3-2-3 AGSSimpleLineSymbol主要属性和方法
AGSSimpleFillSymbol* myFillSymbol = [AGSSimpleFillSymbol simpleFillSymbol]; myFillSymbol.color = [UIColor colorWithRed:0.7 green:0.1 blue:0.1 alpha:0.5];
//线的边框还是“线”
AGSSimpleLineSymbol* myOutlineSymbol = [AGSSimpleLineSymbol simpleLineSymbol]; myOutlineSymbol.color = [UIColor redColor];
myOutlineSymbol.width = 2;
//set the outline property to myOutlineSymbol
myFillSymbol.outline = myOutlineSymbol;
2.1.3 面状符号
面状符号包括:单一填充符号(AGSSimpleFillSymbol)和图片填充符号(AGSPictureFillSymbol),属性与点状符号类似,图片填充符号可以设置显示比例:xscale\yscale。
AGSSimpleFillSymbol* myFillSymbol =[AGSSimpleFillSymbol simpleFillSymbol]; myFillSymbol.color = [UIColorcolorWithRed:0.7 green:0.1 blue:0.1 alpha:0.5];
//外轮廓
AGSSimpleLineSymbol* myOutlineSymbol =[AGSSimpleLineSymbol simpleLineSymbol]; myOutlineSymbol.color = [UIColorredColor]; myOutlineSymbol.width = 2;
myFillSymbol.outline = myOutlineSymbol;
2.1.4 文字型符号
文字型符号(AGSTextSymbol)可以用于任何几何形状,一般当做标注(Label)来用,默认是系统字体,可以设置其字体:颜色、大小,粗细等。如果想展示某属性字段的值,直接用textTemplate就可以完成,如${country_name},其中country_name为属性字段名。

图3-3-2-4 AGSTextSymbol主要属性和方法
AGSTextSymbol* txtSymbol = [AGSTextSymboltextSymbolWithTextTemplate:@"文字" color:[UIColor greenColor]];
txtSymbol.xoffset = -30.;
txtSymbol.yoffset = 30.;
txtSymbol.backgroundColor = [UIColor whiteColor];
txtSymbol.fontSize = 20.;
2.1.5 复合型符号
复合型符号(CompositeSymbol)是为了满足特殊效果要求,对几何形状分部位符号化,有两种:面复合符号(AGSCompositeSymbol)和线复合符号(AGSCompositeLineSymbol)。
面复合符号中可以加入节点符号,突出表现节点。
线复合符号中加入一系列线符号,能表现出渐变的线效果。
实际上在草图图层(AGSSketchLayer)表现选中要素的各个节点(端点、边中点)时就用的是复合型符号。
2.2 渲染
渲染(Renderers)是图层的符号化样式,按照图层中要素的属性值批量进行符号化。值得注意的是渲染样式中的符号类型和几何形状类型是对应的:点状符号渲染点数据、线状符号渲染线数据、面符号对应面数据。

图3-3-2-5 AGSRenderer的继承关系
2.2.1 单一渲染
单一渲染(AGSSimpleRenderer),就是用一种符号渲染所有要素,符号可以是任意一种:点状、线状、面状、文字型或者复合型。
其中符号属性是只读的,变更的话需要重新创建一个单一渲染样式。
//构建复合型符号
AGSCompositeSymbol*composite = [AGSCompositeSymbol compositeSymbol];
AGSSimpleMarkerSymbol*markerSymbol = [[[AGSSimpleMarkerSymbol alloc] init] autorelease];
markerSymbol.style= AGSSimpleMarkerSymbolStyleSquare;
markerSymbol.color= [UIColor greenColor];
[composite.symbolsaddObject:markerSymbol];
AGSSimpleLineSymbol*lineSymbol = [[[AGSSimpleLineSymbol alloc] init] autorelease];
lineSymbol.color=[UIColor grayColor];
lineSymbol.width= 4;
[composite.symbolsaddObject:lineSymbol];
AGSSimpleFillSymbol*fillSymbol = [[[AGSSimpleFillSymbol alloc] init] autorelease];
fillSymbol.color= [UIColor colorWithRed:1.0 green:1.0 blue:0 alpha:0.5] ;
[composite.symbolsaddObject:fillSymbol];
//直接渲染
AGSSimpleRenderer*renderer = [AGSSimpleRenderer simpleRendererWithSymbol:composite];
AGSGraphicLayer*graphicsLayer = [AGSGraphicLayer graphicLayer];
graphicsLayer.renderer= renderer;
2.2.2 分级渲染
分级渲染(AGSClassBreaksRenderer),按照数值型属性把所有要素进行分级,每级要素采用同一种符号。单个级别的数值区间和符号都是一个分段(AGSClassBreak),落在该数值区间内的要素就会按对应的符号渲染。比如有一批小时平均降雨量采样数据,按照5毫米、30毫米的分界,用小雨、中雨和大到暴雨三种符号展现,就是一个典型的分级渲染样式。
AGSClassBreaksRenderer *rainRenderer =[[[AGSClassBreaksRenderer alloc] init] autorelease];
rainRenderer.field = @"day";
//分级段
AGSClassBreak* lowClassBreak = [AGSClassBreakclassBreakInfoWithLabel:@"Low" description:@"" maxValue:5symbol:lowMarkerSymbol];
AGSClassBreak* mediumClassBreak =[AGSClassBreakclassBreakInfoWithLabel:@"Medium" description:@"" maxValue:30symbol:mediumMarkerSymbol];
AGSClassBreak* highClassBreak = [AGSClassBreakclassBreakInfoWithLabel:@"High" description:@"" minValue:30symbol:highMarkerSymbol];
//添加到分级数组
NSMutableArray* classBreaks = [NSMutableArray array];
[classBreaks addObject:lowClassBreak];
[classBreaks addObject:mediumClassBreak];
[classBreaks addObject:highClassBreak];
rainRenderer.classBreaks = classBreaks;
//分级渲染
AGSGraphicLayer* graphicsLayer = [AGSGraphicLayer graphicLayer];
graphicsLayer.renderer = rainRenderer;
2.2.3 唯一值渲染
唯一值渲染(AGSUniqueValueRenderer),适合按非数值的属性进行符号化,每一组唯一值(AGSUniqueValue)包括:值、标注、符号等。比如常见的POI兴趣点,按照餐饮、宾馆、娱乐等进行符号化,就是典型的唯一值渲染。
AGSUniqueValueRenderer *poiRenderer = [[[AGSUniqueValueRenderer alloc] init] autorelease];
//默认符号、对比字段
poiRenderer.defaultSymbol = defaultMakerSymbol;
poiRenderer.field1 = @"TYPE";
//设定唯一值
AGSUniqueValue* food = [[AGSUniqueValue alloc] initWithValue:@"FOOD" label:@"food" description:nil symbol:foodSymbol];
AGSUniqueValue* hotel = [[AGSUniqueValue alloc] initWithValue:@"HOTEL" label:@"hotel" description:nil symbol:hotelSymbol];
AGSUniqueValue* entertainment = [[AGSUniqueValue alloc] initWithValue:@"ENTERTAINMENT" label:@"entertainment " description:nil symbol:entertainmentSymbol];

[poiRenderer.uniqueValues addObject: food];
[poiRenderer.uniqueValues addObject: hotel];
[poiRenderer.uniqueValues addObject: entertainment];
//唯一值渲染
AGSGraphicLayer* graphicsLayer = [AGSGraphicLayer graphicLayer];
graphicsLayer.renderer = poiRenderer;
2.2.4 时态渲染
时态渲染(AGSTemporalRenderer),用来表现带有时态信息的要素图层,包括默认渲染样式(observation renderer)和时间内插器(interpolator)。其中渲染样式就是普通的单一、分级和唯一值渲染,和时间有关的是内插器,它决定了某一时间点或时间段的符号大小和颜色,内插器分为两种:渐变区间(Ramp Interpolator)和时间分级(TimeClassBreaksAger)。
渐变区间内插器定义了一个符号颜色起始/终止值、大小起始/终止值,能够展示连续的时间特征。

图3-3-2-6 使用Ramp Interpolator渲染要素
AGSFeatureLayer* featLayer = ...;
//Observationrenderer
AGSSimpleMarkerSymbol* pointSymbol = [[[AGSSimpleMarkerSymbol alloc] init] autorelease];
pointSymbol.style = AGSSimpleMarkerSymbolStyleSquare;
pointSymbol.size = 6;
pointSymbol.color = [UIColor blackColor];
AGSSimpleRenderer* obsRenderer = [AGSSimpleRenderer simpleRendererWithSymbol:pointSymbol];
//Color range
UIColor*startCol = [UIColor redColor];
UIColor* endCol= [UIColor yellowColor];
//Size range
int startSize = 20;
int endSize = 2;
//A rampinterpolator using the color and size range
AGSRampInterpolator* ramp = [[AGSRampInterpolatoralloc] initWithStartColor:startCol endColor:endCol startSize:startSizeendSize:endSize];
//A temporalrenderer
AGSTemporalRenderer* temporalRenderer =[[AGSTemporalRenderer alloc] initWithObservationRenderer:obsRendererobservationAger:ramp featureLayer:featLayer];
featLayer.renderer = temporalRenderer;
时间分级里包含了一组时间分级段AGSTimeClassBreak,每段定义了符号大小、颜色,和时间长度(maxRelativeAge)。

图3-3-2-7 使用时间分级渲染
//A time-awarefeature layer
AGSFeatureLayer* featLayer = ...;
//An array tohold the class breaks
NSMutableArray* classBreaks = [[[NSMutableArray alloc] init] autorelease];
//Class breakfor features upto 2 days old
AGSTimeClassBreak* tcb = [[[AGSTimeClassBreak alloc] init] autorelease];
tcb.maxRelativeAge = 2; tcb.size = 8; tcb.color = [UIColor whiteColor];
[classBreaks addObject:tcb];
//Class breakfor features upto 5 days old
tcb = [[[AGSTimeClassBreak alloc] init] autorelease];
tcb.maxRelativeAge = 5; tcb.size = 5; tcb.color = [UIColor blueColor];
[classBreaks addObject:tcb];
//Class breakfor features upto 12 days old
tcb = [[[AGSTimeClassBreak alloc] init] autorelease];
tcb.maxRelativeAge = 12; tcb.size = 3; tcb.color = [UIColor redColor];
[classBreaks addObject:tcb];
//A classbreaks ager based on the class breaks defined above
AGSTimeClassBreaksAger *classbreaksAger = [[AGSTimeClassBreaksAger alloc] initWithTimeClassBreaks:classBreaks units:AGSTimeIntervalUnitsDays];
//Observationrenderer
AGSSimpleMarkerSymbol* pointSymbol = [[[AGSSimpleMarkerSymbol alloc] init] autorelease];
pointSymbol.style = AGSSimpleMarkerSymbolStyleCircle;
pointSymbol.size = 2; pointSymbol.color = [UIColor blackColor];
AGSSimpleRenderer* obsRenderer = [AGSSimpleRenderer simpleRendererWithSymbol:pointSymbol];
//Temporal renderer
AGSTemporalRenderer* temporalRenderer = [[AGSTemporalRenderer alloc] initWithObservationRenderer:obsRenderer observationAger:classbreaksAger featureLayer:featLayer];
featLayer.renderer = temporalRenderer;
3 属性信息
空间要素的属性信息装载在一个键值对中(字段名称和内容),通常从已有要素直接获取,或自己重新构建一个NSDictionary。
//获取已有要素属性
AGSGraphic* myGraphic = [AGSGraphic graphicWithGeometry:myMarkerPoint
symbol:myMarkerSymbol attributes: feature.attributes
infoTemplateDelegate:nil];
//构建属性
NSMutableDictionary* attributes = [NSMutableDictionary dictionary];
[attributes setObject:Region forKey:@"Region"];
[attributes setObject:Magnitude forKey:@"Magn"];
[attributes setObject:Depth forKey:@"Depth"];
AGSGraphic* myGraphic = [AGSGraphic graphicWithGeometry:myMarkerPoint
symbol:myMarkerSymbol attributes: feature.attributes
infoTemplateDelegate:self];
代码中的信息模板委托(infoTemplateDelegate)声明了属性信息在弹出框中的显示内容,接下来的“信息窗口”章节中会做详细介绍。


文章来源:http://blog.csdn.net/arcgis_all/article/details/8232830

0 个评论

要回复文章请先登录注册