zoukankan      html  css  js  c++  java
  • 简单实现ArcEngine的一些功能

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

    using ESRI.ArcGIS.SystemUI;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using ESRI.ArcGIS.Controls;
    using ESRI.ArcGIS.Geometry;
    using ESRI.ArcGIS.Carto;
    using ESRI.ArcGIS.Output;
    using ESRI.ArcGIS.esriSystem;
    using ESRI.ArcGIS.Display;
    

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

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

    1.2 保存地图文档

     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);
                    }
                }
    

    1.3新建

            private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
            {
     
                SaveFileDialog SaveFileDlg = new SaveFileDialog();
                SaveFileDlg.Filter = "地图文档文件(*.mxd)|*.mxd";
                SaveFileDlg.Title = "输入需要新建地图文档的名称";
                SaveFileDlg.ShowDialog();
    
                IMapDocument pMapDocument = new MapDocumentClass();
                string strDocFile = SaveFileDlg.FileName;
                if (strDocFile == string.Empty)
                    return;
                pMapDocument.New(strDocFile);
                pMapDocument.Open(strDocFile, "");
                mainMapControl.Map= pMapDocument.get_Map(0);
            }
    

    1.4

    Application.Exit();
    

    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 );
                    }
                }
    

    2.3 打开栅格

    OpenFileDialog open = new OpenFileDialog();
                    open.CheckFileExists = true;
                    open.Title = "打开shp文件";
                    open.RestoreDirectory = true;
                    open.Multiselect = true;
                    open.Filter = "(*.tif)|*.tif|(*.jpg)|*.jpg|(*.jpeg)|*.jpeg|(*.png)|*.png|(*.bmp)|*.bmp|(*.*)|*.*";
                    if (open.ShowDialog() == DialogResult.OK)
                    {
                        string filePath = open.FileName;
                        if (filePath == "") return;
    
                        IRasterLayer rasterLayer = new RasterLayerClass();
                        rasterLayer.CreateFromFilePath(filePath);
                        mainMapControl.AddLayer(rasterLayer, 0);
    
                        mainMapControl.ActiveView.Refresh();
                        mainTOCControl1.SetBuddyControl(mainMapControl);
                    }
    
    1. 地图浏览

    3…1 全图

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

    3.2 等比例放大

    F1
                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();
        
                }
    
    F2
                ICommand command = new ControlsMapZoomInFixedCommandClass();
                command.OnCreate(mainMapControl.Object);
                command.OnClick();
    

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

    F1
                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();
                }   
    
    F2
                ICommand command = new ControlsMapZoomOutFixedCommandClass();
                command.OnCreate(mainMapControl.Object);
                command.OnClick();
    

    3.4 上一视图

    F1
        // 定义全局变量
                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();
        
                }
    
    F2
    ICommand command = new ControlsMapZoomToLastExtentBackCommandClass();
    command.OnCreate(mainMapControl.Object);
    command.OnClick();
    mainMapControl.ActiveView.Refresh();
    

    3.5 下一视图

    F1
                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();
                }
    
    F2
                ICommand command = new ControlsMapZoomToLastExtentForwardCommandClass();
                command.OnCreate(mainMapControl.Object);
                command.OnClick();
                mainMapControl.ActiveView.Refresh();
    
    拉框放大、拉框缩小、漫游 = > 无脑方法(直接调用ICommand或者ITool接口)

    无脑1. 拉框缩小

    private void tsbtnZoomOut_Click(object sender, EventArgs e)
            {
                mainMapControl.CurrentTool = null;
                ICommand command = new ControlsMapZoomOutToolClass();
                command.OnCreate(mainMapControl.Object);
                mainMapControl.CurrentTool = command as ITool;
            }
    

    无脑2. 拉框放大

            private void tsbtnZoomIn_Click(object sender, EventArgs e)
            {
                mainMapControl.CurrentTool = null;
                ICommand command = new ControlsMapZoomInToolClass();
                command.OnCreate(mainMapControl.Object);
                mainMapControl.CurrentTool = command as ITool;
       
    
            }
    

    无脑3. 漫游

                mainMapControl.CurrentTool = null;
                ICommand command = new ControlsMapPanToolClass();
                command.OnCreate(mainMapControl.Object);
                mainMapControl.CurrentTool = command as ITool;
                mainMapControl.ActiveView.Refresh();
    

    4. 保存地图文档

            private void 保存ToolStripMenuItem_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 另存为

    F1.简便方法, 调用ICommand接口
    ICommand command = new ControlsSaveAsDocCommandClass();
    command.OnCreate(mainMapControl.Object);
    command.OnClick();
    
    F2
                    // 获取当前文档的路径与名字
                    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(true, true);
                            pMapDocument.Close();
                            MessageBox.Show("另存文档到" + smxdFileName + "成功!");
                        }
                    }
    

    5.待续…

    
    
    1. 输出地图(这里真的想用python写脚本, engine这么这么复杂)

    7.1. 选择要素

            private void 选择工具ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                mainMapControl.CurrentTool = null;
                ICommand command = new ControlsSelectFeaturesToolClass();
                command.OnCreate(mainMapControl.Object);
                mainMapControl.CurrentTool = command as ITool;
                mainMapControl.ActiveView.Refresh();
            }
    

    4.2 清除选择

    private void 清空选择ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                IActiveView pActiveView = mainMapControl.ActiveView;
                pActiveView.FocusMap.ClearSelection();
                pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,  null, pActiveView.Extent);
            }
    

    7.3 缩放至选择

            private void 缩放至选择ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                ICommand command = new ControlsZoomToSelectedCommandClass();
                command.OnCreate(mainMapControl.Object);
                command.OnClick();
                mainMapControl.ActiveView.Refresh();
    
            }
    
    1. 查询
    
    
    1. 空间分析
    
    
    1. 数据视图与布局视图的同步
    // 数据视图与布局视图同步
            private void mainMapControl_OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e)
            {
                IActiveView pActiveView = (IActiveView)mainPageLayoutControl1.ActiveView.FocusMap;
                IDisplayTransformation displayTransformation = pActiveView.ScreenDisplay.DisplayTransformation;
                displayTransformation.VisibleBounds = mainMapControl.Extent;
                mainPageLayoutControl1.ActiveView.Refresh();
                CopyToPageLayout();  // 调用下面的函数
    
            }
    
            // CopyToPageLayout() 布局视图与数据视图同步
            private void CopyToPageLayout()
            {
                IObjectCopy pObjectCopy = new ObjectCopyClass();
                object copyFromMap = mainMapControl.Map;
                object copiedMap = pObjectCopy.Copy(copyFromMap);   // 复制地图到copiedMap中
                object copyToMap = mainPageLayoutControl1.ActiveView.FocusMap;
                pObjectCopy.Overwrite(copiedMap, ref copyToMap);   // 复制地图
                mainPageLayoutControl1.ActiveView.Refresh();
    
            }
    

    11.状态栏显示坐标

            // 可以设置坐标的显示
            private void mainMapControl_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
            {
                // 显示当前比例尺
                XYSysStripStatusLabel1.Text = " 比例尺 1:" + ((long)this.mainMapControl.MapScale).ToString(); 
    
                XYStripStatusLabel2.Text = " 当前坐标 X = " + e.mapX.ToString() + " Y = " + e.mapY.ToString() + " " + this.mainMapControl.MapUnits;
            }
    
     //当前坐标的后面的坐标单位为“ esriUnknownUnits”或“ esriMeters ”之类,即系统在正常单位的前面加上了“ esri ”,追求完美的我们自然看得不舒服。那就进行简单的替换吧。
            //首先定义个全局坐标单位变量 sMapUnits,再 Form1_Load 函数中进行初始化:   添加 axMapControl1 控件的 OnMapReplaced 事件,在事件响应函数中进行坐标单位替换
    
            private void mainMapControl_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
            {
                esriUnits mapUnits = mainMapControl.MapUnits;
    
                switch (mapUnits)
                {
                    case esriUnits.esriCentimeters:
                        sMapUnits = "Centimeters";
                        break;
    
                    case esriUnits.esriDecimalDegrees:
                        sMapUnits = "Decimal Degrees";
                        break;
    
                    case esriUnits.esriDecimeters:
                        sMapUnits = "Decimeters";
                        break;
    
                    case esriUnits.esriFeet:
                        sMapUnits = "Feet";
                        break;
    
                    case esriUnits.esriInches:
                        sMapUnits = "Inches";
                        break;
    
                    case esriUnits.esriKilometers:
                        sMapUnits = "Kilometers";
                        break;
    
                    case esriUnits.esriMeters:
                        sMapUnits = "Meters";
                        break;
    
                    case esriUnits.esriMiles:
                        sMapUnits = "Miles";
                        break;
    
                    case esriUnits.esriMillimeters:
                        sMapUnits = "Millimeters";
                        break;
    
                    case esriUnits.esriNauticalMiles:
                        sMapUnits = "NauticalMiles";
                        break;
    
                    case esriUnits.esriPoints:
                        sMapUnits = "Points";
                        break;
    
                    case esriUnits.esriUnknownUnits:
                        sMapUnits = "Unknown";
                        break;
    
                    case esriUnits.esriYards:
                        sMapUnits = "Yards";
                        break;
                }
            }
    
    
  • 相关阅读:
    31天重构学习笔记18. 使用条件判断代替异常
    31天重构学习笔记12. 分解依赖
    31天重构学习笔记2. 移动方法
    .NET 技术社区谈之中文篇
    31天重构学习笔记10. 提取方法
    31天重构学习笔记14. 分离职责
    31天重构学习笔记20. 提取子类
    31天重构学习笔记16. 封装条件
    31天重构学习笔记17. 提取父类
    .NET 技术社区谈之英文篇
  • 原文地址:https://www.cnblogs.com/shuai06/p/12397474.html
Copyright © 2011-2022 走看看