基于ArcGIS10.0和Oracle10g的空间数据管理平台六(C#开发)-空间数据操作类

本系统的一个重点功能就是管理空间数据,所以很多空间数据的操作,而且这些操作可能随时都可能用到,所以单独封装为一个独立的空间数据操作类(地图操作类)。封装的函数都是一些最基本的操作功能,具体实现基于ArcGIS平台的空间数据管理还需要很多复杂的功能和逻辑,后面介绍空间数据管理和编辑的时候会详细介绍。

1.首先我们需要介绍的是连接空间数据库的代码函数,具体实现如下:

[csharp]  view plain copy
  1. /// <summary>  
  2. /// 连接空间数据库并得到一个SDE工作空间的实例  
  3. /// </summary>  
  4. /// <returns></returns>  
  5. public static IFeatureWorkspace GetFeatrueWorkspace()  
  6. {  
  7.     //定义一个属性   
  8.     IPropertySet pPS = new PropertySetClass();  
  9.   
  10.     //设置数据库服务器名,服务器所在的IP地址   
  11.     pPS.SetProperty("SERVER", ConfigurationSettings.AppSettings["SERVER"]);  
  12.     //propset.SetProperty("SERVER", "10.51.6.233");  
  13.     //设置SDE的端口,这是安装时指定的,默认安装时"port:5151"   
  14.     pPS.SetProperty("INSTANCE", ConfigurationSettings.AppSettings["INSTANCE"]);  
  15.     //SDE的用户名   
  16.     pPS.SetProperty("USER", ConfigurationSettings.AppSettings["USER"]);  
  17.     //密码   
  18.     pPS.SetProperty("PASSWORD", ConfigurationSettings.AppSettings["PASSWORD"]);  
  19.     //设置数据库的名字,只有SQL Server  Informix 数据库才需要设置   
  20.   
  21.    pPS.SetProperty("DATABASE", ConfigurationSettings.AppSettings["DATABASE"]);  
  22.     //SDE的版本,在这为默认版本   
  23.     pPS.SetProperty("VERSION", ConfigurationSettings.AppSettings["VERSION"]);  
  24.   
  25.     //定义一个工作空间,并实例化为SDE的工作空间   
  26.     IWorkspaceFactory pWF = new SdeWorkspaceFactoryClass();  
  27.     //打开SDE工作空间,并转化为地物工作空间   
  28.     IFeatureWorkspace pFW = (IFeatureWorkspace)pWF.Open(pPS, 0);  
  29.     return pFW;  
  30. }  

上面这个函数是采用SDE连接方式,也可以采用直接连接的方式,下面一个函数通过一个if分支语句来判断可以采用SDE也可以采用直接连接的方式实现,具体请看代码及详细的注释:

[csharp]  view plain copy
  1. public static IWorkspace FindWsByDefault()  
  2. {  
  3.     //定义一个属性   
  4.     IPropertySet Propset = new PropertySetClass();  
  5.     if (true// 采用SDE连接   
  6.     {  
  7.         //设置数据库服务器名,服务器所在的IP地址   
  8.         Propset.SetProperty("SERVER""192.168.1.111");  
  9.         //设置SDE的端口,这是安装时指定的,默认安装时"port:5151"   
  10.         Propset.SetProperty("INSTANCE""port:5151");  
  11.         //SDE的用户名   
  12.         Propset.SetProperty("USER""sde");  
  13.         //密码   
  14.         Propset.SetProperty("PASSWORD""sde");  
  15.         //设置数据库的名字,只有SQL Server  Informix 数据库才需要设置   
  16.         //Propset.SetProperty("DATABASE", "sde");  
  17.         //SDE的版本,在这为默认版本   
  18.         Propset.SetProperty("VERSION""SDE.DEFAULT");  
  19.     }  
  20.     else // 直接连接   
  21.     {  
  22.         //设置数据库服务器名,如果是本机可以用"sde:sqlserver:."   
  23.         Propset.SetProperty("INSTANCE""sde:sqlserver:zhpzh");  
  24.         //SDE的用户名   
  25.         Propset.SetProperty("USER""sa");  
  26.         //密码   
  27.         Propset.SetProperty("PASSWORD""sa");  
  28.         //设置数据库的名字,只有SQL Server  Informix 数据库才需要设置              
  29.         Propset.SetProperty("DATABASE""sde");  
  30.         //SDE的版本,在这为默认版本   
  31.         Propset.SetProperty("VERSION""SDE.DEFAULT");  
  32.     }  
  33.     //定义一个工作空间,并实例化为SDE的工作空间   
  34.     IWorkspaceFactory factory = new SdeWorkspaceFactoryClass();  
  35.     //打开SDE工作空间,并转化为地物工作空间  
  36.     IWorkspace workspace = factory.Open(Propset, 0);  
  37.   
  38.     return workspace;  
  39. }  

代码注释里面提到的工作空间就相当于一个数据库,里面包含了各种可以操作的图层(相当于数据库中的表)。

2.在一个指定的工作空间中查询一个要素类

[csharp]  view plain copy
  1. /// <summary>  
  2.  /// 查找指定要素  
  3.  /// </summary>  
  4.  /// <param name="ws"></param>  
  5.  /// <param name="className"></param>  
  6.  /// <param name="dsName"></param>  
  7.  /// <returns></returns>  
  8.  public static IFeatureClass FindClassByName(IWorkspace ws, string className, string dsName)  
  9.  {  
  10.      IEnumDataset enumDs;  
  11.      if (dsName != "")  
  12.      {  
  13.          enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureDataset);  
  14.          IFeatureDataset featureDs = enumDs.Next() as IFeatureDataset;  
  15.          while (featureDs != null)  
  16.          {  
  17.              string strTemp = featureDs.Name.Substring(featureDs.Name.IndexOf('.') + 1);  
  18.              if (strTemp == dsName)  
  19.              {  
  20.                  return GetFcFromDataset(featureDs, className);  
  21.              }  
  22.              featureDs = enumDs.Next() as IFeatureDataset;  
  23.          }  
  24.      }  
  25.      else  
  26.      {  
  27.          enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureClass);  
  28.          return GetFcFromEnumDataset(enumDs,className);  
  29.      }  
  30.      return null;  
  31.  }  

