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);

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。




    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6262859.html ,如需转载请自行联系原作者
相关文章
|
Java PHP C++
使用moviepy生成视频时,提示找不到ImageMagick
使用moviepy生成视频时,提示找不到ImageMagick
735 0
使用moviepy生成视频时,提示找不到ImageMagick
|
消息中间件 存储 Kubernetes
K8S环境快速部署Kafka(K8S外部可访问)
本文通过实战展示了如何在K8S环境部署kafka集群,并且K8S环境外部也能使用此服务
4036 1
K8S环境快速部署Kafka(K8S外部可访问)
|
11月前
|
缓存 关系型数据库 MySQL
高并发架构系列:数据库主从同步的 3 种方案
本文详解高并发场景下数据库主从同步的三种解决方案:数据主从同步、数据库半同步复制、数据库中间件同步和缓存记录写key同步,旨在帮助解决数据一致性问题。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
高并发架构系列:数据库主从同步的 3 种方案
|
监控 Linux 数据库
Linux标准大页设置不合理案例
【8月更文挑战第15天】某企业Linux服务器上部署大型数据库管理系统,为提升性能启用了标准大页(Huge Pages)。但随后出现系统内存使用率不稳定、数据库响应时间延长及频繁内存分配失败等问题。原因是大页数量设置不当、内存分配策略不合适及与其他应用程序冲突。解决方法包括合理计算大页数量、调整内存分配策略和协调不同应用间的关系,确保系统稳定高效运行。
210 5
|
存储 机器学习/深度学习 算法
深入探索数据压缩:哈夫曼编码与其同类技术的原理与C++ 实现
深入探索数据压缩:哈夫曼编码与其同类技术的原理与C++ 实现
457 0
|
XML 数据挖掘 API
数据为王!深度挖掘天猫商品详情接口,赋能电商运营新策略
**天猫商品详情接口摘要** - 开放平台API,获取商品标题、价格、描述、销量等信息。 - 支持多语言,用于生成详情页、数据分析、营销策略、竞品分析和购物决策。 - 注册授权,获取AppKey和AppSecret,参照文档构建请求。 - 发送GET/POST请求,处理JSON或XML响应数据。 - 助力自动化运营、提升效率和竞争力,对商家和消费者都有价值。
|
弹性计算 自然语言处理 Windows
通义灵码 Visual Studio 下载安装指南(附安装包)
本安装步骤适用于 Windows 10 及以上操作系统中安装和使用通义灵码。
2863 3
|
Java 数据库连接 开发者
SpringBoot实用开发篇第一章(yml配置文件操作)
SpringBoot实用开发篇第一章(yml配置文件操作)
|
关系型数据库 API C#
C#调用执行命令行窗口cmd,及需要交互执行的处理
C#执行外部程序用到的是Process进程类,打开一个进程,可以指定进程的启动信息StartInfo(启动的程序名、输入输出是否重定向、是否显示UI界面、一些必要参数等)...
3858 0
C#调用执行命令行窗口cmd,及需要交互执行的处理