本文為您介紹GanosBase在即時電子圍欄計算方面的實現方式。這是一種基於位置技術的解決方案,旨在建立虛擬地理邊界,廣泛應用於交通安全、應急管理、營銷推廣等多個領域。通過與Realtime Compute for Apache Flink整合,PolarDB GanosBase能夠高效地執行空間計算和資料分析,從而顯著提升地理柵欄應用的即時性和準確性。
關於電子圍欄
電子圍欄是一種基於位置的技術。電子圍欄並不是真正的圍欄,而是由多邊形或折線定義的虛擬地理邊界。當應用程式或裝置使用全球定位系統 (GPS)、射頻識別 (RFID)、Wi-Fi或蜂窩資料時,若進入或離開該邊界,將觸發特定的活動。該邊界被稱為電子地理柵欄。電子圍欄可以圍繞特定地理位置進行建立,其範圍可以從建築物、商店或商場等小型地區,擴充至城市或整個國家等大型地區。

應用情境
電子圍欄在現實生活中有很多實際應用:
交通物流行業
電子圍欄可用於車輛運行狀態的監控。當司機偏離指定路線時,電子圍欄能夠向系統發出警示,以便及時處理潛在風險情況。此外,當車輛進入某些特定地區時,系統可以提供車輛駛入提醒或用於盲區會車的提醒服務等功能。
禁行/禁飛地區管理
在機場周圍的特定範圍內設定無人機禁飛區。當無人機進入該地區時,電子圍欄將自動發出風險預警,以預防航空安全事件的發生。
應急事件
在颱風、龍捲風等惡劣天氣條件下,電子圍欄系統將被啟用。當車輛或船隻進入受惡劣天氣影響的地區時,系統將自動發出警報。
營銷情境
當客戶進入商家設定的電子圍欄時,將自動推送營銷活動,例如優惠券推送等,從而提升營銷效率。
電子圍欄其他情境還包括:
物聯網安防類:當需要監護的兒童或老人離開預先設定的電子圍欄時,系統將觸發警示以防止其走失。
執法:若被監控的個人在未經授權的情況下離開住所,裝置將向相關當局發出警報。
家庭自動化或智能家居:當房主的智能手機進入房屋的電子圍欄範圍時,恒溫器能夠自動調節至預定溫度或燈光可自動開啟。
動物追蹤:寵物主人和農民可以設定電子圍欄,當動物超出設定邊界時將觸發警報,從而使他們能夠即時追蹤動物的動態。
資產管理:公司網路管理員可以在公司裝置離開指定場所時設定警報,以便能夠追蹤其位置並進行鎖定,從而防止未經授權的使用者(例如小偷)對其進行濫用。
人力資源安全管理:如果員工試圖進入未經授權的地理柵欄地區,員工的智慧卡將向安全部門發送警報。
綜上,即時電子圍欄技術為企業和開發人員提供一種強大的工具,能夠更有效地管理和利用地理空間資料,從而提高與位置相關的決策效率和準確性。
最佳實務
GanosBase即時電子圍欄與Realtime Compute for Apache Flink整合,增加Flink引擎中相關的空間計算函數及記憶體空間索引,實現高效能、即時的電子圍欄計算。資料來源可採用Flink支援的資料來源,例如Kafka等。電子圍欄表預先儲存在PolarDB中,可定期進行重新整理操作。同時,電子圍欄運算結果也寫回到PolarDB中。
準備工作
為使用Realtime Compute for Apache Flink產品,請登入Realtime Compute控制台,購買Realtime Compute for Apache Flink執行個體,詳細操作請參考開通Realtime ComputeFlink版。
為使Realtime Compute for Apache Flink的工作空間能夠訪問PolarDB資料庫,建議Realtime Compute for Apache Flink的地區和專用網路和PolarDB叢集保持一致,並將Realtime Compute for Apache Flink工作空間的網段地址添加至PolarDB叢集白名單,如何添加白名單請參考設定叢集白名單。
註冊空間計算函數
將GanosBase空間計算函數上傳至Realtime Compute for Apache Flink工作空間,Realtime Compute for Apache Flink將自動註冊相關函數,並在左側的函數列表中進行展示。請聯絡我們擷取空間計算函數,上傳至Realtime Compute for Apache 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中的電子圍欄表註冊為Realtime Compute for Apache 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%,表明負載壓力仍具有一定的餘量。
總結
相較於傳統中介軟體或業務代碼實現電子圍欄的方式,GanosBase從Realtime Compute層為大規模移動對象提供了標準的時空處理架構,這在計算效率和綜合成本上均實現了顯著改善。未來,GanosBase還將提供更多高效的面向移動對象的Realtime Compute分析能力,推動相關領域的空間資訊應用全面向“線上化”轉型。
試用體驗
您可以訪問PolarDB免費試用頁面,選擇試用“雲原生資料庫PolarDB PostgreSQL版”,體驗GanosBase的即時時空計算能力。