cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5917
  • QQ14265545
  • 铜币29669枚
  • 威望217点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
阅读:933回复:0

在ArcEngine中创建内存图层

楼主#
更多 发布于:2008-06-04 09:23

<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>
喜欢0 评分0
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
游客

返回顶部