【GIS】点图层符号的方向和大小
方向:根据属性字段设置点图层中每个要素的符号方向和大小,
1 所有要素使用同一种符号---简单渲染
在图层属性---符号系统---单一符号中进行设置,首先设置符号,在后面的【高级】选项按钮中分别设置【旋转】和【大小】
【旋转】下拉框中选择对应字段,以及旋转方式,确定即可
【大小】下拉框中选择对应符号大小的字段,确认即可
2 要素根据字段值得不同采用不同的符号---使用唯一值渲染
图层属性中设置唯一值渲染,根据字段值得不同选择不同的符号,并在【高级】选项中设置【旋转】和【大小】,方法同上
显示效果如下:
ArcEngine提供了相应的接口进行设置,
IRotationRenderer设置旋转参数
ISizeRenderer设置大小参数
比如
IRotationRenderer pRotationRender = pSimRender as IRotationRenderer;
pRotationRender.RotationField = "ANGEL";
pRotationRender.RotationType = esriSymbolRotationType.esriRotateSymbolArithmetic;
ISizeRenderer pSizeRender = pSimRender as ISizeRenderer;
pSizeRender.SizeRendererFlags = (int)esriSizeRendererFlags.esriSizeRendererUseExpression;
pSizeRender.SizeRendererExpression = "[SIZE]";
简单渲染
/// <summary> /// 单一符号化 /// </summary> /// <param name="pFeatLyr">渲染图层</param> /// <param name="pRgbColor">渲染颜色</param> private void SimpleRenderer(IFeatureLayer pFeatLyr, IMarkerSymbol markerSymbol) { try { esriGeometryType type = pFeatLyr.FeatureClass.ShapeType; ISimpleRenderer pSimRender = new SimpleRendererClass(); IColor pColor = this.GetColor(255, 0, 0); if (type == esriGeometryType.esriGeometryPoint) { markerSymbol.Color = pColor; markerSymbol.Size = 50; pSimRender.Symbol = markerSymbol as ISymbol; IRotationRenderer pRotationRender = pSimRender as IRotationRenderer; pRotationRender.RotationField = "ANGEL"; pRotationRender.RotationType = esriSymbolRotationType.esriRotateSymbolArithmetic; ISizeRenderer pSizeRender = pSimRender as ISizeRenderer; pSizeRender.SizeRendererFlags = (int)esriSizeRendererFlags.esriSizeRendererUseExpression; pSizeRender.SizeRendererExpression = "[SIZE]"; } IGeoFeatureLayer pGeoFeatLyr = pFeatLyr as IGeoFeatureLayer; pGeoFeatLyr.Renderer = pSimRender as IFeatureRenderer; this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); this.axTOCControl1.Update(); } catch (Exception ex) { } }
唯一值渲染
/// <summary> /// 多符号 /// </summary> /// <param name="pFeaLyr"></param> /// <param name="fieldname"></param> private void UniqueValueRender(IFeatureLayer pFeaLyr, string fieldname) { IGeoFeatureLayer pGeoFeatLyr = pFeaLyr as IGeoFeatureLayer; ITable pTable = pFeaLyr as ITable; IUniqueValueRenderer pUniqueValueRender = new UniqueValueRendererClass(); int intFieldNumber = pTable.FindField(fieldname); pUniqueValueRender.FieldCount = 1;//设置唯一值符号化的关键字段为一个 pUniqueValueRender.set_Field(0, fieldname);//设置唯一值符号化的第一个关键字段 //根据渲染字段的值的个数,设置一组随机颜色,如某一字段有5个值,则创建5个随机颜色与之匹配 IQueryFilter pQueryFilter = new QueryFilterClass(); bool bSuccess = false; IColor pNextUniqueColor = this.GetColor(255, 0, 0); //查询字段的值 pQueryFilter = new QueryFilterClass(); pQueryFilter.AddField(fieldname); ICursor pCursor = pTable.Search(pQueryFilter, true); IRow pNextRow = pCursor.NextRow(); int codeValue = 0; IRowBuffer pNextRowBuffer = null; while (pNextRow != null) { pNextRowBuffer = pNextRow as IRowBuffer; codeValue = Convert.ToInt32(pNextRowBuffer.get_Value(intFieldNumber));//获取渲染字段的每一个值 IMarkerSymbol pMarkerSymbol = null; switch (pGeoFeatLyr.FeatureClass.ShapeType) { case esriGeometryType.esriGeometryPoint: { string symbolname = ""; switch (codeValue) { case 1: symbolname = "飞机场"; break; case 2: symbolname = "箭头"; break; case 3: symbolname = "房屋"; break; } pMarkerSymbol = ServerSymbolUtilty.GetItemFromServerStyle(symbolFile, "Marker Symbols", symbolname).Item as IMarkerSymbol; pMarkerSymbol.Color = pNextUniqueColor; pUniqueValueRender.AddValue(codeValue.ToString(), "", pMarkerSymbol as ISymbol);//添加渲染字段的值和渲染样式 pNextRow = pCursor.NextRow(); break; } } } IRotationRenderer pRotationRender = pUniqueValueRender as IRotationRenderer; pRotationRender.RotationField = "ANGEL"; pRotationRender.RotationType = esriSymbolRotationType.esriRotateSymbolArithmetic; ISizeRenderer pSizeRender = pUniqueValueRender as ISizeRenderer; pSizeRender.SizeRendererFlags = (int)esriSizeRendererFlags.esriSizeRendererUseExpression; pSizeRender.SizeRendererExpression = "[SIZE]"; pGeoFeatLyr.Renderer = pUniqueValueRender as IFeatureRenderer; axMapControl1.Refresh(); axTOCControl1.Update(); }
这里仅是点符号的渲染,其他渲染类似,代码比较乱,仅供参考,