|
阅读:933回复:0
在ArcEngine中创建内存图层<P><FONT face=Verdana>arcEngine9.2中新增了一个新的特征,允许创建内存工作空间。当你需要一个这样的图层时,这个图层的属性数据或者几何数据需要频繁的更新,而又不希望因此而带来效率上的问题,你就可以考虑使用内存图层。<BR> 内存图层的创建分为五步:<BR> 1、设置属性字段<BR> 2、设置空间参考和几何字段<BR> 3、创建内存工作空间<BR> 4、在内存工作空间中创建特征类<BR> 5、创建特征图层,并将上一步创建的特征类设置为这个特征的图层的特征类</FONT></P> <P><FONT face=Verdana>请看以下完整的示例代码</FONT></P> <P><FONT face=Verdana> /// <summary><BR> /// 在内存中创建图层<BR> /// </summary><BR> /// <param name="DataSetName">数据集名称</param><BR> /// <param name="AliaseName">别名</param><BR> /// <param name="SpatialRef">空间参考</param><BR> /// <param name="GeometryType">几何类型</param><BR> /// <param name="PropertyFields">属性字段集合</param><BR> /// <returns>IfeatureLayer</returns><BR> public static IFeatureLayer CreateFeatureLayerInmemeory(string DataSetName, string AliaseName, ISpatialReference SpatialRef, esriGeometryType GeometryType, IFields PropertyFields)<BR> {<BR> IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass();<BR> ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0);<BR> ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName;<BR> ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open();</FONT></P> <P><FONT face=Verdana> IField oField = new FieldClass();<BR> IFields oFields = new FieldsClass();<BR> IFieldsEdit oFieldsEdit = null;<BR> IFieldEdit oFieldEdit = null;<BR> IFeatureClass oFeatureClass = null;<BR> IFeatureLayer oFeatureLayer = null;</FONT></P> <P><FONT face=Verdana> try<BR> {<BR> oFieldsEdit = oFields as IFieldsEdit;<BR> oFieldEdit = oField as IFieldEdit;</FONT></P> <P><FONT face=Verdana> for (int i = 0; i < PropertyFields.FieldCount; i++)<BR> {<BR> oFieldsEdit.AddField(PropertyFields.get_Field(i));<BR> }</FONT></P> <P><FONT face=Verdana> IGeometryDef geometryDef = new GeometryDefClass();<BR> IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;<BR> geometryDefEdit.AvgNumPoints_2 = 5;<BR> geometryDefEdit.GeometryType_2 = GeometryType;<BR> geometryDefEdit.GridCount_2 = 1;<BR> geometryDefEdit.HasM_2 = false;<BR> geometryDefEdit.HasZ_2 = false;<BR> geometryDefEdit.SpatialReference_2 = SpatialRef;</FONT></P> <P><FONT face=Verdana> oFieldEdit.Name_2 = "SHAPE";<BR> oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;<BR> oFieldEdit.GeometryDef_2 = geometryDef;<BR> oFieldEdit.IsNullable_2 = true;<BR> oFieldEdit.Required_2 = true;<BR> oFieldsEdit.AddField(oField);</FONT></P> <P><FONT face=Verdana> oFeatureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");<BR> (oFeatureClass as IDataset).BrowseName = DataSetName;</FONT></P> <P><FONT face=Verdana> oFeatureLayer = new FeatureLayerClass();<BR> oFeatureLayer.Name = AliaseName;<BR> oFeatureLayer.FeatureClass = oFeatureClass;<BR> }<BR> catch<BR> {<BR> }<BR> finally<BR> {<BR> try<BR> {<BR> System.Runtime.InteropServices.Marshal.ReleaseComObject(oField);<BR> System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields);<BR> System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit);<BR> System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldEdit);<BR> System.Runtime.InteropServices.Marshal.ReleaseComObject(name);<BR> System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceFactory);<BR> System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceName);<BR> System.Runtime.InteropServices.Marshal.ReleaseComObject(inmemWor);<BR> System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);<BR> }<BR> catch { }</FONT></P> <P><FONT face=Verdana> GC.Collect();<BR> }<BR> return oFeatureLayer;<BR> }</FONT></P> <P><FONT face=Verdana> 返回来的这个特征图层就是我们所需要的结果,操作这个内存图层方式和操作物理图层方式完全一样。</FONT></P> |
|
|