然后利用这个函数实现了另外一个函数:通过要素类名和数据集名在指定的工作空间中寻找要素类

[csharp]  view plain copy
  1. /// <summary>  
  2. /// 通过要素类名和数据集名在指定的工作空间中寻找要素类  
  3. /// </summary>  
  4. /// <param name="className"></param>  
  5. /// <param name="datasetName"></param>  
  6. /// <returns></returns>  
  7. public static IFeatureClass FindClassByName(string className, string datasetName)  
  8. {  
  9.     IWorkspace ws = FindWsByDefault();  
  10.     IFeatureClass featClass = FindClassByName(ws, className, datasetName);  
  11.     return featClass;  
  12. }  

3.在数据集中查找要素类,一个数据集可能包含多个要素类,数据集就是把一些具有共同特征(共同的数据结构类型,空间参考相同等)的数据(要素类)划分成一个一个的集合。

[csharp]  view plain copy
  1. /// <summary>  
  2. /// 在数据集中查找要素类  
  3. /// </summary>  
  4. /// <param name="pFD"></param>  
  5. /// <param name="className"></param>  
  6. /// <returns></returns>  
  7. public static IFeatureClass GetFcFromDataset(IFeatureDataset pFD, string className)  
  8. {  
  9.     IFeatureClass pFC;  
  10.     IFeatureClassContainer pFCC = pFD as IFeatureClassContainer;  
  11.     for (int i = 0; i < pFCC.ClassCount; i++)  
  12.     {  
  13.         pFC = pFCC.get_Class(i);  
  14.         string strTemp = pFC.AliasName.Substring(pFC.AliasName.IndexOf('.') + 1);  
  15.         if (strTemp == className)  
  16.         {  
  17.             return pFC;  
  18.         }  
  19.     }  
  20.     return null;  
  21. }  

4.将一个要素类从一个工作空间转移到另外一个工作空间:例如文件系统目录(Shape格式文件组成)、mdb或其他格式,文件系统目录下的所有Shape文件(一个等同于表结构的数据文件,内容等同于表里面的数据)构成一个工作空间。

