1 简单符号系统

针对于点、线、面符号,分别对应SimpleMarkerSymbol、SympleLineSymbol和SympleFillSymbol

1.1 使用方法

  1. 新建一个具体的Symbol对象(点Marker、线Line、面Fill等)
  2. 设置相应的属性值
  3. 传入Symbol对象新建一个SimpleRenderer渲染器对象
  4. 设置FeatureLayer或GraphicOverlay的Renderer属性为该SimpleRenderer,FeatureLayer或GraphicOverlay对象可以通过Map对象来获取
SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol();
pointSymbol.Color = System.Drawing.Color.FromArgb(1,255,0,0);
pointSymbol.Style = SimpleMarkerSymbolStyle.Circle;
pointSymbol.Size = 5;
SimpleRenderer simpleRenderer = new SimpleRenderer(pointSymbol);  
feautureLayer.Renderer = simpleRenderer;

1.2 符号属性

较常用到的三类符号及常用属性含义、类型列举如下

1.2.1 点符号SimpleMarkerSymbol

  • Color:点的颜色,类型为System.Drawing.Color,使用该类的FromArgb(a,r,g,b)静态方法获得该类的对象传入即可
  • Style:点的样式,例如圆点、方点之类的,类型为SimpleMarkerSymbolStyle枚举
  • Size:点的大小,类型为Integer

1.2.2 线符号SimpleLineSymbol

  • Color:线的颜色,类型为System.Drawing.Color,使用该类的FromArgb(a,r,g,b)静态方法获得该类的对象传入即可
  • Style:线的样式,比如说实线、虚线、点线等,类型为SimpleLineSymbolStyle枚举
  • Width:线的宽度,类型为Integer

1.2.3 面符号SimpleFillSymbol

  • Color:面的填充颜色,类型为System.Drawing.Color,使用该类的FromArgb(a,r,g,b)静态方法获得该类的对象传入即可
  • Style:填充样式,比如实心填充、条纹填充之类,类型为SimpleFillSymbolStyle
  • Outline:面的轮廓样式,类型为SimpleLineSymbol,具有同样的属性

2 高级符号样式

上面所述的都是较为简单的符号样式,实现分类、分级等高级符号样式的同样是通过Renderer,除了上面用过的SimpleRenderer外,还有ClassBreaksRenderer、UniqueValueRenderer、DictionaryRenderer等,总思路都是新建这个具体的渲染器对象并设置好各参数后,赋值给FeatureLayer的Renderer属性,以下就介绍其最基本的初始化方法。

2.1 唯一值渲染UniqueValueRenderer

  1. 新建一个UniqueValueRenderer对象
  2. 遍历每一个唯一值新建UniqueValue对象,传入字符串的描述、字符串的标签、Symbol类型的符号、符号对应的唯一值
  3. 获取UniqueValueRenderer对象的UniqueValues属性,即UniqueValue的“列表”,严格来说叫做“集合”
  4. 调用此列表的Add方法将新建的UniqueValue对象添加进去
  5. 遍历完之后将这个UniqueValueRenderer赋值给FeatureLayer或GraphicOverlay的Renderer属性
UniqueValueRenderer uniqueValueRenderer = new UniqueValueRenderer();

循环遍历{
	SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol();
	//设置pointSymbol的Color、Size、Style等
	UniqueValue uniqueValue = new UniqueValue("描述","标签",pointSymbol,唯一值);
	UniqueValueCollection uniqueValues = uniqueValueRenderer.UniqueValues;
	uniqueValues.Add(uniqueValue);
}

featureLayer.Renderer = uniqueValueRenderer;

2.2 分级渲染ClassBreaksRenderer

分级渲染可以指定值的区间(最小值,最大值)进行分级颜色渲染

  1. 新建一个ClassBreaksRenderer对象
  2. 遍历每一个级别新建ClassBreak对象,设置其MinValue最小值、MaxValue最大值、Symbol符号
  3. 将此ClassBreak对象添加至ClassBreaksRenderer对象的ClassBreaks属性(也是一个ClassBreak的集合)中
  4. 遍历完之后将这个ClassBreaksRenderer对象赋值给FeatureLayer或GraphicOverlay的Renderer属性
ClassBreaksRenderer classBreaksRenderer = new ClassBreaksRenderer();

循环遍历{
	SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol();
	//设置pointSymbol的Color、Size、Style等
	ClassBreak classBreak = new ClassBreak;
	classBreak.MinValue = 本级最小值;
	classBreak.MaxValue = 本级最大值;
	classBreak.Symbol = pointSymbol;
	classBreaksRenderer.ClassBreaks.Add(classBreak);
}

