/***************************
Write by Chn gzGISer Tst
CSDN blog Ricardo.M.Tan
**************************/
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geodatabase;
using System.Collections.Generic;
using ESRI.ArcGIS.Catalog;
using ESRI.ArcGIS.CatalogUI;
using ESRI.ArcGIS.Controls;
namespace Chn.SpatialDataProcessing.GeoDataHelper.LoadAndSave {
/// <summary>
/// 加載數據
/// </summary>
public class GeoDataLoad {
private IMapControl3 _mapControl = null;
/// <summary>
/// 構造函數
/// </summary>
public GeoDataLoad() {
}
public GeoDataLoad(IMapControl3 mapControl) {
_mapControl = mapControl;
}
/// <summary>
/// 加載單個Shapefile文件
/// </summary>
/// <param name="shpFullPath">文件全路徑</param>
/// <returns>要素圖層(IFeatureLayer)</returns>
public IFeatureLayer LoadShapefile(string shpFullPath) {
IFeatureLayer pFeatuerLayer;
IFeatureWorkspace pFeatureWorkspace;
string pathName = System.IO.Path.GetDirectoryName(shpFullPath);
string fileName = System.IO.Path.GetFileNameWithoutExtension(shpFullPath);
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(pathName, 0) as IFeatureWorkspace;
pFeatuerLayer = new FeatureLayerClass {
FeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName),
Name = fileName
};
return pFeatuerLayer;
}
/// <summary>
/// 加載單個柵格文件
/// </summary>
/// <param name="resterFullPath">柵格文件路徑</param>
/// <returns>柵格圖層(IRasterLayer)</returns>
public IRasterLayer LoadRasterfile(string resterFullPath) {
IRaster pRaster;
IRasterLayer pRasterLayer;
IRasterWorkspace pRasterWorkspace;
IRasterDataset pRasterDataset;
IRasterPyramid pRasterPyramid;
string pathName = System.IO.Path.GetDirectoryName(resterFullPath);
string fileName = System.IO.Path.GetFileNameWithoutExtension(resterFullPath);
pRasterLayer = new RasterLayerClass();
IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactoryClass();
pRasterWorkspace = pWorkspaceFactory.OpenFromFile(pathName, 0) as IRasterWorkspace;
pRasterDataset = pRasterWorkspace.OpenRasterDataset(fileName);
//構建金字塔
pRasterPyramid = pRasterDataset as IRasterPyramid;
if (pRasterPyramid != null) {
if (!pRasterPyramid.Present) {
pRasterPyramid.Create();
}
}
pRaster = pRasterDataset.CreateDefaultRaster();
pRasterLayer.CreateFromRaster(pRaster);
return pRasterLayer;
}
/// <summary>
/// 加載地理文件(能夠加載的文件類型:*.shp, *.bmp, *.tif, *.jpg, *.img)
/// </summary>
/// <param name="strFilePath">地理文件路徑</param>
/// <returns>圖層(ILayer)</returns>
public ILayer Load(string strFilePath) {
try {
string strFileExten = System.IO.Path.GetExtension(strFilePath);
switch (strFileExten) {
case ".shp":
return LoadShapefile(strFilePath) as ILayer;
case ".bmp":
case ".tif":
case ".jpg":
case ".img":
return LoadRasterfile(strFilePath) as ILayer;
default:
return null;
}
} catch (System.Exception) {
throw;
}
}
/// <summary>
/// GxDialog加載數據
/// </summary>
/// <returns></returns>
public List<ILayer> GxDialogLoadGeoData() {
List<ILayer> layers = null;
try {
IGxDialog gxDialog = new GxDialogClass() {
Title = "選擇數據",
AllowMultiSelect = true
};
//過濾器
IGxObjectFilterCollection filters = gxDialog as IGxObjectFilterCollection;
filters.AddFilter(new GxFilterDatasetsAndLayers(), true);
filters.AddFilter(new GxFilterShapefilesClass(), false);
filters.AddFilter(new GxFilterFeatureClassesClass(), false);
filters.AddFilter(new GxFilterRasterDatasetsClass(), false);
IEnumGxObject gxObjects;
bool open = gxDialog.DoModalOpen(0, out gxObjects);
if (!open) return null;
layers = new List<ILayer>();//存儲打開的柵格圖層
gxObjects.Reset();
IGxObject gxObject = gxObjects.Next();
while (gxObject != null) {
IGxDataset gxDataset = gxObject as IGxDataset;
IDataset datasetSource = gxDataset.Dataset;
if (gxObject is IGxDataset) {
switch (datasetSource.Type) {
case esriDatasetType.esriDTFeatureClass:
LoadFeatureClass(datasetSource, ref layers);
break;
case esriDatasetType.esriDTFeatureDataset:
IFeatureDataset pFeatureDataset = datasetSource as IFeatureDataset;
IEnumDataset pEnumDataset = pFeatureDataset.Subsets;
pEnumDataset.Reset();
IDataset dataset = pEnumDataset.Next();
while (dataset != null) {
LoadFeatureClass(dataset, ref layers);
dataset = pEnumDataset.Next();
}
break;
case esriDatasetType.esriDTRasterDataset:
IRasterDataset pRasterDataset = datasetSource as IRasterDataset;
LoadRaster(datasetSource, ref layers);
break;
default:
break;
}
} else if (gxObject is IGxLayer) {
IGxLayer gxLayer = gxObject as IGxLayer;
layers.Add(gxLayer.Layer);
}
gxObject = gxObjects.Next();
}
} catch (System.Exception) {
throw;
}
return layers;
}
/// <summary>
/// 加載地理數據庫要素類
/// </summary>
/// <param name="datasetSource"></param>
/// <param name="layers"></param>
public void LoadFeatureClass(IDataset datasetSource, ref List<ILayer> layers) {
IFeatureLayer pFeatureLayer = new FeatureLayerClass() {
FeatureClass = datasetSource as IFeatureClass,
Name = datasetSource.Name,
};
layers.Add(pFeatureLayer);
}
/// <summary>
/// 加載柵格
/// </summary>
/// <param name="datasetSource"></param>
/// <param name="layers"></param>
public void LoadRaster(IDataset datasetSource, ref List<ILayer> layers) {
IRasterDataset pRasterDataset = datasetSource as IRasterDataset;
//構建金字塔
IRasterPyramid pRasterPyramid = pRasterDataset as IRasterPyramid;
if (pRasterPyramid != null) {
if (!pRasterPyramid.Present) {
pRasterPyramid.Create();
}
}
IRaster pRaster = pRasterDataset.CreateDefaultRaster();
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromRaster(pRaster);
pRasterLayer.Name = datasetSource.Name;
layers.Add(pRasterLayer);
}
}
}