[csharp]  view plain copy
  1.  /// <summary>  
  2. /// 将一个要素类从一个工作空间转移到另外一个工作空间  
  3. /// 注意目标工作空间不能有改要素类,必须先清除    
  4. /// </summary>  
  5. /// <param name="sourceWorkspace">源工作空间</param>  
  6. /// <param name="targetWorkspace">目标工作空间</param>  
  7. /// <param name="nameOfSourceFeatureClass">源要素类名</param>  
  8. /// <param name="nameOfTargetFeatureClass">目标要素类名</param>  
  9. public static void ConvertFeatureClass(IWorkspace sourceWorkspace, IWorkspace targetWorkspace,  
  10.     string nameOfSourceFeatureClass, string nameOfTargetFeatureClass, int sc_id)  
  11. {              
  12.     //create source workspace name  
  13.     //创建源工作空间名称    
  14.     IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;  
  15.     IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName;  
  16.     //create source dataset name  
  17.     //创建源数据集名称  
  18.     IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();  
  19.     IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;  
  20.     sourceDatasetName.WorkspaceName = sourceWorkspaceName;  
  21.     sourceDatasetName.Name = nameOfSourceFeatureClass;  
  22.     //create target workspace name  
  23.     //创建目标工作空间名称  
  24.     IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;  
  25.     IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;  
  26.     //create target dataset name  
  27.     //创建目标数据集名称    
  28.     IFeatureClassName targetFeatureClassName = new FeatureClassNameClass();  
  29.     IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;  
  30.     targetDatasetName.WorkspaceName = targetWorkspaceName;  
  31.     targetDatasetName.Name = nameOfTargetFeatureClass;  
  32.     //Open input Featureclass to get field definitions.   
  33.     //打开输入的要素类以得到字段定义   
  34.     IName sourceName = (IName)sourceFeatureClassName;  
  35.     //打开源要素类   
  36.     IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();  
  37.   
  38.     //Validate the field names because you are converting between different workspace types.  
  39.     //验证字段名称,因为你正在不同类型的工作空间之间进行数据转换  
  40.     IFieldChecker fieldChecker = new FieldCheckerClass();  
  41.     IFields targetFeatureClassFields;  
  42.     IFields sourceFeatureClassFields = sourceFeatureClass.Fields;  
  43.     IEnumFieldError enumFieldError;  
  44.     // Most importantly set the input and validate workspaces!    
  45.     //最重要的设置输入和验证工作空间  
  46.     fieldChecker.InputWorkspace = sourceWorkspace;  
  47.     fieldChecker.ValidateWorkspace = targetWorkspace;  
  48.     fieldChecker.Validate(sourceFeatureClassFields, out enumFieldError, out targetFeatureClassFields);  
  49.     // Loop through the output fields to find the geomerty field  
  50.     //遍历所有输出字段找到几何字段  
  51.     IField geometryField;  
  52.     for (int i = 0; i < targetFeatureClassFields.FieldCount; i++)  
  53.     {  
  54.         if (targetFeatureClassFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)  
  55.         {  
  56.             geometryField = targetFeatureClassFields.get_Field(i);  
  57.             // Get the geometry field's geometry defenition   
  58.             //得到几何字段的几何定义  
  59.             IGeometryDef geometryDef = geometryField.GeometryDef;  
  60.             //Give the geometry definition a spatial index grid count and grid size  
  61.             //赋予几何定义一个空间索引格网数目和格网大小值  
  62.             IGeometryDefEdit targetFCGeoDefEdit = (IGeometryDefEdit)geometryDef;  
  63.             targetFCGeoDefEdit.GridCount_2 = 1;  
  64.             targetFCGeoDefEdit.set_GridSize(0, 0);  
  65.             //Allow ArcGIS to determine a valid grid size for the data loaded  
  66.             //允许ArcGIS为数据加载确定一个有效的格网大小  
  67.             if (sc_id == 0)  
  68.             {  
  69.                 targetFCGeoDefEdit.SpatialReference_2 = geometryField.GeometryDef.SpatialReference;  
  70.             }   
  71.             else  
  72.             {  
  73.                 ISpatialReferenceFactory2 pSRF2 = new SpatialReferenceEnvironmentClass();  
  74.                 IGeographicCoordinateSystem pGCS = pSRF2.CreateGeographicCoordinateSystem(sc_id);  
  75.                 ISpatialReference pSR = (ISpatialReference)pGCS;  
  76.                 targetFCGeoDefEdit.SpatialReference_2 = pSR;  
  77.             }  
  78.             //geometryField.GeometryDef.SpatialReference;  
  79.             // we want to convert all of the features  
  80.             //转换要素类中所有的要素  
  81.             IQueryFilter queryFilter = new QueryFilterClass();  
  82.             queryFilter.WhereClause = "";  
  83.             // Load the feature class  
  84.             //加载要素类  
  85.             IFeatureDataConverter fctofc = new FeatureDataConverterClass();  
  86.             IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(sourceFeatureClassName,  
  87.                 queryFilter, null, targetFeatureClassName, geometryDef,   
  88.                 targetFeatureClassFields, "", 1000, 0);  
  89.             break;  
  90.         }  
  91.     }  
  92. }  

