C# AE开发入门及加载矢量和栅格图片
一、实验目的
加载矢量(Shapefile、DXF)和栅格图片(TIFF)
二、实验步骤
主要步骤:
–创建UI:MapControl、LicenseControl;
–绑定运行时;
–添加引用
(一)配置开发环境,添加引用,运行基本界面
- 打开VS2012,新建windows窗体程序
- 在工具箱——〉容器下拖入一个SplitContainer容器
- 在工具箱——〉ArcGIS Windows Forms下拖入一个MapControl控件,并将其DOCK属性改为FILL即可
- 在工具箱——〉ArcGIS Windows Forms下拖入一个LicenseControl控件(运行时不可见)
5.在程序入口代码(Program.cs)处添加绑定,在Application.Run(new Form1()); 前添加一行ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
- 添加引用,在引用上右键,选择Add ArcGIS Reference,在Engine(Core)下添加以下几个引用:
ESRI.ArcGIS.Geodatabase;
ESRI.ArcGIS.DataSourcesRaster;
ESRI.ArcGIS.DataSourcesFile;
ESRI.ArcGIS.DataSourcesGDB;
7. 在Form1.cs下添加下列引用命名空间
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.DataSourcesRaster;
8. 添加三个按钮控件,并分别修改按钮文本为:AddSHP,AddCAD,AddTIFF
9. 运行至如下界面
(二)实现按钮加载图片功能
1.加载Shapefile文件
private void button1_Click(object sender, EventArgs e)
{
//打开文件对话框,选择shp文件
OpenFileDialog of = new OpenFileDialog();
of.Filter = "*(.shpfile)|*.shp";
of.Title = "打开shp文件";
string path;
string name;
if (of.ShowDialog() == DialogResult.OK)
{
path = System.IO.Path.GetDirectoryName(of.FileName);
name = System.IO.Path.GetFileName(of.FileName);
}
else return;
//新建一个Shapefile工厂类
IWorkspaceFactory pWF;
pWF = new ShapefileWorkspaceFactoryClass();
//使用工厂类打开一个工作空间
IWorkspace pW = pWF.OpenFromFile(path, 0);
//将工作空间强制转换为要素工作空间
IFeatureWorkspace pFW = (IFeatureWorkspace)pW;
//定义要素类并从要素工作空间打开一个Shapefile
IFeatureClass pFC = pFW.OpenFeatureClass(name);
//新建FeatureLayerClass,并将shapefile要素加载到要素图层类
IFeatureLayer pFlyr = new FeatureLayerClass();
pFlyr.FeatureClass = pFC;
//将要素图层加入mapcontrol并刷新
axMapControl1.AddLayer(pFlyr);
axMapControl1.ActiveView.Refresh();
}
运行结果
2.加载TIFF文件
private void button2_Click(object sender, EventArgs e)
{
//打开文件对话框,选择tif文件
OpenFileDialog of = new OpenFileDialog();
of.Filter = "*(.tif)|*.tif";
of.Title = "打开tif文件";
string path;
string name;
if (of.ShowDialog() == DialogResult.OK)
{
path = System.IO.Path.GetDirectoryName(of.FileName);
name = System.IO.Path.GetFileName(of.FileName);
}
else return;
//新建一个Raster工厂类
IWorkspaceFactory workspcFac = new RasterWorkspaceFactory();
//使用工厂类打开一个栅格工作空间
IRasterWorkspace rasterWorkspc;
rasterWorkspc = workspcFac.OpenFromFile(path, 0) as IRasterWorkspace;
//新建栅格数据集和栅格图层
IRasterDataset rasterDataset = new RasterDatasetClass();
IRasterLayer rasterLay = new RasterLayerClass();
//从栅格工作空间选择要的打开tiff文件并将数据集中的文件加载到图层上
rasterDataset = rasterWorkspc.OpenRasterDataset(name);
rasterLay.CreateFromDataset(rasterDataset );
//将栅格图层加入mapcontrol并刷新
axMapControl1.AddLayer(rasterLay );
axMapControl1.Refresh();
}
运行结果
- 加载DXF文件
private void button3_Click(object sender, EventArgs e)
{
//打开文件对话框,选择dxf文件
OpenFileDialog of = new OpenFileDialog();
of.Filter = "*(.dxf)|*.dxf";
of.Title = "打开cad文件";
string path;
string name;
if (of.ShowDialog() == DialogResult.OK)
{
path = System.IO.Path.GetDirectoryName(of.FileName);
name = System.IO.Path.GetFileName(of.FileName);
}
else return;
//新建CAD工厂类
CadWorkspaceFactoryClass fac = new CadWorkspaceFactoryClass();
//定义要素工作空间
IFeatureWorkspace space = fac.OpenFromFile(path ,0) as IFeatureWorkspace ;
//加载面
IFeatureClass polygon = space.OpenFeatureClass(name+":Polygon");
IFeatureLayer layer3 = new CadFeatureLayerClass();
layer3 = new CadFeatureLayerClass();
layer3.FeatureClass = polygon;
//加载线
IFeatureClass polyline = space.OpenFeatureClass(name + ":Polyline");
IFeatureLayer layer = new CadFeatureLayerClass();
layer.FeatureClass = polyline;
//加载点
IFeatureClass point = space.OpenFeatureClass(name+":Point");
IFeatureLayer layer2 = new CadFeatureLayerClass();
layer2 = new CadFeatureLayerClass();
layer2.FeatureClass = point;
//加载注记
IFeatureClass anno = space.OpenFeatureClass(name+":Annotation");
IFeatureLayer layer4 = new CadFeatureLayerClass();
layer4 = (IFeatureLayer) new CadAnnotationLayer();
layer4.FeatureClass = anno;
axMapControl1.AddLayer(layer3);
axMapControl1.AddLayer(layer);
axMapControl1.AddLayer(layer2);
axMapControl1.AddLayer(layer4);
axMapControl1.Refresh();
}
运行结果
4.注意事项
(1)如果报以下错误,在引用Carto时将嵌入互操作类型改为False即可
(2)加载CAD文件注记和点线面分别加载,加载注记时不能直接使用CadFeatureLayerClass,需要用CadAnnotationLayer,然后将其强制转换为IFeatureLayer。
(3)对话框如果不进行选择文件需返回原来的窗口而不能报错。