本文介紹了地理網格模型的用途、基本構成和快速入門等內容。
模型用途
簡介
地理網格模型是一種統(tǒng)一、簡單的地理空間劃分和定位參考系統(tǒng),依據(jù)統(tǒng)一規(guī)則,將地面區(qū)域按照一定經緯度或地面距離進行連續(xù)分割,并將空間不確定性控制在一定范圍內,形成規(guī)則多邊形,每個多邊形均稱為格網單元,從而構成分級、分層次的多級格網體系,實現(xiàn)地面空間離散化,并賦予統(tǒng)一編碼。
Ganos GeomGrid是對象關系型數(shù)據(jù)庫PostgreSQL兼容版本(PolarDB PostgreSQL版)的一個時空引擎擴展,用于表達和處理地理網格對象。此模型主要提供了地理網格以及地理網格數(shù)組類型的空間操作函數(shù),空間關系判斷函數(shù),以及與Ganos中其他數(shù)據(jù)類型的轉換計算函數(shù)
GeomGrid在Ganos中指代地理網格數(shù)據(jù)類型。地理網格是一種再現(xiàn)地球表面的多邊形網格單元集合,可以用于表示地物在地理空間中的位置信息,融合其他各類時空數(shù)據(jù)。每個網格單元都會進行編碼,網格與編碼是一一對應的。三維地理網格不只考慮經緯度,還把高度維納入剖分和編碼范圍。
GeomGrid模塊目前涵蓋GeoSOT和H3兩種地理網格。GeoSOT是中國提出的一套地球空間剖分理論,并在此基礎上發(fā)展出的一種離散化、多尺度區(qū)域位置標識體系。H3是Uber研發(fā)的一種覆蓋全球表面的二維地理網格,采用的基本網格是正六邊形。
功能概述
GeomGrid支持地理網格的輸入輸出,空間操作和空間關系判斷:
支持Text、Bytea、Geometry、Meshgeom、Sfmesh、Vomesh等類型與GeomGrid類型的互相轉換。
支持網格層級獲取,網格坐標獲取,父子節(jié)點計算,網格合并和網格剖分等空間查詢操作。
支持geomgrid與geometry、meshgeom、sfmesh、vomesh以及gemogrid類型之間的空間關系判斷操作。
更多內容請參見GeomGrid SQL參考。
主要業(yè)務場景
Ganos GeomGrid可支持多種業(yè)務場景,最常見的包括以下幾個:
網格查詢
給定一個網格或網格數(shù)組,查詢是否與數(shù)據(jù)庫中存儲的網格相交。支持退化網格,即可以通過子網格查出父網格,反之亦然。例如在停放共享單車時,停放區(qū)的網格碼存在數(shù)據(jù)庫中,而用戶的位置可以轉換為網格碼到庫中搜索,找出最近的停放區(qū)。網格查詢也常用于關聯(lián)不同的圖層,把不同圖層的地物轉化為網格存儲,然后根據(jù)某一網格查出所有相關圖層的地物。
網格聚合
物流、快送等行業(yè)中經常以網格為單位統(tǒng)計時空要素。例如船或車的軌跡數(shù)據(jù)可經過網格聚合生成熱力圖,先把軌跡轉化為網格表達,然后統(tǒng)計每個網格中的軌跡數(shù)量作為熱力進行繪制。再例如以街道為單位收集的人口數(shù)據(jù)可分配至網格進行可視化表達。
網格尋路
無人機在復雜環(huán)境下可以借助三維網格進行航線規(guī)劃,通過網格設置空間障礙物的穿越開銷,借助路徑規(guī)劃算法可得到網格路徑。
基本構成
概述
基于GeoSOT和H3地理網格的理論框架,在Ganos GeomGrid模塊中,兩種網格分別被實現(xiàn)成GeomGrid數(shù)據(jù)類型和H3Grid數(shù)據(jù)類型。
編碼
GeoSOT
GeoSOT將地球通過簡單投影變換到平面,將180°×360° 地球表面空間擴展為512°×512°,并將該空間作為第0級剖分面片,且面片中心與赤道和本初子午線的交點重合。在此基礎上,對第0級剖分面片進行遞歸四叉剖分,直到32級。這樣,整個地球表面經緯度空間在經線方向和緯線方向可嚴格的整型二分,由此將整個地球分割為大到全球、小到厘米級的整度、整分和整秒的層次網格。
GeoSOT二維網格最長的編碼位為32位四進制數(shù)值編碼。第1-9位是度級網格編碼,第10-15位是分級網格編碼,第16-21位是秒級網格編碼,第22-32位是秒以下網格編碼,編碼長度即為網格層級。
經度和緯度均采用A°B′C.D″
的表達形式,將度由十進制數(shù)轉換成8bit的二進制數(shù)A2;將分由十進制數(shù)轉換成6bit的二進制數(shù)B2;將秒由十進制數(shù)轉換成6bit的二進制數(shù)C2;將秒的小數(shù)部分由十進制數(shù)轉換成11bit的二進制數(shù)D2;將二進制數(shù)A2、B2、C2 以及D2順次拼接為31bit的二進制數(shù)。將緯度前置,經度后置,采用莫頓交叉的方式生成62位的混合代碼。在混合代碼前加上G0、G1、G2或G3即可得到網格代碼。G0對應東北半球,G1對應西北半球,G2對應東南半球,G3對應西南半球。
GeoSOT三維網格在二維網格的基礎上增加了高度域。為保證高度域的劃分與經緯度一致,對應地表1o 網格,地面向上延伸至高空256個網格,向下延伸至地心256個網格。而后對應不同層級進行二分處理得到垂直方向的層數(shù),并以此進行二進制編碼,與經緯度編碼莫頓交叉形成三維網格編碼。
H3
H3采用的投影方式是以二十面體近似地球球體,如下圖所示,這個二十面體的每一個面都是球面三角形,有12個頂點,稱為球形二十面體。
如下圖所示,H3在每個三角面上都劃分相同排列方式的六邊形,進而將全球劃分成122個基本單元,然后對每個基本單元再進行六邊形剖分。
H3從122個基本單元開始,對每個單元遞歸地細分為7個子單元,如下圖所示,以編號為20的基本單元為例進行分解。
H3的編碼值最多占63個比特位,可以用一個長整型表示,通常序列化為十六進制字符串。H3編碼的位布局提供了一個相對緊湊的結構,用于存儲有關給定索引的信息并定義其地理位置,如下圖所示。
索引
索引通過將數(shù)據(jù)組織到搜索樹中來加速搜索,避免大數(shù)據(jù)量時全局“順序掃描”帶來的延遲。GeomGrid模塊適用的索引主要包括以下幾種:
索引名稱 | 索引簡介 | 索引特點 |
Btree | Btree索引作用于地理網格類型,通過對網格編碼的大小比對進行查找。 | Btree是數(shù)據(jù)庫最通用的索引方法,可以加速的查詢類型也最多。 |
GiST | GiST索引作用于地理網格類型,提供地理網格外包框的相交和包含查詢。 | GiST此處實現(xiàn)Rtree的結構,對于網格空間查詢效率很高。 |
GridGin | GridGin索引拓展了Gin索引,可作用于地理網格類型和地理網格數(shù)組類型,提供了相交和包含關系判斷,并進行了優(yōu)化處理。 | GridGin支持退化網格查詢,并可以加速網格聚合計算。 |
快速入門
簡介
快速入門文檔幫助用戶快速理解 Ganos GeomGrid 引擎的基本用法,包括擴展創(chuàng)建、建表、插入數(shù)據(jù)、計算網格碼、創(chuàng)建索引、查詢等內容。
語法說明
創(chuàng)建擴展。
CREATE EXTENSION Ganos_GeomGrid CASCADE;
說明建議將擴展安裝在public模式下,避免權限問題。
CREATE extension ganos_geometry WITH schema public cascade;
GeoSOT網格操作。
創(chuàng)建具有網格碼的表。
-- 可以為幾何 CREATE TABLE t_grid(id integer, geom geometry, -- 幾何對象 grid1 geomgrid[], -- 網格碼,精度1 grid2 geomgrid[], -- 網格碼,精度2 grid3 geomgrid[] -- 網格碼,精度3 );
插入數(shù)據(jù)。
--插入點數(shù)據(jù) INSERT INTO t_grid(id, geom) VALUES (1, ST_GeomFromText('POINT(116.31522216796875 39.910277777777778)', 4490)), (2, ST_GeomFromText('POINT(116.31522217796875 39.910277776777778)', 4490)), (3, ST_GeomFromText('POINT(116.31522217797875 39.910277776787778)', 4490)), (4, ST_GeomFromText('POINT(116.31522227796875 39.910277776775778)', 4490)); -- 插入面數(shù)據(jù) INSERT INTO t_grid(id, geom) VALUES(5, 'SRID=4490;POLYGON((-0.08077 -0.02814, 0.0482 -0.03, 0.07426 0.03724, -0.08077 -0.02814))'::geometry); -- 插入三維數(shù)據(jù) INSERT INTO t_grid(id, geom) VALUES(6, 'SRID=4490;CIRCULARSTRING Z (-63.597471 44.8071 20,-63.597 44.807 0,-63.5974 44.807 40)'::geometry);
計算網格碼。
-- 創(chuàng)建不同精度的網格碼 UPDATE t_grid SET grid1 = ST_AsGrid(geom, 10), grid2 = ST_AsGrid(geom, 15), grid3 = ST_AsGrid(geom, 26); -- 生成退化網格碼 UPDATE t_grid SET grid1 = st_asgrid(geom, 18, true) WHERE id = 5; -- 生成三維網格碼 UPDATE t_grid SET grid1 = st_as3dgrid(geom, 25) WHERE id=6;
對網格碼創(chuàng)建索引。
-- 針對不同精度的網格碼創(chuàng)建GIN索引 CREATE INDEX idx_grid_gin1 ON t_grid USING GIN(grid1); CREATE INDEX idx_grid_gin2 ON t_grid USING GIN(grid2); CREATE INDEX idx_grid_gin3 ON t_grid USING GIN(grid3);
查詢。
-- 完全在某個網格中 SELECT id FROM t_grid WHERE grid2 = ARRAY[ST_GridFromText('G001310322230230')]; -- 和某個網格相交 SELECT id FROM t_grid WHERE grid3 @> ARRAY[ST_GridFromText('G00131032223023031031033223')]; -- 和某些網格相交 SELECT id FROM t_grid WHERE grid3 && ARRAY[ST_GridFromText('G00131032223023031031211001'), ST_GridFromText('G00131032223023031031211111')]; -- 和某個幾何對象在網格上相交 SELECT id FROM t_grid WHERE grid3 && ST_AsGrid( ST_GeomFromText('LINESTRING(116.31522216796875 39.910277777777778, 116.31522217797875 39.910277776787778)', 4490), 26);
H3網格操作。
建表。
CREATE TABLE h3_grid( id integer, geom geometry, -- 幾何對象 h3 h3grid[] -- H3對象類型 );
插入數(shù)據(jù)。
INSERT INTO h3_grid VALUES (1, 'POINT(102.5 25.7)'::geometry); INSERT INTO h3_grid VALUES (2, 'POLYGON((-0.08077 -0.02814, 0.0482 -0.03, 0.07426 0.03724, -0.08077 -0.02814)'::geometry);
計算H3網格碼。
-- 普通網格碼 UPDATE h3_grid SET h3 = ST_AsH3Grid(geom, 7); -- 退化網格碼 UPDATE h3_grid SET h3 = ST_AsH3Grid(geom, 7, true);
建立索引。
CREATE INDEX h3_grid_btree ON h3_grid(h3);
查詢。
-- 顯示H3編碼 SELECT st_astext(h3[1]) FROM h3_grid; -- 搜索 SELECT * FROM h3_grid WHERE h3 > ARRAY[ST_H3FromText('884a126689fffff')];
刪除擴展(可選)。
DROP EXTENSION Ganos_GeomGrid CASCADE;
SQL參考
詳細SQL手冊請參見GeomGrid SQL參考。