天津建设厅官方网站,网站制作设计发展前景,做电子商城网站,郑州网站推广公司咨询1. 背景
1.1. SDO_GEOMETRY的应用场景及能力
在数字化城市、物联网和新能源汽车等领域蓬勃发展的背景下#xff0c;空间数据类型的存储和分析需求日益增长#xff1b;对于涉及位置信息服务和地理位置信息应用而言#xff0c;数据库中具备对sdo_geometry数据类型的支持无疑…1. 背景
1.1. SDO_GEOMETRY的应用场景及能力
在数字化城市、物联网和新能源汽车等领域蓬勃发展的背景下空间数据类型的存储和分析需求日益增长对于涉及位置信息服务和地理位置信息应用而言数据库中具备对sdo_geometry数据类型的支持无疑将更好地支撑空间数据的存取与分析过程。
空间数据对象是一组直线相连的点的序列而组成通过sdo_geometry数据类型可以描述OGCOpenGIS 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维的polygonNULL, -- 未定义sridNULL, -- 该字段仅对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(SYSSYS)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(SYSSYS)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(SYSSYS)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(SYSSYS)select g.geo.get_dims() from gis_test g;
------------------
| G.GEO.GET_DIMS() |
------------------
| 2 |
------------------
1 row in set (0.006 sec)ceanBase(SYSSYS)select g.geo.st_coorddim() from gis_test g;
---------------------
| G.GEO.ST_COORDDIM() |
---------------------
| 2 |
---------------------
1 row in set (0.006 sec)
# 返回空间对象是否有效
OceanBase(SYSSYS)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(SYSSYS)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(SYSSYS)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(SYSSYS)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功能如下所示
NameReturnsDescriptionGet_DimsNUMBER返回空间对象的维度在 SDO_GTYPE中定义. 与表达式 ST_CoordDim返回结果相同Get_GeoJsonCLOB返回空间对象的json格式输出.Get_GTypeNUMBER返回空间对象的类型在 SDO_GTYPE中定义Get_WKBBLOB输出空间对象的wkb不带sridGet_WKTCLOB输出空间对下的wktST_CoordDimNUMBER和Get_Dims相同ST_IsValidNUMBER返回空间对象是否有效 (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(SYSSYS)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(SYSSYS)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(SYSSYS)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(SYSSYS)select g.geo.sdo_point.x from gis_test g;
-------------------
| G.GEO.SDO_POINT.X |
-------------------
| 12 |
-------------------
1 row in set (0.005 sec)OceanBase(SYSSYS)select g.geo.sdo_point.y from gis_test g;
-------------------
| G.GEO.SDO_POINT.Y |
-------------------
| 14 |
-------------------
1 row in set (0.005 sec)OceanBase(SYSSYS)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(SYSSYS)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(SYSSYS)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类型的空间索引以及相关空间计算表达式后续根据具体需求来补齐相关功能。