# 如何使用 ArcGIS Engine10.2 + C# VS2012 开发环境打开不同类型的地理数据(mxd,shp,栅格数据)

2023-04-15 22:19:07 浏览数 (1)

这是我的练习作业,这个文章是我拿来复习和回忆的。

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 文件和栅格文件。最后,我运行了程序,并展示了加载不同类型的文件的效果。

希望本文对你有所帮助,如果你有任何问题或建议,请在评论区留言。谢谢!

0 人点赞