7.2.1 使用JGeometry类(2)
表7-2中的两个方法(getElements()和getElementAt())可以对复杂几何体的结构进行检查:你可以提取独立的元素作为单独的JGeometry对象。第一个方法返回所有元素到独立的JGeometry对象数组中。第二个方法返回一个指定元素,通过其在几何体中的位置来标识。
警告:
对element术语的理解应参见OGC Simple Features for SQL规范。例如,一个有孔多边形被看作是一个单元素,尽管它由多个环(在Oracle概念中,每个都是一个单元素)组成。在第5章中讨论的验证函数(VALIDATE_GEOMETRY_WITH_CONTEXT()和EXTRACT())表现出同样的方式。这就意味着getElements()方法不允许你从一个有孔多边形中提取孔。
警告:
元素的编号方式是从1开始的,而不是0。
3. 创建几何体
向数据库中写入几何体(用INSERT或UPDATE语句)要求先创建一个新的JGeometry对象,并用JGeometry.store()方法把它转换成STRUCT。然后把STRUCT传递给INSERT或UPDATE语句。同load()方法一样,也可以使用速度更快的空间序列化工具。图7-3和7-4展示了这两个方法。
下面是这两个方法的例子。首先用JGeometry的静态方法store()把它转换为STRUCT,然后用setObject()方法把它插入到准备好的SQL语句中。
- STRUCT dbObject = JGeometry.store (geom, dbConnection);
- stmt.setObject (1,dbObject);
使用优化的序列化工具除了与store()方法的参数顺序相反以外,其他的都一样:先是定义数据库连接对象,然后是创建JGeometry对象。
- STRUCT dbObject = JGeometry.store (dbConnection, geom);
- stmt.setObject (1,dbObject);
有两种方法可以构造新的JGeometry对象。一种是使用表7-4中的构造函数。另一种方法是用静态的方法来创建不同的几何体。表7-5列出了这些方法。
表7-4 JGeometry转换器
构 造 函 数 | 目 的 |
JGeometry (double x, double y, int srid) | 构造点 |
JGeometry (double x, double y, double z, int srid) | 构造三维点 |
JGeometry (double minX, double minY, double maxX, double maxY, int srid) | 创建矩形 |
JGeometry (int gtype, int srid, int[] elemInfo, double[] ordinates) | 构造一般几何体 |
表7-5 静态JGeometry创建方法
创 建 方 法 | 目 的 |
createPoint(double[] coord, int dim, int srid) | 创建点 |
createLinearLineString(double[] coords, int dim, int srid) | 创建简单线串 |
createLinearPolygon(double[] coords, int dim, int srid) | 创建简单多边形 |
createMultiPoint(java.lang.Object[] coords, int dim, int srid) | 创建多重点对象 |
createLinearMultiLineString(java.lang.Object[] coords, int dim, int srid) | 创建多重线串对象 |
createLinearPolygon(java.lang.Object[] coords, int dim, int srid) | 创建多重多边形 |
createCircle(double x1, double y1, double x2, double y2, double x3, double y3, int srid) | 用圆上三点创建圆 |
createCircle(double x, double y, double radius, int srid) | 用中心和半径创建圆 |
4. 修改存在的几何体
JGeometry类没有提供任何用于修改几何体的方法。例如,没有方法用来从一个线上删除或添加一点。为了执行那些更新,你需要用某个方法,如getOrdinatesArray(),来提取点序列,然后更新由此产生的Java数组,最后用其结果来创建一个新的JGeometry对象。
像先前讨论的那样把修改后的几何体写入到数据库中:用store()方法把JGeometry对象转换为STRUCT,然后把STRUCT传给SQL中的INSERT或UPDATE语句。
5. 处理几何体
Java API也提供了大量的用于对几何体执行各种转换的方法。表7-6中列出了主要的方法。它们以JGeometry对象作为输入而以生成的新几何体作为输出。注意,这些函数大部分都由数据库提供,并通过PL/SQL来对其进行调用,这一内容将在第9章中详述。
表7-6 几何体处理函数
方 法 | 目 的 |
buffer(double bufferWidth) | 在几何体周围形成一个缓冲区 |
simplify(double threshold) | 简化几何体 |
densifyArcs(double arc_tolerance) | 在几何体中增加所有弧的密度 |
clone() | 复制一个几何体 |
affineTransforms(...) | 基于提供的参数(平移、缩放、旋转、切变、 反射)在输入几何体上应用仿射变换 |
projectToLTP(double smax, double flat) | 把一个几何体从经度/纬度投影到一个切面上 |
projectFromLTP() | 把一个几何体从一个本地切面投影到经度/纬度上 |
表7-7总结了API提供的一些辅助方法。这些函数都不涉及JGeometry对象(除了equals),用来辅助处理一定的任务。
equals()函数用来比较两个JGeometry对象,判断它们是否相同。然而,这种比较是基于几何体的内部编码的:如果两个几何体的所有点的坐标都相同且顺序相同,那么就认为这两个几何体相同。该方法不真正进行涉及容差的几何体的比较。
表7-7 几何体辅助函数
方 法 | 目 的 |
equals() | 判断两个几何体是否相同 |
computeArc(double x1, double y1, double x2, double y2, double x3, double y3) | 从三个坐标点来计算这 个弧的中心、半径和角度 |
linearizeArc(double x1, double y1, double x2,double y2, double x3, double y3) | 把一个弧转换成一组二维线段 |
reFormulateArc(double[] d) | 通过重新计算角度重构一条弧 |
expandCircle(double x1, double y1, double x2, double y2, double x3, double y3) | 通过把圆转换成一组二维 线段来实现对其的线性化 |
monoMeasure(double[] coords, int dim ) | 判断一条线是否有变 长或缩短的方法 |