如何在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
相关产品推荐
相关产品推荐