5.将mdb或Shape文件中要素类转换追加到sde数据库已有的要素类中,追加的mdb和Shape格式必须同SDE(空间数据库插件)数据库中表结构的数据格式相同

[csharp]  view plain copy
  1. /// <summary>  
  2.  /// 将mdb或Shape文件中要素类转换追加到sde数据库已有的要素类中  
  3.  /// </summary>  
  4.  /// <param name="sourceWorkspace"></param>  
  5.  /// <param name="targetWorkspace"></param>  
  6.  /// <param name="nameOfSourceFeatureClass"></param>  
  7.  /// <param name="nameOfTargetFeatureClass"></param>  
  8.  public static void AddFeatureClassToSDE(IWorkspace sourceWorkspace, IWorkspace targetWorkspace,  
  9.      string nameOfSourceFeatureClass, string nameOfTargetFeatureClass)  
  10.  {  
  11.      IFeatureWorkspace pSourceFW = sourceWorkspace as IFeatureWorkspace;  
  12.      IFeatureClass pSourceFc = pSourceFW.OpenFeatureClass(nameOfSourceFeatureClass);  
  13.   
  14.      IFeatureWorkspace pTargetFW = targetWorkspace as IFeatureWorkspace;  
  15.      IFeatureClass pTargetFc = pTargetFW.OpenFeatureClass(nameOfTargetFeatureClass);  
  16.   
  17.      mdb2fc(pSourceFc, pTargetFc);  
  18.  }  

函数通过各自的工作空间和要素类名称等到具体需要转换的要素类(包括源要素类:mdb或shape格式中的表结构和目标要素类:SDE中的表结构),然后调用mdb2fc完成具体的转换工作,实现代码如下:

[csharp]  view plain copy
  1. /// <summary>  
  2. /// 追加要素到SDE的featureclass中  
  3. /// </summary>  
  4. /// <param name="pSourceFc">源要素类</param>  
  5. /// <param name="pTargetFc">目的要素类</param>  
  6. private static void mdb2fc(IFeatureClass pSourceFc, IFeatureClass pTargetFc)  
  7. {  
  8.     IFeatureCursor pFeaCursor = pSourceFc.Search(nullfalse);  
  9.     IFeature pFeature = pFeaCursor.NextFeature();  
  10.   
  11.     IField pField = new FieldClass();  
  12.     int iIndex = 0;  
  13.   
  14.     while (pFeature != null)  
  15.     {  
  16.         IFeature tempFeature = pTargetFc.CreateFeature();  
  17.         tempFeature.Shape = pFeature.Shape;  
  18.   
  19.         try  
  20.         {  
  21.             //添加字段值  
  22.             for (int j = 0; j < pSourceFc.Fields.FieldCount; j++)  
  23.             {  
  24.                 pField = pSourceFc.Fields.get_Field(j);  
  25.                 iIndex = tempFeature.Fields.FindField(pField.Name);  
  26.                 if (pField.Editable && iIndex != -1)  
  27.                 {  
  28.                     tempFeature.set_Value(iIndex, pFeature.get_Value(j));  
  29.                 }  
  30.             }  
  31.             tempFeature.Store();  
  32.         }  
  33.         catch (System.Exception ex)  
  34.         {  
  35.             MessageBox.Show(ex.Message);  
  36.             return;  
  37.         }  
  38.         pFeature = pFeaCursor.NextFeature();  
  39.     }  
  40. }  

