ArcGIS Engine地图查询
更新时间:2023-10-30 22:25:01 阅读量: 综合文库 文档下载
- arcgis推荐度:
- 相关推荐
地图查询、统计是一个GIS系统的基本的功能模块,实际上统计功能的前提也是通过查询获取结果以文字或者图表等报表的形式展现查询结果数据。 地图查询有两种类型的查询:
1.空间查询:在地图上设置一定范围,查询这一范围内的要素。例如在地图上画一范围查询这一区域内的所有消防栓,这一范围的所有消防栓高亮显示(或者其他显示方式)并展现出所有的消防栓的属性信息。
2.属性查询:通过一定的查询条件获取目标要素。例如我们需要查询中国行政区上人口大于5000万,同时GDP大于1万亿的省份,通过执行查询,符号条件的省份高亮显示(或者其他显示方式)并展现出这些省份的属性信息。
ArcGIS Engine9.3为开发者提供了无需写代码即可进行查询功能的Identify工具,但是这个工具是一个通用的信息查询新工具。而开发者通常需要自己开发一套符合自己业务需求更加灵活的查询功能模块,甚至一些功能不仅仅是查询信息,很多编辑编辑功能以及和业务相结合的功能开发都用到查询功能。所以很有必要了解ArcGIS Engine的查询机制。
5.1目标
1.熟悉Cursor,FeatureCursor对象,使用IFeatureCursor接口
2.熟悉QueryFilter, SpatialFilter对象使用IQueryFilter,ISpatialFilter接口 3.熟悉要素选择集SelectionSet对象,会使用IFeatureSelection,ISelectionSet接口
4.开发一个属性查询小功能Demo, 获取符号查询条件的Feature,并IFeatureLayerDefinition接口创建一个新的要素图层加载到Mapcontrol上
5.开发一个空间多边形查询功能的小Demo, 学会创建内存半透明图层用于显示选择范围
5.2准备工作
1.IDE:Visual Studio 2005/2008
2.ArcGIS Engine Developer kit 9.3
3.准备一份用于查询的的矢量数据(文章内有说明)
5.3Cursor对象
Cursor(游标)本质上是一个指向数据的指针,本身并不包含数据内容,它是连接到Row对象或要素对象的桥梁。
游标有三种类型,即查询游标、插入游标和更新游标。每一种游标都是通过与之相适应的方法来获得的,如Search、Insert和Update方法。更新和插入游标都需要使用一个过滤器(Filter)对象,因为它们首先必须获得需要进行操作的要素。
Cursor对象支持的接口是ICursor,它定义了操作一个Row集合或一个Row对象的属性和方法,下面是获得插入型、更新型和查询型游标的方法: pCursor = IFeatureClass.Insert()
使用IFeatureClass的Insert方法返回一个插入型游标,它通常用于往表中插入一条记录。 pCursor = IFeatureClass.Update()
使用IFeatureClass的Update方法会返回一个更新型游标,它用于更新或者删除一条记录。 pCursor= IFeatureClass.Search()
使用IFeatureClass的Sarch方法对表进行查询后,可以得到一个查询型Cursor对象,它指向一个或多个Row对象。
以我们这章的内容主要使用查询游标。
FeatureCursor是Cursor的一个子类,指向一个或多个要素,它实现了IFeatureCursor接口,ArcGIS Engine开发所对矢量图层实现查询功能都是实行IFeatureCursor。
5.4QueryFilter对象与SpatialFilter对象
在关系型数据库中,查询条件是通过SQL语句的Where子语句来完成的。在ArcGIS Engine中不能直接使用SQL语句,但ArcGIS Engine提供了QueryFilter和SpatialFilter两个过滤器对象来配合完成查询条件的设置,从而查询到想要的数据。
QueryFilter过滤器主要用于对属性数据查询条件的设置,它主要实现IQueryFilter接口从而实现属性查询功能。
CODE:
IQueryFilter pQueryFilter = new QueryFilterClass();
//设置过滤器对象的属性
pQueryFilter.WhereClause = \人口> 10000000\
SpatialFilter过滤器主要用于空间范围查询条件的设置,它主要实现ISpatialFilter(继承
IQueryFilter接口)接口从而实现空间查询功能。
CODE:
ISpatialFilter pSpatialFilter = new SpatialFilterClass();
//设置空间过滤器的范围(多边形)
pSpatialFilter.Geometry = pGeometry;
//设置空间过滤器空间关系类型
pSpa
tialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
空间过滤器空间关系类型主要有以下几种类型如表一所示:
表1
空间过滤器空间关系类型
esriSpatialRelUndefined esriSpatialRelIntersects
esriSpatialRelEnvelopeIntersects esriSpatialRelIndexIntersects esriSpatialRelTouches esriSpatialRelOverlaps
描述(A是待查询图形,B是过滤条件图形) 未定义
A与B图形相交
A的Envelope和B的Envelope相交 A与B索引相交 A与B边界相接 A与B相叠加
A与B相交(两条线相交于一点,一条线和一个面相
esriSpatialRelCrosses
交)
esriSpatialRelWithin esriSpatialRelContains esriSpatialRelRelation
A在B内 A包含B
A与B空间关联
5.5SelectionSet要素选择集对象
熟悉ArcGIS Desktop使用的开发者一定会知道当在ArcMap中显示查询结果的时,所有的符
号查询调教的要素都以蓝色高亮的形式显示在地图控件上,蓝色高亮显示表示高亮选中,这些高亮显示选中的要素对应一个要素选择集对象中。通过IFeatureSelection的SelectionSet属性可以获取选择集,FeatureLayer对象实现了IFeatureSelection接口。 实现代码如下:
IFeatureLayerpFeatureLayer =this.axMapControl1.get_Layer(0)asIFeatureLayer;
//QI至IFeatureSelection
IFeatureSelectionpFeatureSelection = pFeatureLayerasIFeatureSelection; //创建过滤器
IQueryFilterpQueryFilter =newQueryFilterClass();
//设置过滤器对象的查询条件
pQueryFilter.WhereClause =\人口> 10000000\;
//选择要素
pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultNew,false); //获取选择集对象
ISelectionSetpSelectinSet=pFeatureSelection.SelectionSet;
//设置选择集的符号
pFeatureSelection.SelectionSymbol = pSymbol;
5.6属性查询实例
5.6.1程序实现目标:
查询人口大于5000000的城市,并把查询结果创建为一个新的图层,如图1-3所示:
代码片段如下:
CODE:
private void button1_Click(object sender, EventArgs e)
{
IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer;
//QI到FeatureSelection
IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
//创建过滤器
IQueryFilter pQueryFilter = new QueryFilterClass();
//设置过滤器对象的查询条件
pQueryFilter.WhereClause = \人口> 5000000\
//根据查询条件选择要素
pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
//QI到ISelectionSet
ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
if (pSelectionSet.Count > 0)
{
IFeatureLayerDefinition pFDefinition = pFeatureLayer as IFeatureLayerDefinition;
//创建新图层
IFeatureLayer pNewFeatureLayer = pFDefinition.CreateSelectionLayer(\
pNewFeatureLayer.Name = \查询结果城市\
axMapControl1.AddLayer(pNewFeatureLayer as ILayer);
}
}
5.7空间查询实例
5.7.1目标
实现多边形查询功能
5.7.2功能开发
代码片段如下:
引用的命名空间:
[code]
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.DataSourcesGDB;
///
在程序运行时的内存中创建矢量要素层,并加到地图控件最顶端
/// ///
///
private IFeatureLayer AddFeatureLayerByMemoryWS(AxMapControl pMapCtrl,ISpatialReference pSReference)
{
try
{
if (pMapCtrl == null) return null;
#region
创建新的内存工作空间
IWorkspaceFactory pWSF = new InMemoryWorkspaceFactoryClass();
IWorkspaceName pWSName = pWSF.Create(\
IName pName = (IName)pWSName;
IWorkspace pMemoryWS = (IWorkspace)pName.Open();
#endregion
IField Field = new FieldClass();
IFields Fields = new FieldsClass();
IFieldsEdit FieldsEdit = null;
IFieldEdit FieldEdit = null;
IFeatureClass FeatureClass = null;
IFeatureLayer FeatureLayer = null;
try
{
FieldsEdit = oFields as IFieldsEdit;
oFieldEdit = oField as IFieldEdit;
oFieldEdit.Name_2 = \
oFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
oFieldEdit.IsNullable_2 = false;
oFieldEdit.Required_2 = false;
{
MessageBox.Show(\创建透明临时图层发生异常\提示\
MessageBoxIcon.Information);
return;
}
}
IFeatureClass pFC = pFlyr.FeatureClass;
if (bAutoClear)
{
if (pFC.FeatureCount(null) > 0)
{
IFeatureCursor pFCursor = pFC.Search(null, false);
if (pFCursor != null)
{
IFeature pFeature = pFCursor.NextFeature();
if (pFeature != null)
{
while (pFeature != null)
{
pFeature.Delete();
pFeature = pFCursor.NextFeature();
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFCursor);
}
}
}
//创建要素
IFeature pNFeature = pFC.CreateFeature();
pNFeature.Shape = pPolygon;
pNFeature.set_Value(pFC.FindField(\
pNFeature.Store();
pMapCtrl.Refresh(esriViewDrawPhase.esriViewGeography, pFlyr, pFlyr.AreaOfInterest);
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, \提示\
}
}
CODE:
///
/// 获取查询要素
///
///
///
///
private List
{
try
{
List
//创建SpatialFilter空间过滤器对象
ISpatialFilter pSpatialFilter = new SpatialFilterClass();
IQueryFilter pQueryFilter = pSpatialFilter as ISpatialFilter;
//设置过滤器的Geometry
pSpatialFilter.Geometry = pGeometry;
//设置空间关系类型
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
//获取FeatureCursor游标
IFeatureCursor pFeatureCursor = pFeatureLayer.Search(pQueryFilter, false);
//遍历FeatureCursor
IFeature pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
//获取要素对象
pList.Add(pFeature);
pFeature = pFeatureCursor.NextFeature();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
return pList;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, \提示\
return null;
}
}
CODE:
bool bSearch = false; //定义bool变量用于启动多边形查询功能
private void button1_Click(object sender, EventArgs e)
{
try
{
//向地图控件添加内存图层
IFeatureLayer pFeatureLayer =
this.AddFeatureLayerByMemoryWS(this.axMapControl1,this.axMapControl1.SpatialReference);
this.axMapControl1.AddLayer(pFeatureLayer);
//设置鼠标样式为十字丝
this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;
//启动范围查询功能
bSearch = true;
}
添加一个新的Form在Form上添加一个DataGridView控件用于显示查询结果信息。如图4所示:
CODE:
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
if (bSearch)
{
//设置鼠标样式为十字丝
this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;
//获取画定范围的Geometry
IGeometry pGeometry = this.axMapControl1.TrackPolygon();
//添加半透名临时图形
this.AddTransTempEle(this.axMapControl1, pGeometry, false);
IFeatureLayer pFeatureLayer=this.axMapControl1.get_Layer(1) as IFeatureLayer;
//执行查询获取符号条件的要素
List
attribute pAttribute = new attribute();
//设置信息显示窗体中DataGridView的属性
//设置行数pFList.Count+1包括字段名哪一行即表头
pAttribute.dataGridView1.RowCount = pFList.Count+1;
//设置边界风格
pAttribute.dataGridView1.ColumnHeadersBorderStyle. = DataGridViewHeaderBorderStyle.Sunken;
//设置列数
pAttribute.dataGridView1.ColumnCount = pFList[0].Fields.FieldCount;
//遍历第一个要素的字段用于给列头赋值(字段的名称)
for(int m=0;m { pAttribute.dataGridView1.Columns[m].HeaderText = pFList[0].Fields.get_Field(m).AliasName; } //遍历要素 for (int i = 0; i < pFList.Count; i++) { IFeature pFeature=pFList; for(int j=0;j { //填充字段值 pAttribute.dataGridView1[j, i].Value = pFeature.get_Value(j).ToString(); } } pAttribute.Show(); } } 5.7.3功能演示 1.单击按钮向地图控件上添加一内存图层,并启动多边形查询功能如图5示: 2.点击鼠标左键在地图上画以多边形范围,双击结束,将看到在所画的范围以半透明的形式添加在地图之上,并显示出查询结果的属性信息如图 所示: 5.7.4 Demo总结: 1.使用IWorkspaceFactory,IWorkspaceName,IName,IWorkspace等接口以及InMemoryWorkspaceFactoryClass对象创建在程序运行时的内存中的矢量要素层 2.复习IUniqueValueRenderer等接口以及UniqueValueRendererClass对象唯一值符号化要素图层 3.使用ILayerEffects接口创建半透明效果要素图层 4.使用ISpatialFilter,IQueryFilter 等接口以及SpatialFilterClass对象获取符号条件的FeatureCursor,并学会通过遍历整个FeatureCursor中Feature对象,获取符号查询条件的Feature集合 5.使用IFeatureLayerDefinition根据要素选择集创建新要素图层 5.8附IFeatureClass.Search(IQuery Filter,bool Recycling)参数说明 FeatureClass的Search方法大家经常用到,很多人对Search方法的其中一个参数bool Recycling不是很理解。先做以下解释: 1.pFeatureCursor存储的是所有符合条件的Feature对象的引用, 2.Recycling的意思是回收,参数Recycling为True的时当执行这个方法IFeature pFeature=pFeatureCursor.NextFeature()上一条记录的图形值在内存中所占的地址就会被销毁回收,为False的时候当执行这个方法IFeature pFeature=pFeatureCursor.NextFeature()上一条记录的图形值依然存在在内存中。 1.参数Recycling设置为True IFeatureClass pFeatureClass = (this.axMapControl1.get_Layer(0) as IFeatureLayer).FeatureClass; IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true); //IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false); List while (pFeature != null) { pFeatures.Add(pFeature); pFeature = pFeatureCursor.NextFeature(); } for (int i = 0; i < pFeatures.Count; i++) { MessageBox.Show(((pFeatures.Shape as IPolygon) as IArea).Area.ToString()); } 分析:pFeatures集合存储了指向FeatureClass上所有Feature的引用,但是由于Recycling参数设置为TRUE也就是说每执行一个NextFeautre方法上一条记录的Feature值在内存中被回收,所以到最后遍历pFeatures集合的时候所有的IFeature引用指向的Feature对象都为Null。所以会引发一下错误(如下图7所示): .参数Recycling设置为False IFeatureClass pFeatureClass = (this.axMapControl1.get_Layer(0) as IFeatureLayer).FeatureClass; //IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true); IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false); List pFeatures.Add(pFeature); pFeature = pFeatureCursor.NextFeature(); } for (int i = 0; i < pFeatures.Count; i++) { MessageBox.Show(((pFeatures.Shape as IPolygon) as IArea).Area.ToString()); } 分析:pFeatures集合存储了指向FeatureClass上所有Feature的引用,但是由于Recycling参数设置为False也就是说每执行一个NextFeautre方法上一条记录的Feature值在内存中依然存在,所以到最后遍历pFeatures集合的时候所有的IFeature引用指向的Feature对象都依然存在。所以会执行的很Happy(如下图8所示):
正在阅读:
ArcGIS Engine地图查询10-30
冀教版一年级数学上册期末检测题小学数学试题试卷 - 图文11-17
落料拉深复合模设计说明书12-07
管理沟通最新重点05-31
安全里程碑实施方案06-08
Changeling+《换子疑云》电影中英对照剧本09-17
美丽的植物园作文400字07-06
舆情信息工作资料05-15
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 地图查询
- ArcGIS
- Engine
- 2018-2019学年度第一学期沪教版九年级化学上 - 第一章 - 开启化学之门 - 单元检测试题 -
- 幼儿文学选择题集2
- ISO22000试题
- 警械使用、搜身押解技术教学方案
- 上海长久固定热电磁式万能式断路器DW15 - 图文
- 《商山早行》教学案
- 问题讨论型材料作文怎么写?
- CAM课程考核标准
- 外贸英语函电课后习题参考答案
- 蜀道难 - 行知中学公开课一等奖 - 配套教案
- 噪声干扰信号的Matlab仿真
- 2017届高三南京二模地理卷
- 学生中午外出就餐告家长书
- 王婷 个人简历
- 2016高考物理带电粒子在电场中的运动
- 平行四边形在综合题中的应用(4)
- 齐河县“十二五”土地利用总体规划
- 2018-2019年四年级数学上册11月月考试卷
- 2013年全国大学生数学建模竞赛江西赛区获奖名单 - 图文
- 学习 教师法心得体会