首页 > 代码库 > Arcengine 实现要素选取的方法(转载)

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

转自原文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, nullfalse);
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,nullnull);

 

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