如何使用JDBC从数据库中检索SDO_GEOMETRY?

时间:2011-08-26 11:48:15

标签: java oracle java-ee jdbc

我是Java新手。我需要从数据库中检索SDO_GEOMETRY并使用jdbc将其转换为字符串。如果有任何人有样品或想法请与我分享。

帮助将不胜感激。

最诚挚的问候,
桑杰。

2 个答案:

答案 0 :(得分:3)

查看JGeometry课程。有一个例子可以调用空间类型:

     /// reading a geometry from database
     ResultSet rs = statement.executeQuery("SELECT geometry FROM states where name='Florida'");
     STRUCT st = (oracle.sql.STRUCT) rs.getObject(1);
     //convert STRUCT into geometry
     JGeometry j_geom = JGeometry.load(st);

     // ... manipulate the geometry or create a new JGeometry ...

     /// writing a geometry back to database
     PreparedStatement ps = connection.prepareStatement("UPDATE states set geometry=? where name='Florida'");
     //convert JGeometry instance to DB STRUCT
     STRUCT obj = JGeometry.store(j_geom, connection);
     ps.setObject(1, obj);
     ps.execute();

答案 1 :(得分:0)

如果您不可用Oracle Spatial API,例如因为您使用的是OpenJDK(参见Oracle FAQs),所以还有一种更基本的方法可以从ResultSet r访问SDO_GEOMETRY对象:

import java.sql.Struct;
import java.sql.Array;

//...

// access SDO_GEOMETRY of row 1
Object[] geometryArray = ((Struct) r.getObject(1)).getAttributes();
// read its components
int gtype = ((Integer) geometryArray[0]).intValue();
int srid = ((Integer) geometryArray[1]).intValue();
Double[] pointArray = ((Double[]) ((Array) geometryArray[2]).getArray());
Integer[] elemInfoArray = ((Integer[]) ((Array) geometryArray[3]).getArray());
Double[] ordinateArray = ((Double[]) ((Array) geometryArray[4]).getArray());

您还可以通过简单的循环来解开数字类型,例如

double[] ordinates = new double[ordinateArray.length];
for (int i = 0; i < ordinates.length; i++)
     ordinates[i] = ordinateArray[i].doubleValue();

或使用等效的更方便的方法(参见StackOverflow: How do I convert Double[] to double[]?)。