上面根据源要素类的每一个字段的每一个值依次遍历并且插入SDE的目的要素类(表)中。

6.在图层中搜索要素

[csharp]  view plain copy
  1. /// <summary>  
  2. /// 在图层中搜索要素  
  3. /// </summary>  
  4. /// <param name="pFeatLyr">需要搜索的图层</param>  
  5. /// <param name="pGeo">搜索的集合条件</param>  
  6. /// <returns>包含结果集的游标对象</returns>  
  7. public static IFeatureCursor SearchFeatures(IFeatureLayer pFeatLyr, IGeometry pGeo)  
  8. {  
  9.     try  
  10.     {  
  11.         ISpatialFilter spatialFilter = new SpatialFilterClass();  
  12.         spatialFilter.Geometry = pGeo;  
  13.         spatialFilter.GeometryField = pFeatLyr.FeatureClass.ShapeFieldName;  
  14.         spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;  
  15.         IFeatureCursor featureCursor = pFeatLyr.FeatureClass.Search(spatialFilter, false);  
  16.         return pFeatLyr.FeatureClass.Search(spatialFilter, false);  
  17.     }  
  18.     catch (Exception ex)  
  19.     {  
  20.         MessageBox.Show(ex.Message);  
  21.         return null;   
  22.     }  
  23. }  

7.从选择集中创建要素集

[csharp]  view plain copy
  1. /// <summary>  
  2.  /// 从选择集中创建要素集  
  3.  /// </summary>  
  4.  /// <param name="pFeatureLayer">来源图层</param>  
  5.  /// <param name="pGeometry">选择范围</param>  
  6.  /// <returns>FeatureClass</returns>  
  7.  public static IFeatureClass CreateSelectionLayer(IFeatureLayer pFL, IGeometry pGeometry)  
  8.  {  
  9.      try  
  10.      {  
  11.          IFeatureLayerDefinition pFLD = pFL as IFeatureLayerDefinition;  
  12.   
  13.          ISpatialFilter pSF = new SpatialFilterClass();  
  14.          pSF.Geometry = pGeometry;  
  15.          pSF.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;  
  16.   
  17.          IQueryFilter pQFilter = pSF;  
  18.          IFeatureSelection pFeatureSel = pFL as IFeatureSelection;  
  19.   
  20.          pFeatureSel.SelectFeatures(pSF, esriSelectionResultEnum.esriSelectionResultNew, false);  
  21.          IFeatureLayer pSelFL = pFLD.CreateSelectionLayer("Selected Layer"truenullnull);  
  22.   
  23.          return pSelFL.FeatureClass;  
  24.      }  
  25.      catch (Exception e)  
  26.      {  
  27.          throw (new Exception(e.Message));  
  28.      }  
  29.  }  

8.得到一个要素类和数据集的空间参考系

[csharp]  view plain copy
  1. /// <summary>  
  2.  /// 得到一个要素类的空间参考系  
  3.  /// </summary>  
  4.  /// <param name="pFeatureClass">要素类</param>  
  5.  /// <returns>空间参考系</returns>  
  6.  public static ISpatialReference getSpatialReference(IFeatureClass pFeatureClass)  
  7.  {  
  8.      IGeoDataset pGeoDataset = pFeatureClass as IGeoDataset;  
  9.      return pGeoDataset.SpatialReference;  
  10.   
  11.  }  
  12.   
  13.  /// <summary>  
  14.  /// 得到一个数据集的空间参考系  
  15.  /// </summary>  
  16.  /// <param name="pFeatureDataset">数据集</param>  
  17.  /// <returns>空间参考系</returns>  
  18.  public static ISpatialReference getSpatialReference(IFeatureDataset pFeatureDataset)  
  19.  {  
  20.      IGeoDataset pGeoDataset = pFeatureDataset as IGeoDataset;  
  21.      return pGeoDataset.SpatialReference;  
  22.  }  

9.改变要素类的空间参考

