OceanBase V4.2特性解析:OB Oracle模式下的 SDO_GEOMETRY 空间数据类型

1. 背景

1.1. SDO_GEOMETRY的应用场景及能力

在数字化城市、物联网和新能源汽车等领域蓬勃发展的背景下,空间数据类型的存储和分析需求日益增长;对于涉及位置信息服务和地理位置信息应用而言,数据库中具备对sdo_geometry数据类型的支持无疑将更好地支撑空间数据的存取与分析过程。

空间数据对象是一组直线相连的点的序列而组成,通过sdo_geometry数据类型可以描述OGC(OpenGIS Consortium)定义的7种空间对象类型(point \ linestring \ polygon \ multipoint \ multilinestring \ multipolygon \ collection),这7种空间类型可以覆盖大部分实际应用场景。

空间数据对象之间支持进行关系运算,如包含、相交等,空间关系运算是cpu密集型的运算,在大数据量场景下常规的需要空间索引来提供快速空间关系查询的能力。

1.2. OceanBase v4.2.2release SDO_GEOMETRY特性支持

oceanbase 4.2.2版本下Oracle模式下sdo_geometry类型支持如下特性

特性1 : sdo_geometry支持

用户可以定义数据类型为sdo_geometry,支持PL/SQL下操作sdo_geometry数据类型。

特性2: sdo_geometry成员函数

  • 构造函数:支持通过默认构造函数、Well-Known-Binary数据格式以及Well-Known-Text数据格式创建sdo_geometry数据类型;
  • 查询:支持通过成员函数get_dims/get_gtype/st_isvalid来查询sdo_geometry空间对象的维度、类型以及是否是有效的空间对象的信息;
  • 格式转换:支持通过成员函数get_wkb/get_wkt/get_geojson来将sdo_geometry转换为Well-Known-Binary数据格式、Well-Known-Text数据格式以及json数据格式

特性3: sdo_geometry类型存储

支持定义表中字段为sdo_geometry类型,sdo_geometry数据类型会将其基础属性拆分成多个内置类型的隐藏列进行存储,有效提高存储效率。

特性4: sdo_geometry属性访问

sdo_geometry做为复杂数据类型,包含多个内在属性,支持在SQL/PL下访问其属性。

2. 使用操作

2.1 ddl/dml/select

复制代码
# ddl,创建gis类型字段
CREATE TABLE cola_markets (
  mkt_id NUMBER PRIMARY KEY,
  name VARCHAR2(32),
  shape SDO_GEOMETRY);  --SDO_GEOMETRY表示gis类型

# 插入gis类型数据:通过sdo_geometry constructor创建gis对象实例,
INSERT INTO cola_markets VALUES(
  1,
  'cola_a',
  SDO_GEOMETRY(    --创建gis对象
    2003,  -- 表示2维的polygon
    NULL,  -- 未定义srid
    NULL,  -- 该字段仅对point对象有意义
    SDO_ELEM_INFO_ARRAY(1,1003,1), -- 1表示从SDO_ORDINATE_ARRAY第一个成员开始,
                                   -- 1003表示是一个多边形外环,1表示直线连接
    SDO_ORDINATE_ARRAY(10,105, 15,105, 20,110, 10,110, 10,105) -- 该多边形顶点的坐标值
  )
);

# 查询gis字段,默认按sdo_geometry constructor格式输出
select shape from cola_markets;

