目錄
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
不多比比,直接上代碼,都在註釋裏了兄弟。