[csharp]  view plain copy
  1. /// <summary>  
  2. /// 改变要素类的空间参考  
  3. /// </summary>  
  4. /// <param name="pFeatureClass">要素类</param>  
  5. /// <param name="pGeoType">空间参考类型</param>  
  6. public static void ChangeFeatureClassRef(IFeatureClass pFeatureClass, int gcsType)  
  7. {  
  8.     IGeoDataset pGeoDataset = pFeatureClass as IGeoDataset;  
  9.     //QI 到IGeoDatasetSchemaEdit  
  10.     IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as  
  11.     IGeoDatasetSchemaEdit;  
  12.     if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true)  
  13.     {  
  14.         //创建SpatialReferenceEnvironmentClass对象  
  15.         ISpatialReferenceFactory2 pSpaRefFactory = new SpatialReferenceEnvironmentClass();  
  16.         //创建地理坐标系对象  
  17.         IGeographicCoordinateSystem pNewGeoSys = pSpaRefFactory.CreateGeographicCoordinateSystem(gcsType);  
  18.         pGeoDatasetSchemaEdit.AlterSpatialReference(pNewGeoSys);  
  19.     }  
  20. }  

10.根据各种信息创建要素类

[csharp]  view plain copy
  1. /// <summary>  
  2. /// 创建一个要素类  
  3. /// </summary>  
  4. /// <param name="workspace">创建要素类的工作空间</param>  
  5. /// <param name="featureDataset">数据集</param>  
  6. /// <param name="featureClassName">要素类名称</param>  
  7. /// <param name="fields">字段集合</param>  
  8. /// <param name="CLSID"></param>  
  9. /// <param name="CLSEXT"></param>  
  10. /// <param name="strConfigKeyword"></param>  
  11. /// <returns></returns>  
  12. public static IFeatureClass CreateFeatureClass(IWorkspace2 workspace,  
  13.     IFeatureDataset featureDataset, String featureClassName, IFields fields,  
  14.     UID CLSID, UID CLSEXT, String strConfigKeyword)  
  15. {  
  16.     // name was not passed in   
  17.     if (featureClassName == "")  
  18.     {  
  19.         return null;  
  20.     }  
  21.   
  22.     IFeatureClass featureClass;  
  23.     IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;  
  24.   
  25.     //feature class with that name already exists   
  26.     if (workspace.get_NameExists(esriDatasetType.esriDTFeatureClass, featureClassName))   
  27.     {  
  28.         featureClass = featureWorkspace.OpenFeatureClass(featureClassName);  
  29.         return featureClass;  
  30.     }  
  31.   
  32.     // assign the class id value if not assigned  
  33.     if (CLSID == null)  
  34.     {  
  35.         CLSID = new UIDClass();  
  36.         CLSID.Value = "esriGeoDatabase.Feature";  
  37.     }  
  38.   
  39.     IObjectClassDescription objectClassDescription = new FeatureClassDescriptionClass();  
  40.   
  41.     // if a fields collection is not passed in then supply our own  
  42.     if (fields == null)  
  43.     {  
  44.         return null;  
  45.     }  
  46.   
  47.     System.String strShapeField = "";  
  48.   
  49.     // locate the shape field  
  50.     for (int j = 0; j < fields.FieldCount; j++)  
  51.     {  
  52.         if (fields.get_Field(j).Type == esriFieldType.esriFieldTypeGeometry)  
  53.         {  
  54.             strShapeField = fields.get_Field(j).Name;  
  55.             break;  
  56.         }  
  57.     }  
  58.   
  59.     // Use IFieldChecker to create a validated fields collection.  
  60.     IFieldChecker fieldChecker = new FieldCheckerClass();  
  61.     IEnumFieldError enumFieldError = null;  
  62.     IFields validatedFields = null;  
  63.     fieldChecker.ValidateWorkspace = (IWorkspace)workspace;  
  64.     fieldChecker.Validate(fields, out enumFieldError, out validatedFields);  
  65.   
  66.     // The enumFieldError enumerator can be inspected at this point to determine   
  67.     // which fields were modified during validation.  
  68.   
  69.     // finally create and return the feature class  
  70.     if (featureDataset == null)// if no feature dataset passed in, create at the workspace level  
  71.     {  
  72.         featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, CLSID,  
  73.             CLSEXT, esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);  
  74.     }  
  75.     else  
  76.     {  
  77.         featureClass = featureDataset.CreateFeatureClass(featureClassName, validatedFields, CLSID,  
  78.             CLSEXT, esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);  
  79.     }  
  80.     return featureClass;  
  81. }  

