ArcEngine中创建内存图层、空间、属性查询

  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;

        }

      返回来的这个特征图层就是我们所需要的结果,操作这个内存图层方式和操作物理图层方式完全一样。

 

//空间、属性查询

属性查询是在当前map的layer中获取符合条件的feature的集合,实现过程是获取featurelayer的featureclass。然后定义过滤条件。在featureclass中执行search函数。获取查询结果。主要代码:

           ILayer layer = axMapControl1.get_Layer(0); 
           IFeatureLayer featureLayer = layer as IFeatureLayer; 
           //获取featureLayer的featureClass 
           IFeatureClass featureClass =  featureLayer.FeatureClass; 
           IFeature feature = null;

           IQueryFilter queryFilter = new QueryFilterClass();

           IFeatureCursor featureCusor; 
           queryFilter.WhereClause = “name = ‘” + searchName + “‘”; 
           featureCusor = featureClass.Search(queryFilter, true);

           //search的参数第一个为过滤条件,第二个为是否重复执行。

           feature = featureCusor.NextFeature();

            if (feature != null) 
            { 
                axMapControl1.Map.SelectFeature(axMapControl1.get_Layer(0), feature); 
                axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null); 
            }

空间查询实现起来比较简单,使用arcgis封装好的函数即可,主要是获取选取的geometry对象:

            axMapControl1.MousePointer = ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerCrosshair; 
            IGeometry geometry = null; 
            switch (actionFlag) 
            { 
                case flag.POINTSELECT://点选 
                    ESRI.ArcGIS.Geometry.Point pt = new ESRI.ArcGIS.Geometry.Point(); 
                    pt.X = e.mapX; 
                    pt.Y = e.mapY; 
                    geometry = pt as IGeometry; 
                    break; 
                case flag.CIRCLESELECT://圆选 
                    geometry = axMapControl1.TrackCircle(); 
                    break; 
                case flag.RECTSELECT://长方形选取 
                    geometry = axMapControl1.TrackRectangle(); 
                    break; 
                case flag.POLYGONSELECT://多边形选取 
                    geometry = axMapControl1.TrackPolygon(); 
                    break; 
            } 
            axMapControl1.Map.SelectByShape(geometry, null, false); 
            axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);

转载自:https://blog.csdn.net/wzcool273509239/article/details/17447621

You may also like...