本文来源于阿里云社区电子书《阿里云产品四月刊》
Ganos H3 地理网格能力解析与最佳实践
关于 Ganos
Ganos 是阿里云数据库产品事业部联合阿里云飞天数据库与存储实验室联合共同研发的新一代云原生位置智能引擎,它将时空数据处理能力融入了云原生关系型数据库PolarDB、云原生多模数据库Lindorm、云原生数据仓库AnalyticDB 和云数据库RDS PG 等核心产品中。Ganos 目前拥有几何、栅格、轨迹、表面网格、体网格、3D 实景、点云、路径、地理网格、快显十大核心引擎,为数据库构建了面向新型多模多态时空数据 的存储、查询、分析、服务等一体化能力。
本文介绍的地理网格引擎能力,依托阿里云云原生关系型数据库 PolarDB 建设输出。
关于 Ganos H3 地理网格
地理网格是一种再现地球表面的多边形网格单元集合,可以用于表示地物在地理空间中 的位置信息,融合其他各类时空数据。
地理网格计算一般由粗到细,逐级地分割地球表面,将地球曲面用一定大小的多边形网 格进行近似模拟,其目标是将地理空间的定位和地理特征的描述一体化,并将误差范围
控制在网格单元的范围内。每个网格单元都会进行编码,网格与编码是一一对应的。三 维地理网格不只考虑经纬度,还把高度维纳入剖分和编码范围。
Ganos 地理网格引擎目前涵盖 GeoSOT 和 H3 两种地理网格。GeoSOT 是我国提出的一套地球空间剖分理论,并在此基础上发展出的一种离散化、多尺度区域位置标识体系(关于GeoSOT 网格的最佳实践可参考Ganos 地理网格引擎支撑无人机路径规划能力实践)。H3 是 Uber 研发的一种覆盖全球表面的二维地理网格,采用了一种全球统一的、多层次的六边形网格体系来表示地球表面。
H3 设计独特之处在于其采用六边形结构,相较于传统的四边形或三角形网格,六边形网格具有更均匀分布、邻居关系固定且无方向性等优点,这使得在进行空间数据分析、 路径规划、地理编码以及地理围栏等领域时,能够更加精确和高效地组织和查询地理空 间数据。
利用 Ganos 地理网格的函数可以将不同的空间范围转换为网格编码,可以求出网格编码的空间范围、层级和父子网格。Ganos 支持退化网格计算(如下图),即充分利用网格的层级关系,用更精简的网格组合对空间范围进行表达。此外,Ganos 自研地理网格索引,可用于高效查询网格码以及加速聚合计算。
Ganos H3 地理网格能力解析
业务场景
H3 地理网格技术在诸多业务场景中得到广泛应用,主要包括:
- 物流与出行服务:基于地理网格开展路线规划、区域覆盖分析、配送范围界定、热 点区域发现等功能建设;
- 数据分析:基于地理网格开展人口密度分析、移动用户行为分析、地理市场细分等 大数据分析领域;
- 物联网(IoT):面向智能城市、环境监测、资产追踪等需要实时监控的数据,基于 地理网格进行监测数据空间分布分析的场景;
- 社交网络:基于地理网格构建面向位置服务(LBS)、好友位置分享、事件通知等 社交场景的应用;
- 应急响应与公共服务:基于地理网格开展灾害分布分析、灾害预警热力、应急资源 分布、紧急救援区域划分等;
总之,H3 网格技术为企业和开发者提供了一种强大的工具,能够更好地管理和利用地理空间数据,提高与位置相关的决策效率和准确性。
能力解析
Ganos H3 地理网格包含网格输入/输出,网格父子关系判断,网格路径分析,网格查询等多种能力,地理网格还支持转为 Ganos Geometry 类型,与其它类型的空间数据进行联合分析。值得强调的是,Ganos H3 地理网格也支持退化,用更精简的网格组合对空间范围进行表达,降低用户因打码带来的数据库存储成本。
关于 Ganos H3 地理网格详细功能,可参见 Ganos 地理网格用户手册。
最佳实践
下面我们使用真实场景数据来介绍如何使用 Ganos H3 进行空间点数据的入库、打码、查询到最终显示等功能。这里我们选择的测试数据是 Uber 发布的 2023 年纽约出租车位置数据集 FOIL 进行测试。FOIL 数据记录了纽约地区所有的出租车上下车的位置数据, 详细信息参考。
数据导入
在使用 Ganos H3 前,需要先创建 GeomGrid 扩展,SQL 如下: CREATE EXTENSION Ganos_GeomGrid CASCADE;
GeomGrid 中提供了 h3grid 字段类型,用于表示 H3 编码。下面的 SQL 语句创建了一个带有 h3grid 类型的数据表 FOIL2013,这里字段 h3_lev13 代表我们使用的是第 13 层级的 H3 编码。H3 不同层级网格具有不同分辨率,用户可以可以更具具体业务需求灵活定义。H3 各个层级对应的空间分辨率请参考
-- 创建表用来保存 foil 点数据,h3_lev13 代表 13 级编码 CREATE TABLE FOIL2013 ( id text, lon float, lat float, h3_lev13 h3grid);
FOIL 文件是以 csv 文件格式保存的。用户可以通过编程方式从 CSV 中提取相关信息通过 SQL 入库,也可以通过 FDW 方式入库,这里我们使用 Ganos FDW 模块通过 FDW 方式实现数据快速入库。
首先我们把目标文件上传到 oss 指定目录,比如这里我们文件路径为:
endpoint:oss-cn-hangzhou-internal.aliyuncs.com bucket:dla-ganos-hz path:FOIL/trip_data_1.csv
首先我们创建 Ganos FDW 扩展
CREATE EXTENSION ganos_fdw CASCADE;
然后我们需要创建一个 csvserver,负责管理 csv 文件,ak_id 和 ak_secret 就是用户的 OSS 连接 AK 的 id 和 secret 信息,format 为'CSV'代表管理的数据格式为 CSV。
CREATE SERVER csvserver FOREIGN DATA WRAPPER ganos_fdw OPTIONS ( datasource 'OSS://<ak_id>@oss-cn-hangzhou-internal.aliyuncs.com/dla-ganos-hz/FO IL/trip_data_1.csv', format 'CSV' ); CREATE USER MAPPING FOR CURRENT_USER SERVER csvserver OPTIONS (user '<ak_id>', password '<ak_secret>');
FDW 服务创建成功后,我们就可以通过外表的形式,将 OSS 上的 csv 映射到数据库中作为一个普通表进行查询, 详细 SQL 语句如下。这里我们只选择 medallion 、pickup_longitude、pickup_latitude 三列数据,映射的外表名称为 trip_data_1:
CREATE FOREIGN TABLE trip data 1 ( medallion va rchar , pickup_ longitude varchar, pickup_ latitude varchar) SERVER csvserver OPTIONS ( layer 'trip_ data_ 1') ;
查询外表 trip_data_1:
SELECT * FROM trip_data_1;
结果如下:
然后将外表数据导入到前面我们创建的 FOIL3 表中:
INSERT INTO FOIL2013SELECT medallion as id ,cast (pickup_longitude as double precision) as lon, cast(pickup_latitude as double precision) as lat FROM trip_data_1;
查询 FOIL2013,可以看到 CSV 上的信息已经成功导入到 FOIL2013 表格中,后面我们就可以根据经纬度等位置信息进行打码了。
SELECT * FROM FOIL2013;
《阿里云产品四月刊》—Ganos H3 地理网格能力解析与最佳实践(2)https://developer.aliyun.com/article/1554159