7.2.1 使用JGeometry类(1)
Java中操作几何体的主要工具就是JGeometry类。它使你可以对数据库中的几何体进行读写,同时也可以对几何体进行检查,创建新的几何体和对这些几何体进行一系列的转换。
1. 几何体的读写
当你用SQL的SELECT语句读取对象类型(如SDO_GEOMETRY类型)时,JDBC返回一个Java结构-- 更精确地说,是oracle.sql.STRUCT对象。在写一个对象的时候(用INSERT或UPDATE语句),你仍需要通过oracle.sql.STRUCT对象来传递。对STRUCT的解码和构造都是相当复杂的,而Oracle Spatial Java API(JGeometry类)的主要目标就是使得这种操作变得简单。
JGeometry类提供了两种把STRUCT转换成JGeometry对象的方法:
load()方法用于读入STRUCT,返回JGeometry对象。当你对由SELECT语句返回的几何体进行转换的时候,用该方法。
store()方法与load()方法相反。它把JGeometry对象转换成可以通过INSERT或UPDATE语句写回数据库中的STRUCT对象。
图7-3展示了转换的过程。
(点击查看大图)图7-3 在Java中对几何体的读写 |
图7-4 用优化的"序列化"工具在Java中对几何体进行读写 |
- STRUCT dbObject = (STRUCT) rs.getObject(1);
- JGeometry geom = JGeometry.load(dbObject);
要使用优化的反序列化工具(unpickler),首先使用结果集的getBytes( )方法提取几何体到一个字节数组中。然后再次使用JGeometry的静态方法load()把它转换成JGeometry对象。
- byte[] image = rs. getBytes (1);
- JGeometry geom = JGeometry.load(image);
2. 检查几何体
你现在可以用多个get()方法从几何对象中提取信息。表7-2中总结了主要的方法。在表7-3中附加的is()方法对几何体的特性进行了细化。
表7-2 JGeometry中主要的get()方法
方 法 | 返 回 信 息 |
getType() | 几何体类型 (1表示点,2表示线,依次类推) |
getDimensions() | 维度 |
getSRID() | 空间参考系ID |
getNumPoints() | 几何体中的点数 |
getPoint() | 点对象的坐标(如果几何体是点) |
getFirstPoint() | 几何体中的第一点 |
getLastPoint() | 几何体中的最后一点 |
getMBR() | 几何体的MBR |
getElemInfo() | SDO_ELEM_INFO数组的内容 |
getOrdinatesArray() | SDO_ORDINATES数组的内容 |
getLabelPoint() | 返回SDO_POINT结构的坐标。当用来填充线 或多边形几何体时,这通常被用来当标记点 |
getJavaPoint() | 对一个单点对象来说,以java.awt. geom.Point2D对象的形式返回点坐标 |
getJavaPoints() | 对多点对象来说,返回一个java.awt. geom.Point2D 对象数组 |
getElements() | 得到一个JGeometry对象数组,每个对 象都表示几何体的一个元素 |
getElementAt() | 以JGeometry格式提取几何体的一个元素 |
createShape() | 把几何体转换成java.awt.Shape对象, 为绘制和使用java.awt包中的工具做准备 |
表7-3 主要的JGeometry is()方法
方 法 | 返 回 信 息 |
isPoint() | 是不是点 |
isOrientedPoint() | 是不是有向点 |
isCircle() | 是不是圆 |
isGeodeticMBR() | 是不是大地测量学的MBR |
isMultiPoint() | 是不是多点 |
isRectangle() | 是不是矩形 |
hasCircularArcs() | 几何体中是否包含弧 |
isLRSGeometry() | 是不是一个线性参照的几何体 |