zoukankan      html  css  js  c++  java
  • 在ArcEngine中创建内存图层[转]

    在ArcEngine中创建内存图层[转]

    2008-04-29 10:43       

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

    请看以下完整的示例代码

            /// <summary>
            /// 在内存中创建图层
            /// </summary>
            /// <param name="DataSetName">数据集名称</param>
            /// <param name="AliaseName">别名</param>
            /// <param name="SpatialRef">空间参考</param>
            /// <param name="GeometryType">几何类型</param>
            /// <param name="PropertyFields">属性字段集合</param>
            /// <returns>IfeatureLayer</returns>
            public static IFeatureLayer CreateFeatureLayerInmemeory(string DataSetName, string AliaseName, ISpatialReference SpatialRef, esriGeometryType GeometryType, IFields PropertyFields)
            {
                IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass();
                ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0);
                ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName;
                ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open();

                IField oField = new FieldClass();
                IFields oFields = new FieldsClass();
                IFieldsEdit oFieldsEdit = null;
                IFieldEdit oFieldEdit = null;
                IFeatureClass oFeatureClass = null;
                IFeatureLayer oFeatureLayer = null;

                try
                {
                    oFieldsEdit = oFields as IFieldsEdit;
                    oFieldEdit = oField as IFieldEdit;

                    for (int i = 0; i < PropertyFields.FieldCount; i++)
                    {
                        oFieldsEdit.AddField(PropertyFields.get_Field(i));
                    }

                    IGeometryDef geometryDef = new GeometryDefClass();
                    IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
                    geometryDefEdit.AvgNumPoints_2 = 5;
                    geometryDefEdit.GeometryType_2 = GeometryType;
                    geometryDefEdit.GridCount_2 = 1;
                    geometryDefEdit.HasM_2 = false;
                    geometryDefEdit.HasZ_2 = false;
                    geometryDefEdit.SpatialReference_2 = SpatialRef;

                    oFieldEdit.Name_2 = "SHAPE";
                    oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                    oFieldEdit.GeometryDef_2 = geometryDef;
                    oFieldEdit.IsNullable_2 = true;
                    oFieldEdit.Required_2 = true;
                    oFieldsEdit.AddField(oField);

                    oFeatureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
                    (oFeatureClass as IDataset).BrowseName = DataSetName;

                    oFeatureLayer = new FeatureLayerClass();
                    oFeatureLayer.Name = AliaseName;
                    oFeatureLayer.FeatureClass = oFeatureClass;
                }
                catch
                {
                }
                finally
                {
                    try
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oField);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldEdit);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(name);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceFactory);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceName);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(inmemWor);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);
                    }
                    catch { }

                    GC.Collect();
                }
                return oFeatureLayer;
            }

          返回来的这个特征图层就是我们所需要的结果,操作这个内存图层方式和操作物理图层方式完全一样。接下要做的事情就不必我说了吧。
     

     


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bmoon/archive/2009/02/24/3933412.aspx

  • 相关阅读:
    算法学习——贪心篇
    Centos7下搭建LAMP环境,安装wordpress(不会生产博客,只是一名博客搬运工)(菜鸟)
    小白创建网站的曲折之路
    7.2.5 多层嵌套的if语句
    7.2.4 else与if配对
    7.2.3
    7.4 electirc.c -- 计算电费
    oracle数据库命令行查看存储过程
    Linux下如何查看进程准确启动时间
    7.2 if else 语句
  • 原文地址:https://www.cnblogs.com/yuxuetaoxp/p/1788893.html
Copyright © 2011-2022 走看看