GBase 8a之基于散列点集合获取最小覆盖圆的方法分享

张开发
2026/4/20 17:22:25 15 分钟阅读

分享文章

GBase 8a之基于散列点集合获取最小覆盖圆的方法分享
主要解决问题1针对给定的散列点集合获取能覆盖该集合的面积最小的圆圆心坐标和半径2在地理信息领域通信领域交通信息领域消防、机器人技术 体育竞技流行病医学气象检测等众多领域可广泛应用。部署方式1 创建函数新建create.sql文件如下 use gclusterdb; drop function if exists f_mincir; create function f_mincir(point_str varchar(1000)) returns varchar $$ import subprocess result subprocess.check_output([python, /home/gbase/tmp/mincir.pyo, point_str]).strip() return result $$ language plpythonu; 注 下载mincir.pyo文件将其部署在/home/gbase/tmp/mincir.pyo可以自行指定存放位置前提是每个coordinator节点都需要部署相同的位置。 执行 gccli -uroot -vvv -f create.sql 即可创建该函数使用方式1 新建包含散列点集合的表其中xy代表点的坐标gbase select * from zhao; --------------------- | pointid | x | y | --------------------- | 1 | 23 | 62 | | 2 | 54 | 29 | | 3 | 38 | 74 | | 4 | 85 | 36 | | 5 | 42 | 63 | | 6 | -5 | 18 | | 7 | -13 | 31 | | 8 | 19 | -41 | | 9 | 28 | 62 | | 10 | 54 | 49 | --------------------- 10 rows in set (Elapsed: 00:00:00.01)2 将点集坐标数据打包成元组后直接调用函数gbase select gclusterdb.f_mincir( group_concat( concat((,x,,,y,)) ) ) from zhao; ------------------------------------------------------------------ | gclusterdb.f_mincir( group_concat( concat((,x,,,y,)) ) ) | ------------------------------------------------------------------ | (30.1517, 16.2271, 58.3035) | ------------------------------------------------------------------ 1 row in set (Elapsed: 00:00:00.07) 注意返回结果是一个包含3个元素的元组元素1和2是面积最小的圆的圆心坐标元素3是该圆的半径。验证是否真的覆盖1 将点集和所求的圆在画布上画出来, 可见该圆满足条件5 参考文件1 注 该版本为centos8环境下编译。2 文件下载mincir.pyo链接: https://pan.baidu.com/s/1LES7f39PO79ZIN8bWISyXQ 提取码: ud1u

更多文章