编辑: JZS133 | 2014-06-12 |
也明白 了怎样用 SQL*Plus 从SQL 语言中读取空间对象.在本章中,我们涵盖了怎样在 PL/SQL 和Java 程序语言中操作 SDO_GEOMETRY 对象的内容. 注意, 在大多数情况下, 你都不需要为操作 SDO_GEOMETRY 类型而在程序中写出显 式代码.也就是说,你可以在 SQL 语言中直接检验 SDO_GEOMETRY 的内容.例如,可 以如程序清单 7-1 所示,从一个 SDO_GEOMETRY 对象中获取地理坐标. 程序清单 7-1 提取坐标 SQL>
SELECT b.name, b.location.sdo_point.x b_long, b.location.sdo_point.y b_lat FROM branches b WHERE b.id=42 ;
NAME B_LONG B_LAT BANK OF AMERICA -122.4783 37.7803596 这个例子展示了一种简单但很强大的用来从对象中提取信息的技术:点表示法.运用 该技术可以从几何对象中提取任意的标量值:换句话说就是指几何类型(SDO_GTYPE)、空 间参考系 ID(SDO_SRID)和点结构中的 X,Y 和Z坐标(SDO_POINT.X,.Y 和.Z). 这种技术是通用的,它适用于所有的对象类型,而不仅仅是 SDO_GEOMETRY 类型. 这种技术的优点就是产生的结果集中不包含任何对象类型――只是一些简单的类型,因此 这种结果集可以用任意的应用工具进行处理,而不需要操作对象. 警告: 第章7第Ⅱ部分 基础空间220 要想使用该技术, 必须使用一个表别名(如程序清单 7-1 中的 b). 如果没有使用表别名, 你的查询将会出现 ORA-00904:无效标识 的错误. 在大多数的应用方案中,你需要从 SDO_GEOMETRY 中,如程序清单 7-1 所示,提取 信息或者基于空间关系用空间操作和函数来选择数据(将在第
8 章和第
9 章中讨论).程序 清单 7-2 中展示了对指定分店 0.25 英里内的客户选择.对于这样的空间选择,你所需要做 的就是在 SQL 语句的 where 子句中使用被称为 SDO_WITHIN_DISTANCE 的空间操作. 程序清单 7-2 简单的空间查询 SELECT c.name, c.phone_number FROM branches b, customers c WHERE b.id=42 AND SDO_WITHIN_DISTANCE(c.location,b.location,'
distance=0.25 unit=mile'
) = '
TRUE'
;
NAME PHONE_NUMBER GLOWA GARAGE 415-7526677 PUERTOLAS PERFORMANCE 415-7511701 TOPAZ HOTEL SERVICE 415-9744400 CLEMENT STREET GARAGE 415-2218868 ST MONICA ELEMENTARY SCHOOL NULL 在你的应用程序中包含如程序清单 7-1 或程序清单 7-2 所示的 SQL 语句,与包含其他 规则查询并没有什么不同.它们可以包含一些空间谓词(操作符或函数,这些内容将在第
8 章和第
9 章中讨论),但是返回规则的数据类型.它们能够被任何的程序语言接受和处理. 虽然如此,在一些情况下,你仍需要去调用指定的函数.在这些情况下,需要为 SDO_GEOMETRY 对象的读写而开发特定的代码.这通常是 Oracle Spatial 的一种高级用 法,且在实际中起着重要作用. 下面是需要操作 SDO_GEOMETRY 数据的典型案例: 高级位置分析:在一个商业应用中,对于新分店的位置、合适的销售区域或跟踪 一辆送货车的路径,可能需要创建不同的几何体.除了创建几何体以外,可能还 需要知道如何更新已有的几何体.你可能会为此类的创建和操作创建新的函数. 数据转换:也许你需要加载数据,而对于这些数据格式没有标准的转换器.许多 商业工具提供了格式转换功能,但是在许多情况下,一些传统数据库仍以指定的 私有格式存储空间和(或)属性数据.这在向 Oracle Spatial 中导入 CAD/CAM