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)
会比较靠谱,不然精度一塌糊涂。