【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();
        }

这里仅是点符号的渲染,其他渲染类似,代码比较乱,仅供参考,

原文地址:https://www.cnblogs.com/vichang/p/6826212.html