本文为您介绍Ganos在实时电子围栏计算方面的实现方式。这是一种基于位置技术的解决方案,旨在创建虚拟地理边界,广泛应用于交通安全、应急管理、营销推广等多个领域。通过与实时计算 Flink 版集成,PolarDB Ganos能够高效地执行空间计算和数据分析,从而显著提升地理围栏应用的实时性和准确性。
关于电子围栏
电子围栏是一种基于位置的技术。电子围栏并不是真正的围栏,而是由多边形或折线定义的虚拟地理边界。当应用程序或设备使用全球定位系统 (GPS)、射频识别 (RFID)、Wi-Fi或蜂窝数据时,若进入或离开该边界,将触发特定的活动。该边界被称为电子地理围栏。电子围栏可以围绕特定地理位置进行创建,其范围可以从建筑物、商店或商场等小型区域,扩展至城市或整个国家等大型区域。
应用场景
电子围栏在现实生活中有很多实际应用:
交通物流行业
电子围栏可用于车辆运行状态的监控。当司机偏离指定路线时,电子围栏能够向系统发出警示,以便及时处理潜在风险情况。此外,当车辆进入某些特定区域时,系统可以提供车辆驶入提醒或用于盲区会车的提醒服务等功能。
禁行/禁飞区域管理
在机场周围的特定范围内设定无人机禁飞区。当无人机进入该区域时,电子围栏将自动发出风险预警,以预防航空安全事件的发生。
应急事件
在台风、龙卷风等恶劣天气条件下,电子围栏系统将被激活。当车辆或船只进入受恶劣天气影响的区域时,系统将自动发出警报。
营销场景
当客户进入商家设置的电子围栏时,将自动推送营销活动,例如优惠券推送等,从而提升营销效率。
电子围栏其他场景还包括:
物联网安防类:当需要监护的儿童或老人离开预先设置的电子围栏时,系统将触发报警以防止其走失。
执法:若被监控的个人在未经授权的情况下离开住所,设备将向相关当局发出警报。
家庭自动化或智能家居:当房主的智能手机进入房屋的电子围栏范围时,恒温器能够自动调节至预定温度或灯光可自动开启。
动物追踪:宠物主人和农民可以设置电子围栏,当动物超出设定边界时将触发警报,从而使他们能够实时追踪动物的动态。
资产管理:公司网络管理员可以在公司设备离开指定场所时设置警报,以便能够追踪其位置并进行锁定,从而防止未经授权的用户(例如小偷)对其进行滥用。
人力资源安全管理:如果员工试图进入未经授权的地理围栏区域,员工的智能卡将向安全部门发送警报。
综上,实时电子围栏技术为企业和开发者提供一种强大的工具,能够更有效地管理和利用地理空间数据,从而提高与位置相关的决策效率和准确性。
最佳实践
Ganos实时电子围栏与实时计算 Flink 版集成,增加Flink引擎中相关的空间计算函数及内存空间索引,实现高性能、实时的电子围栏计算。数据源可采用Flink支持的数据源,例如Kafka等。电子围栏表预先存储在PolarDB中,可定期进行刷新操作。同时,电子围栏运算结果也写回到PolarDB中。
准备工作
为使用实时计算 Flink 版产品,请登录实时计算控制台,购买实时计算 Flink 版实例,详细操作请参考开通实时计算Flink版。
为使实时计算 Flink 版的工作空间能够访问PolarDB数据库,建议实时计算 Flink 版的地域和专有网络和PolarDB集群保持一致,并将实时计算 Flink 版工作空间的网段地址添加至PolarDB集群白名单,如何添加白名单请参考设置集群白名单。
注册空间计算函数
将Ganos空间计算函数上传至实时计算 Flink 版工作空间,实时计算 Flink 版将自动注册相关函数,并在左侧的函数列表中进行展示。请联系我们获取空间计算函数,上传至实时计算 Flink 版工作空间详细操作请参考管理自定义函数(UDF)。
电子围栏表
电子围栏表是预先定义的电子围栏,例如禁停区和禁行区等,其数据以几何对象的形式存储在PolarDB中。
生成电子围栏表
在PolarDB中生成10,000个随机多边形电子围栏。生成方法为首先生成10,000个随机点,并以这些随机点为中心,创建半径为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的语法,在进行连接操作时,指定等号操作的谓词为包含(CONTAINS)。
CREATE TEMPORARY TABLE geofencings (
name STRING NOT NULL,
geofencing STRING NOT NULL,
PRIMARY KEY (name) NOT ENFORCED
) WITH (
'connector' = 'polardb',
'jdbcUrl' = 'jdbc:postgresql://<yourHostname>:<yourPort>/<dbname>',
'username' = '<yourUserName>',
'password' = '<yourPassWord>',
'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://<yourHostname>:<yourPort>/<dbname>',
'username' = '<yourUserName>',
'password' = '<yourPassWord>',
'query' = 'INSERT INTO point_in_geofencing(point_id,geofencing_name,point) values(?,?,ST_GeomFromText(?));',
'batchSize' = '100' -- 每批插入100条记录
);
模拟计算源
以下Flink SQL使用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次/秒(即每秒30,000条记录)。对于一台配置为2核4 GB的PolarDB企业版集群,其CPU使用率约为10%,表明负载压力仍具有一定的余量。
总结
相较于传统中间件或业务代码实现电子围栏的方式,Ganos从实时计算层为大规模移动对象提供了标准的时空处理框架,这在计算效率和综合成本上均实现了显著改善。未来,Ganos还将提供更多高效的面向移动对象的实时计算分析能力,推动相关领域的空间信息应用全面向“在线化”转型。
试用体验
您可以访问PolarDB免费试用页面,选择试用“云原生数据库PolarDB PostgreSQL版”,体验Ganos的实时时空计算能力。