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维的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(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类型的空间索引以及相关空间计算表达式,后续根据具体需求来补齐相关功能。
相关文章:
OceanBase V4.2特性解析:OB Oracle模式下的 SDO_GEOMETRY 空间数据类型
1. 背景 1.1. SDO_GEOMETRY的应用场景及能力 在数字化城市、物联网和新能源汽车等领域蓬勃发展的背景下,空间数据类型的存储和分析需求日益增长;对于涉及位置信息服务和地理位置信息应用而言,数据库中具备对sdo_geometry数据类型的支持无疑…...
简介面向对象的封装、继承、多态和抽象
面向对象(Object-Oriented)的特点通常归纳为四个核心概念:封装、继承、多态和抽象。 1. 封装(Encapsulation) 定义: 封装是将对象的属性(数据)和方法(操作)打包在一起&…...
OpenCV + CUDA + cuDNN模块编译
简介 在追求高端性能与资源优化并重的应用场景中,如边缘计算设备或资源受限的开发板上运行YOLO等复杂深度学习模型,采用C结合OpenCV与GPU加速技术相较于传统的Python环境展现出显著优势。这种策略不仅极大地提升了执行效率,还显著降低了运行时…...
Redis 缓存预热、雪崩、穿透、击穿
缓存预热 缓存预热是什么 缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!解决方案 使用 PostConstr…...
仿RabbiteMq简易消息队列基础篇(gtest的使用)
TOC gtest介绍 gtest是google的一个开源框架,它主要用于写单元测试,检查自己的程序是否符合预期行为。可在多个平台上使用(包含Linux,MAC OC,Windows等)。它提供了丰富的断言,致命和非致命失败…...
图像处理中的图像梯度和幅值是什么???(通俗讲解)
在边缘检测和特征提取等任务中,图像的梯度和幅值是图像处理中非常重要的概念。 目录 一、图像的梯度1.1 专业解释1.2 通俗理解1.3 计算方式 二、梯度的幅值2.1 专业解释2.2 通俗理解2.3 计算方式 一、图像的梯度 1.1 专业解释 图像的梯度可以看作是图像中亮度或颜…...
01.计算机网络导论
引言 协议分层 协议分层使我们可以将大任务化简成几个更小、更简单的任务。模块化指的是独立的协议层。一个协议层(模块)可以定义为一个具有输入和输出而不需要考虑输入是如何变成输出的黑匣子。当向两台机器提供相同输入得到相同输出时,它…...
API网关:SpringCloud GateWay
一. 网关的作用及背景 1.API网关的作用 请求路由 在我们的系统中由于同一个接口新老两套系统都在使用,我们需要根据请求上下文将请求路由到对应的接口。 统一鉴权 对于鉴权操作不涉及到业务逻辑,那么可以在网关层进行处理,不用下层到业务…...
【Leetcode 383】赎金信 —— 哈希表 有注解
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1: 输入&#…...
Linux 常见的冷知识集锦
一、前言 本文旨在记录那些常见的Linux概念和名词,但这些又没经常直接使用到,更多在底层运行,见过却又不是特别清楚的碎片知识,以温故知新。 二、知识点和概念说明 2.1、POSIX标准/协议 POSIX(Portable Operating S…...
【喜报】科大睿智祝贺青岛海信网络科技通过CMMI5级评估
青岛海信网络科技股份有限公司成立于1998年,是海信集团B2B产业的核心力量。其主要从事城市交通、公共交通、智慧公路、交通枢纽、智慧停车、智能网联、大数据管理、城市治理、应急管理、轨道交通智能化和医院、校园、园区等智能化建设领域的产品和解决方案开发、…...
2024全国大学生电子设计大赛全国初赛 E题 三子棋游戏装置 一等奖满分最简方案
感想:电赛初赛控制类题还是蛮简单的,别被五花八门的硬件搞懵了(决赛当我没说)。抓住核心,理念都是通用的。我是计科专业的,因此选择的控制类E题,相对来说背的知识要少很多,更考验智商…...
尚品汇-ES(三十一)
目录: (1)封装搜索相关实体对象 (2)搜索接口封装 (3)在service-list-client模块添加远程接口 (1)封装搜索相关实体对象 搜索参数实体:SearchParam 搜索参…...
NC 跳台阶
系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 一只青蛙一次…...
linux 文件编程
1. 标准IO 也称为标准输入输出(Standard Input/Output),是计算机编程中一种常见的IO操作方式,特别是在C语言及其衍生语言中广泛使用。它主要通过标准C库中的函数来实现,提供了丰富的接口用于数据的输入和输出。 文本文…...
【后端速成 Vue】实现动态表白墙
前言: 通过前面几篇的文章的讲解,已经学习到了很多的 Vue 指令了,那么现在就将学习到的指令利用起来,做一个小的 demo。 最终效果图: 通过效果图可以发现,一共有这几个功能: ● 渲染列表&…...
【日常开发】 java返回ECharts数据结构封装
java返回ECharts数据结构封装 一、前端页面示例图如下: 二、准备测试数据: 三、后端 格式封装代码: 四、最终结果: 🎈边走、边悟🎈迟早会好 一、前端页面示例图如下: 二、准备测试数据&am…...
Table表格控件实现单选功能
Table表格控件实现单选功能 <el-tableref"tableRef"height"385"style"--el-table-border-color: none"row-key"contractId"highlight-current-rowsingle-selectselect"handleSelect":data"contractInfo">&l…...
AI技术加速落地 港科广联手思谋打开智能缺陷检测新纪元
AI 技术应用落地的元年,工业是主战场,尤其是工业缺陷检测。 在“生产制造-缺陷检测-工艺优化-生产制造”的智能制造闭环链条中,基于AI的智能缺陷检测扮演着“把关者”的角色。但这个把关者长期以来却缺少一个称手的工具——样本量大、精度高…...
Python爬虫开发:BeautifulSoup、Scrapy入门
在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在Python中,有多个库可以用于爬虫开发,其中BeautifulSoup和Scrapy是两个非…...
SagerNet数据库架构完全指南:Room与DataStore在代理工具中的最佳实践
SagerNet数据库架构完全指南:Room与DataStore在代理工具中的最佳实践 SagerNet作为Android平台上的通用代理工具链,其强大的数据库架构设计是其核心竞争力的关键。通过深入分析SagerNet的Room数据库与DataStore的完美结合,我们可以了解现代A…...
探索R语言中的数据处理:序列统计
在数据分析中,我们经常需要处理复杂的顺序数据,例如测试的时间序列。在本篇博客中,我们将探讨如何使用R语言来处理一个特定的问题:统计四种测试(Test 1到Test 4)在不同顺序下的执行频率。 问题描述 假设我们有一个研究数据框,其中包含四种测试的日期,这些测试可以以任…...
前端自动化部署终极指南:从CI/CD到容器化的完整流程
前端自动化部署终极指南:从CI/CD到容器化的完整流程 【免费下载链接】all-of-frontend 你想知道的前端内容都在这 项目地址: https://gitcode.com/gh_mirrors/al/all-of-frontend GitHub 加速计划(all-of-frontend)是一个全面的前端学…...
机器学习04——numpy
1、numpy介绍Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。Numpy使用ndarray对象来处理多维…...
氢燃料电池模型详解:基于MATLAB Simulink的全方位建模系统,涵盖输出电压模型、流道...
氢燃料电池模型 1.基于MATLAB/simulink开发的,包含输出电压模型,阳极流道模型,阴极流道模型,水传递模型,空压机模型,空压机模型,进气歧管,排气歧管等 2.PEMFC燃电模型为密歇根大学研…...
OpenFontRender:嵌入式MCU的轻量级TTF字体渲染库
1. OpenFontRender 库深度解析:面向嵌入式微控制器的 TTF 字体渲染引擎OpenFontRender 是一款专为资源受限微控制器设计的开源 TTF(TrueType Font)字体渲染库,其核心目标是在 Arduino IDE 生态下实现高质量、可定制、跨平台的矢量…...
(开头直接进入主题,无废话)
(ISAR RD成像)feko仿真单站RCS,使用其导出的.ffe数据,基于MATLAB进行RD算法的ISAR成像 可以直接运行出结果,适合初学者参考和学习 从feko仿真到ISAR成像,全流程数据和代码都给你 我自己也曾是初学者&#x…...
好写作AI“期刊论文魔法工坊”:打造学术发表的秘密武器
在学术的浩瀚星空中,期刊论文宛如璀璨星辰,是研究者展示智慧结晶、推动学科发展的重要途径。然而,撰写一篇高质量且符合期刊要求的论文,却如同在荆棘丛中开辟道路,充满了挑战与艰辛。别担心,好写作AI宛如一…...
2026海雅达HDT500手持终端PDA“12米远距扫描”应用案例:造纸厂原纸立库高层纸卷条码采集应用
标准工业原纸卷重达2吨、宽幅近2.8米,在12-15米高的原纸仓库中堆垛高达8-10米。高空扫码怎么破? 传统PDA扫码距离仅1米,难道必须冒生命危险爬上纸堆?海雅达HDT500的12米扫描头如何实现“降维打击”? 如何利用海雅达H…...
STM32智能垃圾桶开发实战:语音识别与自动分类
1. 项目概述这个智能垃圾桶项目是我去年为一个社区环保活动设计的硬件方案。当时社区正在推广垃圾分类,但居民反映传统分类垃圾桶使用不便,经常出现错投混投的情况。于是我就琢磨着用STM32做个能听懂人话、自动开盖的智能垃圾桶,让垃圾分类变…...