SHAPE(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
--------------------------------------------------------------------------------
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARR
AY(10,105, 15,105, 20,110, 10,110, 10,105)

2.2 sdo_geometry成员函数

  • 构造函数:支持通过默认构造函数、Well-Known-Binary数据格式以及Well-Known-Text数据格式创建sdo_geometry数据类型;支持通过构造函数创建2维和3维的空间对象:point\linestring\polygon\multipoint\multilinestring\multipolygon\collection; 定义方式请参考oracle gis设计方案说明

    wkb创建sdo_geometry对象

    OceanBase(SYS@SYS)>select SDO_GEOMETRY(to_blob('01010000000000000000000000000000000000F03F')) as SDO_GEOMETRY from dual;
    +------------------------------------------------------------------+
    | SDO_GEOMETRY |
    +------------------------------------------------------------------+
    | SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(0, 1, NULL), NULL, NULL) |
    +------------------------------------------------------------------+
    1 row in set (0.001 sec)

    wkt创建sdo_geometry对象

    OceanBase(SYS@SYS)>SELECT SDO_GEOMETRY('POINT(-1e5 1e-3)') as SDO_GEOMETRY from dual;
    +----------------------------------------------------------------------------+
    | SDO_GEOMETRY |
    +----------------------------------------------------------------------------+
    | SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(-100000, 0.001, NULL), NULL, NULL) |
    +----------------------------------------------------------------------------+
    1 row in set (0.005 sec)

  • 查询:支持通过成员函数get_dims/get_gtype/st_isvalid来查询sdo_geometry空间对象的维度、类型以及是否是有效的空间对象的信息;

    OceanBase(SYS@SYS)>select sdo_geometry (2001, null, null, sdo_elem_info_array (1,1,1), sdo_ordinate_array (10,500)).get_gtype() as gtype from dual;
    +-------+
    | GTYPE |
    +-------+
    | 1 |
    +-------+
    1 row in set (0.008 sec)

    返回空间对象的维度

    OceanBase(SYS@SYS)>select g.geo.get_dims() from gis_test g;
    +------------------+
    | G.GEO.GET_DIMS() |
    +------------------+
    | 2 |
    +------------------+
    1 row in set (0.006 sec)

    ceanBase(SYS@SYS)>select g.geo.st_coorddim() from gis_test g;
    +---------------------+
    | G.GEO.ST_COORDDIM() |
    +---------------------+
    | 2 |
    +---------------------+
    1 row in set (0.006 sec)

    返回空间对象是否有效

    OceanBase(SYS@SYS)>select g.geo.st_isvalid() from gis_test g;
    +--------------------+
    | G.GEO.ST_ISVALID() |
    +--------------------+
    | 1 |
    +--------------------+
    1 row in set (0.006 sec)

  • 格式转换:支持通过成员函数get_wkb/get_wkt/get_geojson来将sdo_geometry转换为Well-Known-Binary数据格式、Well-Known-Text数据格式以及json数据格式输出

    get_wkt将sdo_geometry转换为wkt格式

    OceanBase(SYS@SYS)>select sdo_geometry (2001, null, sdo_point_type(10,50,null), null, null).get_wkt() as wkt from dual;
    +-------------------+
    | WKT |
    +-------------------+
    | POINT (10.0 50.0) |
    +-------------------+
    1 row in set (0.006 sec)

    get_wkb将sdo_geometry转换为wkb格式

    OceanBase(SYS@SYS)>select g.geo.get_wkb() from gis_test g;
    +--------------------------------------------+
    | G.GEO.GET_WKB() |
    +--------------------------------------------+
    | 00000000014028000000000000402C000000000000 |
    +--------------------------------------------+
    1 row in set (0.006 sec)

    get_geojson将do_geometry转换为json文本格式

    OceanBase(SYS@SYS)>select g.geo.get_geojson() from gis_test g;
    +----------------------------------------------+
    | G.GEO.GET_GEOJSON() |
    +----------------------------------------------+
    | { "type": "Point", "coordinates": [12, 14] } |
    +----------------------------------------------+
    1 row in set (0.005 sec)

sdo_geometry member function功能如下所示:

|-------------|---------|-------------------------------------------------------------------------------------------------------|
| Name | Returns | Description |
| Get_Dims | NUMBER | 返回空间对象的维度,在 SDO_GTYPE中定义. 与表达式 ST_CoordDim返回结果相同 |
| Get_GeoJson | CLOB | 返回空间对象的json格式输出. |
| Get_GType | NUMBER | 返回空间对象的类型,在 SDO_GTYPE中定义 |
| Get_WKB | BLOB | 输出空间对象的wkb,不带srid |
| Get_WKT | CLOB | 输出空间对下的wkt |
| ST_CoordDim | NUMBER | 和Get_Dims相同 |
| ST_IsValid | NUMBER | 返回空间对象是否有效 (The ISO/IEC SQL Multimedia standard uses the term well formed for valid in this context.) |

