一直以来对栅格数据接触较少,曾经大二的时候用ERDAS做过监督分类和蓝藻提取,后来接触了GIS开发也就没再做过了,不过现在还是准备探索一下ArcEngine针对栅格数据的相关操作。既然数据是GIS的血液,那就从加载栅格数据开始吧。栅格数据大致分为两种形式进行存储:一种是以文件的形式存储,例如TIFF文件,另一种则是存储在地理数据库中。在ArcEngine中,IRasterWorkspace接口用于加载栅格文件,而与之对应的IRasterWorkspaceEx接口用于加载地理数据库中的栅格数据集,下面给出加载栅格数据的代码:
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.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.Output;
using ESRI.ArcGIS.SystemUI;
namespace WindowsFormsApplication1
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
// 加载栅格文件
private void btnLoadRasterFile_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "选择栅格文件";
openFileDialog.Filter = "TIFF(*.tif)|*.tif";
openFileDialog.RestoreDirectory = true;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
AddRasterFile(openFileDialog.FileName);
}
}
// 加载栅格数据集
private void btnLoadRasterDataset_Click(object sender, EventArgs e)
{
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
folderBrowserDialog.Description = "请选择文件地理数据库";
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
if (!folderBrowserDialog.SelectedPath.EndsWith(".gdb"))
{
MessageBox.Show("请选择文件地理数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
AddRasterDataset(folderBrowserDialog.SelectedPath);
}
}
}
private void AddRasterFile(string filePath)
{
IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(filePath), 0);
IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(System.IO.Path.GetFileName(filePath));
// 创建金字塔
IRasterPyramid pRasterPyramid = pRasterDataset as IRasterPyramid;
if (!pRasterPyramid.Present)
{
pRasterPyramid.Create();
}
// 栅格图层
IRasterLayer pRasterLayer = new RasterLayer();
pRasterLayer.CreateFromDataset(pRasterDataset);
ILayer pLayer = pRasterLayer as ILayer;
// 刷新地图
axMapControl1.AddLayer(pLayer, 0);
axMapControl1.Refresh();
}
private void AddRasterDataset(string directory)
{
IWorkspaceFactory pWorkspaceFactory = new FileGDBWorkspaceFactory();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(directory, 0);
IRasterWorkspaceEx pRasterWorkspaceEx = pWorkspace as IRasterWorkspaceEx;
// 获取栅格数据集
IEnumDataset pEnumDataset = pWorkspace.get_Datasets(esriDatasetType.esriDTRasterDataset);
pEnumDataset.Reset();
IDataset pDataset = pEnumDataset.Next();
// 遍历数据集
while (pDataset != null)
{
// 创建金字塔
IRasterDataset pRasterDataset = pRasterWorkspaceEx.OpenRasterDataset(pDataset.Name);
IRasterPyramid pRasterPyramid = pRasterDataset as IRasterPyramid;
if (!pRasterPyramid.Present)
{
pRasterPyramid.Create();
}
// 栅格图层
IRasterLayer pRasterLayer = new RasterLayer();
pRasterLayer.CreateFromDataset(pRasterDataset);
// 刷新视图
axMapControl1.AddLayer(pRasterLayer, 0);
axMapControl1.Refresh();
// 下一数据集
pDataset = pEnumDataset.Next();
}
}
}
}
程序运行结果如下图所示: