最近项目应用到了根据GEOMETRY类型数据范围内查询更新数据的操作,对于此种数据类型的小白,在这两天恶补了一些相关知识,做一些简单的分享。
GEOMETRY数据类型简介:点击打开链接
可以参考这篇文章和以上图片了解基本数据格式和内容,下面直接上应用干货。
在项目应用中多为构建多边形与位置数据,或通过位置信息对数据进行操作,下面总结了这几天我的一些应用。
1.数据转换
STRUCT struct = (STRUCT) rs.getObject(“origin_geo”)
JDBC中resultHandler通过获取对象方式提取数据并强转为STRUCT,并 通过Oracle几何体转wkt几何操作可获取String类型的数据:
/ * Oracle几何体转wkt几何 * * @param struct * Oracle几何 * @return wkt几何 * @throws Exception */ public static String struct2Wkt(STRUCT struct) throws Exception { JGeometry geom = JGeometry.load(struct); String w = new String(new WKT().fromJGeometry(geom)); return w; }
通过以上操作可以得到String类型的数据,并进行范围计算;
2.范围计算
1.以某个点为中心点周边范围内检索数据,可以通过SDO_WITHIN_DISTANCE实现,具体如下
– 空间分析查询(113.,23.)周边十公里信息5条 SELECT B.id id, B.name name, B.dist dist FROM ( SELECT A.id id, A.name name, SDO_GEOM.SDO_DISTANCE(A.location,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(113.,23.,0),NULL,NULL),1) dist FROM spatialtest A WHERE SDO_WITHIN_DISTANCE(A.LOCATION,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(113.,23.,0),NULL,NULL),’distance=10000′) = ‘TRUE’ ORDER BY A.name ) B WHERE ROWNUM <= 5 ;
2.spatial的函数
用于判断一个几何体与另一个几何体的关系,我们用于判断当前点是否在某一个面(省份面、县市面、乡镇面)上。
参数说明:
sdo_Geometry1,sdo_Geometry2为空间数据对应的几何对象。
Tolerance: 容许的精度范围;
MASK参数:
Anyinteract: sdo_Geometry2落在sdo_Geometry1面上包括在边上。
Contains: sdo_Geometry2完全包含在sdo_Geometry1几何对象中,并且两个几何对象的边没有交叉。
Coveredby: sdo_Geometry1完全包含在sdo_Geometry2中,并且这两个几何对象的边有一个或多个点相互重叠。
Covers: sdo_Geometry2完全包含在sdo_Geometry1中,并且这两个几何对象的边有一个或多个点相互重叠。
Disjoint: 两个几何没有重叠交叉点,也没有共同的边。
Equal: 两个几何是相等的。
Inside: sdo_Geometry1完全包含在sdo_Geometry2几何对象中,并且两个几何对象的边没有交叉。
On: sdo_Geometry1的边和内部的线完全在sdo_Geometry2上。
Overlapbdydisjoint: 两个几何对象交迭,但是边没有交叉。
Overlapbdyintersect: 两个几何对象交迭,并且边有部分交叉。
Touch: 两个几何对象有共同的边,但没有交叉。
下面上demo:
假如以A点为原点,检索A的范围内的数据,包含与A相交的数据(例如一条高速公路B横跨a,b两省)
检索条件为:
select B.* from B where sdo_relate(B.GEOMETRY,SDO_GEOMETRY(?,8307), 'mask=anyinteract+contains+inside+touch+covers+overlapbdyintersect') = 'TRUE'
以上:其中B为想要检索的目的数据,如一条高速公路,?部分为元范围数据,在?范围内搜索范围内的B数据,?在JDBC中传递String类型wkt参数即可,检索结果为范围内+在范围边界上+穿过范围的结果集。
MASK参数的拼装如上demo!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224688.html原文链接:https://javaforall.net
