本文来源于阿里云社区电子书《阿里云产品四月刊》
《阿里云产品四月刊》—Ganos H3 地理网格能力解析与最佳实践(1)https://developer.aliyun.com/article/1554160
对象打码
数据入库后,我们可以对点数据进行打码。Ganos H3 提供了多种编码方式,比如通过指定经纬度、标准 H3 字符串、Integer 类型 H3 编码、二进制类型 H3 编码,以及直接从Point 类型转换为H3 等方式。详细内容请参考文档:ST_H3FromText,ST_H3FromInt, ST_AsH3Grid,ST_H3FromLatLng 等。
这里我们使用的是 ST_H3FromLatLng 函数,用户通过指定将经纬度和目标层级可以直接获得 H3 编码。比入下面 SQL 语句就是从 FOIL 表中的 lat 和 lon 字段,生成第 13 层级的 H3 编码,并保存在 h3_lev13 列中,并通过 ST_AsText 函数查询具体 h3 编码。
-- Level 13UPDATE FOIL2013 SET h3_lev13 = ST_H3FromLatLng(lat,lon,13);-- 查询 SELECT id,lon,lat,ST_AsText(h3_lev13) as h3 FROM FOIL2013 LIMIT 100;
查询结果如下图:
网格聚合
使用网格的一个典型场景就是对空间数据按照格网码进行空间聚合统计分析,从而获取 热力图等专题地图信息。比如下面我们就是根据 h3_lev13 列中的 h3 编码,从 FOIL23 表格中统计出每个网格内的点数量(count(*)):
-- 按 照 h3_lev13 进 行 统 计 CREATE TABLE h3_count_lev13 ASSELECT ST_AsText(h3_lev13) AS h3code,count(*) FROM FOIL2013 GROUP BY h3_lev13;-- 查 询 统 计 结 果 SELECT ST_AsText(h3_lev13), ST_AsText(geometry),count FROM h3_count_lev13 order by count desc;
输出结果:
网格查询
Ganos H3 提供了多种基于 H3 编码的操作,比如下面我们可以通过 ST_GridDistance 方法获取 FOIL23 中所有的与空间位置(40.71481749,-73.99100368)对应格网的距离小于 10 的格网点:
SELECT ★ FROM foi1201 3WHEREST GridDi stance (ST_ H3F romLatLng(40.71481749, - 73.9910036 8, 13) , h3 lev13) <10;
输出结果如下:
网格可视化
Ganos 支持像几何数据一样可视化 H3 网格,即可以把 H3 网格转化为矢量瓦片,再由前端渲染查看。Ganos 提供了原生 H3 网格 MVT 函数和索引,用户可以很便捷地查询和可视化 H3 网格及其包含的统计信息。值得一提的是,Ganos 支持可视化动态生成的H3 网格,比如用户想可视化层级为 10 的 H3 网格,但是表格中并没有保存层级为 10 的H3 网格,此时可以使用 ST_AsMVT 加ST_AsMVTGeom(ST_H3FromLatLng(lat, lon, 10), ...)的命令来动态生成层级为 10 的 H3 网格的可视化结果,但是在效率上会不如事先保存 H3 网格,因此下面主要介绍如何可视化保存在表格中的 H3 网格。
创建 H3 网格的索引 SQL 指令如下(创建索引对可视化并不是必须的,但能有效提升可视化效率):
CREATE INDEX ON h3_count_lev13 USING GIST(h3_lev13);
下面的 SQL 指令是根据 H3 网格获取编号为(14,4826,6157)的矢量瓦片,该指令和获取基于矢量数据的矢量瓦片的指令基本一致。
SELECT ST_ AsMVT (tile) FROM ( SELECT ST_ AsMVTGeom(h3_ lev13, ST_ Transform(ST_ TileEnvelope (14, 4826, 6157),4326) ) AS grid, count FROM h3_ count_ lev13 WHERE h3_ lev13 && ST Transform(ST_ TileEnvelope (14 4826, 6157),4326) ) AS tile;
下面的动图展示了在前端实时渲染在数据库端动态查询 H3 网格的矢量瓦片的结果,网格的颜色是根据网格对应的统计值动态决定的。
前端部分只需要一个 Python 脚本和一个 HTML 文件,启动时只需要运行该 Python 脚本和打开浏览器输入 localhost:5100 即可看到结果。Python 脚本会根据用户鼠标在地图上的位置和缩放层级自动生成相应的 SQL 查询发送给数据库,然后将数据库的查询
结果显示在网页上。前端的具体代码见附录部分。
技术优势
相比 pg-h3 等开源产品,Ganos H3 具有如下技术优势:
- 支持更加丰富的打码方式,比如用户可以直接将 Ganos 的点、线、面类型转换为H3 编码
- Ganos H3 在打码效率和格网查询效率上都进行了大量性能优化。
- Ganos H3 支持与其他 Ganos 模型实现联合查询分析,比支持将几何(geometry) 类型直接转换为 h3 编码,或者使用 h3 与栅格(raster)模型进行基于格网的像素统计等。
- Ganos H3 基于 PolarDB 底层的多态分层存储,可以实现基于 OSS 的海量数据点的打码与存储,显著降低存储成本。
总结
本文重点介绍了 Ganos H3 地理网格的相关能力,并基于一个最佳实践介绍了如何使用
H3 地理网格进行矢量数据的聚合、空间关系判断与可视化。地理网格是移动对象相关应用场景的重要支撑,它与轨迹、矢量、栅格等数据类型融合之后可以带来十分巨大的 业务价值与想象空间。Ganos 作为全球首个支持移动对象(MOD)的数据库,相关能力已经在交通、物流、出行、汽车等多个客户侧得到有效验证。相较于传统中间键或业 务代码实现的方式,Ganos 从数据库系统最底层为大规模移动对象提供时空处理框架, 计算效率与综合成本均有大规模改善。未来 Ganos 还将提供更多高效的面向移动对象的场景的库内原生分析能力,推动相关领域的空间信息应用全面走向“在线化”。
《阿里云产品四月刊》—Ganos H3 地理网格能力解析与最佳实践(3)https://developer.aliyun.com/article/1554158