ArcGIS Engine二次开发

目录

1 前言

2 准备工作

2.1 License的加入

 2.2 ToolStrip控件

 2.3 MenuStrip控件

2.4 帮助文档的查看

 3 数据加载

3.1 矢量数据的加载

 3.2 栅格数据的加载

4 地图浏览功能


1 前言


这是一份关于ArcGIS Engine二次开发的一份报告总结,在这份报告中包含了简单的ArcGIS功能。包含的功能如下:

  1. 对数据的加载,包括矢量数据和栅格数据
  2. 地图浏览功能:拉框放大、拉框缩小、平移、全图、逐级放大、逐级缩小、历史视图浏览(撤销、重做)
  3. 点线面的绘制:点、圆、多边形、矩形,能分别设置颜色、样式、大小及面填充方式;

  4. 书签功能

  5. 选择要素:拉框选择、按多边形选择、按圆选择、按线选择,并能设置选择颜色;

  6. 打开图层属性表

  7. 属性查询


2 准备工作

在开始正式书写代码之前,我们需要了解一些基本知识。

2.1 License的加入

 License是进行AE开发必须加入的功能,我们创建一个窗体项目后首先加入 LicenseControl控件,然后在Program.cs中添加如下橙色部分代码(注意不要加错位置):

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
            Application.Run(new mapForm());

 2.2 ToolStrip控件

ToolStrip控件位于工具箱的菜单和工具栏中,可以添加图中所示的几个功能:Button、Label、SplitButton、DropDownButton、Separator、ComboBox、TextBox、ProgressBar。这里用到了Button功能,前九个功能通过添加Button来完成,图片可以自行添加。

 2.3 MenuStrip控件

menustrip可以进行下拉菜单的创建,比如查询功能中包含两个功能,一个是属性查询,一个是空间查询,通过menustrip将二者放到一个下拉菜单中,可以保证界面的整洁舒适,以及功能的方便使用。

2.4 帮助文档的查看

在开始中找到ArcGIS,找到对应的帮助文档,我的Visual Studio是2012版的,用的是第二个。打开帮助我们可以对需要使用的功能进行查询,比如OpenFileDialog,右边是对其用法的介绍。

 3 数据加载

3.1 矢量数据的加载

首先在ToolStrip中添加一个button,直接点击可进行添加;然后在Image中填充“添加数据”的图片,以便和其它功能进行区分,该图片可自行到ArcGIS中进行截图或在网上寻找相关图像;最后通过ToolTipText可以添加对该按钮的描述,当鼠标停在该按钮上时,显示文字。

 

双击按钮默认使用click事件,双击按钮,加入以下代码:

注:由于每行代码都有注释,这里不再赘述。

//打开矢量数据
        private void btnShpOpen_Click(object sender, EventArgs e)
        {
            //实例化一个对象
            OpenFileDialog openShipFile = new OpenFileDialog();
            //打开窗体名称
            openShipFile.Title = "加载矢量数据";
            //允许选择多项
            openShipFile.Multiselect = true;
            //过滤选择矢量数据
            openShipFile.Filter = "ShapeFile数据|*.shp";

            //定义整型intPosition,用于存放位置
            int intPosition;
            //定义字符型stringFilePath和stringFileName,用于存放文件路径和文件名
            string stringFilePath, stringFileName;

            if (openShipFile.ShowDialog() == DialogResult.OK)
            {
                //定义字符型file表示打开文件中的文件名,用foreach进行访问
                foreach (String file in openShipFile.FileNames)
                {
                    //将\\的最后一个位置赋予intPosition
                    intPosition = file.LastIndexOf("\\");
                    //将intPosition前的路径存入stringFilePath中
                    stringFilePath = file.Substring(0, intPosition);
                    //将intPosition后的文件名存入stringFileName中
                    stringFileName = file.Substring(intPosition + 1);

                    //显示数据
                    axMapControl1.AddShapeFile(stringFilePath, stringFileName);
                    //弹框显示数据路径和名称
                    //MessageBox.Show(stringFilePath, stringFileName);
                }
            }
        }

 3.2 栅格数据的加载

栅格数据比矢量数据复杂,这里我并没有将栅格数据和矢量数据的加载放在同一个按钮上实现,而是通过一个新的按钮进行添加。

这里对jpg、img、tiff三种格式的栅格数据进行了添加。

双击按钮默认使用click事件,双击按钮,加入以下代码:

