• ArcGIS Engine 基础功能(一)


    这里放的代码都是目前感觉比较简洁的,可能会有缺陷,但是还是效率优先吧,以后有问题再补充。

    1. 打开地图文档(简便、建议)

    			//using ESRI.ArcGIS.Controls; 引用
                ICommand command = new ControlsOpenDocCommandClass();    
                command.OnCreate(mainMapControl.Object);
                command.OnClick();
                mainTOCControl.SetBuddyControl(mainMapControl);  // 手动绑定伙伴控件
    

    1.2 打开地图文档(不建议)

    // using ESRI.ArcGIS.Carto;
                OpenFileDialog open = new OpenFileDialog();
                //设置参数
                //检查文件是否存在
                open.CheckFileExists = true;
                open.Title = "打开地图文档";
                // 不允许多个文件同时打开
                open.Multiselect = false;
                // 存储时打开的文件路径
                open.RestoreDirectory = true;
                //打开文件格式
                open.Filter = @"地图文档(*.mxd)|*.mxd;|ArcMap模板(*.mxt)|*.mxt;|所有地图格式(*.mxd;*.mxt;*.pmf)|*.mxd;*.mxt;*.pmf";//文件过滤条件
                open.Multiselect = false;//禁止多选
                open.RestoreDirectory = true;
                //打开窗口
                open.ShowDialog();
                // 存储打开的文件路径
                string fileName = open.FileName;
                if (mainMapControl.CheckMxFile(fileName))
                {
                    //将数据载入pMapDocument并与Map控件关联
                    IMapDocument pMapDocument = new MapDocument();   // using ESRI.ArcGIS.Carto;
                    pMapDocument.Open(fileName, "");
                    //获取Map地图中激活的地图文档
                    mainMapControl.Map = pMapDocument.ActiveView.FocusMap;
                    mainMapControl.ActiveView.Refresh();
                }
    
    

    2. 打开数据(数据库,shp, 栅格等多种数据类型)

    // 加载很多种数据
    ICommand command = new ControlsAddDataCommandClass();
    command.OnCreate(mainMapControl.Object);
    command.OnClick();
    mainMapControl.ActiveView.Refresh();
    

    2.2 添加shp数据(为了效率不建议)

    // using ESRI.ArcGIS.Geodatabase;
    // using ESRI.ArcGIS.DataSourcesFile;
    // using ESRI.ArcGIS.DataSourcesRaster;
    
     private void 添加ShapefileToolStripMenuItem_Click(object sender, EventArgs e)
            {
    
                try
                {
                    //同样实例化一个打开文件的类对象
                    OpenFileDialog open = new OpenFileDialog();
                    // 如果打开正确
                    if (open.ShowDialog() == DialogResult.OK)
                    {
                        //首先定义一个空的路径
                        string filePath = string.Empty;
                        // 然后定义一个空的文件名
                        string file = string.Empty;
                        // 获取完整的文件路径
                        string filedir = open.FileName;
                        //如果路径为空,嘛都不返回
                        if (fileDir == "") return;
                        // 对完整路径进行截取  获取最后一个斜杠的索引
                        int pos = filedir.LastIndexOf('\');
                        // 截取字符串  路径
                        filePath =filedir.Substring(0, pos);
                        //文件名
                        file = filedir.Substring(pos+1);
                        // 需要两个参数
                        axMapControl1.AddShapeFile(filePath, file);
                        //刷新
                        axMapControl1.ActiveView.Refresh();
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("请打开正确的文档!", "提醒",MessageBoxButtons.OK, MessageBoxIcon.Error );
                }
            }
    

    3. 地图浏览
    3…1 全图

        private void FullExtentTSButton_Click(object sender, EventArgs e)
            {
                mainMapControl.Extent = mainMapControl.FullExtent;
        
            }
    

    3.2 等比例放大

            private void btnZoomInStep_Click(object sender, EventArgs e)
            {
                IEnvelope  pEnvelope = mainMapControl.Extent;
                pEnvelope.Expand(0.5, 0.5, true);   //放大2倍
                mainMapControl.Extent = pEnvelope;
                mainMapControl.ActiveView.Refresh();
    
            }
    

    3.3 等比例缩小(与放大的区别在于多亿过中心点的设置)

            private void btnZoomIOutStep_Click(object sender, EventArgs e)
            {
                IActiveView pActiveView = mainMapControl.ActiveView;
                IPoint centerPoint = new PointClass();
                centerPoint.PutCoords((pActiveView.Extent.XMin + pActiveView.Extent.XMax) / 2, (pActiveView.Extent.YMax + pActiveView.Extent.YMin) / 2);
                IEnvelope envlop = pActiveView.Extent;
                envlop.Expand(1.5, 1.5, true);    //与放大的区别在于Expand的参数不同
                pActiveView.Extent.CenterAt(centerPoint);
                pActiveView.Extent = envlop;
                pActiveView.Refresh();
            }   
    

    3.4 上一视图

    // 定义全局变量
            IExtentStack pExtentStack;
            private void PreViewTSButton_Click(object sender, EventArgs e)
            {
                pExtentStack = mainMapControl.ActiveView.ExtentStack;
                //判断是否可以回到前一视图,第一个视图没有前视图
                if (pExtentStack.CanUndo())
                {
                    pExtentStack.Undo();      //撤销到上一视图范围
                    NextViewTSButton.Enabled = true;   //后一视图可以使用
                    if (!pExtentStack.CanUndo())
                    {
                        PreViewTSButton.Enabled = false;  //前一视图不能使用
                    }
                }
                mainMapControl.ActiveView.Refresh();
    
            }
    

    3.5 下一视图

            private void NextViewTSButton_Click(object sender, EventArgs e)
            {
                pExtentStack = mainMapControl.ActiveView.ExtentStack;
                //判断是否可以回到后一视图,最后一个视图没有后一视图
                if (pExtentStack.CanRedo())  //如果可以重做下一视图
                {
                    pExtentStack.Redo();   //重做到下一视图
                    PreViewTSButton.Enabled = true;   //上一视图按钮可以使用
    
                    if (!pExtentStack.CanRedo())  //如果不可以重做下一视图
                    {
                        NextViewTSButton.Enabled = false;   //下一视图不能用
                    }
                }
                mainMapControl.ActiveView.Refresh();
            }
    

    下面着几个功能是有关联的,所以放在了一起:
    先定义一个枚举:

        //枚举
        public enum DownButton
        { 
            no = 0,
            pan = 1,
            bigger = 2,  //拉框放大
            smaller = 3, //拉框缩小
     	}
    

    3.6 漫游

            private void PanTSButton_MouseDown(object sender, MouseEventArgs e)
            {
                // EjectAllButton();  //弹起所有得按钮
                PanTSButton.Checked = true;
                DButton = DownButton.pan;
                mainMapControl.MousePointer = esriControlsMousePointer.esriPointerPan;
                mainMapControl.CurrentTool = null;  //将勾选得其他工具取消
            }
    

    3.7 拉框放大

    private void btnBigger_Click(object sender, EventArgs e)
            {
                // EjectAllButton();  //弹起所有得按钮
                btnBigger .Checked = true;
                mainMapControl.CurrentTool = null;
                DButton = DownButton.bigger;
                mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomIn;
            }
    

    3.8 拉框缩小

            private void btnSmaller_Click(object sender, EventArgs e)
            {
                // EjectAllButton();  //弹起所有得按钮
                btnSmaller.Checked = true;
                mainMapControl.CurrentTool = null;  //将勾选的其他工具去掉
                DButton = DownButton.smaller;
                mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomOut;
            }
    

    然后,编写主地图的OnMouseDown事件

    private void mainMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
            {
                //将屏幕的坐标转换为地图的坐标点
                //IPoint pPoint = (mainMapControl.Map as IActiveView).ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
                if (e.button == 1)
                {//表示鼠标的左键
                    IActiveView pActiveView = mainMapControl.ActiveView;
                    IEnvelope pEnvelop = new EnvelopeClass();
    
                    switch (DButton)
                    {
                        
                        //拉框放大
                        case DownButton.bigger:
                        #region 拉框放大
                            pEnvelop = mainMapControl.TrackRectangle();
                            //如果拉框的范围为空则返回
                            if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == 0 || pEnvelop.Width == 0)
                            {
                                return;
                            }
                            //如果有拉框范围则放大到拉框范围
                            pActiveView.Extent = pEnvelop;
                            pActiveView.Refresh();
                            break;
                        #endregion
       
                        case DownButton.smaller:
                        #region 拉框缩小
                            pEnvelop = mainMapControl.TrackRectangle();
                            //如果拉框范围为空则退出
                            if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == 0 || pEnvelop.Width == 0)
                            {
                                return;
                            }
                            else  //如果有拉框范围、则以拉框范围为中心,缩小倍数为当前视图范围/拉框范围
                            {
                                double dWidth = pActiveView.Extent.Width * pActiveView.Extent.Width / pEnvelop.Width;
                                double dHeight = pActiveView.Extent.Height * pActiveView.Extent.Height / pEnvelop.Height;
                                double dXmin = pActiveView.Extent.XMin - ((pEnvelop.XMin - pActiveView.Extent. XMin) * pActiveView.Extent.Width / pEnvelop.Width);
                                double dYmin = pActiveView.Extent.YMin - ((pEnvelop.YMin - pActiveView.Extent.YMin) * pActiveView.Extent.Height / pEnvelop.Height);
                                double dXmax = dXmin + dWidth;
                                double dYmax = dYmin + dHeight;
                                pEnvelop.PutCoords(dXmin, dYmin, dXmax, dYmax);
                            }
                            pActiveView.Extent = pEnvelop;
                            pActiveView.Refresh();
                            break;
                        #endregion
               
                        case DownButton.pan:
                        #region 漫游
                            mainMapControl.Pan();
                            break;
                            #endregion
                    }
                }
    
    
    
            }
    

    4. 保存地图文档

    private void saveToolStrip_Click(object sender, EventArgs e)
            {
                try
                {
                    string sMxdFileName = mainMapControl.DocumentFilename;
                    IMapDocument pMapDocument = new MapDocumentClass();
                    //检查文档是否为空以及有效性
                    if (sMxdFileName != null && mainMapControl.CheckMxFile(sMxdFileName))
                    {
                        if (pMapDocument.get_IsReadOnly(sMxdFileName))
                        {
                            MessageBox.Show("地图本当为只读,不能保存!");
                            pMapDocument.Close();
                            return;
                        }
                        
                        else
                        {
                        SaveFileDialog pSaveFileDialog = new System.Windows.Forms.SaveFileDialog();
                        pSaveFileDialog.Title = "请选择保存路径";
                        pSaveFileDialog.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
                        //当相同的文件存在是提示错误
                        pSaveFileDialog.OverwritePrompt = true;
                        pSaveFileDialog.RestoreDirectory = true;
                        if (pSaveFileDialog.ShowDialog() == DialogResult.OK)
                        {
                            //获取名字
                            sMxdFileName = pSaveFileDialog.FileName;
                        }
                        else
                        {
                            return;
                        }
                            pMapDocument.New(sMxdFileName);
                            pMapDocument.ReplaceContents(mainMapControl.Map as IMxdContents);
                            //保存为绝对路径
                            pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
                            pMapDocument.Close();
                            MessageBox.Show("保存文档成功");
                    }
                    }
                   
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    

    4.2 另存为

    private void saveAsToolStrip_Click(object sender, EventArgs e)
            {
                try
                {
                    SaveFileDialog pSaveDialog = new System.Windows.Forms.SaveFileDialog();
                    pSaveDialog.Title = "另存为";
                    pSaveDialog.OverwritePrompt = true;//当相同的文件存在是提示错误
                    pSaveDialog.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
                    pSaveDialog.RestoreDirectory = true;
                    if (pSaveDialog.ShowDialog() == DialogResult.OK)
                    {
                        string sFilePath = pSaveDialog.FileName;
                        IMapDocument pMapDocument = new MapDocumentClass();
                        pMapDocument.New(sFilePath);
                        pMapDocument.ReplaceContents(mainMapControl.Map as IMxdContents);
                        pMapDocument.Save(true, true);
                        pMapDocument.Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
    
    
    1. 输出地图(这里真的想用python写脚本, engine这么这么复杂)
    
    
    1. 选择要素
    
    
    1. 查询
    
    
    1. 空间分析
    
    
  • 相关阅读:
    luoguP1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
    luoguP1447 [NOI2010]能量采集
    POJ2559 Largest Rectangle in a Histogram (单调栈
    2038: [2009国家集训队]小Z的袜子(hose)
    codeforces 835C Star sky
    HDU1859 最小长方形 (水
    HDU 1754 I Hate It
    HDU 1698 Just a Hook(线段树
    HDU 1394 Minimum Inversion Number(树状数组/归并排序实现
    HDU1166 敌兵布阵(树状数组实现
  • 原文地址:https://www.cnblogs.com/shuai06/p/12397480.html
Copyright © 2020-2023  润新知