5 地圖查詢
地圖查詢、統計是GIS系統的基本功能模塊,實際上統計功能的前提也是通過查詢獲取結果,以文字或者圖表等報表的形式展現查詢結果數據。
地圖查詢有兩種類型的查詢:
1. 空間查詢:在地圖上設置一定范圍,查詢這一范圍內的要素。
例如:在地圖上畫一范圍,查詢這一區域內所有消防栓,這一范圍的所有消防栓高亮顯示(或其他顯示方式),並展現出所有消防栓的屬性信息
2. 屬性查詢:通過一定的查詢條件,獲取目標要素。
例如:我們需要查詢中國行政區上人口大於5000萬,同時GDP大於1萬億的省份,通過執行查詢,符合條件的省份高亮顯示,並展現出這些省份的屬性信息。
AE 為開發者提供了無需寫代碼即可進行查詢功能的Identify公交,但是這個工具是一個通用的信息查詢工具
開發者需要定制出自己需要的查詢功能模塊。
5.1 目標:
1、熟悉Cursor,FeatureCursor對象,使用IFeatureCursor接口;
2、熟悉QueryFilter,SpatialFilter對象,使用IQueryFilter,ISpatialFilter接口
3、熟悉要素選擇集SelectionSet對象,會使用IfeatureSelection,ISelectionSet接口
4、開發一個屬性查詢小功能Demo,獲取符合查詢條件的Feature,並用IFeatureLayerDefinition接口創建一個新的要素圖層加載到MapControl上
5、開發一個空間多邊形查詢功能的demo,學會創建內存半透明圖層用於顯示選擇范圍。
5.3 Cursor對象
Cursor對象,本質上是一個指向數據的指針,本身不包含數據內容,他是連接到Row對象或要素對象的橋梁;
游標有三種類型:查詢游標、插入游標、更新游標;每種游標通過對應方法獲得,如Search(),Insert(),Update();
更新和插入游標都需要是使用一個過濾器(Filter)對象,因為它們首先必須獲取要進行操作的要素;
Cursor對象支持的接口是ICursor,它定義了操作一個Row幾何或一個Row對象的屬性和方法;
1)使用IFeatureClass的Insert方法,返回一個插入型游標,它通常用於往表中插入一條記錄:
pCursor=IFeatureCLass.Insert();
2)使用Update方法,返回 一個更新型游標,他勇於更新或者刪除一條記錄:
pCursor=IFeatureCLass.Update();
3)使用Search方法對表進行查詢后,可以得到一個查詢型Cursor對象,它指向一個或多個Row對象:
pCursor=IFeatureCLass.Search();
本章主要內容是使用查詢游標
FeatureCursor是Cursor的一個子類,指向一個或多個要素,它實行了IFeatureCursor接口,
AE開發 所針對矢量圖層實現的查詢功能都是實現IFeatureCursor。
5.4 QueryFilter對象 和 SpatialFilter對象
在關系型數據庫中,查詢條件是通過SQL語句的Where子句完成的,
在AE中不能直接使用SQL語句,但AE提供了QueryFilter和SpatialFilter兩個過濾器對象,來配合完成查詢條件的設置,從而查詢到想要的數據。
QueryFilter過濾器 主要用於對屬性數據查詢條件的設置,它主要實現IQueryFilter接口,從而實現屬性查詢功能
1 IQueryFilter pQueryFilter = new QueryFilterClass(); 2 // 設置過濾器對象的屬性 3 pQueryFilter.WhereClasue="人口>1000000";
SpatialFilter過濾器主要用於空間范圍查詢條件的設置,它主要實現ISpatialFilter( 繼承IQueryFilter接口) 接口,從而實現空間查詢功能。
1 ISpatialFilter pSpatialFilter = new SpatialFilterClass(); 2 // 設置空間過濾器的范圍(多邊形) 3 pSpatialFilter.Geomerty=pGeometry; 4 // 設置空間過濾器空間關系類型 5 pSpatialFilter.SpatialRel= esriSpatialRelEnum.esriSpatialRelContains;
空間過濾器的空間關系類型主要有以下幾種:
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.5 SelectionSet要素選擇集對象
在AG中,當在ArcMap中顯示查詢結果是,所有滿足條件的要素 都以藍色高亮的形式顯示在地圖控件上
這些高亮顯示選中的要素對應一個要素選擇集對象中,通過IFeatureSelection的SelectionSet屬性可以獲取選擇集
FeatureLayer對象實現了IFeatureSelection接口.
IFeatureSelction接口演示:

1 public void IFeatureSelectionTest(AxMapControl axMapControl) 2 { 3 IFeatureLayer pFeatureLayer = axMapControl.get_Layer(0) as IFeatureLayer; 4 // QI至IFeatureSelection 5 IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection; 6 // 創建過濾器 7 IQueryFilter pQueryFIlter = new QueryFilterClass(); 8 // 設置過濾器對象的查詢條件 9 pQueryFIlter.WhereClause = "人口>1000000"; 10 // 從選擇集中過濾要素 11 pFeatureSelection.SelectFeatures(pQueryFIlter, esriSelectionResultEnum.esriSelectionResultNew, false); 12 // 獲取選中集對象 13 ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet; 14 // 設置選擇集的符號 15 //pFeatureSelection.SelectionSymbol = pSymbol; 16 }
下一篇,將用兩個實例演示如何對圖層進行查詢操作(屬性查詢、空間查詢)。