h3库函数是目前最稳定、语义最清晰的地理网格分组方式,核心为h3_latlng_to_cell(lat, lng, resolution),需确保坐标类型与范围正确,降级须用h3_cell_to_parent而非字符串截断,聚合后须还原多边形并按真实面积归一化密度。

用 H3 库函数生成网格编码再 GROUP BY
PostgreSQL(配合 h3-pg 扩展)或 ClickHouse(h3Index 函数)可直接把 POINT(longitude, latitude) 转为 H3 六边形索引(64 位整数),这是目前最稳定、语义最清晰的网格分组方式。关键不是“算坐标”,而是“把点落到标准六边形格子里”。
-
h3_latlng_to_cell(lat, lng, resolution)是核心函数,resolution值越小网格越粗(如 res=6 ≈ 10 km²,res=8 ≈ 0.7 km²) - 必须确保
lat和lng类型为DOUBLE PRECISION,且纬度在 [-90, 90]、经度在 [-180, 180],否则返回NULL - 不要对 H3 编码做字符串截断来降级——要用
h3_cell_to_parent(h3_id, parent_res),否则父子关系断裂,聚合结果无法下钻 - 示例:按 H3 分辨率 7 聚合 POI 点密度
SELECT h3_latlng_to_cell(latitude, longitude, 7) AS h3_7, COUNT(*) AS cnt FROM pois WHERE latitude IS NOT NULL AND longitude IS NOT NULL GROUP BY h3_7;
PostGIS 中用 ST_SnapToGrid 模拟网格但需注意单位陷阱
ST_SnapToGrid() 在 PostGIS 里常被误当作“地理网格工具”,但它默认按坐标系单位(WGS84 下是度)对齐,不是米。直接写 ST_SnapToGrid(geom, 0.01) 得到的是约 1.1°×1.1° 的格子,赤道和北极面积差一倍,不能用于密度分析。
- 正确做法是先转投影:
ST_Transform(geom, 3857)(Web Mercator,单位米),再调用ST_SnapToGrid(..., 500)表示 500 米边长正方形 -
ST_SnapToGrid()返回的是GEOMETRY,若只想要唯一 ID,建议用ST_XMin()+ST_YMin()提取左下角并拼接成字符串键 - 该方法不支持六边形,也不具备 H3 的层级邻接特性;仅适合与瓦片服务(如 XYZ tile)对齐的简单热力图场景
MySQL / SQL Server 无原生 H3 支持时的降级方案
这两类数据库没有官方 H3 扩展,硬要实现“近似六边形网格分组”,只能退回到经纬度缩放 + 偏移取整,但必须接受空间语义损失。
- MySQL 8.0+ 可用
FLOOR((longitude + 180) * 1000) AS lng_grid和FLOOR((latitude + 90) * 1000) AS lat_grid,再组合成CONCAT(lng_grid, '_', lat_grid)——这本质是等距矩形网格,非六边形 - SQL Server 不支持
h3,也无ST_SnapToGrid;geography::STUnionAggregate()只能合并已有 geometry,不能生成网格 ID - 若业务强依赖六边形(如 Uber 式调度),这类环境应前置在应用层计算 H3 ID(用官方
h3-js或h3-go库),写入时存为BIGINT字段,SQL 层只负责GROUP BY h3_id
聚合后多边形还原与面积校正不可省略
单纯按网格 ID 分组统计只是第一步。若要画热力图或导出 GeoJSON,必须把每个 H3 ID 或 SnapToGrid 几何还原为真实多边形,并用真实面积归一化密度值——否则高纬度网格数值系统性偏低。
- H3 生态中,
h3_cell_to_boundary(h3_id)可返回 WKT 多边形;PostGIS 需配合ST_GeomFromText()导入 - MySQL/SQL Server 无此能力,只能查 H3 官方提供的边界数据表(如
h3_boundaries_8),通过 JOIN 关联 - 密度 =
cnt / ST_Area(geom::geography)(PostGIS),单位统一为 km²;别用ST_Area(geom)(平面面积,单位 m² 但数值错乱) - 最容易被忽略的一点:H3 的
resolution每升一级,面积缩小约 7 倍,但编号数量增约 7 倍——跨分辨率聚合时,务必用h3_cell_to_parent()统一到同一级再比,否则数字不可比