featureLayer.Renderer = classBreaksRenderer;

2.3 字典渲染DictionaryRenderer

使用字典渲染的一个典型用法是直接导入从ArcGIS Pro导出来的样式库stylx文件

  1. 新建一个DictionarySymbolStyle对象
  2. 设置此DictionarySymbolStyle对象的StyleLocation为stylx文件的位置
  3. 新建一个DictionaryRenderer对象,传入刚刚的DictionarySymbolStyle对象
  4. 将这个DictionaryRenderer对象赋值给FeatureLayer或GraphicOverlay的Renderer属性
DictionarySymbolStyle dictionarySymbolStyle = new DictionarySymbolStyle();
dictionarySymbolStyle.StyleLocation = "test.stylx" //样式库文件路径
DictionaryRenderer dictionaryRenderer = new DictionaryRenderer();
featureLayer.Renderer = dictionaryRenderer;

3 绘制图形

3.1 自行编程绘制

临时在地图上绘制图形,考虑使用Graphic而不是Feature,以绘制线要素为例,流程如下:

  1. 构建点的集合:如果是屏幕点击,可以用MapView的ScreenToLocation方法获取到点对象,也可以通过编程新建MapPoint类的对象,传入经纬度,将多个MapPoint对象依序添加至List<MapPoint>内就能得到一个点的集合
  2. 传入点集新建一个Polyline对象(Polyline是Geometry的子类)
  3. 传入Polyline对象以及相应的Symbol新建一个Graphic
  4. 将此Graphic添加至MapView的一个GraphicOverlay里面
    核心代码如下
MapPoint p1 = new MapPoint(0,0);
MapPoint p2 = new MapPoint(1,1);
MapPoint p3 = new MapPoint(2,2);

List<Graphic> points = new List<Graphic>();
points.Add(p1);
points.Add(p2);
points.Add(p3);

Polyline line = new Polyline(points);

//假设已有一个名叫lineSymbol的SimpleLineSymbol类型的变量
Graphic graphic = new Graphic(line,lineSymbol);
MyMapView.GraphicOverlays[0].Add(graphic);

3.2 使用SketchEditor

SketchEditor是ArcGIS Maps SDK for .NET中的一个类,提供了多种对图上要素进行新建、编辑的方法,可以简化开发流程,使用SketchEditor的方法可以分为两类:

  • 直接使用:不需要添加额外的参数,不需要编程干预,直接调用,那么可以直接将按钮绑定到这个类的对应命令上
  • 编程调用:也可以由我们自己去响应事件,在编程中去调用SketchEditor的属性、方法等

3.2.1 绑定命令直接使用

在xaml中使用Command属性绑定事件即可,例如为绘制完成的按钮绑定CompleteCommand命令

<Button x:Name="BtnComplete" Content="完成" Command="{Binding CompleteCommand}"/>

此外,还需要在使用前指定本页面的DataContext为SketchEditor才能绑定成功

DataContext = MyMapView.SketchEditor;

这样点击这个按钮的时候,相应的功能就会被触发并自动执行

3.2.2 编程调用

  1. 通过MapView获取SketchEditor对象
  2. 调用StartAsync方法开始绘制,此方法会返回一个Geometry类型的对象,即编辑的结果;如果是编辑已有几何对象,调用方法时需传入该Geometry,例如需要编辑被点击的要素,可以先用1 数据管理 > 2.2 Identify查询获取到Geometry
SketchEditor editor = MyMapView.SketchEditor;
Geometry newGeometry = editor.StartAsync(editGraphic.Geometry);

4 栅格符号系统

4.1 山体阴影渲染

  1. 新建一个HillShadeRenderer,依序传入参数altitude太阳高度角、azimuth太阳方位角、zfactor缩放因子、slopeType(枚举)坡度类型、pixelSizeFactor像元大小因子、pixelSizePower像元大小的幂、nbits位深度
  2. 设置RasterLayer的Renderer属性为此HillShadeRenderer对象
HillshadeRenderer hillshadeRenderer = new HillshadeRenderer(45, 0, 1, TypeOfSlope.Scaled, 1, 1, 8);
rasterLayer.Renderer = hillshadeRenderer;

4.2 其他渲染器

都是类似的思路,在新建此Renderer对象时传入所需要的各种参数,至于参数要求恐怕也记不来,因此这里也不再赘述;随后设置rasterLayer的Renderer属性为此新建的Renderer对象。