Arcengine 实现要素选取的方法(转载)
来源:互联网 发布:决裂电影知乎 编辑:程序博客网 时间:2024/05/22 14:11
选择一个要素或者一个要素集(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);
- Arcengine 实现要素选取的方法(转载)
- Arcengine 实现要素选取的方法(转载)
- Arcengine 实现要素选取的方法
- Arcengine 实现要素选取的方法
- ArcEngine多要素合并的方法
- arcengine创建要素类、图层的方法
- arcengine 要素类的复制
- ArcEngine中shp中先加入要素然后删除一部分要素后,放大图形后不显示的问题解决方法
- ArcEngine 求线要素之间的交点
- Arcengine编辑要素属性
- ArcEngine创建要素
- ArcEngine要素闪烁
- ArcEngine 面要素类转点
- 用ArcEngine的工具条添加图层要素
- ArcEngine中使用IMap.FeatureSelection获取被选中的要素
- ArcEngine根据选择的要素判断其所属图层
- ArcEngine实现图层地物合并的简单方法
- 计算arcengine 线要素和面要素相交,每个面所截的线段长度
- 细数Objective-C中的回调机制
- sizeof运行时刻
- 顺序表实现
- CDMA & GSM Cellular Technology
- SSD是否也有分层存储
- Arcengine 实现要素选取的方法(转载)
- 基于SAAJ的Web服务----(四)使用原始的XML源和DOM创建web服务客户端
- cxf生成webservice客户端
- [Spring3.x源码]事务(二)事务的执行
- Q_INVOKABLE与invokeMethod用法全解
- Printk的loglevel和日志记录分析
- MySQL几个基本使用
- Makefile常见错误
- 孙多洋的《资本开战》