使用JGeometry类(2)

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语句中。

 
 
  1. STRUCT dbObject = JGeometry.store (geom, dbConnection);  
  2. stmt.setObject (1,dbObject); 

使用优化的序列化工具除了与store()方法的参数顺序相反以外,其他的都一样:先是定义数据库连接对象,然后是创建JGeometry对象。

 
 
  1. STRUCT dbObject = JGeometry.store (dbConnection, geom);  
  2. 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 )

判断一条线是否有变

长或缩短的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值