C# ArcEngine开发 之专题图篇

ArcEngine 二次开发 专栏收录该内容
3 篇文章 0 订阅

C# ArcEngine开发 之专题图篇

提示:上文书链接
C# ArcEngine开发 之地图整饰篇



前言

石崇豪富范丹穷,甘罗运早晚太公。彭祖寿高颜回命短,六个人俱在五行中
上文咱们说到产品大哥又有新需求
“咱们做一个专题图的模块,既能导入模板,也能自定义模板另存,这样就能一键生成这些地图要素”
好吧,满足他

提示:以下是本篇文章正文内容,下面案例可供参考

一、解决思路

在工具栏中添加按钮“模板导入”。

点击弹出模板预览窗口,左侧树形窗口显示可使用的全部模板样式,通过鼠标左击可进行选择,右侧窗口展示当前选中的模板样式。

点击应用,即可应用当前选择的专题图模板

二、实现原理

1.模板预览

左侧放置目录树,System.Windows.Forms.TreeView;
右侧放置页面输出控制(我也不知道这么翻译对不对),总之是,arcgis的AxPageLayoutControl;
通过对后台配置好的模板库地址进行读取,首先将所有模板展示在左侧目录树中,点击相应的模板专题,在右侧AxPageLayoutControl中读取相应模板的mxt文件,预览其样式,点击确定后应用。

2.功能代码

