问题描述:如题
解决方法:
private IFeatureClass GetFeatureClass()
{
IFeatureClass fc = null;
FileInfo fileInfo = new FileInfo(_outfilepath);
if (_outfilepath.ToUpper().Contains(".SHP"))
{
IWorkspaceFactory pWorkspaceFactory;
pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFeatWS;
pFeatWS = pWorkspaceFactory.OpenFromFile(fileInfo.Directory.ToString(), 0) as IFeatureWorkspace;
//打开一个要素类
fc = pFeatWS.OpenFeatureClass(fileInfo.Name);
}
else if (_outfilepath.ToUpper().Contains(".MDB"))
{
IWorkspaceFactory pFactory = new AccessWorkspaceFactoryClass();
ESRI.ArcGIS.Geodatabase.IWorkspace pWorkspace = pFactory.OpenFromFile(fileInfo.DirectoryName, 0);
IFeatureWorkspace pFeatWorkspace = pWorkspace as IFeatureWorkspace;
fc = pFeatWorkspace.OpenFeatureClass(fileInfo.Name);
}
else if (_outfilepath.ToUpper().Contains(".GDB"))
{
IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();
ESRI.ArcGIS.Geodatabase.IWorkspace workspace = workspaceFactory.OpenFromFile(fileInfo.DirectoryName, 0);
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
fc = featureWorkspace.OpenFeatureClass(fileInfo.Name);
}
return fc;
}
更新:
如果路径是GDB、MDB切包含了数据集的路径时,fileInfo.DirectoryName得到的是要素集的全路径,而不是MDB、GDB的
改进方法如下:
private IFeatureClass GetFeatureClass(string _outfilepath)
{
IFeatureClass fc = null;
FileInfo fileInfo = new FileInfo(_outfilepath);
if (_outfilepath.ToUpper().Contains(".SHP"))
{
IWorkspaceFactory pWorkspaceFactory;
pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFeatWS;
pFeatWS = pWorkspaceFactory.OpenFromFile(fileInfo.Directory.ToString(), 0) as IFeatureWorkspace;
//打开一个要素类
fc = pFeatWS.OpenFeatureClass(fileInfo.Name);
}
else if (_outfilepath.ToUpper().Contains(".MDB"))
{
string mdbpath = fileInfo.DirectoryName;
if (!fileInfo.DirectoryName.ToUpper().EndsWith(".MDB"))
{
mdbpath = fileInfo.DirectoryName.Substring(0, fileInfo.DirectoryName.ToUpper().LastIndexOf(".MDB"));
}
IWorkspaceFactory pFactory = new AccessWorkspaceFactoryClass();
ESRI.ArcGIS.Geodatabase.IWorkspace pWorkspace = pFactory.OpenFromFile(mdbpath, 0);
IFeatureWorkspace pFeatWorkspace = pWorkspace as IFeatureWorkspace;
fc = pFeatWorkspace.OpenFeatureClass(fileInfo.Name);
}
else if (_outfilepath.ToUpper().Contains(".GDB"))
{
string gdbpath = fileInfo.DirectoryName;
if (!fileInfo.DirectoryName.ToUpper().EndsWith(".GDB"))
{
gdbpath = fileInfo.DirectoryName.Substring(0, fileInfo.DirectoryName.ToUpper().LastIndexOf(".GDB")+4);
}
IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();
ESRI.ArcGIS.Geodatabase.IWorkspace workspace = workspaceFactory.OpenFromFile(gdbpath, 0);
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
fc = featureWorkspace.OpenFeatureClass(fileInfo.Name);
}
return fc;
}
20220823 遍历gdb里边所有图层
public List ReadFeatureClassList(IWorkspace pWs)
{
//定义接收所有featureclass的数组
List list_sdefeatures = new List();
//打开要素集
IFeatureWorkspace pFeatureWorkspace = pWs as IFeatureWorkspace;
IFeatureClass esriFeatureClass = null;
//遍历要素集Dataset下的featureclass
IEnumDataset penumDatasets = pWs.get_Datasets(esriDatasetType.esriDTFeatureDataset);
penumDatasets.Reset();
IDataset pesriDataset = penumDatasets.Next();
while (pesriDataset != null)
{
if (pesriDataset is IFeatureDataset)
{
// try to find class in dataset
try
{
IFeatureClassContainer featContainer = (IFeatureClassContainer)pesriDataset;
IEnumFeatureClass pEnumFC = featContainer.Classes;
esriFeatureClass = pEnumFC.Next();
while (esriFeatureClass != null)
{
IDataset pDS = esriFeatureClass as IDataset;
list_sdefeatures.Add(pDS.Name.ToString());
esriFeatureClass = pEnumFC.Next();
}
}
catch { }
// try another dataset
}
pesriDataset = penumDatasets.Next();
}
//遍历工作空间下的featureclass
IEnumDataset enumDatasets = pWs.get_Datasets(esriDatasetType.esriDTFeatureClass) as IEnumDataset;
enumDatasets.Reset();
IDataset esriDataset = enumDatasets.Next() as IDataset;
while (esriDataset is IFeatureClass)
{
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(esriDataset.Name);
//获取面要素
if (pFeatureLayer.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
{
list_sdefeatures.Add(esriDataset.Name.ToString());
}
//获取线要素
if (pFeatureLayer.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)
{
list_sdefeatures.Add(esriDataset.Name.ToString());
}
//获取点要素
if (pFeatureLayer.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
{
list_sdefeatures.Add(esriDataset.Name.ToString());
}
esriDataset = enumDatasets.Next();
}
return list_sdefeatures;
}