ArcGIS Engine基础(2)之各类数据源管理(Shapefile)

实现根据字符串获取Shapefile工作空间和图层

private static ShapefileDataSource _instance = null;
        // 获取实例互斥锁
        private static readonly object _getInstanceMutexLocker = new object();

        private ShapefileDataSource() { }

        public static ShapefileDataSource CreateSingleton() {
            if (_instance != null) return _instance;
            lock (_getInstanceMutexLocker) {
                if (_instance == null) return new ShapefileDataSource();
            }
            return _instance;
        }


        /// <summary>
        /// 打开shape工作空间
        /// </summary>
        /// <param name="workspaceDataSourceString">shape全路径</param>
        /// <returns>工作空间</returns>
        public IWorkspace OpenWorkspace(string workspaceDataSourceString) {
            IWorkspace pWorkspace = null;
        //避免直接使用new方式,容易出现无法将类型为“System.__ComObject”的对象强制转换为类型    ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory错误
        //IWorkspaceFactory workspaceFactory= new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory();
            IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(System.Type.GetTypeFromProgID("esriDataSourcesFile.ShapefileWorkspaceFactory"))
            try {
                pWorkspace = workspaceFactory.OpenFromFile(workspaceDataSourceString, 0);
            }
            catch {
            }

            return pWorkspace;
        }

        public IWorkspace OpenWorkspace(string workspaceDataSourceString, bool createIfNotExist) {
            if (Directory.Exists(workspaceDataSourceString))
                return OpenWorkspace(workspaceDataSourceString);
            else if (createIfNotExist)
                return CreateWorkspace(workspaceDataSourceString);

            return null;
        }

        public IWorkspace CreateWorkspace(string workspaceDataSourceString) {
            IWorkspace workspace = null;
            DirectoryInfo directoryInfo = Directory.CreateDirectory(workspaceDataSourceString);
            if (directoryInfo.Exists) workspace = OpenWorkspace(workspaceDataSourceString);

            return workspace;
        }


        public ILayer OpenLayer(string layerDataSourceString) {
            IFeatureClass featureClass = GetFeatureClass(layerDataSourceString);
            if (featureClass == null) return null;

            int pos = layerDataSourceString.LastIndexOf('\\') + 1;
            string shpFileName = layerDataSourceString.Substring(pos);

            IFeatureLayer pFeatureLayer = new FeatureLayerClass();
            pFeatureLayer.Name = shpFileName;
            pFeatureLayer.FeatureClass = featureClass;

            return pFeatureLayer;
        }

        public IEnvelope GetExtent(string layerDataSourceString) {
            IFeatureClass featureClass = GetFeatureClass(layerDataSourceString);
            if (featureClass == null) return null;

            IGeoDataset geoDataset = featureClass as IGeoDataset;
            if (geoDataset == null) return null;

            return geoDataset.Extent;
        }

        #region 私有方法

        private IFeatureClass GetFeatureClass(string layerDataSourceString) {
            if (string.IsNullOrEmpty(layerDataSourceString)) return null;

            int pos1 = layerDataSourceString.LastIndexOf('\\') + 1;
            int pos2 = layerDataSourceString.LastIndexOf('.');
            string shpPathName = layerDataSourceString.Substring(0, pos1);
            string shpFileName = layerDataSourceString.Substring(pos1, pos2 - pos1);

            try {
                IFeatureWorkspace pFeatureWorkspace = OpenWorkspace(shpPathName) as IFeatureWorkspace;
                if (pFeatureWorkspace == null) return null;

                IFeatureClass featureClass = pFeatureWorkspace.OpenFeatureClass(shpFileName);
                return featureClass;
            }
            catch {
                return null;
            }
        }

        #endregion

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xizhjxust_GIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值