目录
1.Intro
关于数据添加,已经写成了通用方法,也可以编译成库调用,直接看代码↓↓↓
2.Environment
Environment:Windows 7及以上
Language:C#
IDE:Visual Studio 2012
SDK:ArcGIS Engine 10.2
3.Source
[Guid("c4513d9a-c1e0-462f-8ed1-0bb09745b706")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Libs_GIS.Add_Data")]
public sealed class Add_Data
{
#region 添加地图文档数据
/// <summary>
/// 从文件添加MXD文档
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="mxd_FullPath">Mxd文件全路径</param>
public static void Add_Data_MXD(AxMapControl axMapControl, string mxd_FullPath)
{
if (axMapControl.CheckMxFile(mxd_FullPath))
{
// 设置 axMapControl 控制鼠标指针图标选项为沙漏光标
axMapControl.MousePointer = esriControlsMousePointer.esriPointerHourglass;
// 传入 LoadMxFile 方法的三个参数
/*
* 1.mxPath:文件路径
* 2.mapNameOrIndex:地图名称或索引
* 3.password:通过反射进行调用获取参数的默认值
*/
axMapControl.LoadMxFile(mxd_FullPath, 0, Type.Missing);
// 定义 axMapControl 控制鼠标指针图标为默认箭头
axMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;
// 全局显示
axMapControl.Extent = axMapControl.FullExtent;
}
else
{
string message = String.Format("<{0}>\r\t不是有效的地图文档!", mxd_FullPath);
System.Windows.Forms.MessageBox.Show(message, "加载失败", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
}
}
#endregion
#region 添加Shp数据
/// <summary>
/// 从文件添加Shapefile数据
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="shapefile_FullPath">Shp文件全路径</param>
public static void Add_Data_Shp_FromFile(AxMapControl axMapControl, string shapefile_FullPath)
{
FileInfo fileInfo = new FileInfo(shapefile_FullPath);
string data_Directory = fileInfo.Directory.ToString();
string data_Name = fileInfo.Name.ToString();
// 1创建工作空间工厂,指定为Shapefile类型
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
// 打开 Shapefile 文件名对应的工作空间
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(data_Directory, 0);
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
// 打开数据(要素类)
IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(data_Name);
// 创建要素图层
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureClass;
pFeatureLayer.Name = pFeatureClass.AliasName;
// 关联图层和要素类
ILayer pLayer = pFeatureLayer as ILayer;
IMap pMap = axMapControl.Map;
// 添加到地图中
pMap.AddLayer(pLayer);
axMapControl.ActiveView.Refresh();
}
#endregion
#region 添加图层数据
/// <summary>
/// 从文件添加图层
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="lyr_FullPath">图层文件全路径</param>
public static void Add_Data_Lyr_FromFile(AxMapControl axMapControl, string lyr_FullPath)
{
axMapControl.AddLayerFromFile(lyr_FullPath);
axMapControl.ActiveView.Refresh();
}
/// <summary>
/// 从图层添加图层
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="pLayer">图层对象</param>
public static void Add_Data_Lyr_FromLayer(AxMapControl axMapControl, ILayer pLayer)
{
axMapControl.AddLayer(pLayer);
axMapControl.ActiveView.Refresh();
}
#endregion
#region 添加数据库数据
/// <summary>
/// 从GDB数据库添加图层
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="gdb_FullPath">GDB全路径</param>
public static void Add_Data_FromGDB(AxMapControl axMapControl, string gdb_FullPath)
{
#region 获取工作空间
FileGDBWorkspaceFactory pFileGDBWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
IWorkspace pWorkspace = pFileGDBWorkspaceFactory.OpenFromFile(gdb_FullPath, 0);
#endregion
//自定义一个方法,传入工作空间和当前地图控制窗体
AddAllDataset(axMapControl, pWorkspace);
}
/// <summary>
/// 从MDB数据库添加图层
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="mdb_FullPath">MDB全路径</param>
public static void Add_Data_FromMDB(AxMapControl axMapControl, string mdb_FullPath)
{
#region 获取工作空间
//直接实例化AccessWorkspaceFactory(从Access工作空间工厂引出IWorkspace工作空间)
AccessWorkspaceFactory pAccessWorkspaceFactory = new AccessWorkspaceFactory();
IWorkspace pWorkspace = pAccessWorkspaceFactory.OpenFromFile(mdb_FullPath, 0);
#endregion
//自定义一个方法,传入工作空间和当前地图控制窗体
AddAllDataset(axMapControl, pWorkspace);
}
/// <summary>
/// 加载数据库加载数据方法:添加所有数据集
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="pWorkspace">工作空间对象</param>
private static void AddAllDataset(AxMapControl axMapControl, IWorkspace pWorkspace)
{
//从工作空间中获取数据集并限定数据集的类型为Any,然后赋值给IEnumDataset完成实例化,让IEnumDataset可以获取工作空间中的任意数据
IEnumDataset pEnumDataset = pWorkspace.get_Datasets(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny);
//将Enum数据集中的数据一个一个地读到Dataset中
IDataset pDataset = pEnumDataset.Next();
//判断数据集pDataset中是否有数据
while (pDataset != null)
{
#region 判断数据集是不是要素数据集类型
if (pDataset is IFeatureDataset)
{
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
//在要素工作空间中检测数据集中的数据名称,并赋值给要素数据集
IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(pDataset.Name);
//将要素数据集中包含的全部数据都赋值给IEnumDataset进行存储
IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;
//重置数据集序列,使指针位于第一个数据集之前
pEnumDataset1.Reset();
//创建组图层,直接实例化
//IGroupLayer pGroupLayer = new GroupLayerClass();
//将要素数据集的名称赋给组图层的名称
//pGroupLayer.Name = pFeatureDataset.Name;
//将Enum1数据集中的数据一个一个地读到Dataset1中
IDataset pDataset1 = pEnumDataset1.Next();
//判断数据集pDataset1中是否有数据
while (pDataset1 != null)
{
if (pDataset1 is IFeatureClass)//判断数据集是不是要素类类型
{
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
//从要素工作空间打开要素类,赋值给要素图层的要素类属性,传入参数:数据集名称
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset1.Name);
if (pFeatureLayer.FeatureClass != null)
{
//将要素图层中要素类的名称属性,赋值给要素图层的名称属性
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
//pGroupLayer.Add(pFeatureLayer);
axMapControl.Map.AddLayer(pFeatureLayer);
}
}
pDataset1 = pEnumDataset1.Next();
}
}
#endregion
#region 判断数据集是不是要素类类型
else if (pDataset is IFeatureClass)
{
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
axMapControl.Map.AddLayer(pFeatureLayer);
}
#endregion
#region 判断数据集是不是栅格数据集类型
else if (pDataset is IRasterDataset)
{
IRasterWorkspaceEx pRasterWorkspace = pWorkspace as IRasterWorkspaceEx;
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pDataset.Name);
//影像金字塔判断与创建
IRasterPyramid3 pRasPyrid = pRasterDataset as IRasterPyramid3;
if (pRasPyrid != null)
{
if (!(pRasPyrid.Present))//如果金字塔图层不存在
{
pRasPyrid.Create();//则创建一个金字塔
}
}
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromDataset(pRasterDataset);
ILayer pLayer = pRasterLayer as ILayer;
axMapControl.AddLayer(pLayer, 0);
}
pDataset = pEnumDataset.Next();
#endregion
}
axMapControl.ActiveView.Refresh();
}
#endregion
#region 添加栅格数据
/// <summary>
/// 从文件添加栅格数据
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="raster_FullPath">栅格文件全路径</param>
public static void Add_Data_Raster_FromFile(AxMapControl axMapControl, string raster_FullPath)
{
#region 获取文件路径和文件名
string raster_FilePath = System.IO.Path.GetDirectoryName(raster_FullPath);
string raster_FileName = System.IO.Path.GetFileName(raster_FullPath);
#endregion
#region 实例化各类
//通过 RasterWorkspaceFactory 组件类来实例化 IWorkspaceFactory 接口
IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();
//调用IWorkspaceFactory接口对象的方法OpenFromFile并传入参数:文件路径,来实例化IWorkspace
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(raster_FilePath, 0);
//将IWorkspace接口的对象赋值给IRasterWorkspace接口的对象,并转换为IRasterWorkspace类型,实现工厂到具体空间的转换
IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;
//通过IRasterWorkspace接口对象的方法OpenRasterDataset并传入参数:文件名,来实例化IRasterDataset,实现栅格工作空间与栅格数据集的联动
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(raster_FileName);
//通过IRasterDataset接口对象的CreateDefaultRaster()方法创建一个默认的栅格赋值给IRaster接口对象进行实例化
IRaster pRaster = pRasterDataset.CreateDefaultRaster();
//通过RasterLayerClass组件类来实例化IRasterLayer接口
IRasterLayer pRasterLayer = new RasterLayerClass();
//调用IRasterLayer接口对象的CreateFromRaster方法并传入参数:默认栅格,实现在当前图层中栅格图层的创建
pRasterLayer.CreateFromRaster(pRaster);
//将IRasterLayer接口对象赋值给ILayer接口对象,转化为ILayer类型实现对ILayer接口的实例化
ILayer pLayer = pRasterLayer as ILayer;
#endregion
#region 影像金字塔判断与创建
//将IRasterDataset接口的对象赋值给IRasterPyramid3接口的对象并转化为IRasterPyramid3类型实现联动
IRasterPyramid3 pRasPyrmid = pRasterDataset as IRasterPyramid3;
//判断金字塔
if (pRasPyrmid != null)//判断栅格金字塔对象是否为空(即栅格数据集是否存在)
{
if (!(pRasPyrmid.Present))//判断是否存在栅格金字塔
{
pRasPyrmid.Create();//如果不存在栅格金字塔,则创建一个栅格金字塔
}
}
#endregion
//在当前地图文档中添加图层
axMapControl.AddLayer(pLayer, 0);
axMapControl.ActiveView.Refresh();
}
#endregion
#region 添加CAD数据
/// <summary>
/// 从文件分图层添加CAD数据
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="cad_FullPath">CAD文件全路径</param>
public static void Add_Data_CAD_Layered_FromFile(AxMapControl axMapControl, string cad_FullPath)
{
#region//获取文件路径和文件名
string cad_FilePath = System.IO.Path.GetFullPath(cad_FullPath);
string cad_FileName = System.IO.Path.GetFileName(cad_FullPath);
#endregion
#region//加载CAD文件中的线文件
//通过CadWorkspaceFactory组件类对WorkspaceFactory接口进行实例化,并强转为WorkspaceFactory类型,实现联动
WorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactory() as WorkspaceFactory;
//通过WorkspaceFactory接口的OpenFromFile方法并传入参数:文件全路径,实现对IFeatureWorkspace接口的实例化,强转为IFeatureWorkspace类型
IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(cad_FullPath, 0) as IFeatureWorkspace;
//通过IFeatureWorkspace接口对象的方法OpenFeatureClass并传入参数:文件名,实现对IFeatureClass接口的实例化
IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(cad_FileName + ":Polyline");
//通过FeatureLayerClass组件类对IFeatureLayer接口进行实例化,联动要素图层和要素类
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
//将文件名赋值给要素图层名
pFeatureLayer.Name = cad_FileName;
//将要素类赋值给要素图层实现关联
pFeatureLayer.FeatureClass = pFeatureClass;
#endregion
axMapControl.Map.AddLayer(pFeatureLayer);
axMapControl.ActiveView.Refresh();
}
/// <summary>
/// 从文件整幅图添加CAD数据
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="cad_FullPath">CAD文件全路径</param>
public static void Add_Data_CAD_Whole_FromFile(AxMapControl axMapControl, string cad_FullPath)
{
#region//获取文件路径和文件名
string cad_FilePath = System.IO.Path.GetFullPath(cad_FullPath);
string cad_FileName = System.IO.Path.GetFileName(cad_FullPath);
#endregion
#region//打开CAD数据集
WorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass() as WorkspaceFactory;
//工作空间工厂 中存在若干 要素工作空间
IFeatureWorkspace pFeatureWorksapce = pWorkspaceFactory.OpenFromFile(cad_FileName, 0) as IFeatureWorkspace;
//要素工作空间 中存在若干 要素数据集
IFeatureDataset pFeatureDataset = pFeatureWorksapce.OpenFeatureDataset(cad_FileName);
//要素类包含者 可以管理 要素数据集中的每一个要素类
IFeatureClassContainer pFeatureClassContainer = pFeatureDataset as IFeatureClassContainer;
//对CAD文件的要素进行遍历处理
for (int i = 0; i < pFeatureClassContainer.ClassCount; i++)
{
//通过要素类包含者 获取到要素数据集中的 每一个要素类,并复制给要素类(无需强转)
IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);
IFeatureLayer pFeatureLayer;
//如果是注记,则添加注记图层
if (pFeatureClass.FeatureType == esriFeatureType.esriFTCoverageAnnotation)
{
//要素图层可以是CAD的注记图层
pFeatureLayer = new CadAnnotationLayerClass();
pFeatureLayer.Name = pFeatureClass.AliasName;
//将要素类 复制给 要素图层的要素类属性
pFeatureLayer.FeatureClass = pFeatureClass;
axMapControl.Map.AddLayer(pFeatureLayer);
}
else//如果是点、线、面,则添加要素层
{
//要素图层可以是要素图层类
pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.Name = pFeatureClass.AliasName;
pFeatureLayer.FeatureClass = pFeatureClass;
axMapControl.Map.AddLayer(pFeatureLayer);
}
axMapControl.ActiveView.Refresh();
}
#endregion
}
/// <summary>
/// 从文件作为栅格添加CAD数据
/// </summary>
/// <param name="axMapControl">地图控件对象</param>
/// <param name="cad_FullPath">CAD文件全路径</param>
public static void Add_Data_CAD_AsRaster_FromFile(AxMapControl axMapControl, string cad_FullPath)
{
#region//获取文件路径和文件名
string cad_FilePath = System.IO.Path.GetFullPath(cad_FullPath);
string cad_FileName = System.IO.Path.GetFileName(cad_FullPath);
#endregion
#region 获得CAD文件的数据集
//通过工作空间工厂一层一层实现 ICadDrawingWorkspace 接口
IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(cad_FilePath, 0);
ICadDrawingWorkspace pCadDrawingWorkspace = pWorkspace as ICadDrawingWorkspace;
//从ICadDrawingWorkspace工作空间接口中打开ICadDrawingDataset数据集
ICadDrawingDataset pCadDrawingDataset = pCadDrawingWorkspace.OpenCadDrawingDataset(cad_FileName);
//将CAD数据集添加到CAD图层中
ICadLayer pCadLayer = new CadLayerClass();
pCadLayer.CadDrawingDataset = pCadDrawingDataset;
#endregion
axMapControl.Map.AddLayer(pCadLayer);
axMapControl.ActiveView.Refresh();
}
#endregion
}
4.Conclusion
不多比比,直接上代码,都在注释里了兄弟。