理解ArcObjects中的游标(1)
本文是ArcUser 2006 7-9月一期中的一篇文章,介绍了Arcobjects中的Cursor对象,我将它翻译出来,作为练笔,同时也是给大家介绍一下洋人是如何认识Cursor的。文章内容浅显,易于理解。
理解ArcObjects中的游标
——学习如何使用cursor操作要素类和表中的记录
作者:Eric Pimpler, President, GeoSpatial Training & Consulting, LLC
当你听到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的细节。
Related Items
Comments
你好,我又用下面的方法试了一下,这次情况刚好相反,删除点后,点还在,但是关闭再重新运行删除的点就没有了。这到底是什么地方出了问题?请赐教,不胜感激!
Dim pEnvelope As IEnvelope
Dim pFsel As IFeatureSelection
Dim pSF As ISpatialFilter
Dim pFCursor As IFeatureCursor
Dim pFeature As IFeature
'定位到特定的图层上
Set pFeatureLayer = Findlayer("bayarealocations")
pEnvelope = MapControl1.trackRectangle
Set pSF = New SpatialFilter
With pSF
Set .Geometry = pEnvelope
.GeometryField = pFeatureLayer.FeatureClass.OIDFieldName
.SpatialRel = esriSpatialRelIntersects
End With
MapControl1.activeview.partialRefresh esriviewgeoselection, Nothing, Nothing
pFsel.SelectFeatures pSF, esriSelectionResultNew, False
MapControl1.activeview.partialRefresh esriviewgeoselection, Nothing, Nothing
pFsel.SelectionSet.Search Nothing, False, pFCursor
Set pFeature = pFCursor.nextfeature
Do Until pFeature Is Nothing
pFeature.Delete
Set pFeature = pFCursor.nextfeature
Loop
Mapcontrol1.ActiveView.Refresh
Leave a comment
Or, take a look at Archives and Categories
我建立了一个personal database,在其中建立了一个featuredataset,在里面有许多featureclass,其中有一个点要素类,我想用鼠标选中其中的点(一个或多个),然后删除掉。我将你书中的一段代码进行了改编,但是当我选中其中的点后并删除了,当在此运行程序时却发现这些点还再。这该怎么办?
Dim pMap As IMap
Dim pActiveView As IActiveView
Set pMap = MapControl1.Map
Set pActiveView = pMap
'得到一个Envelope对象
Dim pEnv As IEnvelope
Set pEnv = MapControl1.TrackRectangle
'新建选择集环境对象
Dim pSelectionEnv As ISelectionEnvironment
Set pSelectionEnv = New SelectionEnvironment
'改变选择集的默认颜色
Dim myColor As IColor
Set myColor = New RgbColor
myColor.RGB = RGB(110, 120, 210)
Set pSelectionEnv.DefaultColor = myColor
pMap.SelectByShape pEnv, pSelectionEnv, False
pActiveView.PartialRefresh esriViewGeoSelection, Nothing, Nothing
Dim pEnumFeat As IEnumFeature
Dim pFeat As IFeature
'得到选择级并删除要素
Set pEnumFeat = pMap.FeatureSelection
Set pFeat = pEnumFeat.Next
Do While (Not pFeat Is Nothing)
pFeat.Delete
Set pFeat = pEnumFeat.Next
Loop
pMap.ClearSelection
pActiveView.Refresh