11.导入一个要素类到目标工作空间中

[csharp]  view plain copy
  1. /// <summary>  
  2. /// 导入一个要素类到目标工作空间中  
  3. /// </summary>  
  4. /// <param name="pFW">目标工作空间</param>  
  5. /// <param name="pFD">目标工作空间中的数据集</param>  
  6. /// <param name="strFCName">导入的目标工作空间的要素类名称</param>  
  7. /// <param name="pFC">被导入的要素类</param>  
  8. public static void ImportFeatureClassToSDE(IFeatureWorkspace pFW, IFeatureDataset pFD,  
  9.     string strFCName, IFeatureClass pSourceFC)  
  10. {  
  11.     if (pSourceFC == null)  
  12.     {  
  13.         MessageBox.Show("被导入的要素类为空了!");  
  14.         return;  
  15.     }  
  16.     IWorkspace2 pW2 = pFW as IWorkspace2;  
  17.     IFeatureClass pTargetFC = null;  
  18.     pTargetFC = CreateFeatureClass(pW2, pFD, strFCName, pSourceFC.Fields, null,  
  19.         null"");  
  20.   
  21.     if (pTargetFC != null)  
  22.     {  
  23.         mdb2fc(pSourceFC, pTargetFC);  
  24.     }  
  25.     else  
  26.     {  
  27.         MessageBox.Show("打开或创建目标要素类失败!");  
  28.     }  
  29. }  

12.编辑空间参照和设置IFeatureDataset空间参照

[csharp]  view plain copy
  1. /// <summary>  
  2. /// 编辑空间参照  
  3. /// </summary>  
  4. /// <param name="inputSpr"></param>  
  5. /// <returns></returns>  
  6. public static ISpatialReference EditSpatialReferenceDlg(ISpatialReference inputSpr)  
  7. {  
  8.     ESRI.ArcGIS.CatalogUI.ISpatialReferenceDialog2 spatialReferenceDialog2 = new ESRI.ArcGIS.CatalogUI.SpatialReferenceDialogClass();  
  9.     ISpatialReference spf = spatialReferenceDialog2.DoModalEdit(inputSpr, falsefalsefalsefalsefalsefalsefalse, 0);  
  10.     return spf;  
  11. }  
  12.   
  13. /// <summary>  
  14. /// 设置IFeatureDataset空间参照  
  15. /// </summary>  
  16. /// <param name="ds"></param>  
  17. /// <returns></returns>  
  18. public static void SetFdsSpatialReference(IFeatureClass ds)  
  19. {  
  20.     IGeoDataset gds = ds as IGeoDataset;  
  21.     // Cast the geodataset to the IGeoDatasetSchemaEdit interface and set the Spatial Reference.      
  22.     IGeoDatasetSchemaEdit geoDatasetSchemaEdit = (IGeoDatasetSchemaEdit)gds;  
  23.     if (geoDatasetSchemaEdit.CanAlterSpatialReference)  
  24.     {  
  25.         geoDatasetSchemaEdit.AlterSpatialReference(EditSpatialReferenceDlg(gds.SpatialReference));  
  26.     }  
  27. }  

        这里实现所有的函数都是在类MapOperation中,要看懂上面的所有代码必须要有一些ArcObejct编程的基础知识,当然还包括我前一篇博文介绍的有关于ArcGIS的相关知识,为了给大家提供一些ArcObject的编程知识,特别是用C#讲解的,我上传一本电子书,这本书我觉得很不错,讲到了很多关于ArcGIS二次开发的各个方面。电子书的下载地址:

http://download.csdn.net/detail/wanweiaiaqiang/3824454;或在下载页搜索:ArcGIS Engine+C#实例开发教程。

     凌晨1:50,睡觉了。昨天晚上我们整个项目组在公司加班到晚上10点以后哦!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值