orical空间数据类型GEOMETRY使用干货

最近项目应用到了根据GEOMETRY类型数据范围内查询更新数据的操作,对于此种数据类型的小白,在这两天恶补了一些相关知识,做一些简单的分享。


GEOMETRY数据类型简介:点击打开链接orical空间数据类型GEOMETRY使用干货_第1张图片

可以参考这篇文章和以上图片了解基本数据格式和内容,下面直接上应用干货。


在项目应用中多为构建多边形与位置数据,或通过位置信息对数据进行操作,下面总结了这几天我的一些应用。

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.2359818,23.16937253)周边十公里信息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.2359818,23.16937253,0),NULL,NULL),1) dist
FROM
spatialtest A
WHERE
SDO_WITHIN_DISTANCE(A.LOCATION,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(113.2359818,23.16937253,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!










你可能感兴趣的:(数据库)