前言
PolarDB是阿里云自研的云原生关系型数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。其中,PolarDB PostgreSQL 版100%兼容 PostgreSQL,高度兼容Oracle语法。Ganos是PolarDB PostgreSQL版提供的新一代云原生时空数据库引擎,在100%兼容PostGIS开源空间数据库基础上,同时具备几何、栅格、轨迹、表面网格、体网格、3D实景、点云、路径、地理网格、快显10大核心引擎完整能力,为数据库构建了面向物理世界时空多模多态数据的混合存储、查询、分析一体化能力。
本文介绍的Ganos实时电子围栏计算能力,依托阿里云云原生关系型数据库PolarDB PostgreSQL版建设输出。
业务场景
什么是电子围栏
电子围栏是一种基于位置的技术。电子围栏不是真正的围栏,而是一些使用多边形或折线定义的虚拟的地理边界,当使用全球定位系统 ( GPS )、射频识别 ( RFID )、Wi-Fi或蜂窝数据移动的应用程序或设备在进入或离开该边界时,会触发有针对性的活动。这个边界被称为电子地理围栏。电子围栏可以围绕地理位置进行创建,小到建筑物、商店或商场,大到城市或整个国家。
电子围栏应用
电子围栏在现实生活中有很多实际应用:
在交通物流行业中,电子围栏可以用于车辆运行状态监控,当司机偏离指定路线时,电子围栏可以向系统发出警示,便于及时处理风险情况;当车辆进入到某些指定区域,可以进行车辆驶入提醒或用于盲区会车提醒服务等。
在禁行/禁飞区域管理中:如机场周围一定范围内设置为无人机禁飞区,当有无人机进入该区域时,电子围栏自动发出风险预警,预防航空危险事件发生。应急事件:台风、龙卷风等恶劣天气下,触发恶劣天气周边的电子围栏系统,当车辆或船只进入恶劣天气影响区域时,自动进行告警。在营销场景中:当客户进入商家设置的电子围栏时,可以自动进行营销活动的推送,如优惠券推送等,提升营销效率。
电子围栏其他场景还包括:
- 物联网安防类:需要监护的儿童或老人离开预先设置的电子围栏时,进行报警操作,防止走丢。
- 执法:如果被监控的个人未经事先授权离开住所,设备可以向当局发出警报。
- 家庭自动化或智能家居: 当房主的智能手机进入房屋的电子围栏范围时,恒温器可以自行调节到预定的温度或灯可以自动打开。
- 动物追踪:宠物主人和农民可以设置电子围栏,当动物离开边界时发出警报,从而让他们能够追踪动物。
- 资产管理:公司网络管理员可以在公司设备离开场所时设置警报,以便他们能够找到其位置并将其锁定,以防止未经授权的用户(例如小偷)滥用。
- 人力资源安全管理:如果员工试图进入未经授权的地理围栏区域,员工的智能卡可以向安全部门发送警报。
总之,实时电子围栏技术为企业和开发者提供了一种强大的工具,能够更好地管理和利用地理空间数据,提高与位置相关的决策效率和准确性。
最佳实践
技术实现
Ganos 实时电子围栏依托于阿里云实时计算Flink版产品,通过增加Flink引擎中相关的空间计算函数以及内存空间索引,来实现高性能,实时的电子围栏运算。
数据源可使用Flink数据源,如Kafka等。
电子围栏表预先存储在PolarDB中,可定期进行刷新操作。电子围栏运算结果也写回到PolarDB中。
准备工作
为了使用阿里云实时计算Flink版相关产品,需要在阿里云控制台中开通相关服务。
为了允许Flink的工作空间访问PolarDB数据库,需要确保Flink和PolarDB处于同一个region中,并将Flink工作空间的网段地址注册为PolarDB的白名单。
注册空间计算函数
Ganos空间计算相关能力封装在一个jar包中,该功能正在邀测中,请提工单进行获取。
获取jar包后,在Flink工作空间中进行上传操作(如图中+号位置),Flink会自动注册相关的函数,并展示在左侧的函数列表中。
电子围栏表
电子围栏表是预先定义好的电子围栏,如禁停区,禁行区等,数据以几何对象的方式存储在PolarDB中。
生成电子围栏
在PolarDB中生成10000随机多边形电子围栏。生成的方式为先生成10000随机点,并以这些随机点为中心,进行半径为0.01的缓冲区生成。
-- 生成随机浮点数 CREATE OR REPLACE FUNCTION test_random_float(low float, high float) RETURNS float AS $$ BEGIN RETURN random() * (high-low) + low; END; $$ LANGUAGE 'plpgsql' STRICT; -- 生成随机点 CREATE OR REPLACE FUNCTION test_random_geogpoint(lowx float, highx float, lowy float, highy float) RETURNS geometry AS $$ BEGIN RETURN st_setsrid(st_point(test_random_float(lowx, highx), test_random_float(lowy, highy)),4326); END; $$ LANGUAGE 'plpgsql' STRICT; -- 电子围栏表 CREATE TABLE IF NOT EXISTS geofencings ( name VARCHAR(100) PRIMARY KEY, geofencing Geometry ); -- 插入10000条随机电子围栏 INSERT INTO geofencings SELECT 'g_' || s, test_random_geogpoint(129, 130, 49, 50) FROM generate_series(1, 10000) s; -- 生成半径大约1公里的缓冲区 Update geofencings set geofencing = st_buffer(geofencing, 0.01);
注册为Flink维表
在Flink SQL中将PolarDB中表注册为Flink的围栏表。
电子围栏的信息来源于PolarDB中的geofencings 表。
根据Flink的语法,在进行join操作时指定了等号操作的谓词为包含(CONTAINS)。
CREATE TEMPORARY TABLE geofencings ( name STRING NOT NULL, geofencing STRING NOT NULL, PRIMARY KEY (name) NOT ENFORCED ) WITH ( 'connector' = 'polardb', 'jdbcUrl' = 'jdbc:postgresql://pc-2zei5iq60*********.rwlb.rds.aliyuncs.com:1921/ganos', 'username' = 'ganos', 'password' = '******', 'query' = 'SELECT name, ST_AsText(geofencing) FROM geofencings;', 'join.columnName' = 'geofencing', 'join.predicate' = 'CONTAINS' );
计算结果
实时电子围栏的计算结果同样存到PolarDB中。
计算结果表
在PolarDB中创建电子围栏计算的结果表,记录符合电子围栏要求的点的id,围栏名称以及点坐标信息。
CREATE TABLE IF NOT EXISTS point_in_geofencing ( id serial PRIMARY KEY, -- 主键 point_id VARCHAR(100), -- 点id geofencing_name VARCHAR(100), -- 围栏名称 point Geometry -- 点 );
注册为Flink表
在Flink SQL中将PolarDB中结果表注册为Flink的结果表。
查询结果以SQL的方式写入到PolarDB中。
CREATE TEMPORARY TABLE point_in_geofencing ( point_id STRING NOT NULL, geofencing_name STRING NOT NULL, point STRING NOT NULL ) WITH ( 'connector' = 'polardb', 'jdbcUrl' = 'jdbc:postgresql://pc-2zei5iq60*********.rwlb.rds.aliyuncs.com:1921/ganos', 'username' = 'postgres', 'password' = '*****', 'query' = 'insert into point_in_geofencing(point_id,geofencing_name,point) values(?,?,ST_GeomFromText(?));', 'batchSize' = '100' -- 每批插入100条记录 );
模拟数据源
以下示例以datagen作为数据源表,每秒产生10万条记录,记录包含随机id,随机经度,随机纬度和时间戳。
CREATE TEMPORARY TABLE points ( id STRING not null, lng DOUBLE not null, -- 经度 lat DOUBLE not null, -- 纬度 proctime AS PROCTIME(), -- 时间戳 PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '100000', 'fields.lng.kind' = 'random', 'fields.lng.min' = '129', 'fields.lng.max' = '130', 'fields.lat.kind' = 'random', 'fields.lat.min' = '49', 'fields.lat.max' = '50', 'fields.id.kind' = 'random', 'fields.id.length' = '5' );
电子围栏计算
在Flink SQL中执行Join操作,JOIN的谓词(preidacte)在创建表定义时被设置为CONTAINS,即执行 geofencings.geofencing CONTAINS ST_MakePoint(lng,lat)
判断,结果写入到PolarDB point_in_geofencing 表中:
INSERT INTO point_in_geofencing SELECT points.id, geofencings.name, ST_MakePoint(lng,lat) FROM points JOIN geofencings FOR SYSTEM_TIME AS OF points.proctime ON geofencings.geofencing = ST_MakePoint(lng,lat);
计算性能
在以上场景中,监控显示数据库写入TPS大约为300/秒(即每秒30000条记录),对于一个2c4g的PolarDB企业版实例CPU使用率约10%,负载压力仍有余量。
总结
本文重点介绍了PolarDB Ganos实时电子围栏计算场景。相较于传统中间键或业务代码实现电子围栏方式,Ganos从实时计算层为大规模移动对象提供标准时空处理框架,计算效率与综合成本均有大规模改善。未来Ganos还将提供更多高效的面向移动对象的实时计算分析能力,推动相关领域的空间信息应用全面走向“在线化”。
试用体验
欢迎访问PolarDB免费试用页面,选择试用“云原生数据库PolarDB PostgreSQL版”,体验PolarDB Ganos的实时时空计算能力。