//打开栅格数据
        private void btnRasterOpen_Click(object sender, EventArgs e)
        {
            //实例化对象
            OpenFileDialog openRaster = new OpenFileDialog();
            //命名弹窗名称
            openRaster.Title=("加载栅格数据");
            //允许选择多项
            openRaster.Multiselect = true;
            //过滤栅格数据
            openRaster.Filter = "栅格文件jpg|*.jpg|栅格文件tiff|*.tiff|栅格文件img|*.img";

            //定义整型位置intPosition
            int intPosition;
            //定义字符型路径stringFilePath和名字stringFileName
            string stringFilePath, stringFileName;

            if (openRaster.ShowDialog() == DialogResult.OK)
            {
                //foreach访问
                foreach (String file in openRaster.FileNames)
                {
                    //intPosition的1位置在最后一个\\处
                    intPosition = file.LastIndexOf("\\");
                    //路径
                    stringFilePath = file.Substring(0, intPosition);
                    //文件名
                    stringFileName = file.Substring(intPosition + 1);

                    //IWorkSpace是一个容器,存放空间数据与非空间数据
                    //如:FeatureClass、RasterDataset、table等
                    //IWorkSpace有三种类型:FileSystemWorkspace、LocalDatsbaseWorkspace,RemoteDatabaseWorkspace
                    //WorkSpace类不能直接实例化,必须由IWorkSpaceFactory的Create方法创建
                    //WorkspaceFactory:create workspace

                    //IRasterWorkspace Interfece:provides access to members that control a raster workspace
                    //含OpenRasterDataset:Opens a rasterdataset in the workspace given its name

                    //通过IworkSpaceFactory创建工作空间,将其在RasterWorkspaceFactory中实例化
                    IWorkspaceFactory prasterWorspaceFactory = new RasterWorkspaceFactory();
                    //创建一个栅格工作空间,将其在工作空间中的栅格文件在栅格工作空间中打开
                    IRasterWorkspace rasterWorkSpace = prasterWorspaceFactory.OpenFromFile(stringFilePath, 0) as IRasterWorkspace;
                    //将栅格空间中的空间数据打开
                    IRasterDataset pRasterDataset = rasterWorkSpace.OpenRasterDataset(stringFileName);

                    //IRasterLayer:provide access to members that create or modify a raster layer
                    //RasterLayerClass:raster layer source and display options
                    IRasterLayer pRasterLayer = new RasterLayerClass();
                    //在图层中创建栅格数据
                    pRasterLayer.CreateFromDataset(pRasterDataset);
                    //ILayer:provide access to members that work with all layers
                    //将栅格图层转换为图层形式
                    ILayer pLayer = pRasterLayer as ILayer;

                    //显示栅格图层
                    axMapControl1.AddLayer(pLayer);
                }
            }
        }

至此便可完成对矢量数据栅格数据的加载。


4 地图浏览功能

地图浏览功能包含:矩形拉框放大、矩形拉框缩小、平移(漫游)、全图显示、逐级放大、逐级缩小、历史视图浏览(撤销、重做)

在ToolStrip中分别八个功能进行添加,分别设置好图片内容和鼠标悬浮显示文字。

双击按钮默认使用click事件,双击按钮,加入以下代码:

注:由于全图显示、逐级放大、逐级缩小、历史视图浏览(撤销、重做)五个功能只需要点击对应按钮,触发Click事件即可实现,因此不对其进行功能标识;而矩形拉框放大、矩形拉框缩小、平移(漫游)在触发Click事件之后还要在axMapControl1中进行鼠标点击以实现功能,故需通过flag对其进行标识。

//地图浏览
        int flag;
        //放大
        private void enLarge_Click(object sender, EventArgs e)
        {
            flag = 1;
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerZoomIn;
        }
        //缩小
        private void Suoxiao_Click(object sender, EventArgs e)
        {
            flag = 2;
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerZoomOut;
        }
        //平移
        private void Pingyi_Click(object sender, EventArgs e)
        {
            flag = 3;
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerPan;
        }
        //逐级放大
        private void EnlargeByStep_Click(object sender, EventArgs e)
        {
            IEnvelope yEnvelop = axMapControl1.Extent;
            yEnvelop.Expand(0.5, 0.5, true);
            axMapControl1.Extent = yEnvelop;
            axMapControl1.ActiveView.Refresh();
        }
        //逐级缩小
        private void SuoxiaoBystep_Click(object sender, EventArgs e)
        {
            IEnvelope yEnvelop = axMapControl1.Extent;
            yEnvelop.Expand(2, 2, true);
            axMapControl1.Extent = yEnvelop;
            axMapControl1.ActiveView.Refresh();
        }
        //全图显示
        private void Entire_Click(object sender, EventArgs e)
        {
            axMapControl1.Extent = axMapControl1.FullExtent;
        }
        
        IExtentStack yExtentStack;
        //上一级视图
        private void before_Click(object sender, EventArgs e)
        {
            yExtentStack = axMapControl1.ActiveView.ExtentStack;
            //判断是否可返回
            if (yExtentStack.CanUndo())
            {
                yExtentStack.Undo();
                before.Enabled = true;
                if (!yExtentStack.CanUndo())
                {
                    before.Enabled = false;
                }
            }
            axMapControl1.ActiveView.Refresh();
        }
        //下一级视图
        private void after_Click(object sender, EventArgs e)
        {
            yExtentStack = axMapControl1.ActiveView.ExtentStack;
            if (yExtentStack.CanRedo())
            {
                yExtentStack.Redo();
                after.Enabled = true;
                if (!yExtentStack.CanRedo())
                {
                    after.Enabled = false;
                }
            }
            axMapControl1.ActiveView.Refresh();
        }

 在axMapControl1_OnMouseDown中加入以下代码:

*地图浏览
            //激活
            IActiveView yActiveView = axMapControl1.ActiveView;
            //框架
            IEnvelope yEnvelope = new EnvelopeClass();
            switch (flag)
            {
                case 1:
                    //框架为矩形
                    yEnvelope = axMapControl1.TrackRectangle();
                    //视图范围为框架选择范围
                    yActiveView.Extent = yEnvelope;
                    //刷新
                    yActiveView.Refresh();
                    break;

                case 2:
                    //框架为矩形缩小
                    yEnvelope = axMapControl1.TrackRectangle();
                    //两倍缩小
                    yEnvelope.Expand(2, 2, true);
                    //视图范围为框架范围
                    yActiveView.Extent = yEnvelope;
                    //刷新
                    yActiveView.Refresh();
                    break;

                case 3:
                    //漫游
                    axMapControl1.Pan();
                    break;

                default:
                    break;

            }

 至此便可实现地图浏览的“矩形拉框放大、矩形拉框缩小、平移(漫游)、全图显示、逐级放大、逐级缩小、历史视图浏览(撤销、重做)”八个功能。


 持续更新中。。。

  • 8
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值