Arcengine 实现要素选取的方法(转载)

选择一个要素或者一个要素集(FeatureSelection)的方法很多,如IMap::SelectByShape、ILayer::search、IFeatureSection::SelectFeature等方法

主要用到的方法:

IMap接口的SelectFeature(Layer, Feature) (方法,从一个Layer中选择一个Feature);

IMap接口SelectByShape(Shape, env, justOne) (方法,从Layer中依靠一个图形的范围shape和一个选择的环境env来选择要素,而在所有图层中只从IFeatureLayer的图层中进行选择)

IFeatureSelection接口SelectFeatures (Filter, Method, justOne ) (方法,根据指定的标准过滤器filter和方法,选择要素,第一个参数为QueryFilter类型的变量,第二个参数为esriSelectionResultEnum类型的变量,第三个参数为布尔型变量,通常为false)

IFeatureLayer接口Search (IqueryFilter, book ) (方法,创建一个游标去查询相应设置的过滤器的查询)

1 点选法获取要素

   废话少说先看代码:

        private double ConvertPixelsToMapUnits(IActiveView pActiveView, double pixelUnits)
        {
            // Uses the ratio of the size of the map in pixels to map units to do the conversion
            IPoint p1 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperLeft;
            IPoint p2 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperRight;
            int x1, x2, y1, y2;
            pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out x1, out y1);
            pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p2, out x2, out y2);
            double pixelExtent = x2 - x1;
            double realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;
            double sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;
            return pixelUnits * sizeOfOnePixel;
        }
             IMap pMap = axMapControl1.Map;
                IActiveView pActiveView = pMap as IActiveView;
                IFeatureLayer pFeatureLayer = pMap.get_Layer(0) as IFeatureLayer;
                IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

                //设置点击点的位置
                IPoint point = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
                ITopologicalOperator pTOpo = point as ITopologicalOperator;
                double length;
                length = ConvertPixelsToMapUnits(pActiveView, 4);
                IGeometry pBuffer = pTOpo.Buffer(length);
                IGeometry pGeomentry = pBuffer.Envelope;
                //空间滤过器
                ISpatialFilter pSpatialFilter = new SpatialFilterClass();
                pSpatialFilter.Geometry = pGeomentry;
                //根据被选择要素的不同,设置不同的空间滤过关系
                switch (pFeatureClass.ShapeType)
                {
                    case esriGeometryType.esriGeometryPoint:
                        pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;
                        break;
                    case esriGeometryType.esriGeometryPolyline:
                        pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelCrosses;
                        break;
                    case esriGeometryType.esriGeometryPolygon :
                        pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;
                        break;

                }
                IFeatureSelection pFSelection=pFeatureLayer as IFeatureSelection;
                pFSelection.SelectFeatures(pSpatialFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
                ISelectionSet pSelectionset=pFSelection.SelectionSet;
                ICursor pCursor;
                pSelectionset.Search(null,true,out pCursor);
                IFeatureCursor pFeatCursor=pCursor as IFeatureCursor;
                IFeature pFeature=pFeatCursor.NextFeature();
                 while(pFeature!=null)
                 {
                     pMap.SelectFeature(pFeatureLayer,pFeature);
                     pFeature=pFeatCursor.NextFeature();
                 }
           pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphicSelection,null,null);
//另外的改写:
             pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
                IQueryFilter pFilter = pSpatialFilter;
                IFeatureCursor pFeatCursor = pFeatureLayer.Search(pFilter,false);
                IFeature pFeature=pFeatCursor.NextFeature();
                 while(pFeature!=null)
                 {
                     pMap.SelectFeature(pFeatureLayer,pFeature);
                     pFeature=pFeatCursor.NextFeature();
                 }
           pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphicSelection,null,null);


另外还有一种比较简单的点选方法:

                IGeometry g = null;
                IEnvelope pEnv;
                IActiveView pActiveView = axMapControl1.ActiveView;
                IMap pMap = axMapControl1.Map;
                pEnv = axMapControl1.TrackRectangle();
                if (pEnv.IsEmpty == true)
                {
                    ESRI.ArcGIS.Display.tagRECT r;
                    r.bottom = e.y + 5;
                    r.top = e.y - 5;
                    r.left = e.x - 5;
                    r.right = e.x + 5;
                    pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnv, ref r, 4);
                    pEnv.SpatialReference = pActiveView.FocusMap.SpatialReference;
                }
                g = pEnv as IGeometry;
                axMapControl1.Map.SelectByShape(g, null, false);
                axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);


2 拉框选择


IMap pMap = axMapControl1.Map;
                IActiveView pActiveView = pMap as IActiveView;
                IEnvelope pEnv = axMapControl1.TrackRectangle();
pMap.SelectByShape(pEnv, null, false);
                pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,null, null);



  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要素添加是 ArcEngine 中的一个重要功能,可以通过以下步骤实现要素添加实例: 1. 创建一个要素类对象,并指定要素类的名称、几何类型和空间参考系统。 ```csharp IFeatureClass featureClass = new FeatureClass(); featureClass.ShapeType = esriGeometryType.esriGeometryPoint; featureClass.SpatialReference = spatialReference; ``` 2. 创建一个字段集合对象,并添加要素类所需的字段。 ```csharp IFields fields = new Fields(); IFieldsEdit fieldsEdit = (IFieldsEdit)fields; // 添加一个名称为“ID”的整型字段 IField idField = new Field(); IFieldEdit idFieldEdit = (IFieldEdit)idField; idFieldEdit.Name_2 = "ID"; idFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger; fieldsEdit.AddField(idField); // 添加一个名称为“Name”的字符串字段 IField nameField = new Field(); IFieldEdit nameFieldEdit = (IFieldEdit)nameField; nameFieldEdit.Name_2 = "Name"; nameFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; nameFieldEdit.Length_2 = 50; fieldsEdit.AddField(nameField); ``` 3. 创建一个要素缓存对象,并指定要素类和字段集合。 ```csharp IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer(); featureBuffer.Shape = point; // 设置要素属性值 featureBuffer.set_Value(featureBuffer.Fields.FindField("ID"), 1); featureBuffer.set_Value(featureBuffer.Fields.FindField("Name"), "Feature 1"); ``` 4. 创建一个要素游标对象,并使用要素缓存添加要素。 ```csharp IFeatureCursor featureCursor = featureClass.Insert(true); featureCursor.InsertFeature(featureBuffer); ``` 5. 释放资源。 ```csharp Marshal.ReleaseComObject(featureCursor); Marshal.ReleaseComObject(featureBuffer); Marshal.ReleaseComObject(fieldsEdit); Marshal.ReleaseComObject(featureClass); ``` 这些步骤可以在 ArcEngine 的开发环境中实现要素添加实例。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值