ArcGIS Engine开发之旅08--和查询相关的对象和接口
查詢(xún)?cè)贕IS領(lǐng)域應(yīng)該是一個(gè)很頻繁的操作,在GIS中除了具有屬性查詢(xún)(和其他關(guān)系型數(shù)據(jù)庫(kù)的查詢(xún)類(lèi)似),還提供了空間查詢(xún)。在介紹查詢(xún)的時(shí)候,讓我們先了解下面的對(duì)象。
1.Table 對(duì)象
Table 是不含有空間信息的一張二維表,它主要實(shí)現(xiàn)了 ITable 接口。在這張二維表中,每一行稱(chēng)之為 Row(IRow),ITable 接口 定義了對(duì)這張二維表行的插入,更新,查詢(xún),以及刪除等操作。 獨(dú)立表(standalone table):就是一個(gè)單獨(dú)的不含空間信息的表也就是只能在 ArcMap 中 Table of Contents 的 Source 選項(xiàng)卡中看到的。
2.對(duì)象類(lèi)
對(duì)象類(lèi)是在 Table 的基礎(chǔ)上擴(kuò)展起來(lái)的,因此在外觀上來(lái)看,它也是一個(gè)二維表,也是用來(lái)存儲(chǔ)非空間數(shù)據(jù),它與 Table 的區(qū)別在于它的一行是一個(gè) Object(對(duì)象),盡管在形式上也是一條記錄,但它是具有屬性和行為的一個(gè)對(duì)象,而非簡(jiǎn)單的記錄了。
3.FeatureClass 對(duì)象
要素類(lèi)是存儲(chǔ)在工作空間中的一種數(shù)據(jù)組織方式,要素類(lèi)是在對(duì)象類(lèi)的基礎(chǔ)上的進(jìn)一步擴(kuò)展,包含了現(xiàn)實(shí)世界中的空間實(shí)體。要素類(lèi)由要素組成(Feature),要素對(duì)應(yīng)要素類(lèi)中的一行,要素相當(dāng)于空間對(duì)象(Geometry ) +相應(yīng)的屬性信息。IFeatureClass 定義了對(duì)要素的查詢(xún),更新,刪除等操作。關(guān)于 ROW,Table,對(duì)象類(lèi),Feature,要素類(lèi),我們可以從下面的圖上得到啟示:
FeatureClass 對(duì) 象 實(shí) 現(xiàn) 了 IFeatureClass 接 口 , IFeatureClass 對(duì) 查 詢(xún) 定 義 了 兩 個(gè) 方 法IFeatureClass.Search 和 IFeatureClass.Select。 Search 方法需要傳入兩個(gè)參數(shù),一個(gè)是過(guò)濾器;另外一個(gè)是布爾值,用于說(shuō)明放回的要素游標(biāo)是否被回收,一般的,如果僅僅是為了讀取數(shù)據(jù),那么這個(gè)參數(shù)應(yīng)該是 true,如果要對(duì)選擇出來(lái)的要素更新,那么這個(gè)參數(shù)應(yīng)該設(shè)置為 false。那么這兩個(gè)參數(shù)到底有什么意義,我們從下面的代碼中看一下。?
3.1?false 和 true 參數(shù)的差別?
我們定義一個(gè) Search 函數(shù),通過(guò)傳 false 和 true 來(lái)對(duì)這兩個(gè)參數(shù)進(jìn)行說(shuō)明,代碼如下:?
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 參數(shù)是 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 參數(shù)是true"); } pFt1 = pFtCursor.NextFeature(); } } } 當(dāng) recycling 為 true 的時(shí)候,我們會(huì)看到程序執(zhí)行到 MessageBox.Show("Recycling 參數(shù)是 true"),如 下圖:3.2?Search和 Select 方法的比較?
Search 返回游標(biāo),Select 返回選擇集 游標(biāo):必須遍歷游標(biāo)才能得到所有的結(jié)果,不必太關(guān)注內(nèi)存 選擇集: 查詢(xún)后既可得到,但是通常只保留 OID 字段,數(shù)據(jù)量大的時(shí)候要考慮內(nèi)存壓力 。
3.3?Cursor 和 FeatureCursor對(duì)象?
Cursor 中文‘游標(biāo)“,它本質(zhì)上是一個(gè)指向數(shù)據(jù)的指針,自身并不包含數(shù)據(jù)。游標(biāo)有三類(lèi),查詢(xún)游標(biāo),插入游標(biāo)和更新游標(biāo),每一中游標(biāo)都是有其相應(yīng)的方法得到,如查詢(xún)游標(biāo)是由 ITable.Search 方法得到。游標(biāo)是 GIS 中使用頻率很高的,凡是和數(shù)據(jù)的查詢(xún),更新,刪除等都跟他有關(guān)。ICursor 定義了對(duì)游標(biāo)的操作。當(dāng)我們通過(guò) ITable.Search 對(duì)數(shù)據(jù)進(jìn)行查詢(xún),要獲取具體 Row 的信息的時(shí)候,要通過(guò) ICursor.NextRow方法向前遍歷,游標(biāo)是不能后退的。游標(biāo)是和 Table 相對(duì)應(yīng)的。IFeatureCursor 繼承了 ICursor,IFeatureCursor 是和要素類(lèi)相對(duì)應(yīng)。
3.4?QueryFilter 與 SpatialFilter對(duì)象?
在 ArcGIS Engine 中進(jìn)行查詢(xún)或者選擇,都需要傳給一個(gè)查找條件,或者過(guò)濾條件,這個(gè)條件就相當(dāng)于一般的 SQL 語(yǔ)句中的 Where 語(yǔ)句,如 Select * from 用戶(hù) where 性別=’女’;我們知道 GIS 不僅僅有屬性查詢(xún),還有一般關(guān)系型數(shù)據(jù)庫(kù)不具有的空間查詢(xún)。而 QueryFilter 對(duì)象和 SpatialFilter 對(duì)象分別對(duì)應(yīng)了ArcGIS Engine 中的屬性查詢(xún)和空間查詢(xún)。 IQueryFilter 被兩個(gè)類(lèi)實(shí)現(xiàn) QueryFilterClass 和 SpatialFilterClass,前者是針對(duì)屬性查詢(xún)的,后者是針對(duì)空間查詢(xún)的。 在介紹下這些對(duì)象后,我們現(xiàn)在來(lái)做一個(gè)高亮顯示的查詢(xún)操作。
?
3.5 IFeatureSelection接口?
IFeatureSelection 接口負(fù)責(zé)管理一個(gè)圖層中的要素選擇集的方法和屬性。 IFeatureSelection 接口的 Add方法可以把本圖層中的一個(gè)要素添加到圖層的選擇集中;SelectFeatures 方法則利用過(guò)濾器對(duì)象將符合條件的要素放入到圖層的選擇集中。使用IFeatureSelection接口可以實(shí)現(xiàn)要素的高亮顯示。在ArcGIS Engine中有很多類(lèi)實(shí)現(xiàn)了這個(gè)接口,如下圖:?
3.5.1?使用 IFeatureSelection接口高亮顯示?
在介紹 IMap 接口那一節(jié),我們用 IMap 的 IMap.SelectFeature 方法實(shí)現(xiàn)了對(duì)查詢(xún)的要素高亮顯示,現(xiàn)在我們用 IFeatureSelection 接口實(shí)現(xiàn)查詢(xún)高亮顯示?
?
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 函數(shù)是我們寫(xiě)的一個(gè)根據(jù)圖層的名稱(chēng)獲取圖層的方法,代碼如下圖:?
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未來(lái)之路 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/5784686.html
總結(jié)
以上是生活随笔為你收集整理的ArcGIS Engine开发之旅08--和查询相关的对象和接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: memcache两种客户端比较
- 下一篇: Android深度探索(卷1)HAL与驱