由AO查询条件问题谈ArcSDE
我们在使用AO的时候,可能都频繁接触过过滤器对象IQueryFilter,无论是空间过滤器还是普通过滤器,都有个属性WhereClause,而这里就是我们传递SQL语句的地方。 在笔者的书中,我讨论了查询数值和字符串的两种类型字段的方法,至少还有如下的问题:1.这些S...
- 作者:boatboy1983来源:https://hi.baidu.com/gezhou/|2007年01月28日
我们在使用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类型字段来保存数据的。