符号定义了图形外观的非地理方面。它包括了图形的颜色、线宽、透明度等等。ArcGIS Runtime SDK for iOS包含了许多符号类,其中的每个类可以让你以独特的方式指定符号。每个符号的类型也是特定于一个几何类型(即点、线、面)。
渲染器定义了适用于图形层的符号集。应用于每个图层的符号取决于图形的属性。渲染器指定哪些属性值对应于哪个符号。
符号类型
可用的符号和所适用的几何符号总结在下表中:
符号 | 几何形状 | 描述 | 符号类 |
简单标记 | 点 | 用简单形状符号化点 | AGSSimpleMarkerSymbol |
图形标记 | 点 | 用图像来符号化点 | AGSPictureMakerSymbol |
简单线 | 线 | 用预定义类型来符号化线 | AGSSimpleLineSymbol |
组合 | 点、线、面 | 用一组符号来符号化几何图形 | AGSCompositeSymbol |
简单填充 | 面 | 用一系列形式填充面 | AGSSimpleFillSymbol |
文本 | 点、线、面 | 为几何形状展示文本 | AGSTextSymbol |
上述所有提到的符合类都继承自AGSSymbol。
创建符号
在许多应用中,相同的符号将多次应用。例如,利用“寻找任务”可以允许用户搜索县。在这种情况下,每次任务被执行时,将相同的符号应用到任务的结果中是很有意义的。在这种情况下,你应该以实例变量/属性类的形式存储该对象的引用。
下面的代码创建了用AGSSimpleMakerSymbol绘制一个蓝色钻石,轮廓为白色,且有三个像素宽。
1
2
3
4
5
6
|
//Create the AGSSimpleMarker Symbol and set some properties AGSSimpleMarkerSymbol* myMarkerSymbol = [AGSSimpleMarkerSymbol simpleMarkerSymbol]; myMarkerSymbol.color = [UIColor blueColor]; myMarkerSymbol.style = AGSSimpleMarkerSymbolStyleDiamond; myMarkerSymbol.outline.color = [UIColor whiteColor]; myMarkerSymbol.outline.width = 3 ; |
下面的代码用半透明的红色填充和红色轮廓(两个像素宽)创建了AGSSimpleFillSymbol。一个简单填充符号的轮廓是AGSSimpleLineSymbol
1
2
3
4
5
6
7
8
9
10
11
|
//Create the AGSSimpleFillSymbol and set it’s color AGSSimpleFillSymbol* myFillSymbol = [AGSSimpleFillSymbol simpleFillSymbol]; myFillSymbol.color = [UIColor colorWithRed: 0.7 green: 0.1 blue: 0.1 alpha: 0.5 ]; //Create the AGSSimpleLineSymbol used for the outline AGSSimpleLineSymbol* myOutlineSymbol = [AGSSimpleLineSymbol simpleLineSymbol]; myOutlineSymbol.color = [UIColor redColor]; myOutlineSymbol.width = 2 ; //set the outline property to myOutlineSymbol myFillSymbol.outline = myOutlineSymbol; |
现在符号已经被声明,你可以将它跟一个图形联系或在渲染器中使用。
渲染器
渲染器定义了一组符号集,将被用于图形层中的图形。你可以用渲染器以不同的颜色和尺寸,基于图形的属性值来符号化属性。要使用渲染,你可以创建它,定义符号,然后设置一个图形层的渲染特性。
1
|
myGraphicsLayer.renderer = myRenderer; |
创建一个简单的渲染
一个简单的渲染器是指为每个图形使用相同的符号。所有你需要做的是用要求的符号创建渲染器,然后为图形层设置渲染特性。
1
2
3
|
AGSSimpleRenderer* mySimpleRenderer = [AGSSimpleRenderer simpleRendererWithSymbol:myMarkerSymbol]; myGraphicsLayer.renderer = mySimpleRenderer; |
AGSSimpleRenderer的符号属性是只读的。用简单的渲染器使用一个符号,你必须用需要的符号创建渲染器。此外,符号类型必须于属性类型匹配(点要素和标记符号、线要素和线符号、面要素和填充符号)。
创建一个级别间隔渲染器
一个级别间隔渲染器是指基于一些数值属性的值来符号化每个图形。具有相似属性值的图形获得相同的符号。“间隔”定义了符号发生变化时的属性值。
符号和值之间的映射被定义在AGSClassBreak对象的数组里。AGSClassBreaksRenderer 用它的classBreaks属性存储这些映射以作为AGSClassBreak 对象。AGSClassBreak 对象包括用来绘制图形的的符号、最小值和最大值。任何大于或等于最小值,和小于最大值的值将会用类间断符号绘制。
下面的代码创建AGSClassBreaksRenderer并根据大小来符号化城市。总共有3个级别间隔:第一级别是从DBL_MIN到5000,第二基本是从5000到250,000,第三级别是从250,000到DBL_MAX。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//create the renderer with a default simple marker symbol //and an attribute field. AGSClassBreaksRenderer *cityRenderer = [[[AGSClassBreaksRenderer alloc] init] autorelease]; cityRenderer.field = @ "POP1990" ; cityRenderer.minValue = DBL_MIN; //create three AGSClassBreak objects, one each for //low, medium and high populations and the appropriate //symbol (for clarity, the symbol creation has been omitted) AGSClassBreak* lowClassBreak = [AGSClassBreak classBreakInfoWithLabel:@ "Low" description:@ "" maxValue: 50000 symbol:lowMarkerSymbol]; AGSClassBreak* mediumClassBreak =[AGSClassBreak classBreakInfoWithLabel:@ "Medium" description:@ "" maxValue: 250000 symbol:mediumMarkerSymbol]; AGSClassBreak* highClassBreak = [AGSClassBreak classBreakInfoWithLabel:@ "High" description:@ "" maxValue:DBL_MAX symbol:highMarkerSymbol]; //add the AGSClassBreak objects to the renderer NSMutableArray* classBreaks = [NSMutableArray array]; [classBreaks addObject:lowClassBreak]; [classBreaks addObject:mediumClassBreak]; [classBreaks addObject:highClassBreak]; cityRenderer.classBreaks = classBreaks; //add the renderer to the graphics layer citiesGraphicsLayer.renderer = cityRenderer; |
创建唯一值渲染器
唯一值渲染器符号化那些具有匹配属性的图形组。这在名词或是字符串数据中最为常见。例如,你可以用唯一值渲染器来符号化区划名称:黄色为居民区、紫色为工业区、红色为商业区等等。你也可以使用唯一值渲染器在编码数值上,或是序数词如第一、第二、第三等等。
下面的代码创建AGSUniqueValueRenderer ,用三个值VILLAGE,CITY和TOWN来符号化城市,每一个唯一的符号代表TYPE的属性字段(为了清楚起见,符号的创建已被省略)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//create the renderer //specify the attribute field whose values will decide the symbol //we need to provide a default symbol for unmatched values AGSUniqueValueRenderer *cityRenderer = [[[AGSUniqueValueRenderer alloc] init] autorelease]; cityRenderer.defaultSymbol = defaultMakerSymbol; cityRenderer.field1 = @ "TYPE" ; //create three AGSUniqueValue objects, one each for //CITY, TOWN, and VILLAGE AGSUniqueValue* village = [[AGSUniqueValue alloc] initWithValue:@ "VILLAGE" label:@ "village" description:nil symbol:villageSymbol]; AGSUniqueValue* city = [[AGSUniqueValue alloc] initWithValue:@ "CITY" label:@ "city" description:nil symbol:citySymbol]; AGSUniqueValue* town = [[AGSUniqueValue alloc] initWithValue:@ "TOWN" label:@ "town" description:nil symbol:townSymbol]; //add the AGSUniqueValue objects to the renderer [cityRenderer.uniqueValues addObject:village]; [cityRenderer.uniqueValues addObject:city]; [cityRenderer.uniqueValues addObject:town]; //add the renderer to the graphics layer citiesGraphicsLayer.renderer = cityRenderer; |
改变渲染动态图层
在ArcGIS server 10.1或是更高版本中,动态图层提供了在客户端上改变渲染来自ArcGIS Server(非缓存)地图服务的能力。在动态图层上设置图层定义和绘制选项使得你可以控制在服务中子图层的内容和显示方式。
在服务器上创建渲染器
对于在ArcGIS Server10.1或更高版本中的图层,你可以用GenerateRendererTask 来创建和返回一个级别间隔或是一个唯一值渲染器。所生成的渲染器然后可以被应用到你地图中相应的动态图层中去。
使用任务创建一个唯一值渲染器使得你具备了指定一个颜色渐变过程,从而在渲染器中每一个唯一的符号都可以获得唯一的一个y颜色。使用GenerateRendererTask,利用一些唯一值为属性图层生成一个渲染器,比写代码明确定义每个类更有效。
使用任务创建一个类别间隔渲染器可以使你具备用统计分类的方法来确定你的分类范围的能力。不是用手工来编码类别间隔最小值和最大值,而是你可以指定所需要的分类数目并应用以下的分类方法之一来确定每一个分类的间隔值:自然分割、等间距、分位数、或是标准差。你也可以选择利用总的百分比来标准化你的数据、另一个字段的值或是通过日志。