欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap FreeTalk
   您现在位于: 首页技术专栏ArcGIS应用与开发ArcGIS其它 → 正文
由AO查询条件问题谈ArcSDE
07-10-22 10:01:23 作者:半块点心 出处:本站原创
我们在使用AO的时候,可能都频繁接触过过滤器对象IQueryFilter,无论是空间过滤器还是普通过滤器,都有个属性WhereClause,而这里就是我们传递SQL语句的地方。

在笔者的书中,我讨论了查询数值和字符串的两种类型字段的方法,至少还有如下的问题:
1.这些SQL语句与普通的关系数据库的SQL语句有什么区别和联系?
2.如何查询时间?
3.可以使用诸如Order By一类的语法吗?

对于这些问题,我最近一直在看ArcSDE方面的资料,对于开发者而言,ArcSDE拥有三套开发集,即C API、JAVA API和AO的GeoDatabase部分,其中前两个是给非ESRI程序调用的,第三个是给ESRI程序使用的,显然,C API的效率应该是最高的。这点我曾经在一个SDE for CAD Client例子中看到过。

我们在逻辑上可以将一个要素类看作是一张表,当然,ArcSDE是使用一张或多张表来实现一个要素类的,这取决于DBMS的类型、几何字段类型和这个要素类是否将处于一个长事物过程中。ArcSDE不会改变一个已经存在的DBMS,它仅仅是一个中间件产品,它提供了工具和接口,扩展了标准的SQL函数。

当我们将一个空间字段添加到一个表的时候(这个表称为业务表,Business Table),ArcSDE的元数据表metatable会存储这个要素类表的元数据属性,如要素类名、空间范围、所有者、空间字段类型。这个metatable是ArcSDE安装的时候建立的。

ArcSDE存储几何数据采用了有序坐标与真实曲线结合的方式,如点是单个的XY坐标,而线则是由有序坐标和曲线Curve组成,这是因为直线当然可以由有序坐标集来构成,但万一线中出现完全部分,使用真实的曲线对象则更好一点。ArcSDE在考虑Annotation上是非常特殊的,它将Annotation当作是“一个要素的属性”,即ArcSDE还是存储的要素,但这个要素中有个特殊的BLOB字段,用于储存一个Text的对象,这个Text与一个坐标相关联。另外,ArcSDE的Annotation与AO Geodatabase的Annotation是有区别的(有什么区别,我还没注意到)。

不同的DBMS采用不同类型的字段来保存几何信息,如Oracle分别使用Long Raw或BLOB字段,如果装有Oracle的空间模块,则是SDO_Geometry字段,MS的SQL产品都是使用IMAGE类型字段来保存数据的。

ArcSDE由于是使用标准DBMS作为数据的存储引擎,在理论上具有无限的数据存储能力,因此用户不必再将数据进行分割(这也是目前整理基础地形库的一个比较麻烦的问题),而是在一个连续的坐标域内存储所有的要素(9.2由于使用了更长的位数,使得这种存储范围能力真的达到了无限的地步)。
ArcSDE是基于不同类型的DBMS采用的不同空间索引建构方式,我们知道,在数据库中建立索引后,查询速度可以得到有效的提高。一般情况下,我们遇到的ArcSDE的索引都是多层次Index Grid的方法。即对一个要素类建立三级的Grid Index记录,请注意看我们新建一个要素类时Geometry中的属性,会有Grid 1、Grid 2和Grid 3三个参数,其中一般只建立了一个Grid。所谓Grid Index是人为将整个范围的要素类根据Grid的参数划分为N个网格,然后在Schema表(S表)中记录处于这个网格内的要素,如下图:

在数据库中是由一个到多个表来构成一个逻辑上的要素类,因此,我们有必要介绍一下这些DBMS中的辅助表:

Business Table——这个表在逻辑上表现要素类和用户“看到”的内容,用户不必去关注其它构成要素类的表集的存在,我们可以认为所有必要的数据都存储在这个表中,包括几何内容。 
Feature Table——即F表,它存储一个要素类Geometry字段的一些辅助元数据,这些数据可以为将来的图层显示使用。这些表以f开头,如f110,即一个ID为110的要素类的要素元数据表。 
Spatial Index Table——即S表,存储一个B表的Geoemtry的空间Grid Index。注意,如果不使用Grid Index进行空间索引的DBMS,是不存在F表和S表的。 
Delta Table——如果一个要素类参与了多版本,则就会出现Delta表,这种表有两种类型,即a表——add table,用于记录被添加的要素类和d表,用于记录被删除的要素类。 
如果是在ArcSDE中储存栅格数据,则会添加一些元数据表,诸如SDE_RAS_<ID#>、SDE_BND_<ID#>、SDE_AUX_<ID#>和SDE_BLK_<ID#>。

我们许多人在安装ArcSDE后便直接开始使用sde帐号进行数据的存储访问,其实这样的做法非常不好,首先系统维护表GDB_和数据表混杂,其次物理文件也是同一个不利于文件的安全,且在用户控制上也不好。虽然这一切我们在ArcGIS的程序中根本看不出来。我个人的做法是,在建立了sde用户后,使用这个帐号在Oracle中建立一个新的用户,并使用独立的存储文件,我们在使用ArcCatalog时,完全可以使用新建的帐号去访问。这样,在sde用户下全是系统维护表,而在新用户下,纯粹是数据表。
好了,我们再来解剖一下ArcSDE的DBMS是如何组织的吧。按照我前一篇blog介绍的方法,在sde用户中建立gis用户,这样sde方案中全是系统表,而gis方案中则是数据表,这样便于我们来研究整个架构。 
我的SDE库结构如下:两个要素数据集,每个数据集中分别有30个要素类,与数据集同路径的位置有一个Table对象。

打开SDE的方案中的表,然后打开GDB_OBJECTCLASSES,我们将在这个表中看到SDE中所有的要素类和表的记录,一共是61行记录,其记录包括:该对象类的ID(这个狠重要哦)、所有者(均是GIS)、对象类的名称(表名或要素类名),最后一个字段是该对象类属于哪个要素数据集,不过只有60条记录有这个值。

打开GDB_FEATURECLASSES表,我们可以看到60条记录,即60个要素类将被看作是要素类;打开GDB_FEATUREDATASET,我们会看到两条记录,记录了两个要素数据集的名字。

继续往下看,打开GEOMETRY_COLUMNS的表,看看是什么内容。哦,原来是将一个B表和它的F表关联的记录,一个B表的OID如果是121,则它的F表就是“F121”。

再看LAYERS表,这下许多秘密就可以看到了,某个图层的图层ID、数据表名、空间字段名、空间范围都保存在这里,这也是为什么一个要素类载入空间后会有范围显示的原因。

好了,使用sde帐号,我们首先就看这些辅助表,我们应该可以意识到,这里面都是构建架构的辅助表,不存在任何数据。

再使用gis帐号,打开gis方案中的表,随便打开一个B表,看看其中记录的值,和在ArcCatalog中的差不多,但最后有个字段SHAPE的值,怎么是NUMBER型?它不是LONG RAW的吗?不要着急,查查它的OID号,然后打开这个B表的F表,看看结果,注意下这几个字段的值:

·NUMOFPTS   我们讲过,SDE保存数据是使用有序点集合和实体曲线对象完成的,这个字段就告诉我们,这个要素使用了几个点 
·EMINX、EMINY、EMAXX、EMAXY,这些是告诉我们一个要素的Envelope值 
·AREA和LEN,最常见的字段 
·POINTS 这个字段才是几何内容所在,它才是LONG RAW型的 

(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  

    关于我们友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
     
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.
     

                   滇ICP备05006901号