zoukankan      html  css  js  c++  java
  • 不同gdb,相同数据集合并

    众所周知,数据处理是GIS中一项重要且繁琐的工作,处理数据的工具和方法也太多了,在做数据处理的时候,经常会遇到这样的问题:对存储在不同gdb中、并且数据集名称相同的数据进行合并处理:

    如图:数据组织如下,每个gdb中都存储了一些列FeatureClass,(但gdb中的FeatureClass数量并不相同)

    思路是:

    1.先对每个gdb中的数据进行处理,使得每个gdb中的featureclass数量和名称相同。由于对Engine比较熟悉,这里我是用Engine进行处理的,具体代码如下:

    private function Execute(){  //初始执行函数:
         string templatePath = @"F:	estout";
         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:	estout" + gdbName, FeatureClassName);//判断FeatureClass是否存在
             string path = @"F:	estout" + 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:DataShapefiles存储了所有的要合并的FeatureClass的空图层,便于拷贝。

     private void convert()
            {
                     IWorkspaceName sourceWorkspaceName = new WorkspaceNameClass
                     {
                         WorkspaceFactoryProgID = "esriDataSourcesFile.ShapefileWorkspaceFactory",
                         PathName = @"D:DataShapefiles"
                     };
                     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:DataPublic.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脚本:

  • 相关阅读:
    [转]Eclipse之ANT使用
    [转]深入浅出解读微软云计算:让云触手可及
    [转]android的selector,背景选择器
    [转]android 个人铃声设置代码
    [转]Android中的Frame动画
    [转]WebGL中文教程
    节点遍历函数
    javascript深拷贝
    javascript 跨浏览器的事件系统
    CSS选择器的权重详解
  • 原文地址:https://www.cnblogs.com/esrichina/p/3546065.html
Copyright © 2011-2022 走看看