C# AE ArcScene 二次开发线符号渲染实现

        为了满足系统应用需求,现对ArcGIS三维地图进行二次开发,使用ArcEngine实现ArcScene 三维加载矢量图图层进行符号渲染;在开发时抽空对已完成开发的功能做以下记录,不完善之处请多多指教,具体如下:

一、实现效果预览

二、 部分代码

        /// <summary>
        /// 加载选中的样式符号
        /// </summary>
        /// <param name="path"></param>
        private void loadStyle(string path)
        {
            this.styleColors.Clear();
            this.styleWidths.Clear();
            lineSymbologyControl.Clear();
            string[] sts = path.Split('.');
            // 做相关处理避免加载不同后缀样式时报错
            if (sts[sts.Length - 1] == "style")
                lineSymbologyControl.LoadDesktopStyleFile(path); // 加载后缀为Style样式文件
            else
                lineSymbologyControl.LoadStyleFile(path); // 加载后缀为ServerStyle样式文件
            lineSymbologyControl.StyleClass = esriSymbologyStyleClass.esriStyleClassLineSymbols;
            m_SymbologyStyleClass = lineSymbologyControl.GetStyleClass(lineSymbologyControl.StyleClass);

            // 添加当前图层渲染的符号
            IStyleGalleryItem pStyleGalleryItem = new ServerStyleGalleryItem();
            pStyleGalleryItem.Name = "当前符号";
            pStyleGalleryItem.Item = m_LegendClass.Symbol;
            m_SymbologyStyleClass.AddItem(pStyleGalleryItem, 0);

            // 符号属性集合处理存储
            for (int i = 0; i < m_SymbologyStyleClass.get_ItemCount(); i++)
            {
                IStyleGalleryItem item = m_SymbologyStyleClass.GetItem(i);
                ILineSymbol pLineSymbol = item.Item as ILineSymbol;
                if (!styleWidths.ContainsKey(item.ID))
                    styleWidths.Add(item.ID, pLineSymbol.Width);

                if (!styleColors.ContainsKey(item.ID))
                    styleColors.Add(item.ID, ConvertToColor(pLineSymbol.Color));
            }
            m_SymbologyStyleClass.SelectItem(0);
        }

        /// <summary>
        /// Color转换为ESRI的IColor
        /// </summary>
        /// <param name="color"></param>
        /// <returns></returns>
        private IColor ConvertToRgbColor(Color color)
        {
            IColor pColor = new RgbColor();
            pColor.RGB = color.R + color.G * 256 + color.B * 65536;
            return pColor;
        }
        
        /// <summary>
        /// ESRI的IColor转换为Color
        /// </summary>
        /// <param name="pColor"></param>
        /// <returns></returns>
        private Color ConvertToColor(IColor pColor)
        {
            return ColorTranslator.FromOle(pColor.RGB);
        }

        /// <summary>
        /// 预览当前选择符号
        /// </summary>
        private void PreviewLineSymbol(IStyleGalleryItem pStyleGalleryItem)
        {
            IPictureDisp pPictureDisp = m_SymbologyStyleClass.PreviewItem(pStyleGalleryItem, symbolPreview.Width, symbolPreview.Height);
            Image priviewImage = Image.FromHbitmap(new IntPtr(pPictureDisp.Handle));
            symbolPreview.Image = priviewImage;
        }

三、主窗口调用代码

点击AxTOCControl控件中图层的符号调用线符号窗口

        private IFeatureLayer pToccFeatureLayer = null; //当前选择的要素类图层
        private ILayer pTOCLayer = null;

        private void MapTOCControl_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
        {
            esriTOCControlItem pItem = esriTOCControlItem.esriTOCControlItemNone;
            IBasicMap pBasicMap = null;
            object other = null;
            object index = null;
            if (e.button == 1)
            {
                mapTOCControl.HitTest(e.x, e.y, ref pItem, ref pBasicMap, ref pTOCLayer, ref other, ref index);
                System.Drawing.Point pos = new System.Drawing.Point(e.x, e.y);
                if (pItem == esriTOCControlItem.esriTOCControlItemLegendClass)
                {
                    if (pTOCLayer is IFeatureLayer)
                    {
                        IFeatureLayer pFeatureLayer = pTOCLayer as IFeatureLayer;
                        if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
                        {
                            ILegendGroup pLegendGroup = other as ILegendGroup;
                            ILegendClass pLegendClass = pLegendGroup.get_Class((int)index);
                            SceneLineSymbol frm = new SceneLineSymbol(this.mapSceneControl.SceneGraph, this.mapTOCControl, pTOCLayer, pLegendClass);
                            frm.ShowDialog();
                        }
                    }
                }
            }
        }

四、源码下载

链接地址:线符号渲染下载

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

向着太阳往前冲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值