这是我的练习作业,这个文章是我拿来复习和回忆的。
ArcGIS 是一款强大的地理信息系统软件,它可以帮助我们处理和分析各种类型的地理数据,如矢量数据,栅格数据,地图文档等。在本文中,我将介绍如何使用 ArcGIS Engine C# VS2012 开发环境来打开不同类型的地理数据,并在地图控件上显示它们。我将使用一个 Windows 窗体应用程序作为示例,它有一个按钮和一个地图控件,如下图所示:
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ESRI.ArcGIS;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
定义变量和初始化组件
接下来,我们需要定义一些变量,用于存储打开文件对话框,文件路径,鹰眼地图的范围,矩形框,活动视图,移动点和拖动标志。我们可以在 Form1 类中添加如下变量:
代码语言:javascript复制public OpenFileDialog OpenFileda;//创建一个打开文件对话框
public string filename;//获取文件路径
public IEnvelope pEnv;//用于存储鹰眼地图的范围
public IGraphicsContainer pGraphicsContainer;//用于存储鹰眼地图的矩形框
public IActiveView pActiveView;//用于存储鹰眼地图的活动视图
public IPoint pMoveRectPoint;
public Boolean bCanDrag;//用于判断是否可以拖动矩形框
然后,我们需要在构造函数中初始化组件,并绑定 ArcGIS 的运行时。我们可以在 Form1 类中添加如下代码:
代码语言:javascript复制public Form1()
{
InitializeComponent();
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
}
响应按钮点击事件
当用户点击按钮时,我们需要弹出一个打开文件对话框,让用户选择要打开的文件,并根据不同的文件类型调用不同的方法来加载文件。我们可以为按钮添加一个 Click 事件处理函数,并在其中调用 OpenFile 方法。我们可以在 Form1 类中添加如下代码:
代码语言:javascript复制private void button1_Click(object sender, EventArgs e)
{
OpenFile();
}
打开不同类型的文件
在 OpenFile 方法中,我们需要创建一个打开文件对话框,并设置标题和过滤条件。如果用户选择了一个文件并点击确定,我们就获取文件的路径和扩展名,并根据不同的扩展名调用不同的方法来打开不同类型的文件。我们可以在 Form1 类中添加如下代码:
代码语言:javascript复制//打开文件
public void OpenFile()
{
//创建一个打开文件对话框
OpenFileda = new OpenFileDialog();
//设置标题
OpenFileda.Title = "打开文件";
//设置过滤条件
OpenFileda.Filter = "Shapefile文件(*.shp)|*.shp|Mxd文件(*.mxd)|*.mxd|栅格文件(*.tif;*.jpg;*.bmp)|*.tif;*.jpg;*.bmp|所有文件(*.*)|*.*";
if (OpenFileda.ShowDialog() == DialogResult.OK)
{
filename = OpenFileda.FileName;
string flieext = System.IO.Path.GetExtension(filename);
switch (flieext)
{
case ".shp":
//打开Shp数据
OpenShpFile();
break;
case ".mxd":
//打开Mxd数据
OpenMxdFile();
break;
case ".tif":
case ".jpg":
case ".bmp":
//打开栅格数据
OpenRasterFile();
break;
default:
break;
}
}
}
打开 Mxd 文件
在 OpenMxdFile 方法中,我们直接使用 axMapControl1 控件的 LoadMxFile 方法来加载 Mxd 文件。这个方法会自动加载 Mxd 文件中的所有图层和符号,并显示在地图控件上。我们可以在 Form1 类中添加如下代码:
代码语言:javascript复制//加载Mxd数据
public void OpenMxdFile()
{
axMapControl1.LoadMxFile(filename);
}
打开 Shp 文件
在 OpenShpFile 方法中,我们首先设置打开文件对话框的 Multiselect 属性为 true,允许用户选择多个文件,然后遍历用户选择的文件,获取每个文件的路径和名称,并使用 axMapControl1 控件的 AddShapeFile 方法来加载 Shp 文件。这个方法会自动创建一个 FeatureLayer 对象,并添加到地图控件的图层集合中。我们可以在 Form1 类中添加如下代码:
代码语言:javascript复制//加载Shp数据
public void OpenShpFile()
{
OpenFileda.Multiselect = true;
int intposition;//定义int型接收路径和文件名界限的顺序,lastindex的最后一个匹配项从0开始的位置
string stringFilePath, stringShpName;
foreach (String file in OpenFileda.FileNames)
{
intposition = file.LastIndexOf("\");//找到分界线
stringFilePath = file.Substring(0, intposition);//找到文件路径的结尾
stringShpName = file.Substring(intposition 1);//分界点的后一位就是
axMapControl1.AddShapeFile(stringFilePath, stringShpName);
}
}
打开栅格文件
在 OpenRasterFile 方法中,我们首先获取文件的路径和名称,然后创建一个 RasterWorkspaceFactory 对象,用于打开栅格数据的工作空间。接着,我们使用 OpenRasterDataset 方法来打开栅格数据集,并判断是否需要创建影像金字塔。最后,我们创建一个 RasterLayer 对象,并使用 CreateFromRaster 方法和 axMapControl1 控件的 AddLayer 方法来加载栅格文件。我们可以在 Form1 类中添加如下代码:
代码语言:javascript复制//加载栅格数据
public void OpenRasterFile()
{
//获取文件路径和名称
string pRasterPath = System.IO.Path.GetDirectoryName(filename);
string pRasterName = System.IO.Path.GetFileName(filename);
//创建一个工作空间工厂
IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();
//打开工作空间
IRasterWorkspace pRasterWorkspace = (IRasterWorkspace)pWorkspaceFactory.OpenFromFile(pRasterPath, 0);
//打开栅格数据集
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pRasterName);
//影像金字塔判断与创建
IRasterPyramid3 pRasPyrmid = pRasterDataset as IRasterPyramid3;
if (pRasPyrmid != null)
{
if (!(pRasPyrmid.Present))
{
pRasPyrmid.Create(); //创建金字塔
}
}
IRaster pRaster = pRasterDataset.CreateDefaultRaster();
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromRaster(pRaster);
axMapControl1.AddLayer(pRasterLayer, 0);
至此,我们已经完成了打开不同类型的文件的功能,我们可以运行程序,点击按钮,选择要打开的文件,然后在地图控件上看到加载的数据。
总结:
在本文中,我介绍了如何使用 ArcGIS Engine 10.2 C# VS2012 开发环境来打开不同类型的地理数据,并在地图控件上显示它们。我使用了一个 Windows 窗体应用程序作为示例,它有一个按钮和一个地图控件。我首先引入了 ArcGIS 相关的命名空间和类库,然后定义了一些变量和初始化了组件。接着,我响应了按钮点击事件,并调用了 OpenFile 方法。在 OpenFile 方法中,我创建了一个打开文件对话框,并根据不同的文件类型调用了不同的方法来加载文件。在这些方法中,我使用了 ArcGIS 的相关对象和方法来打开和加载 Mxd 文件,Shp 文件和栅格文件。最后,我运行了程序,并展示了加载不同类型的文件的效果。
希望本文对你有所帮助,如果你有任何问题或建议,请在评论区留言。谢谢!