MySQL 的经纬度计算,算是移动应用里比较常见的一种优化需求了。你像查找附近的酒店、商家这些功能,背后其实就靠着这套经纬度匹配的逻辑。嗯,数据库里提前存好每家店的坐标,App 那边拿到当前定位后,数据库层直接过滤计算一波,就能筛出最近的几家。

MySQL 里比较推荐用Haversine 公式来做这个事儿,虽然不算精确,但对大多数场景,比如查 5 公里以内的酒店,完全够用了。你可以直接在 SQL 里写个计算公式,像下面这样:

SELECT id, name, latitude, longitude,
  (6371 * acos(cos(radians(你的纬度)) * cos(radians(latitude)) * 
  cos(radians(longitude) - radians(你的经度)) + 
  sin(radians(你的纬度)) * sin(radians(latitude)))) AS distance
FROM hotels
HAVING distance < 5>

结果不仅准确,响应也快,尤其是加上地理位置索引,效率会更上一层楼。如果你用的是Elasticsearch,也可以直接导入数据进去,它对地理查询支持得挺好。

另外,如果你想扩展思路或者查下全国的经纬度资源,也有不少现成的资源挺方便,像全国城市经纬度库中国邮政编码经纬度数据这些,都能直接拿来用。

如果你刚好在做 LBS 相关的功能,比如查附近店铺、定位打卡、地图展示这些,建议提前规划好坐标的存储方式,字段类型别用错,像DECIMAL(10,6)会比较靠谱,不然精度一塌糊涂。