使用JGeometry类

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中对几何体的读写
在Oracle Database 11g中,load()和store()方法得到了强化,以提供自己的为几何体对象而优化的序列化(pickling) 及反序列化(unpickling)方法。因此它们应当执行得更好。对于读取一个几何体,首先要把这个对象以字节数组的形式读入,然后把这个数组传递给load()方法。图7-4展示了这个过程。
 
图7-4  用优化的"序列化"工具在Java中对几何体进行读写
下面的这个例子,首先用结果集的getObject()方法,把各行的几何体对象提取为STRUCT类型,然后使用JGeometry的静态方法load()把它转换成JGeometry对象。
 
 
  1. STRUCT dbObject = (STRUCT) rs.getObject(1);  
  2. JGeometry geom = JGeometry.load(dbObject); 

要使用优化的反序列化工具(unpickler),首先使用结果集的getBytes( )方法提取几何体到一个字节数组中。然后再次使用JGeometry的静态方法load()把它转换成JGeometry对象。

 
 
  1. byte[] image = rs. getBytes (1);  
  2. 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()

是不是一个线性参照的几何体

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值