`
yuanlanxiaup
  • 浏览: 859995 次
文章分类
社区版块
存档分类
最新评论

空间数据查询——根据几何条件查询对象

 
阅读更多

二、根据几何条件查询对象

根据几何条件查询对象同样主要是通过FeatureLayer对象IFeatureClass对象Search()方法来实现,在Search()方法的第一个参数为IQueryFilter接口,可以将其改为ISpatialFilter接口,通过ISpatialFilter接口来指定空间查询的几何范围,首先来看一下ISpatialFilter接口的一些常用属性和方法:

图片

它本身就继承IQueryFilter接口,所以具有IQueryFilter接口的一些属性和方法,在ISpatialFilter接口的这些属性和方法中只需要注重两个属性:GeometrySpatialRelGeometry属性用于指定查询的范围,如果是点击查询则为一个IPoint对象,如果为面范围查询则为一个IPolygon对象。SpatialRel属性用于指定查询数据与查询范围的空间关系,如相交、覆盖、接触等关系,都是通过设置SpatialRel属性来完成。

首先添加如下图所示控件(pointRadioButtonpolygonRadioButton、根据几何条件查询对象):

图片

由于点击或面范围查询,都需要绘制图形(点或面),这些都要在AxMapControl控件中完成,如点击查询可以在AxMapControl控件的OnMouseDown事件中完成,而绘制面则要在AxMapControl控件的OnMouseDown事件中绘制面,在OnDoubleClick()事件中完成绘制同时执行查询。当然这些都不是绝对的,如果已有几何图形范围则不需要去绘制几何图形了。

1、点击查询

1)全部变量定义

首先需要在全局中定义变量DoQueryIndex来表示当前要执行的查询模式:点击查询还是面范围查询。如果值为1表示点击查询,如果值为2表示面范围查询,默认其值为0,不执行任何操作。该变量定义如下:

private int DoQueryIndex = 0;

2)设置查询模式

如果选择点击模式则设置变量DoQueryIndex值为1,如果选择面范围模式则设置变量DoQueryIndex值为2,如果不查询则设置DoQueryIndex值为0根据几何条件查询对象按钮的Click()事件代码如下:

private void 根据几何条件查询对象_Click(object sender, EventArgs e)

{

if (根据几何条件查询对象.Text == "根据几何条件查询对象")

{

if (pointRadioButton.Checked)

{

DoQueryIndex = 1;

}

else if (polygonRadioButton.Checked)

{

DoQueryIndex = 2;

}

根据几何条件查询对象.Text = "停止几何条件查询对象";

}

else

{

根据几何条件查询对象.Text = "根据几何条件查询对象";

DoQueryIndex = 0;

}

}

3)点击查询

点击范围可以通过AxMapControlOnMouseDown()事件来执行,在AxMapControl中按下鼠标即可获得点击位置,通过查询该位置的数据对象即可,如下代码:

private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)

{

if (DoQueryIndex == 1)//点击查询

{

ESRI.ArcGIS.Carto.IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(layerComboBox.SelectedIndex) as ESRI.ArcGIS.Carto.IFeatureLayer;

ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass();

point.PutCoords(e.mapX, e.mapY);

ESRI.ArcGIS.Geodatabase.ISpatialFilter spatialFilter = new ESRI.ArcGIS.Geodatabase.SpatialFilterClass();

spatialFilter.Geometry = point;

spatialFilter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;

ESRI.ArcGIS.Geodatabase.IFeatureCursor featureCursor = pFeatureLayer.Search(spatialFilter, false);

ESRI.ArcGIS.Geodatabase.IFeature pFeature;

while ((pFeature = featureCursor.NextFeature()) != null)

{

axMapControl1.FlashShape(pFeature.Shape);

}

}

}

其中,如果为点击模式(即DoQueryIndex = 1)则执行点击查询的代码。首先仍然是点击查询的图层对象或FeatureClass,在此使用IFeatureLayer,然后定义一个IPoint对象,通过PutCoords方法设置其值为地图上点击的位置。然后定义一个ISpatialFilter对象用于设置空间查询的条件,设置其查询的几何范围为前面定义的IPoint对象,同时设置几何对象的几何关系,最后通过IFeatureLayerSearch()方法来执行查询,查询返回结果为一个IFeatureCursor游标对象,通过该游标的NextFeature()方法可以获取游标中的每一个IFeature对象,这些IFeature就是要查询的结果。在此只是闪烁显示了这些对象,如果要获取该对象的属性等信息,直接使用IFeatureFields属性即可获得。

运行程序,其结果如下图所示:

图片

2、面范围查询

面范围查询首先还是要绘制面的几何图形,然后通过IFeatureClassIFeatureLayerSearch()方法来执行查询,其方式和点击查询完全相同,只是绘制几何图形的方式不同。如果采用面范围查询方式,在AxMapControl控件的OnMouseDown()事件中记录鼠标点击位置,同时在OnMouseDown()事件中绘制这样一个面区域。

1)全局变量定义

在全局中定义变量pointCollection,其为IPointCollection对象,它用于保存每次在AxMapControl控件的OnMouseDown()事件中点击的鼠标位置,如下:

private ESRI.ArcGIS.Geometry.IPointCollection pointCollection;

2)定义绘制面函数

由于在点击鼠标的同时,还要显示已经绘制的面的范围以便用户更好的选择查询区域,所以需要定义一个绘制面的函数DrawPolygon(),其代码如下:

private void DrawPolygon(ESRI.ArcGIS.Geometry.IPointCollection pPointCollection, ESRI.ArcGIS.Controls.AxMapControl axMapControl)

{

ESRI.ArcGIS.Geometry.IPolygon pPolygon;

pPolygon = (ESRI.ArcGIS.Geometry.IPolygon)pPointCollection;

axMapControl.DrawShape(pPolygon);

}

3)记录面的边界点

由于每次在AxMapControl上点击鼠标表示该为面创建一个边界点,所以在OnMouseDown()事件中要添加该点到变量pointCollection中去,同时绘制已经形成的面。故在axMapControl1OnMouseDown()事件中继续添加如下代码:

else if(DoQueryIndex == 2)//面范围查询

{

ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass();

point.PutCoords(e.mapX, e.mapY);

pointCollection.AddPoints(1, ref point);

if (pointCollection.PointCount > 2)

{

DrawPolygon(pointCollection, axMapControl1);

}

}

4)查询范围内对象

设计当鼠标在axMapControl1控件上双击时即完成面范围的绘制,所以执行面范围的查询就在axMapControl1OnDoubleClick()事件中,如下代码所示:

private void axMapControl1_OnDoubleClick(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnDoubleClickEvent e)

{

if(DoQueryIndex == 2)//面范围查询

{

ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass();

point.PutCoords(e.mapX, e.mapY);

pointCollection.AddPoints(1, ref point);

if (pointCollection.PointCount > 2)

{

axMapControl1.Refresh();

ESRI.ArcGIS.Carto.IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(layerComboBox.SelectedIndex) as ESRI.ArcGIS.Carto.IFeatureLayer;

ESRI.ArcGIS.Geometry.IPolygon pPolygon;

pPolygon = (ESRI.ArcGIS.Geometry.IPolygon)pointCollection;

ESRI.ArcGIS.Geodatabase.ISpatialFilter spatialFilter = new ESRI.ArcGIS.Geodatabase.SpatialFilterClass();

spatialFilter.Geometry = pPolygon;

spatialFilter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;

ESRI.ArcGIS.Geodatabase.IFeatureCursor featureCursor = pFeatureLayer.Search(spatialFilter, false);

ESRI.ArcGIS.Geodatabase.IFeature pFeature;

int featureCount = 0;

while ((pFeature = featureCursor.NextFeature()) != null)

{

axMapControl1.FlashShape(pFeature.Shape);

featureCount++;

}

MessageBox.Show("选择范围内共有" + featureCount.ToString() + "个对象!");

}

}

}

调用几何条件查询在根据几何条件查询对象按钮的Click()事件中完成,所以在调用面范围查询时还需要对全局变量pointCollection进行实例化,所以根据几何条件查询对象按钮Click()事件的代码如下:

private void 根据几何条件查询对象_Click(object sender, EventArgs e)

{

if (根据几何条件查询对象.Text == "根据几何条件查询对象")

{

if (pointRadioButton.Checked)//点击查询

{

DoQueryIndex = 1;

}

else if (polygonRadioButton.Checked)//面范围查询

{

DoQueryIndex = 2;

pointCollection = new ESRI.ArcGIS.Geometry.PolygonClass();

}

根据几何条件查询对象.Text = "停止几何条件查询对象";

}

else

{

根据几何条件查询对象.Text = "根据几何条件查询对象";

DoQueryIndex = 0;

}

运行程序,其结果如下图所示:

图片

源码及开发文档下载地址(保存于网络硬盘,请勿直接复制链接下载!):
http://www.brsbox.com/filebox/up ... bbb3/dirids/1501532

分享到:
评论

相关推荐

    5.4空间数据库管理系统.pdf

    的方案——关系表 SDO_GEOMETRY对象类型 每个图层再被分解为若干 几何实体——每一行记录 几何实体又被分解成点、 线、面等基本元素 Oracle中的栅格数据存储 GeoRaster 存储、索引、查询、分析空间GeoRaster栅格数据...

    民航航行情报发布系统随时随刻掌握空中交通管制状况

    航行情报发布系统AIDS采用北京超图地理信息技术有限公司的SuperMap Objects 全组件GIS 软件,利用了SuperMap Objects 文件式空间数据引擎——DGN 引擎对DGN 数据进行无缝集成。DGN 引擎提供了直接访问MicroStation ...

    ArcObjects GIS应用开发——基于C#.NET

    系统详细地阐述了GIS应用开发基础、ArcGIS应用程序框架、使用ArcObjects控件编程、几何对象与空间参考、地图及相关对象、空间数据的可视化表达、空间数据管理、地理处理框架、空间查询与空间分析、空间数据编辑以及...

    ArcObjects GIS 应用开发——基于C#.NET(WYP).pdf

    全书十二章,分别介绍了开发基础、ArcMap用户界面定制、使用AO控件编程、几何形体对象Geometry、地图的组成、空间数据的符号化、地图的输出、空间数据管理、空间分析、空间数据编辑、ArcCatalog对象、Raster数据简介...

    ArcGIS Engine基础开发教程(bbs整理)

    3.ArcGIS Engine基础开发教程(2)——学习几何对象与空间参考 4.地图和地图布局... 44 5.ArcGIS Engine基础开发教程(4)— 图层符号化 6.ArcGIS Engine基础开发教程(5)——学习地图查询 7.ArcGIS Engine基础开发...

    ArcObjects GIS应用开发-基于C#

    几何形体对象——Geometry 4.1 Geometry模型 4.2 Point和MultiPoint对象 4.3 包络线Envelope 4.4 曲线(curve) 4.5 Geometry集合接口 4.6 动态跟踪 4.7 空间参考 5. 地图的组成 5.1 Map对象 5.2 图层对象 5.3 ...

    WebGIS从基础到开发实践代码(基于ArcGIS API for JavaScript)

    第5章空间参考系统与几何对象 5.1空间参考系统 5.1.1空间参考系统类 5.1.2参考系统转换 5.2几何对象 5.2.1几何对象类及其之间的继承关系 5.2.2几何对象的绘制 5.2.3几何对象相关的功能模块 第6章符号与图形 6.1符号 ...

    3D游戏卷2:动画与高级实时渲染技术——2

    6.5.2 实例分析2——使用微分几何 6.5.3 实例分析3——网格重新划分算法MAPS 附录6.1 数学背景 附录6.2 演示 第三部分 动画制作 第7章 角色动画 7.1 简介 7.2 顶点动画与合成 7.3 骨架动画 7.4 低层次动画管理 ...

    3D游戏卷2:动画与高级实时渲染技术——1

    6.5.2 实例分析2——使用微分几何 6.5.3 实例分析3——网格重新划分算法MAPS 附录6.1 数学背景 附录6.2 演示 第三部分 动画制作 第7章 角色动画 7.1 简介 7.2 顶点动画与合成 7.3 骨架动画 7.4 低层次动画管理 ...

    MATLAB 7_0实用指南 (上册)

    次曲面 11.2.3样条曲面 11.2.4用给定数据绘图 t12.5非均匀采样数据的曲面图 11.2.6表面图绘制的数据格式问题 11.3多边形对象模型 11.3.1patch函数 11.3.2用patch函数创建面片 11.4消隐控制...

    Web GIS从基础到开发实践 基于ArcGIS API for JavaScript

    4.4.3跨域访问参数配置 4.5图层控制器 4.5.1图层控制器小部件模板 4.5.2图层控制器小部件类 4.5.3图层控制器小部件的使用 第5章空间参考系统与几何对象 5.1空间参考系统 5.1.1空间参考系统类 5.1.2参考系统转换 5.2...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    观事务的软件化模拟,是变量(数据和数据结构)和相关方法(对数据操作和对象管理的程 序)的软件组合。 在面向对象的程序设计中,你可以用软件对象表示现实世界的对象,而这些软件对象和 现实世界对象是相对应的。...

    体感画板——基于外接摄像头追踪物件(Python-Opencv库).zip

    丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG...

    IOI国家集训队论文集1999-2019

    骆 骥 -《由"汽车问题"浅谈深度搜索的一个方面——搜索对象与策略的重要性》 毛子青 -《动态规划算法的优化技巧》 俞 玮 -《基本动态规划问题的扩展》 张一飞 -《求N!的高精度算法》 ## 2002 戴德承 -《退...

    2009.6.19—30举办3S研讨会暨Google Earth与Google Map等仿真建模与共享及ARCGIS与遥感高级程序员培训班

    2、如何创建,使用,编辑以及管理存储在GEODATABASE数据模型中空间数据和属性数据 主讲人:GIS硕士、南京路川公司专业技术开发工程师 3、以ARCCIS9的功能结构主线,学习利用ARCCIS进行数据输入,数据编辑,地图配标...

    基于opencv的手势识别——手势控制电脑(手势刷抖音和阅读小说等).zip

    丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG...

Global site tag (gtag.js) - Google Analytics