ActionDB 扩展 OB GIS 能力:新增 ST_PointN 函数
如何扩展 OceanBase 的 GIS 功能?看 ActionDB 技术团队的一个小案例。
作者:爱可生 ActionDB 技术团队。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 1900 字,预计阅读需要 6 分钟。
在江苏省某行政单位的 ActionDB 项目中,由于强依赖于地图,功能涉及大量坐标处理,而 OceanBase 原生几何属性函数(Geometry Property Functions)无法满足需求,需要在地理信息系统(Geographic Information System,简称 GIS)功能中增加 ST_PointN 函数。
面对这一挑战,ActionDB 技术团队深入解析了 OceanBase 中已有的 GIS 函数,包括从表达式解析到算法调用的完整逻辑链路。为了实现 ST_PointN 函数 ,技术团队需在现有基础上注册 ST_PointN 相关元信息,并开发地理(GEO)函数的对应实现,确保 ST_PointN 函数的无缝集成与高效运行。
ST_PointN 函数介绍
ST_PointN 函数用于在给定的几何对象中提取第 N 个点,常用于几何对象分析和地理信息系统(GIS)中。ST_PointN 函数接受一个几何对象(如线或多边形)和一个索引 N,返回该几何对象的第 N 个点。该函数的主要作用是帮助用户从复杂的几何对象中提取具体的点,以便进行进一步的地理分析或处理。
有哪些常见的应用场景?
- 道路和路线分析:在分析交通路线时,可以提取路线中的特定点以进行详细分析或优化。
- 环境监测:用于从多边形或线型区域中提取监测点,从而对环境数据进行更精确的分析。
- 城市规划:在城市规划中,能够从复杂的多边形中提取特定点以帮助规划人员做出决策。
- 导航系统:导航系统中,通过提取路径中的关键点,优化导航指引和路径规划。
函数功能实现
如何添加注册信息?
添加 ST_PointN 函数 注册信息,需要在 OceanBase 已有的 GIS 相应信息后追加内容。
-
定义函数名 :在头文件中
ob_name_def.h
中添加函数名名称,以便在其他地方使用和引用。 -
定义函数 ID :为函数分配一个唯一的 ID,每个 GIS 系统函数(
T_FUN_SYS_ST_xx
)的 ID 不重复。 -
添加序列化信息 :所有的函数与表达式需要在
ObExpr::EvalFunc g_expr_eval_functions
注册,用于函数信息的序列化。 -
注册函数实现类 :在工厂方法
register_expr_operators
中注册函数实现类,使其可在执行 SQL 查询时被识别并使用。 -
添加函数与 GIS 算法的对应信息 :由
ob_geo_func_register
维护函数与 GIS 算法的对应关系,添加相应信息。
如何实现 ST_PointN 函数?
算法功能的实现包含两部分:
- ObExprSTPointN
表达式处理的入口,负责 GIS 算法参数的有效性检查,并准备 GIS 上下文。
在 SQL 表达式的执行阶段,位于 src/sql/engine/expr
目录下的各模块负责处理各种不同类型的 SQL 表达式(包括 GIS 函数)。该类主要在算法执行前检查输入参数的有效性,并准备好执行 GIS 算法所需的上下文环境。
- ObExprSTPointN 算法实现
一旦 ObExprSTPointN
类完成参数检查后,它会调用 ObGeoFunc::geo_func::eval
方法。这会触发模板分发逻辑,最终执行具体的算法模块 ObGeoFuncPointNImpl
,实现 ST_PointN 的功能。
1. 添加函数实现类
添加接口说明:
-
calc_result_type1:检查传递参数类型和数量是否正确。
calc_result_type
族函数以后缀识别不同的参数个数,如calc_result_type1
为一个函数参数。
-
eval_st_PointN:检查所生成的 GIS 对象是否合法,检查 GIS 元数据与 GIS 上下文。
- 调用 ObGeoTypeUtil 工具类的各个检查接口。
- 设置 GIS 函数执行所需的 GIS 对象与 GIS 上下文(
gis_ctx
),并检查 GIS 相关对象有效。 - 验证完成后,最后会调用
ObGeoFunc<ObGeoFuncType::PointN>::geo_func::eval(gis_context, result)
进入模板函数的分发逻辑,最终选择ObGeoFuncPointNImpl
模块中匹配的eval
函数。
2. 添加算法实现
实现 ponitN 的 GIS 处理的核心逻辑。
第一步,注册支持的入参 GIS 子类型(如 linestring
和 multi_point
)。
第二步,定义 eval
族函数。
第三步,自定义的 pointN 函数。
Boost.Geometry
没有直接提供 pointN 函数,但可以通过访问几何体的内部结构实现类似功能。此方法适用于大多数 Boost.Geometry
提供的几何类型(如 linestring
和 multi_point
)。
方案优势
量身定制,满足特定需求
- 定制化: 通过添加自定义 GIS 函数,如 ST_PointN,可以根据具体应用需求量身定制数据库功能,确保数据库能够精准地满足业务需求,提高数据处理的灵活性和效率。
提高性能和效率
- 优化算法: 自定义 GIS 函数可以根据实际应用场景进行性能优化,比通用的开源解决方案更高效。这样可以减少复杂 GIS 操作的计算时间,提高查询性能。
增强系统可扩展性
- 功能扩展: 自定义函数为系统增加了新的功能模块,使得 OceanBase 更加多样化和强大,能够支持更广泛的数据操作需求和业务场景。
提升用户体验
- 功能丰富: 用户可以直接在数据库中定制函数, 替代复杂的业务 GIS 操作,而不需要借助外部工具或额外的开发工作,简化了开发流程,提高了用户体验和开发效率。
数据安全性和一致性
- 内部实现: 自定义 GIS 函数在数据库内部实现,减少了数据传输过程中的安全隐患,保证了数据处理的一致性和安全性。
适应快速变化的业务需求
- 灵活性: 自定义函数使得数据库可以快速响应和适应不断变化的业务需求,无需等待开源社区的更新或第三方工具的升级,显著提高了开发和部署速度。
总结
通过上述步骤,在 OceanBase 中添加并实现了 ST_PointN 函数。具体包括定义函数名和 ID、注册函数、参数类型检查、执行上下文设置、模板函数分发和具体算法实现等子步骤。
最终,通过调用自定义的 pointN 函数,实现了在 OceanBase 中 GIS 功能的扩展。
ST_PointN 函数 的实现,进一步步丰富了 ActionDB 的 GIS 功能矩阵,提升了其在地理信息处理领域的应用价值与竞争力。ActionDB 本着依托开源回馈开源的初衷,本文讨论的 GIS 功能已经提交给 OceanBase 社区版,相信下一个版本可以使用。
什么是 ActionDB?
ActionDB 作为一款卓越的企业级分布式数据库,其设计核心依托于 OceanBase 的开源内核,辅以爱可生在开源数据库领域的深厚积累与技术专长,荣获原厂的正式授权及内核级技术支持。
ActionDB 集 OceanBase 的稳健性与高性能于一身,更进一步强化了与 MySQL 的兼容性,融合爱可生独有的安全特性与用户友好的运维管理工具,缔造了更高品质、更全面的数据库解决方案。
ActionDB 的 MySQL 8.0 协议全面兼容能力,辅以基于 MySQL binlog 的双向复制技术,为业务系统与下游数据平台提供了安全无虞、无缝迁移的完美方案,确保数据迁移的零风险与无感知。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
✨ Github:https://github.com/actiontech/sqle
📚 文档:https://actiontech.github.io/sqle-docs/
💻 官网:https://opensource.actionsky.com/sqle/
👥 微信群:请添加小助手加入 ActionOpenSource

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开源日报 | OpenAI可能在12个月内破产;重现80年代的电脑;PDF转Markdown方案选型;闲鱼网页版已回归
欢迎阅读 OSCHINA 编辑部出品的开源日报,每天更新一期。 # 2024.7.29 今日要闻 OpenAI 可能在 12 个月内破产 - OpenAI 正处于破产边缘,预计亏损达 50 亿美元。 - 这家初创公司在训练其 AI 模型上花费 70 亿美元,以及在人员配备上花费 15 亿美元。 - ChatGPT 开发商获得的大约 35 亿美元的收入并不能满足其运营成本。 开源监控-夜莺项目 v7 正式发版了 关于 CrowdStrike 事故的技术报告和分析 针对近期有 “史上最严重 IT 事故” 之称的 Windows 全球大面积蓝屏死机问题,两个直接当事方 —— 微软和 CrowdStrike 均已发布了相关技术报告。 7 月 24 日,CrowdStrike 发布 Windows 大范围蓝屏事件初步审查报告,并表示即将在公开发布的根本原因分析中详细说明全面调查结果。根据报告,蓝屏死机是由内存安全问题引起的,CrowdStrike 的 CSagent 驱动程序发生了越界读取访问冲突。 86% 的用户因成本等原因放弃 Oracle Java 多年来 Oracle 在 Java 用户...
- 下一篇
优化 GitHub 体验的浏览器插件「GitHub 热点速览」
上周,GitHub 有个"安全问题"------CFOR(Cross Fork Object Reference)冲上了热搜,该问题的表现是: 远程仓库的提交内容任何人可以访问,即使已被删除。只需要拿到 commit ID+源/Fork 的项目地址,任何人都能访问之前提交到远程仓库的内容。下面有 3 个演示,可以复现该问题: 演示一:Fork 项目已删除,之前的提交所有人可见,复现步骤如下: Fork 任意公开的开源项目(源项目) 在 Fork 项目中提交 commit 并推送到远程仓库(push) 记下 commit ID 后删除 Fork 项目 访问源项目,并在地址栏拼接上 commit ID,即可查看之前的提交内容 演示二:源(上游)项目已被删除,但通过 Fork 项目地址和 commit ID,仍可访问源项目的提交内容。 演示三:源项目是私有项目,被 Fork(私有)后,源项目设置为公开,此时 Fork 项目中的私有内容可被任何人访问。 对此,GitHub 官方很早之前就回应过,这些不是 bug,而是故意为之的特性。既然如此,我们应该如何规避这些安全隐患呢?限于篇幅,详细讨论将...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- 2048小游戏-低调大师作品