代码如下:

    public partial class FrmTemplate : Form
    {
        private string sExtention = ".mxt";
        AxPageLayoutControl pPageLayoutControl;

        public static string filepath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
        string spath = Application.StartupPath + "\\style\\Symbol";//载入系统模板       
        private string sTemplatePath = string.Empty;

        public FrmTemplate(AxPageLayoutControl axPLC)
        {
            InitializeComponent();
            pPageLayoutControl = axPLC;
            InitUI();
        }


        /// <summary>
        /// 向 tlstTemplate中添加各类模板名称
        /// </summary>
        private void InitUI()
        {
            try
            {
                List<string> plstDirName = null;
                List<string> plstFileName = null;


                string sFileName = string.Empty;
                string sParentName = string.Empty;

                plstDirName = GetChildDirectoryName(spath);//获取指定路径文件夹下子文件夹名称
                for (int i = 0; i < plstDirName.Count; i++)
                {
                    sParentName = plstDirName[i];
                    TreeNode pParentNode = new TreeNode();
                    pParentNode.Text = sParentName;
                    pParentNode.ExpandAll();
                    plstFileName = GetFiles(spath + "\\" + sParentName);
                    for (int j = 0; j < plstFileName.Count; j++)
                    {
                        sFileName = plstFileName[j];
                        //获取除后缀类型外的样式名
                        sFileName = sFileName.Substring(0, sFileName.LastIndexOf('.'));
                        TreeNode pSsan = new TreeNode();
                        pSsan.Text = sFileName;
                        pParentNode.Nodes.Add(pSsan);
                    }
                    tlstTemplate.Nodes.Add(pParentNode);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
		//鼠标点击事件
        private void tlstTemplate_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            try
            {
                tlstTemplate.SelectedNode = e.Node;//鼠标获取的节点
                TreeNode pFocusedNode = tlstTemplate.SelectedNode;//当前节点
                TreeNode pParentNode = new TreeNode();
                if (pFocusedNode != null)
                {

                    string sDirName = string.Empty;
                    string sFileName = string.Empty;
                    string sFilePath = string.Empty;
                    pParentNode = pFocusedNode.Parent;
                    sFileName = pFocusedNode.Text + sExtention;

                    if (pParentNode != null)//有父节点
                    {
                        sDirName = pParentNode.Text;
                        sFilePath = spath + "\\" + sDirName + "\\" + sFileName;
                    }
                    else//没有父节点,即第一级目录的样式
                    {
                        sFilePath = spath + "\\" + sFileName;
                    }

                    if (pageLayoutCtrlMxt.CheckMxFile(sFilePath))
                    {
                        pageLayoutCtrlMxt.LoadMxFile(sFilePath);
                        sTemplatePath = sFilePath;
                    }

                }
            }
            catch (Exception ex)
            {

            }
        }
		//确认使用
        private void btnOK_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(sTemplatePath))
            {
                //类中的界面控件也可以控制主界面
                UseTemplateMxtToPageLayout(pPageLayoutControl, sTemplatePath);
                this.Close();
            }
            else
            {
                MessageBox.Show("请选择要应用模板!", "提示", MessageBoxButtons.OK,
                    MessageBoxIcon.Information);
                return;
            }
        }
        
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        /// <summary>
        /// 模板替换
       	/// 这里是替换主页面中地图整饰的所有元素,比较核心了,请大家仔细观看
        /// </summary>
        /// <param name="_pageLayoutCtrl"></param>
        /// <param name="sTemplatePath"></param>
        /// <returns></returns>
        public static bool UseTemplateMxtToPageLayout(AxPageLayoutControl _pageLayoutCtrl, string sTemplatePath)
        {
            bool bSuccess = false;
            try
            {
                IMap pMap = null;
                IActiveView pActiveView = null;
                IPageLayout pCurPageLayout = _pageLayoutCtrl.PageLayout;
                pActiveView = pCurPageLayout as IActiveView;
                pMap = pActiveView.FocusMap;

                //读取模板
                IMapDocument pTempMapDocument = new MapDocumentClass();
                pTempMapDocument.Open(sTemplatePath, "");

                IPageLayout pTempPageLayout = pTempMapDocument.PageLayout;
                IPage pTempPage = pTempPageLayout.Page;
                IPage pCurPage = pCurPageLayout.Page;

                //替换单位及地图方向
                pCurPage.Orientation = pTempPage.Orientation;
                pCurPage.Units = pTempPage.Units;

                //替换页面尺寸
                Double dWidth; Double dHeight;
                pTempPage.QuerySize(out dWidth, out dHeight);
                pCurPage.PutCustomSize(dWidth, dHeight);

                //删除当前layout中除了mapframe外的所有element
                IGraphicsContainer pGraph;
                pGraph = pCurPageLayout as IGraphicsContainer;
                pGraph.Reset();
                IElement pElement = pGraph.Next();
                IMapFrame pMapFrame = null;
                pMapFrame = pGraph.FindFrame(pMap) as IMapFrame;
                while (pElement != null)
                {
                    if (pElement is IMapFrame)
                    {
                        pMapFrame = pElement as IMapFrame;
                    }
                    else
                    {
                        pGraph.DeleteElement(pElement);
                        pGraph.Reset();
                    }
                    pElement = pGraph.Next();
                }

                //遍历模板中的PageLayout所有元素,替换当前PageLayout的所有元素
                IGraphicsContainer pTempGraph = pTempPageLayout as IGraphicsContainer;
                pTempGraph.Reset();
                pElement = pTempGraph.Next();
                IArray pArray = new ArrayClass();
                while (pElement != null)
                {
                    if (pElement is IMapFrame)
                    {
                        IElement pMapFrameElement = pMapFrame as IElement;
                        pMapFrameElement.Geometry = pElement.Geometry;
                    }
                    else
                    {
                        if (pElement is IMapSurroundFrame)
                        {
                            IMapSurroundFrame pTempMapSurroundFrame = pElement as IMapSurroundFrame;
                            pTempMapSurroundFrame.MapFrame = pMapFrame;
                            IMapSurround pTempMapSurround = pTempMapSurroundFrame.MapSurround;
                        }
                        pArray.Add(pElement);
                    }
                    pElement = pTempGraph.Next();
                }

                int pElementCount = pArray.Count;
                for (int i = 0; i < pArray.Count; i++)
                {
                    pGraph.AddElement(pArray.get_Element(pElementCount - 1 - i) as IElement, 0);
                }
                
                pActiveView.Refresh();
                bSuccess = true;
            }
            catch (Exception ex)
            {

            }
            return bSuccess;
        }

        /// <summary>
        /// 获取指定文件夹下文件名称
        /// </summary>
        /// <param name="sDirPath"></param>
        /// <returns></returns>
        public static List<string> GetChildDirectoryName(string sDirPath)
        {
            List<string> plstDirName = null;
            try
            {
                string sDirName = string.Empty;
                plstDirName = new List<string>();
                DirectoryInfo _direcInfo = new DirectoryInfo(sDirPath);
                DirectoryInfo[] _dirInfo = _direcInfo.GetDirectories();
                foreach (DirectoryInfo _directoryInfo in _dirInfo)
                {
                    sDirName = _directoryInfo.Name;
                    if (!plstDirName.Contains(sDirName))
                    {
                        plstDirName.Add(sDirName);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return plstDirName;
        }

        /// <summary>
        /// 获取指定文件夹下文件名称
        /// </summary>
        /// <param name="sDirPath"></param>
        /// <returns></returns>
        public static List<string> GetFiles(string sDirPath)
        {
            List<string> plstFileName = null;
            try
            {
                FileInfo[] _fileInfo = null;
                string sFileName = string.Empty;
                plstFileName = new List<string>();

                DirectoryInfo _direcInfo = new DirectoryInfo(sDirPath);
                _fileInfo = _direcInfo.GetFiles();
                foreach (FileInfo _fInfo in _fileInfo)
                {
                    sFileName = _fInfo.Name;
                    if (!plstFileName.Contains(sFileName))
                    {
                        plstFileName.Add(sFileName);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return plstFileName;
        }

    }

总结

本次对于AE 专题图的开发的分享就到此结束啦,希望能对大家有所帮助。最后,欢迎各位关注以下公众号,我们会发布各种技术交流帖子,并提供相关文档和程序的下载。
在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页

打赏作者

Rqmadlife

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值