您的位置:首页 > 其它

AE要素选择(点选和拉框选择…

2016-01-25 15:26 281 查看
原文地址:AE要素选择(点选和拉框选择)作者:小马哥淡定转自:/article/5555297.html选择一个要素或者一个要素集(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 点选法获取要素废话少说先看代码:
View
Code
private
double
ConvertPixelsToMapUnits(IActiveView pActiveView,double
pixelUnits){//
Uses the ratio of the size of the map in pixels to map units to do
the conversionIPoint 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=pFeatureLayeras
IFeatureSelection;pFSelection.SelectFeatures(pSpatialFilter,esriSelectionResultEnum.esriSelectionResultNew,false);ISelectionSet pSelectionset=pFSelection.SelectionSet;ICursor pCursor;pSelectionset.Search(null,true,outpCursor);IFeatureCursor pFeatCursor=pCursoras
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);另外还有一种比较简单的点选方法:
View
Code
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 拉框选择
View
Code
IMap pMap
=
axMapControl1.Map;IActiveView pActiveView
=
pMap
as
IActiveView;IEnvelope pEnv
=
axMapControl1.TrackRectangle();pMap.SelectByShape(pEnv,
null,false);pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,null,null);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: