作者:爱可生 ActionDB 技术团队。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 1900 字,预计阅读需要 6 分钟。
在江苏省某行政单位的 ActionDB[1] 项目中,由于强依赖于地图,功能涉及大量坐标处理,而 OceanBase 原生几何属性函数[2](Geometry Property Functions)无法满足需求,需要在地理信息系统(Geographic Information System,简称 GIS)功能中增加 ST_PointN 函数。
面对这一挑战,ActionDB 技术团队深入解析了 OceanBase 中已有的 GIS 函数,包括从表达式解析到算法调用的完整逻辑链路。为了实现 ST_PointN 函数,技术团队需在现有基础上注册 ST_PointN 相关元信息,并开发地理(GEO)函数的对应实现,确保 ST_PointN 函数的无缝集成与高效运行。
ST_PointN 函数用于在给定的几何对象中提取第 N 个点,常用于几何对象分析和地理信息系统(GIS)中。ST_PointN 函数接受一个几何对象(如线或多边形)和一个索引 N,返回该几何对象的第 N 个点。该函数的主要作用是帮助用户从复杂的几何对象中提取具体的点,以便进行进一步的地理分析或处理。
添加 ST_PointN 函数 注册信息,需要在 OceanBase 已有的 GIS 相应信息后追加内容。
ob_name_def.h
中添加函数名名称,以便在其他地方使用和引用。T_FUN_SYS_ST_xx
)的 ID 不重复。ObExpr::EvalFunc g_expr_eval_functions
注册,用于函数信息的序列化。register_expr_operators
中注册函数实现类,使其可在执行 SQL 查询时被识别并使用。ob_geo_func_register
维护函数与 GIS 算法的对应关系,添加相应信息。算法功能的实现包含两部分:
表达式处理的入口,负责 GIS 算法参数的有效性检查,并准备 GIS 上下文。
在 SQL 表达式的执行阶段,位于 src/sql/engine/expr
目录下的各模块负责处理各种不同类型的 SQL 表达式(包括 GIS 函数)。该类主要在算法执行前检查输入参数的有效性,并准备好执行 GIS 算法所需的上下文环境。
一旦 ObExprSTPointN
类完成参数检查后,它会调用 ObGeoFunc::geo_func::eval
方法。这会触发模板分发逻辑,最终执行具体的算法模块 ObGeoFuncPointNImpl
,实现 ST_PointN 的功能。
添加接口说明:
calc_result_type
族函数以后缀识别不同的参数个数,如 calc_result_type1
为一个函数参数。gis_ctx
),并检查 GIS 相关对象有效。ObGeoFunc<ObGeoFuncType::PointN>::geo_func::eval(gis_context, result)
进入模板函数的分发逻辑,最终选择 ObGeoFuncPointNImpl
模块中匹配的 eval
函数。实现 ponitN 的 GIS 处理的核心逻辑。
第一步,注册支持的入参 GIS 子类型(如 linestring
和 multi_point
)。
第二步,定义 eval
族函数。
第三步,自定义的 pointN 函数。
Boost.Geometry
没有直接提供 pointN 函数,但可以通过访问几何体的内部结构实现类似功能。此方法适用于大多数 Boost.Geometry
提供的几何类型(如 linestring
和 multi_point
)。
通过上述步骤,在 OceanBase 中添加并实现了 ST_PointN 函数。具体包括定义函数名和 ID、注册函数、参数类型检查、执行上下文设置、模板函数分发和具体算法实现等子步骤。
最终,通过调用自定义的 pointN 函数,实现了在 OceanBase 中 GIS 功能的扩展。
ST_PointN 函数 的实现,进一步步丰富了 ActionDB 的 GIS 功能矩阵,提升了其在地理信息处理领域的应用价值与竞争力。ActionDB 本着依托开源回馈开源的初衷,本文讨论的 GIS 功能已经提交给 OceanBase 社区版,相信下一个版本可以使用。
ActionDB 作为一款卓越的企业级分布式数据库,其设计核心依托于 OceanBase 的开源内核,辅以爱可生在开源数据库领域的深厚积累与技术专长,荣获原厂的正式授权及内核级技术支持。
ActionDB 集 OceanBase 的稳健性与高性能于一身,更进一步强化了与 MySQL 的兼容性,融合爱可生独有的安全特性与用户友好的运维管理工具,缔造了更高品质、更全面的数据库解决方案。
ActionDB 的 MySQL 8.0 协议全面兼容能力,辅以基于 MySQL binlog 的双向复制技术,为业务系统与下游数据平台提供了安全无虞、无缝迁移的完美方案,确保数据迁移的零风险与无感知。
更多了解:云树®ActionDB-基于 OceanBase 开源内核的商业发行版
[1]
ActionDB: https://www.actionsky.com/actionDB
[2]
OceanBase 几何属性函数: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001054513
本文关键字:#OceanBase# #ActionDB# #GIS# #开发#