基于Ganos的实时时空计算:电子围栏计算

本文为您介绍Ganos在实时电子围栏计算方面的实现方式。这是一种基于位置技术的解决方案,旨在创建虚拟地理边界,广泛应用于交通安全、应急管理、营销推广等多个领域。通过与实时计算 Flink 版集成,PolarDB Ganos能够高效地执行空间计算和数据分析,从而显著提升地理围栏应用的实时性和准确性。

关于电子围栏

电子围栏是一种基于位置的技术。电子围栏并不是真正的围栏,而是由多边形或折线定义的虚拟地理边界。当应用程序或设备使用全球定位系统 (GPS)、射频识别 (RFID)、Wi-Fi或蜂窝数据时,若进入或离开该边界,将触发特定的活动。该边界被称为电子地理围栏。电子围栏可以围绕特定地理位置进行创建,其范围可以从建筑物、商店或商场等小型区域,扩展至城市或整个国家等大型区域。

image

应用场景

电子围栏在现实生活中有很多实际应用:

  • 交通物流行业

    电子围栏可用于车辆运行状态的监控。当司机偏离指定路线时,电子围栏能够向系统发出警示,以便及时处理潜在风险情况。此外,当车辆进入某些特定区域时,系统可以提供车辆驶入提醒或用于盲区会车的提醒服务等功能。

    image
  • 禁行/禁飞区域管理

    在机场周围的特定范围内设定无人机禁飞区。当无人机进入该区域时,电子围栏将自动发出风险预警,以预防航空安全事件的发生。

  • 应急事件

    在台风、龙卷风等恶劣天气条件下,电子围栏系统将被激活。当车辆或船只进入受恶劣天气影响的区域时,系统将自动发出警报。

  • 营销场景

    当客户进入商家设置的电子围栏时,将自动推送营销活动,例如优惠券推送等,从而提升营销效率。

电子围栏其他场景还包括:

  • 物联网安防类:当需要监护的儿童或老人离开预先设置的电子围栏时,系统将触发报警以防止其走失。

  • 执法:若被监控的个人在未经授权的情况下离开住所,设备将向相关当局发出警报。

  • 家庭自动化或智能家居:当房主的智能手机进入房屋的电子围栏范围时,恒温器能够自动调节至预定温度或灯光可自动开启。

  • 动物追踪:宠物主人和农民可以设置电子围栏,当动物超出设定边界时将触发警报,从而使他们能够实时追踪动物的动态。

  • 资产管理:公司网络管理员可以在公司设备离开指定场所时设置警报,以便能够追踪其位置并进行锁定,从而防止未经授权的用户(例如小偷)对其进行滥用。

  • 人力资源安全管理:如果员工试图进入未经授权的地理围栏区域,员工的智能卡将向安全部门发送警报。

综上,实时电子围栏技术为企业和开发者提供一种强大的工具,能够更有效地管理和利用地理空间数据,从而提高与位置相关的决策效率和准确性。

最佳实践

Ganos实时电子围栏与实时计算 Flink 版集成,增加Flink引擎中相关的空间计算函数及内存空间索引,实现高性能、实时的电子围栏计算。数据源可采用Flink支持的数据源,例如Kafka等。电子围栏表预先存储在PolarDB中,可定期进行刷新操作。同时,电子围栏运算结果也写回到PolarDB中。

image

准备工作

为使用实时计算 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)判断,然后将结果写入到PolarDBpoint_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的实时时空计算能力。