ArcGIS Engine开发之旅08--和查询相关的对象和接口
查詢在GIS領域應該是一個很頻繁的操作,在GIS中除了具有屬性查詢(和其他關系型數據庫的查詢類似),還提供了空間查詢。在介紹查詢的時候,讓我們先了解下面的對象。
1.Table 對象
Table 是不含有空間信息的一張二維表,它主要實現了 ITable 接口。在這張二維表中,每一行稱之為 Row(IRow),ITable 接口 定義了對這張二維表行的插入,更新,查詢,以及刪除等操作。 獨立表(standalone table):就是一個單獨的不含空間信息的表也就是只能在 ArcMap 中 Table of Contents 的 Source 選項卡中看到的。
2.對象類
對象類是在 Table 的基礎上擴展起來的,因此在外觀上來看,它也是一個二維表,也是用來存儲非空間數據,它與 Table 的區別在于它的一行是一個 Object(對象),盡管在形式上也是一條記錄,但它是具有屬性和行為的一個對象,而非簡單的記錄了。
3.FeatureClass 對象
要素類是存儲在工作空間中的一種數據組織方式,要素類是在對象類的基礎上的進一步擴展,包含了現實世界中的空間實體。要素類由要素組成(Feature),要素對應要素類中的一行,要素相當于空間對象(Geometry ) +相應的屬性信息。IFeatureClass 定義了對要素的查詢,更新,刪除等操作。關于 ROW,Table,對象類,Feature,要素類,我們可以從下面的圖上得到啟示:
FeatureClass 對 象 實 現 了 IFeatureClass 接 口 , IFeatureClass 對 查 詢 定 義 了 兩 個 方 法IFeatureClass.Search 和 IFeatureClass.Select。 Search 方法需要傳入兩個參數,一個是過濾器;另外一個是布爾值,用于說明放回的要素游標是否被回收,一般的,如果僅僅是為了讀取數據,那么這個參數應該是 true,如果要對選擇出來的要素更新,那么這個參數應該設置為 false。那么這兩個參數到底有什么意義,我們從下面的代碼中看一下。?
3.1?false 和 true 參數的差別?
我們定義一個 Search 函數,通過傳 false 和 true 來對這兩個參數進行說明,代碼如下:?
void Search(IFeatureClass _pFeatureClass,bool _Bool) { IFeature pFt1, pFt2; IFeatureCursor pFtCursor; if (_Bool == false) { pFtCursor = _pFeatureClass.Search(null, _Bool); pFt1 = pFtCursor.NextFeature(); while (pFt1 != null) { pFt2 = pFtCursor.NextFeature(); if (pFt1 == pFt2) { MessageBox.Show("Recycling 參數是 false"); } pFt1 = pFtCursor.NextFeature(); } } else { pFtCursor = _pFeatureClass.Search(null, _Bool); pFt1 = pFtCursor.NextFeature(); while (pFt1 != null) { pFt2 = pFtCursor.NextFeature(); if (pFt1 == pFt2) { MessageBox.Show("Recycling 參數是true"); } pFt1 = pFtCursor.NextFeature(); } } } 當 recycling 為 true 的時候,我們會看到程序執行到 MessageBox.Show("Recycling 參數是 true"),如 下圖:3.2?Search和 Select 方法的比較?
Search 返回游標,Select 返回選擇集 游標:必須遍歷游標才能得到所有的結果,不必太關注內存 選擇集: 查詢后既可得到,但是通常只保留 OID 字段,數據量大的時候要考慮內存壓力 。
3.3?Cursor 和 FeatureCursor對象?
Cursor 中文‘游標“,它本質上是一個指向數據的指針,自身并不包含數據。游標有三類,查詢游標,插入游標和更新游標,每一中游標都是有其相應的方法得到,如查詢游標是由 ITable.Search 方法得到。游標是 GIS 中使用頻率很高的,凡是和數據的查詢,更新,刪除等都跟他有關。ICursor 定義了對游標的操作。當我們通過 ITable.Search 對數據進行查詢,要獲取具體 Row 的信息的時候,要通過 ICursor.NextRow方法向前遍歷,游標是不能后退的。游標是和 Table 相對應的。IFeatureCursor 繼承了 ICursor,IFeatureCursor 是和要素類相對應。
3.4?QueryFilter 與 SpatialFilter對象?
在 ArcGIS Engine 中進行查詢或者選擇,都需要傳給一個查找條件,或者過濾條件,這個條件就相當于一般的 SQL 語句中的 Where 語句,如 Select * from 用戶 where 性別=’女’;我們知道 GIS 不僅僅有屬性查詢,還有一般關系型數據庫不具有的空間查詢。而 QueryFilter 對象和 SpatialFilter 對象分別對應了ArcGIS Engine 中的屬性查詢和空間查詢。 IQueryFilter 被兩個類實現 QueryFilterClass 和 SpatialFilterClass,前者是針對屬性查詢的,后者是針對空間查詢的。 在介紹下這些對象后,我們現在來做一個高亮顯示的查詢操作。
?
3.5 IFeatureSelection接口?
IFeatureSelection 接口負責管理一個圖層中的要素選擇集的方法和屬性。 IFeatureSelection 接口的 Add方法可以把本圖層中的一個要素添加到圖層的選擇集中;SelectFeatures 方法則利用過濾器對象將符合條件的要素放入到圖層的選擇集中。使用IFeatureSelection接口可以實現要素的高亮顯示。在ArcGIS Engine中有很多類實現了這個接口,如下圖:?
3.5.1?使用 IFeatureSelection接口高亮顯示?
在介紹 IMap 接口那一節,我們用 IMap 的 IMap.SelectFeature 方法實現了對查詢的要素高亮顯示,現在我們用 IFeatureSelection 接口實現查詢高亮顯示?
?
IMap pMap = axMapControl1.Map; IFeatureLayer pFeaturelayer = GetLayer(pMap, "Roads") as IFeatureLayer; IFeatureSelection pFeatureSelection = pFeaturelayer as IFeatureSelection; IQueryFilter pQuery = new QueryFilterClass(); pQuery.WhereClause = "TYPE=" +"'paved'"; pFeatureSelection.SelectFeatures(pQuery,esriSelectionResultEnum.esriSelectionResultNew,false ); axMapControl1.ActiveView.Refresh();?
其中 GetLayer 函數是我們寫的一個根據圖層的名稱獲取圖層的方法,代碼如下圖:?
private ILayer GetLayer(IMap pMap, string LayerName) { IEnumLayer pEnunLayer; pEnunLayer = pMap.get_Layers(null, false); pEnunLayer.Reset(); ILayer pRetureLayer; pRetureLayer = pEnunLayer.Next(); while (pRetureLayer != null) { if (pRetureLayer.Name == LayerName) { break; } pRetureLayer = pEnunLayer.Next(); } return pRetureLayer; }?
posted on 2016-08-18 17:17 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/lonelyxmas/p/5784686.html
總結
以上是生活随笔為你收集整理的ArcGIS Engine开发之旅08--和查询相关的对象和接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: memcache两种客户端比较
- 下一篇: Android深度探索(卷1)HAL与驱