符号定义了非地理(non-geographic)特性的图形外观. 这包括图形的颜色,边框宽度,透明度等。 ArcGIS Runtime SDK for iOS包含许多符号类,每个符号类都允许您以独特的方式指定符号系统。每种符号类型也特定于一种几何类型(即点,线或多边形)。

渲染器定义了适用于图形图层的符号集。应用于每个图形的符号取决于图形的属性。渲染器指定哪些属性值对应于哪个符号。

Symbol types

下表中总结了可用的符号及其适用的几何形状:

Symbol 几何图形 Description class
Simple Marker 用简单的形状象征点 AGSSimpleMarkerSymbol
Picture Marker 用图像象征点 AGSPictureMarkerSymbol
Simple Line 折线 用预定义的样式表示线条 AGSSimpleLineSymbol
Composite 点/线/多边形 用一组符号来表示几何图形 AGSCompositeSymbol
Simple Fill 多边形 用多种图案填充多边 AGSSimpleFillSymbol
Text 点/线/多边形 显示几何图形的文本标签 AGSTextSymbol

以上都继承于AGSSymbol

Creating symbols

在许多应用中,相同的符号将被多次使用。 在这种情况下,每次执行任务时将相同的符号系统应用于任务的结果是有意义的。在这种情况下,您应该将对象的引用存储在类中的实例变量/属性中。

以下代码创建一个AGSSimpleMarkerSymbol,绘制为蓝色菱形,带有一个白色,三个像素宽的白色轮廓:

//Create the AGSSimpleMarker Symbol and set some properties
let myMarkerSymbol = AGSSimpleMarkerSymbol ()
myMarkerSymbol.color = UIColor.blueColor()
myMarkerSymbol.style = .Diamond
myMarkerSymbol.outline.color = UIColor.whiteColor()
myMarkerSymbol.outline.width = 3

以下代码创建一个半透明红色填充和两个像素宽的红色轮廓的AGSSimpleFillSymbol。 简单填充符号的大纲是一个AGSSimpleLineSymbol。

//Create the AGSSimpleFillSymbol and set it’s color
let myFillSymbol = AGSSimpleFillSymbol()
myFillSymbol.color = UIColor(red:0.7, green:0.1, blue:0.1, alpha:0.5)
        
//Create the AGSSimpleLineSymbol used for the outline
let myOutlineSymbol = AGSSimpleLineSymbol()
myOutlineSymbol.color = UIColor.redColor()
myOutlineSymbol.width = 2
        
//set the outline property to myOutlineSymbol
myFillSymbol.outline = myOutlineSymbol

现在该符号已被声明,您可以将其附加到图形或在渲染器中使用它。

Renderers

渲染器定义了一组将用于图形图层中的图形的符号。

您可以使用渲染器根据图形的属性值使用不同颜色或大小的特征进行符号化。要使用渲染器,可以创建它,定义符号系统,然后设置Graphics图层的渲染器属性。

myGraphicsLayer.renderer = myRenderer

Creating a simple renderer

一个简单的渲染器为每个图形使用相同的符号。 你所需要做的就是用所需的符号创建渲染器,然后将其设置为图形图层的渲染器属性。

let mySimpleRenderer = AGSSimpleRenderer(symbol: myMarkerSymbol)
myGraphicsLayer.renderer = mySimpleRenderer

AGSSimpleRenderer上的符号属性是只读的。 要使用简单的渲染器使用符号,必须使用所需的符号创建渲染器。 另外,符号类型需要与要素类型匹配(点要素的标记符号,折线要素的线符号以及多边形要素的填充符号)。

Creating a class breaks renderer

class breaks renderer基于某些数字属性的值来标记每个图形(类似UIKit的view.tag)。具有相似属性值的图形将获得相同的symbol。“breaks”定义符号体系更改的值。

symbols和values之间的映射在AGSClassBreak对象的数组中定义(in an array of AGSClassBreak objects)。

AGSClassBreaksRenderer将它作为一组AGSClassBreak对象存储在其classBreaks属性中。 AGSClassBreak对象包含用于绘制图形的符号:最小值和最大值。 任何大于或等于最小值且小于最大值的值均使用分类符号来绘制。

