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. 空间分析

原文地址:https://www.cnblogs.com/shuai06/p/12397480.html