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

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)声明了属性信息在弹出框中的显示内容,接下来的“信息窗口”章节中会做详细介绍



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值