基于ArcGIS Engine二次开发的数据加载
- 准备工作
- 加载地图文档
- 加载矢量数据
- 加载栅格数据
- 总结
1.准备工作
1.添加控件包括:Esri MapControl;Esri LicenseControl;Button(Text改成相应的目标);如下图即可:
2.在引用中添加ArcGIS,并绑定ArcGIS Engine & ArcGIS License;
2.添加地图文档
using ESRI.ArcGIS
OpenFileDialog pOpenFileDialog = new OpenFileDialog(); //其来自于命名空间 System.Windows.Forms
pOpenFileDialog.CheckFileExists = true; // 获取或设置一个值,该值指示如果用户指定不存在的文件名,对话框是否显示警告。
pOpenFileDialog.Title = "打开地图文档";
pOpenFileDialog.Filter = "ArcGIS文档(*.mxd)|*.mxd|ArcGIS模板(*.mxt)|*.mxt|发布地图文件(*.pmf)|*.pmf|所有地图文档(*.mxd;*.mxt;*.pmf)|*.mxd;*.mxt;*.pmf";
pOpenFileDialog.Multiselect = false; //不允许多个文件同时进行选择
pOpenFileDialog.RestoreDirectory = true; //存储打开的文件路径
if(pOpenFileDialog.ShowDialog() == DialogResult.OK) //当选中文档后,即点击"确定",则进入下面的步骤
{
string pFileName = pOpenFileDialog.FileName;
if(pFileName == "")
{
return;
}
if(axMapControl1.CheckMxFile(pFileName)) //检查地图文档是否有效
{
axMapControl1.ClearLayers();
axMapControl1.LoadMxFile(pFileName); //加载地图文档
}
else
{
MessageBox.Show(pFileName + "是无效的地图文档!", "信息提示")
return;
}
}
通过上面的代码就可以实现对地图文档的加载,具体可以得到类似于以下的效果图:
3.添加矢量数据
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog.CheckFileExists = true;
pOpenFileDialog.Title = "打开shp文件";
pOpenFileDialog.Filter = "shp文件(*.shp)|*.shp";
pOpenFileDialog.ShowDialog(); //获取文件路径,之后是需要的;
IWorkspaceFactory pWorkspaceFactory;
IFeatureWorkspace pFeatureWorksapce;
IFeatureLayer pFeatureLayer;
string pFullPath = pOpenFileDialog.FileName;
if (pFullPath == "") return;
int pIndex = pFullPath.LastIndexOf("\\");
string pFilePath = pFullPath.Substring(0, pIndex); //这里需要注意下Substring()的用法,对路径进行截取
string pFileName = pFullPath.Substring(pIndex + 1); //截取获得Shape的文件名
pWorkspaceFactory = new ShapefileWorkspaceFactory();
pFeatureWorksapce = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, 0); //
IFeatureClass pFeatureClass = pFeatureWorksapce.OpenFeatureClass(pFileName);
pFeatureLayer = new FeatureLayer();
pFeatureLayer.FeatureClass = pFeatureClass;
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
axMapControl1.ClearLayers();
axMapControl1.Map.AddLayer(pFeatureLayer);
axMapControl1.ActiveView.Refresh();
通过上面的代码可以实现shp文件的加载,上述代码中仍旧有部分不太理解,已经进行标注,熟悉之后可能会有所明白。具体的实现逻辑如下图所示,方便代码的记忆():
4.添加栅格数据
同样在进行添加栅格数据的时候也是需要思考一下逻辑,和之前的矢量数据一致,主要是在栅格数据时需要注意一下影像金字塔的判断和创建。
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog.CheckFileExists = true;
pOpenFileDialog.Title = "打开栅格数据";
pOpenFileDialog.Filter = "栅格文件(*.*)|*.bmp;*.tif;*.jpg;*.img|(*.bmp)|(*.tif)|(*.jpg)|(*.img)";
pOpenFileDialog.ShowDialog();
string pFullPath = pOpenFileDialog.FileName;
if (pFullPath == "") return;
string pRasterPath = System.IO.Path.GetDirectoryName(pFullPath);
string pRasterName = System.IO.Path.GetFileName(pFullPath);
IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();
//IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(pRasterPath, 0);
IRasterWorkspace pRasterWorkspace = (IRasterWorkspace)pWorkspaceFactory.OpenFromFile(pRasterPath, 0);
//IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;
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);
效果图如下:
5.总结
以上主要是参考书本上的一些代码,并添加了部分自己的思考,多记忆和多思考,多练习就可以了。