不同gdb,相同数据集合并
分享
众所周知,数据处理是GIS中一项重要且繁琐的工作,处理数据的工具和方法也太多了,在做数据处理的时候,经常会遇到这样的问题:对存储在不同gdb中、并且数据集名称相同的数据进行合并处理:
如图:数据组织如下,每个gdb中都存储了一些列FeatureClass,(但gdb中的FeatureClass数量并不相同)
思路是:
1.先对每个gdb中的数据进行处理,使得每个gdb中的featureclass数量和名称相同。由于对Engine比较熟悉,这里我是用Engine进行处理的,具体代码如下:
private function Execute(){ //初始执行函数:
string templatePath = @"F:\testout";
DirectoryInfo directoryInfo = new DirectoryInfo(templatePath);
DirectoryInfo[] dirInfo = directoryInfo.GetDirectories();
string yy = dirInfo[0].Name;
string FeatureClassName = "ROALK_arc"; //FeatureClass名称,这里可以设置一个数组,存储所有的FeatureClass
for (int i = 0; i < dirInfo.Length; i++)
{
string gdbName = dirInfo[i].Name;
//打开filegdb
bool value = oper(@"F:\testout\" + gdbName, FeatureClassName);//判断FeatureClass是否存在
string path = @"F:\testout\" + gdbName;
if (value == false)
{
copyFeatureClass(path, FeatureClassName);
}
}
}
public bool oper(string filename,string featureClassName) //判断FeatureClass是否存在
{
IWorkspace2 workspace = null;
IWorkspaceFactory2 workspaceFactory = new FileGDBWorkspaceFactoryClass();
workspace = workspaceFactory.OpenFromFile(filename, 1) as IWorkspace2;
IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace;
bool flag = workspace.get_NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureClass, featureClassName);
return flag;
}
public bool oper(string filename,string featureClassName) //判断是gdb中是否存在某个FeatureClass
{
IWorkspace2 workspace = null;
IWorkspaceFactory2 workspaceFactory = new FileGDBWorkspaceFactoryClass();
workspace = workspaceFactory.OpenFromFile(filename, 1) as IWorkspace2;
IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace;
bool flag = workspace.get_NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureClass, featureClassName);
return flag;
}
//拷贝所有的FeatureClass到gdb,并删除里面的数据,保证每个featureclass为空,注:D:\Data\Shapefiles存储了所有的要合并的FeatureClass的空图层,便于拷贝。
private void convert()
{
IWorkspaceName sourceWorkspaceName = new WorkspaceNameClass
{
WorkspaceFactoryProgID = "esriDataSourcesFile.ShapefileWorkspaceFactory",
PathName = @"D:\Data\Shapefiles"
};
IName sourceWorkspaceIName = (IName)sourceWorkspaceName;
IWorkspace sourceWorkspace = (IWorkspace)sourceWorkspaceIName.Open();
// Create a name object for the target (file GDB) workspace and open it.
IWorkspaceName targetWorkspaceName = new WorkspaceNameClass
{
WorkspaceFactoryProgID = "esriDataSourcesGDB.FileGDBWorkspaceFactory",
PathName = @"D:\Data\Public.gdb"
};
IName targetWorkspaceIName = (IName)targetWorkspaceName;
IWorkspace targetWorkspace = (IWorkspace)targetWorkspaceIName.Open();
// Create a name object for the source dataset.
IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;
sourceDatasetName.Name = "BOUNT_arc";
sourceDatasetName.WorkspaceName = sourceWorkspaceName;
// Create a name object for the target dataset.
IFeatureClassName targetFeatureClassName = new FeatureClassNameClass();
IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;
targetDatasetName.Name = "BOUNT_arc";
targetDatasetName.WorkspaceName = targetWorkspaceName;
// Open source feature class to get field definitions.
IName sourceName = (IName)sourceFeatureClassName;
IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();
// Create the objects and references necessary for field validation.
IFieldChecker fieldChecker = new FieldCheckerClass();
IFields sourceFields = sourceFeatureClass.Fields;
IFields targetFields = null;
IEnumFieldError enumFieldError = null;
// Set the required properties for the IFieldChecker interface.
fieldChecker.InputWorkspace = sourceWorkspace;
fieldChecker.ValidateWorkspace = targetWorkspace;
// Validate the fields and check for errors.
fieldChecker.Validate(sourceFields, out enumFieldError, out targetFields);
if (enumFieldError != null)
{
// Handle the errors in a way appropriate to your application.
MessageBox.Show("Errors were encountered during field validation.");
} // Find the shape field.
String shapeFieldName = sourceFeatureClass.ShapeFieldName;
int shapeFieldIndex = sourceFeatureClass.FindField(shapeFieldName);
IField shapeField = sourceFields.get_Field(shapeFieldIndex);
// Get the geometry definition from the shape field and clone it.
IGeometryDef geometryDef = shapeField.GeometryDef;
IClone geometryDefClone = (IClone)geometryDef;
IClone targetGeometryDefClone = geometryDefClone.Clone();
IGeometryDef targetGeometryDef = (IGeometryDef)targetGeometryDefClone;
// Cast the IGeometryDef to the IGeometryDefEdit interface.
IGeometryDefEdit targetGeometryDefEdit = (IGeometryDefEdit)targetGeometryDef;
// Set the IGeometryDefEdit properties.
targetGeometryDefEdit.GridCount_2 = 1;
targetGeometryDefEdit.set_GridSize(0, 0.75);
IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
IEnumInvalidObject enumInvalidObject = featureDataConverter.ConvertFeatureClass
(sourceFeatureClassName, null, null, targetFeatureClassName,
targetGeometryDef, targetFields, "", 1000, 0); // Check for errors.
IInvalidObjectInfo invalidObjectInfo = null; enumInvalidObject.Reset();
}
2.合并,在ArcGIS中采用Python:
可以参考http://blog.csdn.net/esrichinacd/article/details/14146653
最后需要注意的地方是:在10.2的ArcMap中执行时会如下错误
我也是检查了好长时间,原因是10.2的ArcMap中执行结果会自动添加到ArcMap中,即使右键取消“添加至结果”也不行。(导致了第二次循环的时候合并的数据是结果集相同的数据的合并,所以会报上面错误)
所以这里,我们执行的时候可以到ArcCatalog中执行python脚本:
文章来源:http://www.cnblogs.com/esrichina/p/3546065.html
如图:数据组织如下,每个gdb中都存储了一些列FeatureClass,(但gdb中的FeatureClass数量并不相同)
思路是:
1.先对每个gdb中的数据进行处理,使得每个gdb中的featureclass数量和名称相同。由于对Engine比较熟悉,这里我是用Engine进行处理的,具体代码如下:
private function Execute(){ //初始执行函数:
string templatePath = @"F:\testout";
DirectoryInfo directoryInfo = new DirectoryInfo(templatePath);
DirectoryInfo[] dirInfo = directoryInfo.GetDirectories();
string yy = dirInfo[0].Name;
string FeatureClassName = "ROALK_arc"; //FeatureClass名称,这里可以设置一个数组,存储所有的FeatureClass
for (int i = 0; i < dirInfo.Length; i++)
{
string gdbName = dirInfo[i].Name;
//打开filegdb
bool value = oper(@"F:\testout\" + gdbName, FeatureClassName);//判断FeatureClass是否存在
string path = @"F:\testout\" + gdbName;
if (value == false)
{
copyFeatureClass(path, FeatureClassName);
}
}
}
public bool oper(string filename,string featureClassName) //判断FeatureClass是否存在
{
IWorkspace2 workspace = null;
IWorkspaceFactory2 workspaceFactory = new FileGDBWorkspaceFactoryClass();
workspace = workspaceFactory.OpenFromFile(filename, 1) as IWorkspace2;
IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace;
bool flag = workspace.get_NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureClass, featureClassName);
return flag;
}
public bool oper(string filename,string featureClassName) //判断是gdb中是否存在某个FeatureClass
{
IWorkspace2 workspace = null;
IWorkspaceFactory2 workspaceFactory = new FileGDBWorkspaceFactoryClass();
workspace = workspaceFactory.OpenFromFile(filename, 1) as IWorkspace2;
IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace;
bool flag = workspace.get_NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureClass, featureClassName);
return flag;
}
//拷贝所有的FeatureClass到gdb,并删除里面的数据,保证每个featureclass为空,注:D:\Data\Shapefiles存储了所有的要合并的FeatureClass的空图层,便于拷贝。
private void convert()
{
IWorkspaceName sourceWorkspaceName = new WorkspaceNameClass
{
WorkspaceFactoryProgID = "esriDataSourcesFile.ShapefileWorkspaceFactory",
PathName = @"D:\Data\Shapefiles"
};
IName sourceWorkspaceIName = (IName)sourceWorkspaceName;
IWorkspace sourceWorkspace = (IWorkspace)sourceWorkspaceIName.Open();
// Create a name object for the target (file GDB) workspace and open it.
IWorkspaceName targetWorkspaceName = new WorkspaceNameClass
{
WorkspaceFactoryProgID = "esriDataSourcesGDB.FileGDBWorkspaceFactory",
PathName = @"D:\Data\Public.gdb"
};
IName targetWorkspaceIName = (IName)targetWorkspaceName;
IWorkspace targetWorkspace = (IWorkspace)targetWorkspaceIName.Open();
// Create a name object for the source dataset.
IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;
sourceDatasetName.Name = "BOUNT_arc";
sourceDatasetName.WorkspaceName = sourceWorkspaceName;
// Create a name object for the target dataset.
IFeatureClassName targetFeatureClassName = new FeatureClassNameClass();
IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;
targetDatasetName.Name = "BOUNT_arc";
targetDatasetName.WorkspaceName = targetWorkspaceName;
// Open source feature class to get field definitions.
IName sourceName = (IName)sourceFeatureClassName;
IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();
// Create the objects and references necessary for field validation.
IFieldChecker fieldChecker = new FieldCheckerClass();
IFields sourceFields = sourceFeatureClass.Fields;
IFields targetFields = null;
IEnumFieldError enumFieldError = null;
// Set the required properties for the IFieldChecker interface.
fieldChecker.InputWorkspace = sourceWorkspace;
fieldChecker.ValidateWorkspace = targetWorkspace;
// Validate the fields and check for errors.
fieldChecker.Validate(sourceFields, out enumFieldError, out targetFields);
if (enumFieldError != null)
{
// Handle the errors in a way appropriate to your application.
MessageBox.Show("Errors were encountered during field validation.");
} // Find the shape field.
String shapeFieldName = sourceFeatureClass.ShapeFieldName;
int shapeFieldIndex = sourceFeatureClass.FindField(shapeFieldName);
IField shapeField = sourceFields.get_Field(shapeFieldIndex);
// Get the geometry definition from the shape field and clone it.
IGeometryDef geometryDef = shapeField.GeometryDef;
IClone geometryDefClone = (IClone)geometryDef;
IClone targetGeometryDefClone = geometryDefClone.Clone();
IGeometryDef targetGeometryDef = (IGeometryDef)targetGeometryDefClone;
// Cast the IGeometryDef to the IGeometryDefEdit interface.
IGeometryDefEdit targetGeometryDefEdit = (IGeometryDefEdit)targetGeometryDef;
// Set the IGeometryDefEdit properties.
targetGeometryDefEdit.GridCount_2 = 1;
targetGeometryDefEdit.set_GridSize(0, 0.75);
IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
IEnumInvalidObject enumInvalidObject = featureDataConverter.ConvertFeatureClass
(sourceFeatureClassName, null, null, targetFeatureClassName,
targetGeometryDef, targetFields, "", 1000, 0); // Check for errors.
IInvalidObjectInfo invalidObjectInfo = null; enumInvalidObject.Reset();
}
2.合并,在ArcGIS中采用Python:
可以参考http://blog.csdn.net/esrichinacd/article/details/14146653
最后需要注意的地方是:在10.2的ArcMap中执行时会如下错误
我也是检查了好长时间,原因是10.2的ArcMap中执行结果会自动添加到ArcMap中,即使右键取消“添加至结果”也不行。(导致了第二次循环的时候合并的数据是结果集相同的数据的合并,所以会报上面错误)
所以这里,我们执行的时候可以到ArcCatalog中执行python脚本:
文章来源:http://www.cnblogs.com/esrichina/p/3546065.html
0 个评论
相关问题
- 作为Desktop用户对数据的获取比较乏力,可能缺了哪些知识?
- 有谁知道哪里可以免费获取各省市地图数据呢,包括详细的shape文件数据
- 有栅格数据a(大数据),小数据b,怎么从a中扣掉b,得到a数据剩下的部分?栅格能裁剪取反吗?
- 在windows server2008 R2 64位中安装了portal 10.5 设置好托管arcgis server站点,并用data store为托管数据库,发布数据出错
- cityengine怎么导入arcgis的shp数据,对shp数据有什么要求
- ArcGIS数据库数据逐图幅裁剪
- 运用ArcGIS利用大数据中哪些数据对公园可达性进行分析?
- 网络分析中用路构建网络数据集的问题
- 基于ArcGIS的CAD数据向GIS数据转换方法
- 镶嵌数据集 Add Rasters
- ArcEngine 复制镶嵌数据集