原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
主要解决问题
(1)针对给定的散列点集合,获取能覆盖该集合的,面积最小多边形(多边形顶点坐标集)
(2)在地理信息领域,通信领域,交通信息领域,消防、机器人技术, 体育竞技,流行病医学,气象检测等众多领域,可广泛应用。
部署方式
(1) 创建函数
新建create.sql文件,如下:
use gclusterdb;
drop function if exists f_minpoly;
create function f_minpoly(point_str varchar(1000))
returns varchar
$$
import subprocess
result = subprocess.check_output(["python", "/home/gbase/tmp/minpoly.pyo", point_str]).strip()
return result
$$ language plpythonu;
注: 下载minpoly.pyo文件,将其部署在/home/gbase/tmp/minpoly.pyo(可以自行指定存放位置),前提是每个coordinator节点都需要部署相同的位置。
执行 gccli -uroot -vvv -f < create.sql 即可创建该函数
使用方式
(1) 新建包含散列点集合的表,其中x,y代表点的坐标
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_minpoly( group_concat( concat('(',x,',',y,')') ) ) from zhao;
+---------------------------------------------------------------------------------------------+
| gclusterdb.f_minpoly( group_concat( concat('(',x,',',y,')') ) ) |
+---------------------------------------------------------------------------------------------+
| (-13.0000,31.0000),(19.0000,-41.0000),(85.0000,36.0000),(38.0000,74.0000),(23.0000,62.0000) |
+---------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.10)
注意:返回结果是若干元组,这些元组是所求多边形顶点坐标。
验证是否真的覆盖
(1) 将点集和所求的圆在画布上画出来, 可见该圆满足条件
(1) 再多尝试一些场景
参考文件
(1) 注: 该版本为centos8环境下编译。
(2) 文件下载:minpoly.pyo
链接:pan.baidu.com/s/14yl73-Jk… 提取码:w287
原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。