Symbols, styles, and renderers(符号,样式和渲染器)

符号定义图形(graphic)或要素外(feature)观的所有非地理方面的信息,包括颜色,大小,边框和透明度。当那你创建 graphic 时,可以直接提供符号给单个图形,还可以使用符号为图形叠加层或要素图层创建渲染器。

使用渲染器时:

  • 无论属性值如何,对图层中的所有要素(或叠加层中的所有图形)使用一个符号
  • 基于一个或多个属性值,以不同方式对图层中的要素(或叠加中的图形)进行符号化

在要素上设置符号的唯一方法是使用渲染器。

某些不支持符号和渲染器的图层类型(如WMS)可以使用样式(styles)作为替代。样式提供了内容呈现方式的选项。

Symbols(符号)

符号不是地图上显示的内容,而是控制 graphic 和 feature 如何显示。通过正确的符号可以提高地图的展示质量。

无论是将符号直接应用于图形还是使用符号创建渲染器,请确保符号化的图形或特征的几何类型与要使用的符号兼容。

获取符号模型的两种方式:

  1. 简单符号系统API
    在关闭高级符号系统时从Web地图和要素服务中获取这些符号。
  2. 高级符号系统
    通过多层符号类访问的高级符号遵循ArcGIS Pro符号模型。这些符号来自要素服务,移动样式文件,字典渲染器和移动地图包。

以下是API中可用的符号表,其中包含兼容的几何类型和简要说明:

Symbol/Class Geometry(几何图形) 描述
SimpleMarkerSymbol point, multipoint 用基本形状表示点或多点。
PictureMarkerSymbol point, multipoint 用图像表示点或多点。
SimpleLineSymbol polyline 用预定义样式表示多线。
SimpleFillSymbol polygon, envelope 使用颜色和预定义样式填充多边形或envelope。
TextSymbol point, multipoint, polyline, polygon 显示文字。

根据不同的几何图形,定义不同的选项选择符号。点,线和多边形都有一个可以使用的基本符号:SimpleMarkerSymbol,SimpleLineSymbol和SimpleFillSymbol。您还可以使用PictureMarkerSymbol对点进行符号化。

所有标记符号都能够设置旋转符号的角度。此外,标记符号具有角度对齐属性,指定地图旋转时标记符号是保持屏幕对齐还是地图对齐。所有标记符号的默认值都是屏幕对齐的,这意味着符号不会随地图一起旋转。还可以定义x或y偏移,处理文本时很有用。

简单符号类型(SimpleMarkerSymbolSimpleLineSymbolSimpleFillSymbol)使您能够通过选择样式快速创建符号(例如,多边形的实心或交叉阴影填充;折线的实线或虚线;点的正方形或圆形标记)设置颜色,定义尺寸(标记)或宽度(线条)。对于标记和填充,您还可以定义轮廓符号(使用线符号)。

Picture symbols(图片符号)

图片符号(如PictureMarkerSymbol)允许您使用图像来表示要素。图像可以存储在本地,也可以来自在线资源。在线资源可以缓存(点击查看)。

从文件系统上的图像创建图片标记符号:

// mPinBlankOrangeFilePath 文件路径
BitmapDrawable pinBlankOrangeDrawable = (BitmapDrawable) Drawable.createFromPath(mPinBlankOrangeFilePath);
final PictureMarkerSymbol pinBlankOrangeSymbol = new PictureMarkerSymbol(pinBlankOrangeDrawable);
//设置大小,如果不设置根据图片的像素自动设置,然后会根据不同的的设备分辨率而变化
pinBlankOrangeSymbol.setHeight(20);
pinBlankOrangeSymbol.setWidth(20);
//设置偏移量
pinBlankOrangeSymbol.setOffsetY(10); //使用的图像没有缓冲,因此Y偏移是高度/ 2
pinBlankOrangeSymbol.loadAsync();

从URL创建图片标记符号:

//使用URL时,需要调用load来获取远程资源
final PictureMarkerSymbol campsiteSymbol = new PictureMarkerSymbol(
  "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Recreation/FeatureServer/0/images/e82f744ebb069bb35b234b3fea46deae");
campsiteSymbol.setHeight(18);
campsiteSymbol.setWidth(18);
campsiteSymbol.loadAsync();

从Android Drawable创建图片标记符号:

