Arcengine实现要素选取的⽅法(转载)
选择⼀个要素或者⼀个要素集(FeatureSelection)的⽅法很多,如IMap::SelectByShape、ILayer::arch、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类型的变量,第三个参数为布尔型变量,通常为fal)IFeatureLayer接⼝Search (IqueryFilter, book ) (⽅法,创建⼀个游标去查询相应设置的过滤器的查询)
1 点选法获取要素
废话少说先看代码:
羽扇纶巾指的是谁
private double ConvertPixelsToMapUnits(IActiveView pActiveView, double pixelUnits)
{
// Us 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 = _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)
{
ca esriGeometryType.esriGeometryPoint:
pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;
break;
ca esriGeometryType.esriGeometryPolyline:
pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelCross;
break;
ca esriGeometryType.esriGeometryPolygon :
pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntercts;
break;
}
IFeatureSelection pFSelection=pFeatureLayer as IFeatureSelection;
pFSelection.SelectFeatures(pSpatialFilter,esriSelectionResultEnum.esriSelectionResultNew,fal);
ISelectionSet pSelectiont=pFSelection.SelectionSet;
ICursor pCursor;
pSelectiont.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(esriViewDrawPha.esriViewGraphicSelection,null,null);
//另外的改写:
贫困生认定标准pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
IQueryFilter pFilter = pSpatialFilter;
IFeatureCursor pFeatCursor = pFeatureLayer.Search(pFilter,fal);
IFeature pFeature=pFeatCursor.NextFeature();
while(pFeature!=null)
{
pMap.SelectFeature(pFeatureLayer,pFeature);
pFeature=pFeatCursor.NextFeature();
}
pActiveView.PartialRefresh(esriViewDrawPha.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.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, fal);
axMapControl1.Refresh(esriViewDrawPha.esriViewGeoSelection, null, null);
2 拉框选择
IMap pMap = axMapControl1.Map;
IActiveView pActiveView = pMap as IActiveView;
IEnvelope pEnv = axMapControl1.TrackRectangle();
pMap.SelectByShape(pEnv, null, fal);
pActiveView.PartialRefresh(esriViewDrawPha.esriViewGeoSelection,null, null);