选择一个要素或者一个要素集(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 ) (方法,创建一个游标去查询相应设置的过滤器的查询)
选择一个要素或者一个要素集(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);