ArcObject中的游標Cursor的理解

2021-08-31 10:41:50 字數 3955 閱讀 6414

cursor給人的第一感覺是,類似於指標的東西,感覺它是在螢幕上顯示何處將開始下乙個輸入活動的符號嗎(就是螢幕上的滑鼠)?在ao 中,cursor代表了乙個對要素類或表通過使用屬性或空間查詢而獲得的記錄子集。這個子集儲存在記憶體中而不是視覺化顯示出來。不要將它與選擇集 (selection set)弄混淆。選擇集物件是在arcmap中用於顯示當前被選擇的要素或行記錄,而cursor缺不是為了顯示的目的而使用的。

例如,乙個查詢cursor可以被用於程式設計產生乙個租金表,這個表包含了所有在100中受過澇災且其財產價值超過了10萬美元的平原。ao提供了從 地理資料集(要素類)和普通資料表中獲取cursor的能力。這些cursor物件允許在乙個單個物件中管理記錄集。本文將介紹這些ao物件,方法和屬 性,它們都用於操作cursor物件。

cursor vs featurecursor

ao使用何種cursor來管理記錄子集取決於資料來源的不同。cursor和featurecursor是非常相似的物件,除了cursor是用於操作 表,而後者用於操作要素類。換而言之,cursor是一種為了特定目的——操作儲存在傳統資料庫表中的記錄子集——而建立的類結構,而 featurecursor的記錄子集則是儲存在shapefile檔案、個人geodatabase或企業級geodatabase中。

cursors型別

在cursor和featurecursor類群中有三種型別的cursor。最常用的是search cursor,它被用於查詢操作以返回乙個滿足查詢條件的記錄子集。search cursor是一種唯讀的cursor,你可以用它遍歷獲取的資訊。

你不能使用這種游標來插入、更新或刪除表中的記錄。insert cursor是專門用於往乙個表中插入一條新記錄,而update cursor則是用於更新或刪除記錄,這兩個cursor返回的記錄可以通過乙個屬性或空間查詢來限定。

為了你進行的操作產生恰當型別的cursor是非常重要的。例如,不要產生乙個search cursor,如果你試圖更新乙個表中的記錄。正如前面提到的,search cursor是一種讓你不能更新資料的唯讀結構。在本文中,我們將揭示每一種cursor的細節。

cursor class

正如前面提到的,cursor類是用於產生乙個與資料庫表進行互動互動的物件。在ao中,cursor類是乙個非例項化物件,它意味著你必須使用另 乙個物件來獲得乙個cursor類的例項。既然如此,在ao中,錶類被用於產生乙個cursor類的例項,錶類包含了三種方法能夠產生乙個cursor類 的例項,而返回的cursor型別取決於程式設計師呼叫的方法。fig1顯示了ao中的table class的omd。itable介面擁有三種方法能夠返回特定型別的cursor。itable介面的search、insert和update方法能 夠用於返回cursor例項。這些方法的名字與返回的cursor型別相對應。

在這些方法其中乙個被呼叫以後,ao返回乙個icursor的例項。fig2顯示了乙個cursor類的omd,search、insert和 update都可以返回乙個icursor的例項。icursor有乙個屬性fields和許多能夠操作記錄子集的方法,但這些方法是否可用取決於你使用 的cursor型別。例如,如果你產生了乙個search cursor,當你呼叫insertrow和updaterow方法聚會返回乙個錯誤。

featurecursor class

featurecursor類與cursor類非常相似,其區別在於前者是操作地理資料集而後者是操作傳統資料庫表。shapefile和 geodatabase的地理資料集在ao中表現為乙個ao 要素類的形式。與cursor類相似,featurecursor類也是乙個通過featureclass物件的方法產生的非例項化物件。與itable 介面類似,ifeatureclass介面也包含了search、insert和update方法用於返回乙個ifeaturecursor例項。

在其中乙個方法被呼叫後,乙個ifeaturecursor的例項將會被返回,ifeaturecursor可以的屬性和方法儘管與icursor的在名字上稍微不同,但其功能卻是差別很大,例如,insertfeature vs insertrow。

使用屬性和空間約束條件

看看featureclass和table的omd圖,查詢search、insert和update方法。注意每乙個方法都可以用於返回乙個 cursor,cursor包含了乙個引數,這個引數是iqueryfilter的例項。注意iqueryfilter引數,iqueryfilter是 乙個可以在記憶體中產生用於限制記錄子集的物件。

