怎样在SQL中按地理网格编码进行多边形数据分组聚合

落杰姑娘_2423

落杰姑娘_2423

2026-10-14

702人浏览

原创

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

怎样在sql中按地理网格编码进行多边形数据分组聚合

用 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() 统一到同一级再比,否则数字不可比
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4223

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

891

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1109

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6121

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2983

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6100

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8221

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1110

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

972

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习