赞
踩
在数字化城市、物联网和新能源汽车等领域蓬勃发展的背景下,空间数据类型的存储和分析需求日益增长;对于涉及位置信息服务和地理位置信息应用而言,数据库中具备对sdo_geometry数据类型的支持无疑将更好地支撑空间数据的存取与分析过程。
空间数据对象是一组直线相连的点的序列而组成,通过sdo_geometry数据类型可以描述OGC(OpenGIS Consortium)定义的7种空间对象类型(point \ linestring \ polygon \ multipoint \ multilinestring \ multipolygon \ collection),这7种空间类型可以覆盖大部分实际应用场景。
空间数据对象之间支持进行关系运算,如包含、相交等,空间关系运算是cpu密集型的运算,在大数据量场景下常规的需要空间索引来提供快速空间关系查询的能力。
oceanbase 4.2.2版本下Oracle模式下sdo_geometry类型支持如下特性
特性1 : sdo_geometry支持
用户可以定义数据类型为sdo_geometry,支持PL/SQL下操作sdo_geometry数据类型。
特性2: sdo_geometry成员函数
特性3: sdo_geometry类型存储
支持定义表中字段为sdo_geometry类型,sdo_geometry数据类型会将其基础属性拆分成多个内置类型的隐藏列进行存储,有效提高存储效率。
特性4: sdo_geometry属性访问
sdo_geometry做为复杂数据类型,包含多个内在属性,支持在SQL/PL下访问其属性。
- # 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)

- # 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)

- 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_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.) |
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)

本次SDO_GEOMETRY类型特性计划在4.2.2版本发布,补齐Oracle模式下支持空间数据类型的功能。本次特性暂未支持SDO_GEOMETRY类型的空间索引以及相关空间计算表达式,后续根据具体需求来补齐相关功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。