例如,如果正在查詢乙個parcel資料庫,你可能需要限制返回的parcels結果,讓它們的值都大於10萬美元。你可以使用 iqueryfilter介面來約束。除此以外,如果你使用乙個featureclass物件,還可以使用ispatialfilter介面來產生 spatialfilter。這樣你可以返回所有在洪水區的parcel(使用空間查詢),且其價值高於10萬美元(使用屬性查詢)。記住空間查詢只能用 於要素類上,如果在乙個資料庫表上使用空間查詢則會返回錯誤,因為沒有地理物件可以用過濾器過慮。讓我們看看queryfilter和 spatialfilter類的細節。

queryfilter

在從乙個資料集產生乙個cursor或featurecursor之前,你能定義乙個queryfilter來設定約束限制返回記錄的條數。 queryfilter是乙個可產生的類(元件類),你可以在vba中使用new關鍵字來產生乙個此類的例項物件。你將能夠使用iqueryfilter 介面來處理queryfilter類來定義乙個屬性約束。whereclause屬性則用於限制這個查詢,下列**就是乙個例子:

dim pqueryfilter as iqueryfilter

set pqueryfilter=new queryfilter

pqueryfilter.whereclause="prop_val>=100000"

spatialfilter

spatialfilter可以用於產生乙個基於空間約束的記錄子集。它能夠使用在featureclass上,但不能用於table。 spatialfilter是乙個元件類,也可以使用new關鍵字來產生乙個類的例項。spatialfilter使用geometry屬性和 spatialrel屬性來設定查詢約束條件。geometry屬性用於設定乙個特定的地理要素,而spatialrel則用於預設其空間關係,如相交、 疊加或相鄰。

由於spatialfilter是一種queryfilter,它也可以訪問其所有的屬性和方法。因此,你能夠使用iqueryfilter的whereclause屬性來繫結空間和屬性限制。下面是乙個聯合使用的例子:

dim pspatialfilter as ispatialfilter

set pspatialfilter = new spatialfilter

set pspatialfilter.geometry = pfloodpolygon

pspatialfilter.spatialrel = esrispatialrelcontains

pspatialfilter.whereclause = 「prop_val > 100000」

set pfcursor = pcustomerlayer.search(pspatialfilter,true)

使用cursor來訪問記錄

現在你已經對產生cursor的一般機制有了很好的了解,讓我們來看看如何使用乙個cursor來訪問返回的記錄。記住,cursor是僅僅存在記憶體中的來自乙個表或要素類的記錄集合。

當乙個cursor第一次產生後,乙個關聯指標也產生了。你使用一次可以使用乙個cursor來訪問一行記錄。這個指標可以幫助你追蹤目前是哪一條 行記錄在被訪問。使用初始化,指標實際上可以指向第一條記錄。為了通過cursor獲得第一條記錄,你必須呼叫nextrow或nextfeature方 法。這兩個方法指向了cursor的下一條記錄。但當它第一次呼叫的時候,實際指向第一條記錄。之後每一次呼叫這些方法都是指向下一條記錄。

通過某些方法你還可以到達游標中可以記錄的末尾位置,如使用newrow或newfeature將返回nothing物件,指示目前已經在 cursor的末尾。在ao中的cursor是乙個單向移動的物件,它不允許你返回之前的位置。一旦你訪問過了一條記錄,你就不能再返回去了。

使用ArcObject的工作流程

工作流程分為三步 1 定義arcobject的程式設計任務 2 定位正確的物件模型 3 導航到物件模型圖 下面將這三步又細分 一 定義arcobject的程式設計任務 1.1以arcobject的形式描述問題 2.2分出子任務 2.3決定在 寫 2.4 尋找相關的例子和推薦的技術 二 定位正確的物件...

CU的最終劃分

相信會有不少人對如何確定cu最終的劃分有所困惑 包括我在內,剛開始接觸時也不知道該怎麼做 我覺得很大的乙個原因就是cu是遞迴劃分的,這就導致在尋找確定最佳分割位置時比較困難。其實,解決問題的辦法說難也不難,關鍵在於思路的轉換,既然對於xcompresscu中是如何儲存劃分模式的覺得難以理解,何不跳出...

Oracle中的游標

cursor found最近一次讀取是否成功 notfound isopen游標開啟時返回true rowcount返回已從游標讀取的記錄數 輸出年齡大於等於18的使用者的id跟name declare v id t.id type v name t.name type cursor c user ...