ArcGIS Engine地图查询精品文档21页Word格式文档下载.docx
《ArcGIS Engine地图查询精品文档21页Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ArcGIS Engine地图查询精品文档21页Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
当我发现有的幼儿不专心听别人发言时,就随时表扬那些静听的幼儿,或是让他重复别人说过的内容,抓住教育时机,要求他们专心听,用心记。
平时我还通过各种趣味活动,培养幼儿边听边记,边听边想,边听边说的能力,如听词对词,听词句说意思,听句子辩正误,听故事讲述故事,听谜语猜谜底,听智力故事,动脑筋,出主意,听儿歌上句,接儿歌下句等,这样幼儿学得生动活泼,轻松愉快,既训练了听的能力,强化了记忆,又发展了思维,为说打下了基础。
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:
VisualStudio2019/2019
2.ArcGISEngineDeveloperkit9.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接口,ArcGISEngine开发所对矢量图层实现查询功能都是实行IFeatureCursor。
5.4QueryFilter对象与SpatialFilter对象
在关系型数据库中,查询条件是通过SQL语句的Where子语句来完成的。
在ArcGISEngine中不能直接使用SQL语句,但ArcGISEngine提供了QueryFilter和SpatialFilter两个过滤器对象来配合完成查询条件的设置,从而查询到想要的数据。
QueryFilter过滤器主要用于对属性数据查询条件的设置,它主要实现IQueryFilter接口从而实现属性查询功能。
CODE:
IQueryFilterpQueryFilter=newQueryFilterClass();
//设置过滤器对象的属性
pQueryFilter.WhereClause="
人口>
10000000"
;
SpatialFilter过滤器主要用于空间范围查询条件的设置,它主要实现ISpatialFilter(继承IQueryFilter接口)接口从而实现空间查询功能。
ISpatialFilterpSpatialFilter=newSpatialFilterClass();
//设置空间过滤器的范围(多边形)
pSpatialFilter.Geometry=pGeometry;
//设置空间过滤器空间关系类型
pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;
空间过滤器空间关系类型主要有以下几种类型如表一所示:
表1
空间过滤器空间关系类型
描述(A是待查询图形,B是过滤条件图形)
esriSpatialRelUndefined
未定义
esriSpatialRelIntersects
A与B图形相交
esriSpatialRelEnvelopeIntersects
A的Envelope和B的Envelope相交
esriSpatialRelIndexIntersects
A与B索引相交
esriSpatialRelTouches
A与B边界相接
esriSpatialRelOverlaps
A与B相叠加
esriSpatialRelCrosses
A与B相交(两条线相交于一点,一条线和一个面相交)
esriSpatialRelWithin
A在B内
esriSpatialRelContains
A包含B
esriSpatialRelRelation
A与B空间关联
5.5SelectionSet要素选择集对象
熟悉ArcGISDesktop使用的开发者一定会知道当在ArcMap中显示查询结果的时,所有的符号查询调教的要素都以蓝色高亮的形式显示在地图控件上,蓝色高亮显示表示高亮选中,这些高亮显示选中的要素对应一个要素选择集对象中。
通过IFeatureSelection的SelectionSet属性可以获取选择集,FeatureLayer对象实现了IFeatureSelection接口。
实现代码如下:
IFeatureLayerpFeatureLayer=this.axMapControl1.get_Layer(0)asIFeatureLayer;
//QI至IFeatureSelection
IFeatureSelectionpFeatureSelection=pFeatureLayerasIFeatureSelection;
//创建过滤器
IQueryFilterpQueryFilter=newQueryFilterClass();
//设置过滤器对象的查询条件
pQueryFilter.WhereClause="
//选择要素
pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
//获取选择集对象
ISelectionSetpSelectinSet=pFeatureSelection.SelectionSet;
//设置选择集的符号
pFeatureSelection.SelectionSymbol=pSymbol;
5.6属性查询实例
5.6.1程序实现目标:
查询人口大于5000000的城市,并把查询结果创建为一个新的图层,如图1-3所示:
代码片段如下:
privatevoidbutton1_Click(objectsender,EventArgse)
{
IFeatureLayerpFeatureLayer=this.axMapControl1.get_Layer(0)asIFeatureLayer;
//QI到FeatureSelection
IFeatureSelectionpFeatureSelection=pFeatureLayerasIFeatureSelection;
//创建过滤器
5000000"
//根据查询条件选择要素
pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
//QI到ISelectionSet
ISelectionSetpSelectionSet=pFeatureSelection.SelectionSet;
if(pSelectionSet.Count>
0)
IFeatureLayerDefinitionpFDefinition=pFeatureLayerasIFeatureLayerDefinition;
//创建新图层
IFeatureLayerpNewFeatureLayer=pFDefinition.CreateSelectionLayer("
newlayerName"
true,null,null);
pNewFeatureLayer.Name="
查询结果城市"
axMapControl1.AddLayer(pNewFeatureLayerasILayer);
}
5.7空间查询实例
5.7.1目标
实现多边形查询功能
5.7.2功能开发
引用的命名空间:
[code]
usingSystem;
usingSystem.Drawing;
usingSystem.Collections;
usingSystemponentModel;
usingSystem.Windows.Forms;
usingSystem.Data;
usingSystem.IO;
usingSystem.Runtime.InteropServices;
usingSystem.Collections.Generic;
usingESRI.ArcGIS.esriSystem;
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Controls;
usingESRI.ArcGIS.ADF;
usingESRI.ArcGIS.SystemUI;
usingESRI.ArcGIS.Display;
usingESRI.ArcGIS.Geodatabase;
usingESRI.ArcGIS.Geometry;
usingESRI.ArcGIS.DataSourcesGDB;
///<
summary>
///
在程序运行时的内存中创建矢量要素层,并加到地图控件最顶端
/summary>
///
<
paramname="
pMapCtrl"
>
地图控件<
/param>
returns>
IFeatureLayer新加的要素层<
/returns>
private
IFeatureLayerAddFeatureLayerByMemoryWS(AxMapControlpMapCtrl,ISpatialReferencepSReference)
{
try
if(pMapCtrl==null)returnnull;
#region
创建新的内存工作空间
IWorkspaceFactorypWSF=newInMemoryWorkspaceFactoryClass();
IWorkspaceNamepWSName=pWSF.Create("
"
"
Temp"
null,0);
INamepName=(IName)pWSName;
IWorkspacepMemoryWS=(IWorkspace)pName.Open();
#endregion
IFieldField=newFieldClass();
IFieldsFields=newFieldsClass();
IFieldsEditFieldsEdit=null;
IFieldEditFieldEdit=null;
IFeatureClassFeatureClass=null;
IFeatureLayerFeatureLayer=null;
FieldsEdit=oFieldsasIFieldsEdit;
oFieldEdit=oFieldasIFieldEdit;
oFieldEdit.Name_2="
OBJECTID"
oFieldEdit.Type_2=esriFieldType.esriFieldTypeOID;
oFieldEdit.IsNullable_2=false;
oFieldEdit.Required_2=false;
oFieldsEdit.AddField(oField);
oField=newFieldClass();
IGeometryDefpGeoDef=newGeometryDefClass();
IGeometryDefEditpGeoDefEdit=(IGeometryDefEdit)pGeoDef;
pGeoDefEdit.AvgNumPoints_2=5;
pGeoDefEdit.GeometryType_2=esriGeometryType.esriGeometryPolygon;
pGeoDefEdit.GridCount_2=1;
pGeoDefEdit.HasM_2=false;
pGeoDefEdit.HasZ_2=false;
pGeoDefEdit.SpatialReference_2=pSReference;
SHAPE"
oFieldEdit.Type_2=esriFieldType.esriFieldTypeGeometry;
oFieldEdit.GeometryDef_2=pGeoDef;
oFieldEdit.IsNullable_2=true;
oFieldEdit.Required_2=true;
Code"
oFieldEdit.Type_2=esriFieldType.esriFieldTypeSmallInteger;
//创建要素类
oFeatureClass=(pMemoryWSasIFeatureWorkspace).CreateFeatureClass("
oFields,null,null,esriFeatureType.esriFTSimple,"
);
oFeatureLayer=newFeatureLayerClass();
oFeatureLayer.Name="
TransTemp"
oFeatureLayer.FeatureClass=oFeatureClass;
//创建唯一值符号化对象
IUniqueValueRendererpURender=newUniqueValueRendererClass();
pURender.FieldCount=1;
pURender.set_Field(0,"
pURender.UseDefaultSymbol=false;
ISimpleFillSymbolpFillSym=newSimpleFillSymbolClass();
pFillSym.Style.=esriSimpleFillStyle.esriSFSSolid;
//半透明颜色
IRgbColorpColor=newRgbColorClass();
pColor.Red=255;
pColor.Green=255;
pFillSym.Color=pColor;
pURender.AddValue("
1"
pFillSymasISymbol);
pFillSym=newSimpleFillSymbolClass();
//唯一值符号化内存图层
(oFeatureLayerasIGeoFeatureLayer).Renderer=pURenderasIFeatureRenderer;
ILayerEffectspLyrEffect=oFeatureLayerasILayerEffects;
//透明度
pLyrEffect.Transparency=80;
catch(ExceptionErr)
MessageBox.Show(Err.Message);
finally
try{
ystem.Runtime.InteropServices.Marshal.ReleaseComObject(oField);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldEdit);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pName);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSF);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSName);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pMemoryWS);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);
catch
GC.Collect();
returnoFeatureLayer;
catch(ExceptionErr)
MessageBox.Show(Err.Message,"
提示"
MessageBoxButtons.OK,MessageBoxIconrmation);
returnnull;
///<
在地图控件上添加透明临时图元///<
pGeo"
Envelope或Polygon几何实体<
bAutoClear"
是否清除原有内容<
public
voidAddTransTempEle(AxMapControlpMapCtrl,IGeometrypG