以下代码创建一个AGSClassBreaksRenderer以根据大小来标记城市。 有三个班休息:第一个从DBL_MIN到50,000,第二个从50,000到250,000,最后一个从250,000到DBL_MAX。

//create the renderer with a default simple marker symbol
//and an attribute field.
let cityRenderer = AGSClassBreaksRenderer()
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)
let lowClassBreak = AGSClassBreak(label: "Low", description: "", maxValue: 50000, symbol: lowMarkerSymbol)
let mediumClassBreak = AGSClassBreak(label: "Medium", description: "", maxValue: 250000, symbol: mediumMarkerSymbol)
let highClassBreak = AGSClassBreak(label: "High", description: "", maxValue: DBL_MAX, symbol: highMarkerSymbol)
       
//add the AGSClassBreak objects to the renderer
cityRenderer.classBreaks = [lowClassBreak, mediumClassBreak, highClassBreak]      
        
//add the renderer to the graphics layer  
citiesGraphicsLayer.renderer = cityRenderer

Creating a unique value renderer

一个唯一的值渲染器代表具有匹配属性的图形组。 这对于名义或字符串数​​据最为常见。 例如,您可以使用唯一的值渲染器来表示分区标识:住宅为黄色,工业为紫色,商业为红色等。 您还可以在编码值的数字字段上或序号属性(如First,Second,Third等)上使用唯一值呈示器.

下面的代码创建了一个AGSUniqueValueRenderer,用于表示具有三个值的城市:VILLAGE,CITY和TOWN,每个都有一个唯一的符号来表示TYPE属性字段(为了清晰起见,省略了符号的创建):

//create the renderer
//specify the attribute field whose values will decide the symbol
//we need to provide a default symbol for unmatched values
let cityRenderer = AGSUniqueValueRenderer()
cityRenderer.defaultSymbol = defaultMakerSymbol
cityRenderer.field1 = "TYPE"
        
//create three AGSUniqueValue objects, one each for
//CITY, TOWN, and VILLAGE
let village = AGSUniqueValue(value: "VILLAGE", label: "village", description: nil, symbol: villageSymbol)
let city = AGSUniqueValue(value: "CITY", label: "city", description: nil, symbol: citySymbol)
let town = AGSUniqueValue(value: "TOWN", label: "town", description: nil, symbol: townSymbol)
        
//add the AGSUniqueValue objects to the renderer
cityRenderer.uniqueValues = [village, city, town]

//add the renderer to the graphics layer  
citiesGraphicsLayer.renderer = cityRenderer

上面的setObject方法中的对象是符号,关键字是符号将表示的属性。 这些属性是AGSUniqueValueRenderer uniqueValueRendererWithDefaultSymbol方法中指定的属性字段的成员。 请记住,对于所有渲染器变体,符号类型需要与要素类型匹配:点要素的标记符号,折线要素的线符号以及面要素的填充符号。

Change rendering for a dynamic layer

借助ArcGIS for Server 10.1或更高版本,动态图层可以更改客户端上用于处理来自ArcGIS for Server(非缓存)地图服务的数据的呈现功能。 通过在动态图层上设置图层定义和绘图选项,您可以控制服务内容和子图层的显示。

Generate a renderer on the server

(机翻)

对于使用ArcGIS for Server 10.1或更高版本创建的服务的图层,可以使用GenerateRendererTask生成并返回类别分隔符或唯一值呈示器。 生成的渲染器可以应用到地图中相应的动态图层。 使用该任务创建一个唯一的值渲染器,可以指定一个颜色渐变,从中可以为渲染器中的每个唯一元件检索唯一的颜色。 使用GenerateRendererTask为具有几个唯一值的要素图层生成渲染器比编写代码以明确定义渲染器中的每个类更有效。 生成一个类可以使渲染器与任务分离,使您可以使用统计分类方法来确定您的类范围。 您可以指定需要的休息点数量,并使用以下某种分类方法来确定每个休息点的值,而不是手动编制课程休息的最小值和最大值:自然休息,等间隔,分位数或标准差。 您还可以选择按照总数的百分比,其他字段的值或日志来标准化数据。