ArcEngine——數據加載常用方法

/***************************
 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);
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章