如何在SQL中实现按地理位置经纬度进行网格化分组统计?

陌枫同学_4769

陌枫同学_4769

2026-06-26

523人浏览

原创

直接用 round(lat, 2) 做网格会出错,因为经纬度每度对应的实际距离不恒定——纬度方向约111km/度,经度方向则随纬度升高而急剧收缩(如北纬60°仅约55km/度),导致同一小数位精度在不同地区代表的物理面积差异可达一倍,统计结果不可比。

如何在sql中实现按地理位置经纬度进行网格化分组统计?

为什么直接用 ROUND(lat, 2) 做网格会出错

很多人第一反应是把经纬度各自 ROUND() 到小数点后几位,比如 ROUND(lat, 2)ROUND(lng, 2),再组合成分组键。但这样做的实际网格边长不恒定——纬度方向每度约111km,经度方向则随纬度升高急剧收缩(赤道约111km,北纬60°只剩约55km)。同一 ROUND 精度在不同地区代表的物理面积可能差一倍,统计结果不可比。

真正可控的网格需基于固定距离(如5km×5km),而非固定小数位数。

  • 避免用 ROUND(lat, n) / ROUND(lng, n) 直接分组
  • 优先采用「墨卡托投影 + 整数取整」或「geohash前缀截断」两类可靠方案
  • 若数据库不支持地理函数(如MySQL旧版本),必须先用应用层预计算网格ID

PostgreSQL + PostGIS:用 ST_SnapToGrid() 生成等距网格

PostGIS 提供了真正按米级精度划分平面网格的能力。关键不是对原始经纬度四舍五入,而是先将地理坐标转为 Web Mercator 投影(SRID 3857),再用 ST_SnapToGrid() 对 X/Y 坐标做等距对齐。

SELECT
  ST_AsText(ST_SnapToGrid(
    ST_Transform(ST_SetSRID(ST_MakePoint(lng, lat), 4326), 3857),
    500  -- 网格边长(单位:米)
  )) AS grid_geom,
  COUNT(*) AS cnt
FROM locations
GROUP BY grid_geom;

注意:ST_SnapToGrid() 返回的是几何对象,若只想存网格ID便于后续关联,可改用 ST_XMin()ST_YMin() 提取左下角坐标并拼接:

  • ST_Transform(..., 3857) 是必须步骤,否则 ST_SnapToGrid 在球面坐标上无意义
  • 500 表示 500 米边长正方形,数值越大网格越粗
  • 输出的 grid_geom 可直接用于空间连接,也支持 ST_Contains 查询某点归属

MySQL 8.0+:用 ST_GeomFromText() 搭配自定义网格函数

MySQL 原生不提供 ST_SnapToGrid(),但可通过计算墨卡托坐标后手动取整模拟。核心是把经纬度转为 Web Mercator 的 XY(单位:米),再除以目标网格尺寸后取整:

百度AI助手
百度AI助手

百度AI助手是一款AI智能体工具,百度推出的多场景AI智能体助手。

下载
SELECT
  FLOOR((lng * PI() / 180) * 6378137) DIV 500 AS x_grid,
  FLOOR(LN(TAN((90 + lat) * PI() / 360)) * 6378137) DIV 500 AS y_grid,
  COUNT(*) AS cnt
FROM locations
GROUP BY x_grid, y_grid;

这里用了近似墨卡托公式(WGS84椭球简化为球体),误差在城市级分析中可接受;若需更高精度,应改用 ST_Transform()(MySQL 8.0.33+ 支持)或移至应用层计算。

  • 公式中 6378137 是地球赤道半径(米),不可替换成其他常量
  • lat 必须用度数,且范围限定在 -85.0511 ~ 85.0511(墨卡托极点截断值)
  • 若数据含极地坐标,此公式会溢出,需提前过滤或换用 geohash

通用 fallback 方案:用 ST_GeoHash() 截断长度控制网格粒度

几乎所有支持地理扩展的数据库(PostgreSQL、MySQL、ClickHouse)都内置 ST_GeoHash()。它本质是空间填充曲线编码,截断长度即可控制精度:长度为 6 的 geohash 约对应 1.2km × 1.2km,长度为 5 约对应 4.9km × 4.9km。

SELECT
  SUBSTRING(ST_GeoHash(POINT(lng, lat)), 1, 6) AS gh6,
  COUNT(*) AS cnt
FROM locations
GROUP BY gh6;

优点是无需投影、跨库兼容性好;缺点是网格非正方形(呈矩形且随纬度变形),且相邻 geohash 并不保证空间邻近(存在“断裂带”)。适合快速探索性分析,但不适合要求严格空间连续性的场景。

  • 不要用 LEFT(geohash, n) 以外的方式截断,否则破坏编码结构
  • geohash 长度与实际尺寸是非线性关系,查表确认目标精度对应长度(如长度7 ≈ 150m)
  • PostgreSQL 中函数名为 ST_GeoHash(geom, precision),MySQL 中为 ST_GeoHash(x, y, precision)

地理网格化最易被忽略的点是:没有统一坐标系就谈“等距”毫无意义。哪怕只差一个 ST_Transform() 调用,结果就可能从可用变成误导。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

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

下载

相关标签:

地理位置

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

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

4056

5

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

2025.12.08

1209

12

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

203

5

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

426

22

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

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

2023.10.12

3743

8

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

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

2023.10.27

791

4

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

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

2024.02.23

969

5

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

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

2024.03.06

5521

10

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

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

2024.03.06

2503

4

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程