//从 APP 资源中创建
BitmapDrawable pinStarBlueDrawable = (BitmapDrawable) ContextCompat.getDrawable(this, R.drawable.pin_star_blue);
final PictureMarkerSymbol pinStarBlueSymbol = new PictureMarkerSymbol(pinStarBlueDrawable);
pinStarBlueSymbol.setHeight(40);
pinStarBlueSymbol.setWidth(40);

pinStarBlueSymbol.setOffsetY(
    11); 
pinStarBlueSymbol.loadAsync();
Multilayer (advanced) symbols(多层(高级)符号)

多层符号基于ArcGIS Pro的符号系统模型的子集。这些符号具有多个图层,并且可以在每个图层中包含不同的符号类型,并具有可定义的行为以提升制图效果。您可以使用ArcGIS Pro创建这些复杂的符号类型,并使用“使用高级符号(Use Advanced Symbology)”属性通过要素服务进行共享,该属性默认设置为true。多层符号也用于移动地图包,移动样式文件和字典渲染器。

MultilayerSymbol基类允许您获取和设置符号的颜色。返回或应用颜色值的方式取决于符号的创作方式。

MultilayerPointSymbol类允许您更改符号的角度和角度对齐。设置角度将影响所有符号图层,但结果旋转将取决于编写符号的方式。角度对齐属性的默认值还取决于符号的创作方式,但可以更改。

MultilayerPointSymbol类具有size属性,MultilayerLineSymbol具有width属性。更改这些将按比例影响符号的所有图层。

Applying a symbol to a graphic ( 将符号应用于图形 )

图形(Graphics)是内存中的功能,提供了在地图上显示几何图形的基本方法。图形的独特之处在于它们可以使用包含它们的叠加层的渲染器进行符号化(在本主题后面部分进行描述),或者通过将符号直接应用于图形来进行符号化。有关如何使用图形的说明,请参阅向图形叠加添加图形和文本(Add graphics and text to graphics overlays)。

//create a simple marker symbol
SimpleMarkerSymbol symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 12); //size 12, style of circle

//add a new graphic with a new point geometry
Point graphicPoint = new Point(-226773, 6550477, SpatialReferences.getWebMercator());
Graphic graphic = new Graphic(graphicPoint, symbol);
graphicsOverlay.getGraphics().add(graphic);
Working with simple and multilayer symbols(使用简单和多层符号)

简单符号系统是Web地图的符号系统。在ArcGIS Pro中将地图创作为Web地图时,请务必注意您的符号将转换为简单符号。通常,点符号被转换为针对网络优化的图片标记符号,并且对线和多边形符号尽可能地表示原始符号进行简化。

如果您的应用主要使用您希望在整个平台上看起来相同的网络地图,那么您的应用应该使用简单符号API。如果您使用多层符号并尝试将地图另存为Web地图,则保存将失败,并且强制保存它将删除符号。

如果您的地图仅用于ArcGIS Runtime和ArcGIS Pro,则可以使用多层符号。在这些环境中对多层(高级)符号进行矢量化,从而在具有高分辨率屏幕的设备上进行更好的缩放。

Renderers(渲染器)

顾名思义,渲染器是一个对象,用于确定如何在显示中渲染(绘制)图层中的要素(features)或图形(graphics)。然后渲染器使用符号(symbles)绘制它们。渲染器包括用于将适当的符号应用于层中的每个要素或覆盖中的每个图形的逻辑。有各种渲染器类型,每种类型都设计为使用不同的渲染逻辑。大多数渲染器使用属性值来确定应该应用哪个符号。

在典型的工作流程中,渲染器用于对要素图层中的要素进行符号化,其中要素具有相同的几何类型。您可以创建一个带有符号的渲染器,这些符号可以应用于图层的几何类型)。渲染器也可以应用于图形叠加层,但不应用于具有混合几何类型图形的叠加层。对于这种情况,在创建每个图形时应用符号是首选工作流程。可以使用Runtime API创建几种类型的渲染器,包括简单渲染器和唯一值渲染器。每个都在下面描述。

Simple renderer(简单渲染器)

无论属性值如何,简单渲染器都会对图层中的所有要素(或叠加层中的所有图形)使用一个符号。
例:

//create a simple symbol for use in a simple renderer
SimpleMarkerSymbol symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CROSS, Color.RED, 12); //size 12, style of cross
SimpleRenderer renderer = new SimpleRenderer(symbol);

//apply the renderer to the graphics overlay (so all graphics will use the same symbol from the renderer)
graphicOverlay.setRenderer(renderer);
Unique value renderer(唯一值渲​​染器)

