You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中查询指定坐标1公里内的geometry类型点

MySQL直接查询指定坐标1公里内的Geometry点

当然可以直接通过MySQL的空间函数实现,性能会比PHP全量查询后计算好很多,具体方案如下:

核心查询语句

MySQL 5.7及以上版本提供了ST_Distance_Sphere()函数,专门用于计算两个球面坐标点的距离(单位为米),非常适配经纬度场景。

假设你的表名为points_table,存储坐标的geometry字段为location,指定的目标坐标是经度116.397428,纬度39.90923,查询1公里(1000米)内的点的SQL如下:

SELECT *
FROM points_table
WHERE ST_Distance_Sphere(
    location,
    ST_GeomFromText('POINT(116.397428 39.90923)')
) <= 1000;
  • ST_GeomFromText():将文本格式的经纬度转换为MySQL可识别的geometry类型点,注意格式是POINT(经度 纬度),顺序别搞反。
  • ST_Distance_Sphere():返回两个点之间的球面距离(米),直接筛选小于等于1000的结果即可。

性能优化:添加空间索引

针对数千条数据的场景,给geometry字段添加空间索引能大幅提升查询速度,执行以下语句创建索引:

CREATE SPATIAL INDEX idx_points_location ON points_table(location);

注意:空间索引仅支持InnoDB(MySQL 5.7+)和MyISAM引擎,如果你的表用的是其他引擎,需要先调整引擎类型。

旧版本MySQL兼容方案

如果你的MySQL版本低于5.7,没有ST_Distance_Sphere(),可以用平面距离近似计算(精度略低,但大部分场景足够),公式如下:

SELECT *
FROM points_table
WHERE ST_Distance(
    location,
    ST_GeomFromText('POINT(116.397428 39.90923)')
) * 6371000 <= 1000;

这里的6371000是地球平均半径(米),用平面距离乘以半径得到近似球面距离。

内容的提问来源于stack exchange,提问作者user1314836

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:00:34