ArcGIS Engine - 图层渲染

在这里插入图片描述

		/// <summary>
        /// 单一符号选择事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rbSymbol_CheckedChanged(object sender, EventArgs e)
        {
            if (rbSymbol.Checked)
            {
                onlySymbol.Visible = true;
                onlyField.Visible = false;
            }
        }

        /// <summary>
        /// 唯一值选择事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rbField_CheckedChanged(object sender, EventArgs e)
        {
            if (rbField.Checked)
            {
                onlySymbol.Visible = false;
                onlyField.Visible = true;
            }
        }

        /// <summary>
        /// 添加所有值
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void addAllValue_Click(object sender, EventArgs e)
        {
            if (null == layer || !(layer is IFeatureLayer)) return;

            IFeatureLayer featureLayer = layer as IFeatureLayer;
            if (null == featureLayer.FeatureClass) return;

            IFeatureClass featureClass = featureLayer.FeatureClass;
            IFeatureCursor featureCursor = featureClass.Search(null,true);
            IFeature feature = featureCursor.NextFeature();
            
            //获取指定字段的所有值
            List<object> fieldValue = new List<object>();
            while(feature != null)
            {
                int l = feature.Fields.FindField(checkedFields.Text);
                fieldValue.Add(feature.get_Value(l));
                feature = featureCursor.NextFeature();
            }
            
            //去重复
            List<object> fieldValue_Distinct = fieldValue.Distinct().ToList();

            //临时符号
            ISymbol pSymbol = UniqueValueSymbol[0];

            //清空显示
            if (fieldValue_Distinct.Count != 0)
            {
                UniqueValueSymbol.RemoveRange(0, FeatureGridView.Rows.Count);
                FeatureGridView.Rows.Clear();
            }

            //添加到显示
            for (int i = 0; i < fieldValue_Distinct.Count; i++)
            {
                int k = FeatureGridView.Rows.Add(1);

                //添加符号(根据色带添加,此处临时固定一个Symbol)
                FeatureGridView.Rows[k].Cells[0].Value = PreViewFillSymbol(pSymbol, FeatureGridView.Columns[0].Width, FeatureGridView.Rows[0].Height);
                UniqueValueSymbol.Add(pSymbol);

                //添加值字段
                FeatureGridView.Rows[k].Cells[1].Value = fieldValue_Distinct[i];

                //添加标注字段
                FeatureGridView.Rows[k].Cells[2].Value = fieldValue_Distinct[i];

                //添加计数字段
                FeatureGridView.Rows[k].Cells[3].Value = fieldValue.Count(s => s.ToString() == fieldValue_Distinct[i].ToString());

            }

            UpdateRemove();
        }

        /// <summary>
        /// 移除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void removeValue_Click(object sender, EventArgs e)
        {
            if (FeatureGridView.SelectedRows.Count > 0)
            {
                int i = FeatureGridView.SelectedRows[0].Index;
                FeatureGridView.Rows.RemoveAt(i);
                UniqueValueSymbol.RemoveAt(i);
            }

            if (FeatureGridView.Rows.Count == 0)
            {
                removeValue.Enabled = false;
                removeAllValue.Enabled = false;
            }

            UpdateRemove();
        }

        /// <summary>
        /// 移除全部
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void removeAllValue_Click(object sender, EventArgs e)
        {
            FeatureGridView.Rows.Clear();
            UpdateRemove();
        }

        /// <summary>
        /// 符号点击打开符号选择器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FeatureGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                //获取选择行号
                int row = e.RowIndex;

                //初始化符号
                ISymbol pSymbol = UniqueValueSymbol[row];

                //符号窗口
                SymbolForm symbolForm = null;

                //判断图层要素类型
                IFeatureLayer featureLayer = layer as IFeatureLayer;

                if (featureLayer == null) return;

                //点类型
                if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
                {
                    symbolForm = new SymbolForm(pSymbol, esriSymbologyStyleClass.esriStyleClassMarkerSymbols);
                }

                //线类型
                if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
                {
                    symbolForm = new SymbolForm(pSymbol, esriSymbologyStyleClass.esriStyleClassLineSymbols);
                }

                //面类型
                if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
                {
                    symbolForm = new SymbolForm(pSymbol, esriSymbologyStyleClass.esriStyleClassFillSymbols);
                }

                DialogResult dialogResult = symbolForm.ShowDialog(this);

                if (dialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    //获取填充符号
                    pSymbol = symbolForm.SymbolObject as ISymbol;

                    //填充符号
                    FeatureGridView.Rows[row].Cells[0].Value = PreViewFillSymbol(pSymbol, FeatureGridView.Columns[0].Width, FeatureGridView.Rows[0].Height);

                    //储存符号
                    UniqueValueSymbol[row] = pSymbol;
                }

            }
        }
        
        /// <summary>
        /// 单一符号化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void picPreview_Click(object sender, EventArgs e)
        {
            //符号窗口
            SymbolForm symbolForm = null;

            //判断图层要素类型
            IFeatureLayer featureLayer = layer as IFeatureLayer;

            if (featureLayer == null) return;

            //点类型
            if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
            {
                symbolForm = new SymbolForm(SimpleSymbol, esriSymbologyStyleClass.esriStyleClassMarkerSymbols);
            }

            //线类型
            if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
            {
                symbolForm = new SymbolForm(SimpleSymbol, esriSymbologyStyleClass.esriStyleClassLineSymbols);
            }

            //面类型
            if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
            {
                symbolForm = new SymbolForm(SimpleSymbol, esriSymbologyStyleClass.esriStyleClassFillSymbols);
            }

            DialogResult dialogResult = symbolForm.ShowDialog(this);

            if (dialogResult == System.Windows.Forms.DialogResult.OK)
            {
                //获取填充符号
                SimpleSymbol = symbolForm.SymbolObject as ISymbol;

                //填充符号
                picPreview.Image = PreViewFillSymbol(SimpleSymbol, picPreview.Width, picPreview.Height);

            }

        }
        
		/// <summary>
        /// 更新移除
        /// </summary>
        private void UpdateRemove()
        {
            if (FeatureGridView.Rows.Count != 0)
            {
                removeValue.Enabled = true;
                removeAllValue.Enabled = true;

            }
            else
            {
                removeValue.Enabled = false;
                removeAllValue.Enabled = false;
            }
        }

        /// <summary>
        /// 填充符号字段列表
        /// </summary>
        /// <param name="layer"></param>
        private void FillSymbolFields(ILayer layer)
        {
            if (null == layer || !(layer is IFeatureLayer)) return;

            IFeatureLayer featureLayer = layer as IFeatureLayer;

            if (null == featureLayer.FeatureClass) return;

            IFeatureClass featureClass = featureLayer.FeatureClass;
            IFields fields = featureClass.Fields;

            for (int i = 0; i < fields.FieldCount; i++)
            {
                IField field = fields.get_Field(i);

                if (MapHelper.IsReservedField(featureClass, field.Name)) continue;

                checkedFields.Properties.Items.Add(field.Name);
            }

            if (checkedFields.Properties.Items.Count != 0)
            {
                checkedFields.SelectedIndex = 0;
            }
        }

        /// <summary>
        /// 填充图层渲染符号
        /// </summary>
        /// <param name="pLayer"></param>
        private void FillLayerRenderer(ILayer player)
        {
            if (null == layer || !(layer is IFeatureLayer)) return;

            //获取要素图层
            IFeatureLayer pFeatureLayer = player as IFeatureLayer;

            IGeoFeatureLayer geoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;

            if (geoFeatureLayer == null) return;

            //单要素渲染
            if (geoFeatureLayer.Renderer is ISimpleRenderer)
            {
                ISimpleRenderer pSimpleRenderer = geoFeatureLayer.Renderer as ISimpleRenderer;

                if (pSimpleRenderer == null) return;

                //填充图层符号
                SimpleSymbol = pSimpleRenderer.Symbol;

                if (SimpleSymbol != null)
                {
                    picPreview.Image = PreViewFillSymbol(SimpleSymbol, picPreview.Width, picPreview.Height);
                }

                rbSymbol.Checked = true;
            }

            //唯一值渲染
            if (geoFeatureLayer.Renderer is IUniqueValueRenderer)
            {
                IUniqueValueRenderer uniqueValueRenderer = geoFeatureLayer.Renderer as IUniqueValueRenderer;

                if (uniqueValueRenderer == null) return;

                //填充渲染字段名字
                checkedFields.SelectedItem = uniqueValueRenderer.get_Field(0);

                //填充符号样式
                for (int i = 0; i < uniqueValueRenderer.ValueCount; i++)
                {
                    //获取值名称
                    string name = uniqueValueRenderer.get_Value(i);

                    //获取标签
                    string lable = uniqueValueRenderer.get_Label(name);

                    //获取符号
                    ISymbol pSymbol = uniqueValueRenderer.get_Symbol(name);

                    //储存符号
                    UniqueValueSymbol.Add(pSymbol);

                    //填充到表格
                    int k = FeatureGridView.Rows.Add(1);

                    //添加符号
                    FeatureGridView.Rows[k].Cells[0].Value = PreViewFillSymbol(pSymbol, FeatureGridView.Columns[0].Width, FeatureGridView.Rows[0].Height);

                    //添加值
                    FeatureGridView.Rows[k].Cells[1].Value = name;

                    //添加标注
                    FeatureGridView.Rows[k].Cells[2].Value = lable;

                    //添加数量
                    FeatureGridView.Rows[k].Cells[3].Value = "?";

                }

                rbField.Checked = true;

                UpdateRemove();
            }
        }

        /// <summary>
        /// 图层单要素渲染器
        /// </summary>
        /// <param name="player"></param>
        /// <param name="fillSymbol"></param>
        private void SimpleRenderer(ILayer player, ISymbol pSymbol)
        {
            //获取要素图层
            IFeatureLayer pFeatureLayer = player as IFeatureLayer;

            IGeoFeatureLayer geoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;

            //单要素渲染
            ISimpleRenderer pSimpleRenderer = new SimpleRendererClass();

            pSimpleRenderer.Symbol = pSymbol;

            //将样式附给图层
            geoFeatureLayer.Renderer = pSimpleRenderer as IFeatureRenderer;

        }

        /// <summary>
        /// 图层唯一值渲染器
        /// </summary>
        /// <param name="player"></param>
        /// <param name="nameValue"></param>
        /// <param name="RenderField"></param>
        /// <param name="UniqueValueSymbol"></param>
        private void UniqueValueRenderer(ILayer player, List<string> nameValue, string RenderField, List<ISymbol> UniqueValueSymbol)
        {
            //获取要素图层
            IFeatureLayer pFeatureLayer = player as IFeatureLayer;

            IGeoFeatureLayer geoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;

            //唯一值渲染
            IUniqueValueRenderer uniqueValueRenderer = new UniqueValueRendererClass();
            uniqueValueRenderer.FieldCount = 1;
            uniqueValueRenderer.set_Field(0, RenderField);

            //符号同步
            for (int i = 0; i < nameValue.Count; i++)
            {
                uniqueValueRenderer.AddValue(nameValue[i], RenderField, UniqueValueSymbol[i]);
            }

            //将样式附给图层
            geoFeatureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer;

        }

        /// <summary>
        /// Symbol转为Image
        /// </summary>
        /// <param name="pSymbol"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <returns></returns>
        private Image PreViewFillSymbol(ISymbol pSymbol, int width, int height)
        {
            if (pSymbol == null) return null;

            IStyleGalleryClass pStyleGalleryClass = null;

            if (pSymbol is IMarkerSymbol)
            {
                pStyleGalleryClass = new MarkerSymbolStyleGalleryClass();
            }
            if (pSymbol is ILineSymbol)
            {
                pStyleGalleryClass = new LineSymbolStyleGalleryClass();
            }
            if (pSymbol is IFillSymbol)
            {
                pStyleGalleryClass = new FillSymbolStyleGalleryClass();
            }

            Image img = new Bitmap(width, height);
            Graphics gc = Graphics.FromImage(img);
            IntPtr hdc = gc.GetHdc();
            tagRECT rect = new tagRECT();
            rect.left = 0;
            rect.top = 0;
            rect.right = width;
            rect.bottom = height;
            pStyleGalleryClass.Preview(pSymbol, hdc.ToInt32(), ref rect);
            gc.ReleaseHdc(hdc);
            gc.Dispose();
            return img;
        }  




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王八八。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值