唯一值渲​​染器根据一个或多个属性值以不同方式表示图层中的要素(或叠加中的图形)。当基于属性的符号表示特征时,它特别有用,该属性的值表示名称或类别,通常称为名义数据。与图形不同,要素没有符号属性,因此无法分配单个符号。但是,您可以使用唯一值渲染器根据每个要素的属性值在图层上设置符号系统。 (你也可以为图形做这个。)

Note
ArcGIS地图服务最多允许三个字段用于唯一值渲染器。 ArcGIS要素服务仅允许一个。作为开发人员,您可以根据需要指定任意数量的字段,确保您指定的字段的顺序与您指定的值的顺序相对应。

警告
应用在绑定到服务要素表的要素图层上使用属性值的渲染器时,必须确保在表外场中指定了必需的字段。在代码中实例化服务要素表时,默认情况下仅请求呈现要素所需的最小字段集(对象ID,几何和渲染器字段)。从地图加载服务要素表时,默认情况下会请求所有字段。务必通过在加载表之前设置外场来覆盖这些默认值。

例:

// Create service feature table
ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable(getResources().getString(R.string.sample_service_url));

// Create the feature layer using the service feature table
FeatureLayer featureLayer = new FeatureLayer(serviceFeatureTable);

// Override the renderer of the feature layer with a new unique value renderer
UniqueValueRenderer uniqueValueRenderer = new UniqueValueRenderer();
// Set the field to use for the unique values 设置唯一值的字段
uniqueValueRenderer.getFieldNames().add("STATE_ABBR"); //You can add multiple fields to be used for the renderer in the form of a list, in this case we are only adding a single field

// Create the symbols to be used in the renderer
SimpleFillSymbol defaultFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.NULL, Color.BLACK, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GRAY, 2));
SimpleFillSymbol californiaFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.RED, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.RED, 2));
SimpleFillSymbol arizonaFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.GREEN, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GREEN, 2));
SimpleFillSymbol nevadaFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID,Color.BLUE, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLUE, 2));

// Set default symbol
uniqueValueRenderer.setDefaultSymbol(defaultFillSymbol);
uniqueValueRenderer.setDefaultLabel("Other");

// Set value for california
List<Object> californiaValue = new ArrayList<>();
// You add values associated with fields set on the unique value renderer.
// If there are multiple values, they should be set in the same order as the fields are set
californiaValue.add("CA");
uniqueValueRenderer.getUniqueValues().add(new UniqueValueRenderer.UniqueValue("California", "State of California", californiaFillSymbol, californiaValue));

// Set value for arizona
List<Object> arizonaValue = new ArrayList<>();
// You add values associated with fields set on the unique value renderer.
// If there are multiple values, they should be set in the same order as the fields are set
arizonaValue.add("AZ");
uniqueValueRenderer.getUniqueValues().add(new UniqueValueRenderer.UniqueValue("Arizona", "State of Arizona", arizonaFillSymbol, arizonaValue));

// Set value for nevada
List<Object> nevadaValue = new ArrayList<>();
// You add values associated with fields set on the unique value renderer.
// If there are multiple values, they should be set in the same order as the fields are set
nevadaValue.add("NV");
uniqueValueRenderer.getUniqueValues().add(new UniqueValueRenderer.UniqueValue("Nevada", "State of Nevada", nevadaFillSymbol, nevadaValue));

// Set the renderer on the feature layer
featureLayer.setRenderer(uniqueValueRenderer);
Styles

某些不支持符号和渲染器的图层提供样式作为替代。

ArcGIS vector tiled layer styles(ArcGIS矢量平铺图层样式)

ArcGIS矢量切片图层使用矢量切片以及用于绘制它们的关联样式。由于样式与基础数据是分开的,因此您可以轻松自定义现有底图图层的样式。ArcGIS Online提供了许多样式的图层。

您可以使用在线样式编辑器创建自己的样式。然后,您可以将自定义矢量图层保存到ArcGIS Online并从中读取。

WMS styles

样式是内容显示方式的预定义选项。例如,WMS服务器为客户端提供每个层支持的样式列表。您可以选择WMS服务器用于呈现地图图像的样式。通常,样式是预定义的,无法更改或添加。

可以检查WmsLayerInfo类的styles属性以确定是否有可用的样式。可以将WMS子图层的当前样式属性设置为选择特定样式。

// set the sublayer's current style
wmsLayer.getSublayers().get(0).setCurrentStyle(styles.get(0));

推荐阅读更多精彩内容