在ArcEngine中创建内存图层

来源:互联网 发布:websphere mq java 编辑:程序博客网 时间:2024/05/17 02:49

 arcEngine9.2中新增了一个新的特征,允许创建内存工作空间。当你需要一个这样的图层时,这个图层的属性数据或者几何数据需要频繁的更新,而又不希望因此而带来效率上的问题,你就可以考虑使用内存图层。
        内存图层的创建分为五步:
      1、设置属性字段
      2、设置空间参考和几何字段
      3、创建内存工作空间
      4、在内存工作空间中创建特征类
      5、创建特征图层,并将上一步创建的特征类设置为这个特征的图层的特征类
请看以下完整的示例代码

  1.  /// <summary>
  2.         /// 在内存中创建图层
  3.         /// </summary>
  4.         /// <param name="DataSetName">数据集名称</param>
  5.         /// <param name="AliaseName">别名</param>
  6.         /// <param name="SpatialRef">空间参考</param>
  7.         /// <param name="GeometryType">几何类型</param>
  8.         /// <param name="PropertyFields">属性字段集合</param>
  9.         /// <returns>IfeatureLayer</returns>
  10.         public static IFeatureLayer CreateFeatureLayerInmemeory(string DataSetName, string AliaseName, ISpatialReference SpatialRef, esriGeometryType GeometryType, IFields PropertyFields)
  11.         {
  12.             IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass();
  13.             ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("""MyWorkspace"null, 0);
  14.             ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName;
  15.             ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open();
  16.             IField oField = new FieldClass();
  17.             IFields oFields = new FieldsClass();
  18.             IFieldsEdit oFieldsEdit = null;
  19.             IFieldEdit oFieldEdit = null;
  20.             IFeatureClass oFeatureClass = null;
  21.             IFeatureLayer oFeatureLayer = null;
  22.             try
  23.             {
  24.                 oFieldsEdit = oFields as IFieldsEdit;
  25.                 oFieldEdit = oField as IFieldEdit;
  26.                 for (int i = 0; i < PropertyFields.FieldCount; i++)
  27.                 {
  28.                     oFieldsEdit.AddField(PropertyFields.get_Field(i));
  29.                 }
  30.                 IGeometryDef geometryDef = new GeometryDefClass();
  31.                 IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
  32.                 geometryDefEdit.AvgNumPoints_2 = 5;
  33.                 geometryDefEdit.GeometryType_2 = GeometryType;
  34.                 geometryDefEdit.GridCount_2 = 1;
  35.                 geometryDefEdit.HasM_2 = false;
  36.                 geometryDefEdit.HasZ_2 = false;
  37.                 geometryDefEdit.SpatialReference_2 = SpatialRef;
  38.                 oFieldEdit.Name_2 = "SHAPE";
  39.                 oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
  40.                 oFieldEdit.GeometryDef_2 = geometryDef;
  41.                 oFieldEdit.IsNullable_2 = true;
  42.                 oFieldEdit.Required_2 = true;
  43.                 oFieldsEdit.AddField(oField);
  44.                 oFeatureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, nullnull, esriFeatureType.esriFTSimple, "SHAPE""");
  45.                 (oFeatureClass as IDataset).BrowseName = DataSetName;
  46.                 oFeatureLayer = new FeatureLayerClass();
  47.                 oFeatureLayer.Name = AliaseName;
  48.                 oFeatureLayer.FeatureClass = oFeatureClass;
  49.             }
  50.             catch
  51.             {
  52.             }
  53.             finally
  54.             {
  55.                 try
  56.                 {
  57.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(oField);
  58.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields);
  59.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit);
  60.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldEdit);
  61.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(name);
  62.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceFactory);
  63.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceName);
  64.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(inmemWor);
  65.                     System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);
  66.                 }
  67.                 catch { }
  68.                 GC.Collect();
  69.             }
  70.             return oFeatureLayer;
  71.         } 
  72.  返回来的这个特征图层就是我们所需要的结果,操作这个内存图层方式和操作物理图层方式完全一样。接下要做的事情就不必我说了吧。
原创粉丝点击