用心计较般般错 安心自守事事宽

cgl 坚持、努力终有所获
  新随笔  :: 管理

Mxd文档更新比例尺

Posted on 2017-02-16 14:04  用心计较般般错 安心自守事事宽  阅读(211)  评论(0编辑  收藏  举报

在AE中,更新Mxd文档的比例尺,比较特殊。写代码以记录,更新比例尺代码如图所示:

        [DllImport("User32.dll")]
        public static extern int GetDesktopWindow();
        /// <summary>
        /// 更新比例尺
        /// </summary>
        /// <param name="pNewMxdFile"></param>
        private void UpdataScale(string pNewMxdFile)
        {
            IMapDocument tMapDocument2 = new MapDocumentClass();
            tMapDocument2.Open(pNewMxdFile);
            IPageLayout pageLayout = tMapDocument2.PageLayout;
            IActiveView activeView2 = (IActiveView)pageLayout;
            IMap map = activeView2.FocusMap;
            activeView2.Activate(GetDesktopWindow());
            map.MapScale = _MapScale;
            activeView2.Refresh();
            tMapDocument2.Save(true, false);
            tMapDocument2.Close();
        }

 

注意事项:在这个方法中,好像只能用于更新比例尺的操作。除此之外,如果做其他操作,就会造成莫名奇妙的错误。例如:先让Map缩放到一个特性的Envelope中后,再更新一个比例尺,就有问题。Mxd打开图后,就看不见数据了。相当奇怪,不知道其他的操作会造成什么影响。主要怀疑是函数GetDesktopWindow在作怪。
所以一般把修改比例尺放到一个单独的函数中。如果Mxd中有多个Map,都要更新比例尺,则代码如下所示:

        private void UpdataScale(string pNewMxdFile)
        {
            IMapDocument mapDocument = new MapDocumentClass();
            mapDocument.Open(pNewMxdFile);

            IPageLayout pageLayout = mapDocument.PageLayout;
            IActiveView activeView = (IActiveView)pageLayout;
            IMap map = activeView.FocusMap;

            activeView = (IActiveView)mapDocument.PageLayout;
            activeView.Activate(GetDesktopWindow());

            map.MapScale = _MapScale;
            activeView.Refresh();

            pageLayout.FocusNextMapFrame();
            pageLayout = mapDocument.PageLayout;
            activeView = (IActiveView)pageLayout;
            map = activeView.FocusMap;

            activeView = (IActiveView)mapDocument.PageLayout;
            activeView.Activate(GetDesktopWindow());

            map.MapScale = _MapScale;
            activeView.Refresh();

            mapDocument.Save(true, true);
        }

更新Mxd的范围代码如下:

        /// <summary>
        /// 更新缩放范围
        /// </summary>
        /// <param name="pNewMxdFile"></param>
        private void UpdataExtend(string pNewMxdFile,IEnvelope pEnvelope)
        {
            IMapDocument tMapDocument2 = new MapDocumentClass();
            tMapDocument2.Open(pNewMxdFile);
            IPageLayout pageLayout = tMapDocument2.PageLayout;
            IActiveView activeView2 = (IActiveView)pageLayout;
            IEnvelope pEnv = activeView2.Extent;
            pEnv = pEnvelope;
            //pEnv.CenterAt(point)   //指向中心点
            activeView2.Extent = pEnv;
            activeView2.Refresh();
            tMapDocument2.Save(true, false);
            tMapDocument2.Close();
        }