2.3 sdo_geometry属性访问

sdo_geometry做为复杂数据类型,包含多个内在属性,支持在SQL/PL下访问其属性。

复制代码
OceanBase(SYS@SYS)>select sdo_geometry (2001, null, sdo_point_type(10,50,null), null, null).SDO_GTYPE from dual;
+------------------------------------------------------------------------+
| SDO_GEOMETRY(2001,NULL,SDO_POINT_TYPE(10,50,NULL),NULL,NULL).SDO_GTYPE |
+------------------------------------------------------------------------+
|                                                                   2001 |
+------------------------------------------------------------------------+
1 row in set (0.006 sec)
# 访问sdo_srid属性
OceanBase(SYS@SYS)>select g.geo.sdo_srid from gis_test g;
+----------------+
| G.GEO.SDO_SRID |
+----------------+
|           4326 |
+----------------+
1 row in set (0.005 sec)
# 访问sdo_point属性,sdo_point也是个复杂属性,包含x/y/z
OceanBase(SYS@SYS)>select g.geo.sdo_point from gis_test g;
+------------------------------+
| G.GEO.SDO_POINT              |
+------------------------------+
| SDO_POINT_TYPE(12, 14, NULL) |
+------------------------------+
1 row in set (0.004 sec)
# 访问sdo_point的x/y/z属性
OceanBase(SYS@SYS)>select g.geo.sdo_point.x from gis_test g;
+-------------------+
| G.GEO.SDO_POINT.X |
+-------------------+
|                12 |
+-------------------+
1 row in set (0.005 sec)

OceanBase(SYS@SYS)>select g.geo.sdo_point.y from gis_test g;
+-------------------+
| G.GEO.SDO_POINT.Y |
+-------------------+
|                14 |
+-------------------+
1 row in set (0.005 sec)

OceanBase(SYS@SYS)>select g.geo.sdo_point.z from gis_test g;
+-------------------+
| G.GEO.SDO_POINT.Z |
+-------------------+
|              NULL |
+-------------------+
1 row in set (0.004 sec)
# 访问SDO_ELEM_INFO属性
OceanBase(SYS@SYS)>select g.geo.SDO_ELEM_INFO from gis_test g;
+---------------------+
| G.GEO.SDO_ELEM_INFO |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.005 sec)
# 访问SDO_ORDINATES属性
OceanBase(SYS@SYS)>select g.geo.SDO_ORDINATES from gis_test g;
+---------------------+
| G.GEO.SDO_ORDINATES |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.005 sec)

3. 总结和展望

本次SDO_GEOMETRY类型特性计划在4.2.2版本发布,补齐Oracle模式下支持空间数据类型的功能。本次特性暂未支持SDO_GEOMETRY类型的空间索引以及相关空间计算表达式,后续根据具体需求来补齐相关功能。

相关推荐
fen_fen12 小时前
Oracle建表语句示例
数据库·oracle
此刻你16 小时前
常用的 SQL 语句
数据库·sql·oracle
OceanBase数据库官方博客17 小时前
OceanBase场景解码系列三|OB Cloud 如何稳定支撑中企出海实现数 10 倍的高速增长?
数据库·oceanbase·分布式数据库
海心焱21 小时前
从零开始构建 AI 插件生态:深挖 MCP 如何打破 LLM 与本地数据的连接壁垒
jvm·人工智能·oracle
德彪稳坐倒骑驴1 天前
MySQL Oracle面试题
数据库·mysql·oracle
吕司1 天前
MySQL库的操作
数据库·mysql·oracle
dishugj1 天前
【Oracle】 rac的一些问题以及解决方案
数据库·oracle
eWidget1 天前
面向信创环境的Oracle兼容型数据库解决方案
数据库·oracle·kingbase·数据库平替用金仓·金仓数据库
码海踏浪1 天前
从简单到专业在OceanBase中查看SQL是否走索引
数据库·sql·oceanbase
熊文豪1 天前
关系数据库替换用金仓——Oracle兼容性深度解析
数据库·oracle·金仓数据库·电科金仓·kes