在gis系统中,属性的查询浏览功能是必不可少的,针对各个业务图层的属性查询、空间查询以及空间及属性的联合查询经常用到。
同时为支持不同的数据库系统,空间数据分为多种空间数据结构。比如ST_ Geometry、SDO_ Geometry、Geometry、Geography。其中oracle数据库支持ST及SDO两种空间数据结构,而sqlserver数据库支持Geometry、Geography两种空间数据结构。并且为了支持目前广泛使用的结构化查询语言(SQL),各种空间数据类型提供了各自的查询函数。这就为使用SQL语句来实现地理数据库的业务图层属性的查询浏览奠定了基础。
例如:
ST_Buffer 获取几何对象和距离,然后返回表示围绕源对象的缓冲区的几何对象。相应的语法为
sde.st_buffer (g1 sde.st_geometry, distance double_precision)
返回类型
ST_Geometry
为了能够达到实现跨数据库系统及空间数据类型的查询模块,做了以下设计
上图定义了普通的查询语句的sql语句构建接口,包括常用的圆形、多边形、矩形等常用形状的空间查询,并针对不同的空间数据类型进行了实现。
上图定义了缓冲区空间查询的接口,包括点、线、面等类型的缓冲区空间查询。并提供了针对四种空间数据类型的实现。
上图定义了一个工厂类接口,使用抽象工厂模式、并根据四种空间数据类型进行实现。并在每个实现类中对ICreateGeneralQuerySql、ICreateBufferQuerySql进行实例化。
在以上的查询模块的设计中只是包含了常用的空间查询及缓冲区空间查询,同时也可以包含复杂些的空间条件查询。以上的设计只是提供了空间查询所需要的sql语句。但是当前设计只能提供常用的sql语句,并不能支持所有的查询功能。
同时针对以上的设计可以提供一些优化方法。比如:
1、可以使用简单工厂模式来优化上面的抽象工厂方法
2、在上面的基础上使用配置文件+反射来进行最终的优化,从而是程序达到完全解耦。
ST_Geometry数据类型相关官方资料:
http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#//006z0000003z000000