ArcGIS Engine二次开发

article/2025/10/15 20:16:45

目录

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){//将\\的最后一个位置赋予intPositionintPosition = 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";//定义整型位置intPositionint intPosition;//定义字符型路径stringFilePath和名字stringFileNamestring 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 optionsIRasterLayer 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;}

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


 持续更新中。。。


http://chatgpt.dhexx.cn/article/iLgR6B85.shtml

相关文章

ArcGIS二次开发知识点总结

空间分析定义:空间分析是指分析具有空间坐标或相对位置的数据和过程的理论和方法,是对地理空间现象的定量研究,其目的在于提取并传输空间数据中隐含的空间信息。 叠置分析定义:是指将同一坐标系统下不同信息表达的两组或多组专题…

【ArcGIS Pro二次开发】(31):ArcGIS Pro中的多线程

ArcGIS Pro与旧的ArcGIS桌面应用程序的显著不同之处在于,它采用多线程架构,可以有效的发挥多核CPU的优势。这使得二次开发工具的性能变得更好,但也对开发工作带来了更多的难点和挑战。 一、多线程需要注意的问题 一般情况下,为了…

GIS二次开发:实验一 ArcGIS Engine 开发初步

实验一 ArcGIS Engine 开发初步 一、实验目的 掌握ArcGIS Engine的安装;熟悉ArcGIS Engine中几个常用的控件;搭建第一个简单的ArcGIS Engine 程序;通过ICommand接口添加地图浏览工具。 二、实验仪器与设备 计算机、visual studio 软件、A…

Arcgis二次开发软件安装(Arcgis10.2、VS2012、AE10.2)

目录 一、序言 二、Arcgis10.2安装 (一)安装ArcGIS License Manager 1.1 ArcGIS License Manager安装 1.2 ArcGIS License Manager配置 (二)安装ArcGIS Desktop 1.1ArcGIS Desktop安装 1.2.ArcGIS文件替换 1.3中文显示与…

StackPanel 实现从上往下+从右往左 排列+RenderTransform特效实例分析

StackPanel:将子元素排列到可沿水平或垂直放置的行。 参考资料: 1. StackPanel类 2. Silverlight学习笔记(九)——RenderTransform特效【五种基本变换】及【矩阵变换MatrixTransform】 3. MatrixTransform矩阵变换 stack表明StackPane…

控件篇 - 子控件在StackPanel里的居中问题

如下面代码&#xff1a; <StackPanel Width"200" Height"80" Background"Tomato"><TextBlock HorizontalAlignment"Center" VerticalAlignment"Center" Text"ABCD"/></StackPanel> 原意是想通…

Docker Stack

大规模场景下的多服务部署和管理是一件很难的事情。Docker Stack 为解决该问题而生&#xff0c;Docker Stack 通过提供期望状态、滚动升级、简单易用、扩缩容、健康检查等特性简化了应用的管理&#xff0c;这些功能都封装在一个完美的声明式模型当中。 Stack 能够在单个声明文…

StackPanel布局

StackPanel可以把内部元素在纵向或横向上紧凑排列&#xff0c;形成栈式布局。 示例代码&#xff1a; <Grid><GroupBox Header"请选择没有错别字的成语" BorderBrush"Black" Margin"5"><StackPanel Margin"5" Heig…

2.12 Stack

2.12 Stack Stack也是List接口的实现类之一&#xff0c;和Vector一样&#xff0c;因为性能原因&#xff0c;更主要在开发过程中很少用到栈这种数据结构&#xff0c;不过栈在计算机底层是一种非常重要的数据结构&#xff0c;下边将探讨下Java中Stack。 2.12.1 Stack的继承关系 …

wpf之StackPanel布局

注意两个参数&#xff1a; Orientation &#xff1a;控制排列是水平方向&#xff0c;还是垂直方向&#xff08;Horizontal 水平方向 Vertical垂直方向&#xff09; FlowDirection&#xff1a;控制控件排序是从右往左还是从左往右&#xff0c;写两个简单的demo如下&#xff…

四、StackPanel控件

StackPanel可以把内部控件在纵向或横向上紧凑排列、形成栈式布局&#xff0c;当上层控件不被删除时&#xff0c;剩余的控件会前移&#xff0c;填充空白 特点&#xff1a; 同类控件紧凑排列移除其中…

WPF 控制StackPanel用法

StackPanel是非常相似的WrapPanel&#xff0c;但至少有一个重要的区别&#xff1a;StackPanel的不换行的内容。相反&#xff0c;它将内容向一个方向拉伸&#xff0c;允许您将一项一项一项地堆叠在一起。让我们首先尝试一个非常简单的示例&#xff0c;就像我们对 WrapPanel 所做…

2021-08-16 WPF控件专题 StackPanel 控件详解

1.StackPanel 控件介绍 堆栈面板 —布局控件 —Panel 子元素排列成一行或一列 水平 垂直 FlowDirection 子元素的流动方向 Orientation&#xff1a;Horizontal 一行 一般设置VerticalAlignment&#xff1a;Top Bottom Center Stretch Vertical 一列 HorizontalAlignment Left…

WPF中StackPanel的尺寸的怪癖

前几天写了文章&#xff1a;WPF中的DataGrid控件的VerticalScrollBarVisibility属性失效 今天继续补充StackPanel的特点&#xff0c;可以作为对上述文章的进一步解释。 在WPF中&#xff0c;StackPanel是十分常用的布局元素。然而&#xff0c;该元素和很多其它元素不同&#x…

StackPanel

原文链接&#xff1a;http://www.cnblogs.com/Jennifer/articles/1987757.html Canvas、StackPanel、WrapPanel、DockPanel和Grid是WPF中主要的5种内建面板&#xff0c;这些面板类都位于System.Windows.Controls命名空间下。 StackPanel是一个受欢迎的面板&#xff0c;因为它方…

WPF中的StackPanel、WrapPanel、DockPanel

一、StackPanel StackPanel是以堆叠的方式显示其中的控件 1、可以使用Orientation属性更改堆叠的顺序 Orientation"Vertical" 默认&#xff0c;由上到下显示各控件。控件在未定义的前提下&#xff0c;宽度为StackPanel的宽度&#xff0c;高度自动适应控件中内容的高…

WPF布局控件之StackPanel

StackPanel Stack&#xff0c;英文意思是堆栈&#xff0c;StackPanel&#xff0c;意思是堆栈式布局&#xff0c;相当于把控件给堆起来。如果不设置StackPanel中控件的宽高&#xff0c;那么其中控件的宽高是默认和StackPanel一样的&#xff0c;如果设置控件宽高&#xff0c;那么…

WPF-StackPanel面板

StackPanel Orientation属性 Orientation属性决定SatckPanel中元素的排列方向&#xff0c;默认为垂直排列 Orientation“Vertical” <Window x:Class"StackPanel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:…

WPF之路——StackPanel布局(堆栈面板)

StackPanel是一个受欢迎的面板&#xff0c;因为它方便好用&#xff0c;它会顺序对它的子元素进行排列。它是少数几个没有定义任何附加属性的面板之一。由于没有附加属性来排列子元素&#xff0c;只有一种方法可以定制StackPanel的行为——设置Orientation属性为Horizontal或Ver…

解决StackPanel滚动条无法显示

解决StackPanel滚动条无法显示 解决方法 1.添加容器:xtraScrollableControl 2.StackPanel隐藏属性 StackPanel.AutoScroll true (设计界面StackPanel控件无法找到该属性&#xff0c;代码设置) 配个显示效果图