实现根据字符串获取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