实现过程:创建或打开一个FileGDB-->创建或打开一个栅格目录-->选择一个文件夹,把此文件夹下的栅格数据导入栅格目录:
下面为核心代码
using System; using System.IO; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.DataSourcesRaster; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.DataManagementTools; using ESRI.ArcGIS.Geoprocessor; using ESRI.ArcGIS.Geoprocessing; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.Carto; namespace RasterOperation { public class RasterCatalogOperation { /// <summary> /// fileGDB路径 /// </summary> public string FileGDBPath { get ; set ; } /// <summary> /// 栅格数据目录 /// </summary> public string SourceRasterDic { get; set; } /// <summary> /// 栅格目录名称 /// </summary> public string RasterDSName { get; set; } /// <summary> /// 栅格坐标系 /// </summary> public ISpatialReference RasterSpRf { get; set; } /// <summary> /// 矢量坐标系 /// </summary> public ISpatialReference GeometrySpRf { get; set; } /// <summary> /// 栅格目录转换为图层 /// </summary> /// <param name="folderName">目录名</param> /// <param name="datasetName">数据集名</param> /// <returns>要素图层</returns> public ILayer AddRasterCatalogLayer(string folderName, string datasetName) { IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass(); try { IWorkspace workspc = workspaceFactory.OpenFromFile(folderName, 0); IRasterWorkspaceEx pRaterWs = (IRasterWorkspaceEx)workspc; IRasterCatalog rasterCatalog = pRaterWs.OpenRasterCatalog(datasetName); ESRI.ArcGIS.Carto.IGdbRasterCatalogLayer rastercatalogLayer = new GdbRasterCatalogLayerClass(); rastercatalogLayer.Setup((ITable)rasterCatalog); //Add it to map if the layer is valid. if (!(rastercatalogLayer == null)) { return rastercatalogLayer as ILayer; } else return null; } catch { return null; } //Create a raster catalog layer. } /// <summary> /// 创建FileGDB /// </summary> /// <param name="fullPath">路径名</param> public void CreateFileGDB(string fullPath) { if (!Directory.Exists(fullPath)) { IWorkspaceFactory2 wsFctry = new FileGDBWorkspaceFactoryClass(); wsFctry.Create(System.IO.Path.GetDirectoryName(fullPath), System.IO.Path.GetFileName(fullPath), null, 0); FileGDBPath = fullPath; wsFctry = null; } } /// <summary> /// 创建RasterCatalog /// </summary> /// <param name="path">路径</param> /// <param name="catalogName">名称</param> /// <param name="rasterCoordSys">栅格坐标系</param> /// <param name="geometryCoordsys">矢量坐标系</param> public void CreateRasterCatalog_GP(string path, string catalogName, ISpatialReference rasterCoordSys, ISpatialReference geometryCoordsys) { //坐标转换 //Coordinate system for raster column IGPCoordinateSystem rSR = new GPCoordinateSystemClass(); rSR.SpatialReference = rasterCoordSys; //Coordinate system for geometry column IGPSpatialReference gSR = new GPSpatialReferenceClass(); gSR.SpatialReference = geometryCoordsys; //初始化GeoProcessor ESRI.ArcGIS.Geoprocessor.Geoprocessor geoProcessor = new ESRI.ArcGIS.Geoprocessor.Geoprocessor(); RasterDSName = catalogName; //创建工具 CreateRasterCatalog createRasterCatalog = new CreateRasterCatalog(); //设置参数 createRasterCatalog.out_path = path; createRasterCatalog.out_name = catalogName; createRasterCatalog.raster_spatial_reference = rSR; createRasterCatalog.spatial_reference = gSR; //利用工具创建RasterCatalog geoProcessor.Execute(createRasterCatalog, null); //ReturnMessages(geoProcessor); } //GP message handling public void ReturnMessages(Geoprocessor gp) { if (gp.MessageCount > 0) { for (int Count = 0; Count <= gp.MessageCount - 1; Count++) { Console.WriteLine(gp.GetMessage(Count)); } } } //static string rasterFolder = @"c:\tempdata"; //static string outRC = @"Database Connections\connection to raster.sde\rc_203"; //LoadDirtoRasterCatalog(outRC, rasterFolder); /// <summary> /// 输入整个目录到库中 /// </summary> /// <param name="outRasterCatalog">目标栅格库全路径</param> /// <param name="inputDir">输入目录</param> public void LoadDirtoRasterCatalog(string outRasterCatalog, string inputDir) { if (!Directory.Exists(inputDir)) { System.Windows.Forms.MessageBox.Show("路径不正确,请重新输入", "提示"); return; } //初始化 GeoProcessor ESRI.ArcGIS.Geoprocessor.Geoprocessor geoProcessor = new ESRI.ArcGIS.Geoprocessor.Geoprocessor(); //设置参数 IVariantArray parameters = new VarArrayClass(); //输入的文件夹目录 parameters.Add(inputDir); //目标栅格库路径 parameters.Add(outRasterCatalog); //Execute the tool to load rasters in the directory to raster catalog geoProcessor.Execute("WorkspaceToRasterCatalog", parameters, null); // ReturnMessages(geoProcessor); } /// <summary> /// 选择要素的坐标系 /// </summary> /// <param name="refFileName"></param> /// <returns></returns> public ISpatialReference InputReferece() { System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog(); if (SourceRasterDic != string.Empty || SourceRasterDic != " ") { openFileDialog.InitialDirectory = SourceRasterDic; } openFileDialog.Title = "加载图层数据"; openFileDialog.Filter = "Tif文件(*.tif)|*.tif|Shp文件(*.shp)|*.shp|Jpg文件(*.jpg)|*.jpg|Bmp文件(*.bmp)|*.bmp|Gif文件(*.gif)|*.gif|Img文件(*.img)|*.img|Png文件(*.png)|*.png|Tiff文件(*.tiff)|*.tiff"; openFileDialog.Multiselect = false; openFileDialog.DefaultExt = "*.tif|*.shp"; openFileDialog.SupportMultiDottedExtensions = true; string refFileName = string.Empty; if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { refFileName = openFileDialog.FileName; } else { return null; } IWorkspaceFactory pWorkspaceFactory = null; string p = System.IO.Path.GetExtension(refFileName); string fileNameWithoutExtentsion = System.IO.Path.GetFileNameWithoutExtension(refFileName); string pathName = System.IO.Path.GetDirectoryName(refFileName); string fileName = System.IO.Path.GetFileName(refFileName); if (p == ".shp" || p == ".SHP") { IFeatureWorkspace ws; IFeatureClass pFeatureClass; pWorkspaceFactory = new ShapefileWorkspaceFactory(); ws = pWorkspaceFactory.OpenFromFile(pathName, 0) as IFeatureWorkspace; pFeatureClass = ws.OpenFeatureClass(fileName); ws = null; return (pFeatureClass as IGeoDataset).SpatialReference; } if (p == ".jpg" || p == ".bmp" || p == ".gif" || p == ".img" || p == ".png" || p == ".tif" || p == ".tiff" || p == ".JPG" || p == ".BMP" || p == ".GIF" || p == ".IMG" || p == ".PNG" || p == ".TIF" || p == ".TIFF") { IRasterLayer pRasterLayer = new RasterLayerClass(); IRasterWorkspace pRasterWorkspace; IRaster pRaster; IRasterDataset pRasterDataset; IWorkspace pWorkspace; pWorkspaceFactory = new RasterWorkspaceFactoryClass(); pWorkspace = pWorkspaceFactory.OpenFromFile(pathName, 0);//0 pRasterWorkspace = pWorkspace as IRasterWorkspace; pRasterDataset = pRasterWorkspace.OpenRasterDataset(fileName); pRaster = pRasterDataset.CreateDefaultRaster(); pRasterLayer.CreateFromRaster(pRaster); IRasterProps pRasterProps = pRasterLayer.Raster as IRasterProps; return pRasterProps.SpatialReference; } return null; } /// <summary> /// 获取要素数据集 /// </summary> /// <param name="workspace">工作空间</param> /// <returns>要素数据集</returns> public IFeatureClass GetFirstFClass(IWorkspace workspace) { IFeatureClass FClass = null; IEnumDataset enumDataset = workspace.get_Datasets(esriDatasetType.esriDTAny); enumDataset.Reset(); IDataset perFeatSet = enumDataset.Next(); while (perFeatSet != null) { esriDatasetType getDatasetType = perFeatSet.Type; switch (getDatasetType) { case esriDatasetType.esriDTFeatureClass: ILayerFactoryHelper layerFactoryHelper = new LayerFactoryHelperClass(); IEnumLayer enumLayer = layerFactoryHelper.CreateLayersFromName(perFeatSet.FullName); enumLayer.Reset(); ILayer layer = enumLayer.Next(); while (layer != null) { //筛选出第一个面状要素数据集 if (layer is IFeatureLayer && (layer as IFeatureLayer).FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon) { return (layer as IFeatureLayer).FeatureClass; } layer = enumLayer.Next(); } System.Runtime.InteropServices.Marshal.ReleaseComObject(enumLayer); break; case esriDatasetType.esriDTFeatureDataset: case esriDatasetType.esriDTTable: case esriDatasetType.esriDTRasterDataset: break; default: break; } perFeatSet = enumDataset.Next(); } System.Runtime.InteropServices.Marshal.ReleaseComObject(enumDataset); return FClass; } } }