首页 理论教育 使用JGeometry类实现空间数据库操作

使用JGeometry类实现空间数据库操作

时间:2023-08-29 理论教育 版权反馈
【摘要】:Java中操作几何体的主要工具就是JGeometry类。可以提取独立的元素作为单独的JGeometry对象。表7-3JGeometry转换器表7-4静态JGeometry创建方法7.2.3.4 修改几何体JGeometry类中没有提供任何用于修改几何体的方法。它们以JGeometry对象作为输入而以生成的新几何体作为输出。equals()函数用来比较两个JGeometry对象,判断它们是否相同。

使用JGeometry类实现空间数据库操作

Java中操作几何体的主要工具就是JGeometry类。它可以对数据库中的几何体进行读写,同时也可以对几何体进行检查,创建新的几何体和对这些几何体进行一系列的转换。

7.2.3.1 几何体的读写

当用SQL的SELECT语句读取对象类型(如SDO_GEOMETRY类型)时,JDBC返回一个java.sql.Struct对象(需要说明的是,在Oracle 11g之前返回的是Oracle.sql.STRUCT对象,现在返回该对象的load和store函数已经被建议不再使用)。在写一个对象的时候(用INSERT或UPDATE语句),仍需要通过java.sql.Struct对象来传递。对java.sql.Struct的解码和构造都是相当复杂的,而Oracle Spatial Java API(JGeometry类)的主要目标就是使得这种操作变得简单。

JGeometry类提供了两种把java.sql.Struct转换成JGeometry对象的方法:

staticJGeometry load(byte[]image);

staticJGeometry loadJS(java.sql.Struct st);

它们分别是从字节数组和java.sql.Struct转换成JGeometry。与load系列方法相反,JGeometry提供的store系列方法则是将JGeometry转成字符数组或java.sql.Struct,方法如下:

static byte[]store(JGeometry geom);

static java.sql.StructstoreJS(java.sql.Connection conn,JGeometry geom);

在Oracle Database 12c中,load()和store()方法得到了强化,可以提供为几何体对象而优化序列化及反序列化方法。

对于读取一个几何体,首先要把这个对象以字节数组的形式读入,然后把这个数组传递给load()方法。下面的例子展示了如何使用load方法:

上面这个例子,首先用结果集的getBytes()方法,把各行的几何体对象提取为字节数组,然后使用JGeometry的静态方法load()把它转换成JGeometry对象。除了上面的这种方式,也可以采用java.sql.Struct类型,例如:

Struct dbObject=(Struct)rs.getObject(1);

JGeometry geom=JGeometry.loadJS(dbObject);

如果要更新数据库中一个几何体对象,则需要使用JGeometry的store方法,下面的程序展示了数据库中几何体更新:

该程序首先调用JGeometry.storeJS(connection,g)将集合对象转成java.sql.Struct,然后将该结构体对象设置到PreparedStatement中,最后执行更新操作。

7.2.3.2 检查几何体

Oracle Spatial的JGeometry对象提供了很多get()方法,可以用这些get()方法从几何对象中提取需要的信息。表7-1中总结了主要的方法。在表7-2中附加的is()方法对几何体的特性进行了细化。(www.xing528.com)

表7-1中的两个方法getElements()和getElementAt()可以对复杂几何体的结构进行检查。可以提取独立的元素作为单独的JGeometry对象。第一个方法返回所有元素到独立的JGeometry对象数组中。第二个方法返回一个指定元素,通过它在几何体中的位置来标识。注意:元素的编号方式是从1开始的,而不是0。

表7-1 JGeometry主要的get()方法

表7-2 JGeometry主要的is()方法

7.2.3.3 创建几何体

向数据库中写入几何体(用INSERT或UPDATE语句)要求先创建一个新的JGeometry对象,并用JGeometry.storeJS()方法把它转换成Struct,然后把Struct传递给INSERT或UPDATE语句。同load()方法一样,也可以使用速度更快的空间序列化工具。下面是这个方法的例子。首先用JGeometry的静态方法storeJS()把它转换为Struct,然后用setObject()方法把它插入到准备好的SQL语句中:

有两种方法可以构造新的JGeometry对象:一种方法是使用表7-3中的构造函数,另一种方法是用静态的方法来创建不同的几何体。表7-4列出了这些方法。

表7-3 JGeometry转换器

表7-4 静态JGeometry创建方法

7.2.3.4 修改几何体

JGeometry类中没有提供任何用于修改几何体的方法。例如,没有方法从一个线上删除或添加一点。为了执行那些更新,需要用某个方法,如getOrdinatesArray()来提取点序列,然后更新由此产生的Java数组,最后用其结果来创建一个新的JGeometry对象。

像先前讨论的那样把修改后的几何体写入到数据库中:用storeJS()方法把JGeometry对象转换为Struct,然后把Struct传给SQL中的INSERT或UPDATE语句。

7.2.3.5 处理几何体

Oracle Spatial的Java API也提供了大量的用于对几何体执行各种处理的方法。表7-5中列出了主要的方法。它们以JGeometry对象作为输入而以生成的新几何体作为输出。注意,这些函数大部分都由数据库提供,并通过PL/SQL来进行调用。

表7-5 几何体处理函数

表7-6总结了Oracle Spatial的Java AP提供的一些辅助方法。这些函数都不涉及JGeometry对象(除了equals),用来辅助处理一定的任务。equals()函数用来比较两个JGeometry对象,判断它们是否相同。然而,这种比较是基于几何体内的内部编码的,也就是,如果两个几何体的所有点坐标都相同且顺序相同,那么就认为这两个几何体相同。该方法不真正进行涉及容差的几何体的比较。

表7-6 几何体辅助函数

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