zoukankan      html  css  js  c++  java
  • 理解 ArcObjects 中的游标

    写在前面的话:本文是ArcUser 2006 7-9 月一期中的一篇文章:介绍了 Arcobjects 中的 Cursor对象,节选翻译而来

        cursor 和featurecursor 是非常相似的对象: cursor 是用于操作表,而后者用于操作要素类,也可以这样说,cursor 是一种为了特定目的——操作存储在传统数据库表中的记录子集——而建立的类结构,而 featurecursor 的记录子集则是存储在 shapefile 文件、个人 geodatabase 或企业级 geodatabase 中。

    在 Cursor 和 FeatureCursor 类群中有三种类型的 cursor。最常用的是 SearchCursor,它被用于查询操作以返回一个满足查询条件的记录子集。Search Cursor 是一种只读的 cursor,你可以用它遍历获取的信息。你不能使用这种游标来插入、更新或删除表中的记录。Insert Cursor 是专门用于往一个表中插入一条新记录,而 Update Cursor 则是用于更新或删除记录,这两个cursor 返回的记录可以通过一个属性或空间查询来限定。为了你进行的操作产生恰当类型的 cursor 是非常重要的。例如,不要产生一个search cursor,如果你试图更新一个表中的记录。正如前面提到的,search cursor是一种让你不能更新数据的只读结构。

        Cursor Class 正如前面提到的,cursor 类是用于产生一个与数据库表进行交互交互的对象。在 AO 中,cursor 类是一个非实例化对象,它意味着你必须使用另一个对象来获得一个 cursor 类的实例。既然如此,在 AO 中,表类被用于产生一个 cursor 类的实例,表类包含了三种方法能够产生一个 cursor 类的实例,而返回的 cursor 类型取决于程序员调用的方法。ITable 接口拥有三种方法能够返回特定类型的 cursor。ITable 接口的 Search、Insert 和 Update 方法能够用于返回 cursor 实例。这些方法的名字与返回的 cursor 类型相对应。 在这些方法其中一个被调用以后,AO返回一个ICursor的实例。Search、Insert 和 Update 都可以返回一个 ICursor 的实例。ICursor 有一个属性 Fields 和许多能够操作记录子集的方法,但这些方法是否可用取决于你使用的cursor类型。例如,如果你产生了一个search cursor,当你调用InsertRow和UpdateRow方法聚会返回一个错误。

        FeatureCursor ClassFeatureCursor 类与 Cursor 类非常相似,其区别在于前者是操作地理数据集而后者是操作传统数据库表。shapefile 和 geodatabase 的地理数据集在 AO 中表现为一个 AO 要素类的形式。与 cursor 类相似,FeatureCursor 类也是一个通过 FeatureClass 对象的方法产生的非实例化对象。与 ITable 接口类似,IFeatureClass 接口也包含了 Search、Insert 和 Update 方法用于返回一个IFeatureCursor 实例。 在其中一个方法被调用后,一个 IFeatureCursor 的实例将会被返回,IFeatureCursor 可以的属性和方法尽管与 ICursor 的在名字上稍微不同,但其功能却是差别很大,注意每一个方法都可以用于返回一个 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 可以用于产生一个基于空间约束的记录子集。它能够使用在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是一个单向移动的对象,它不允许你返回之前的位置。一旦你访问过了一条记录,你就不能再返回去了。

  • 相关阅读:
    德国闪电战和苏联大纵深,谁更厉害?(一个是为了避免战略上的持久战,一个是为了战役的突破)
    “MEAN”技术栈开发web应用
    MVC 01
    适配器模式
    w3wp占用CPU过高
    安装tensorflow
    MemCache分布式内存对象缓存系统
    MVC 使用IBatis.net
    分布式计算
    Remote Desktop Connection Manager
  • 原文地址:https://www.cnblogs.com/hl3292/p/1850976.html
Copyright © 2011-2022 走看看