参考文档
MySQL 数据库中如何存储经纬度(已采纳):https://blog.csdn.net/m__l__/article/details/83795592
mysql根据经纬度获取附近的商家(已采纳):https://www.cnblogs.com/jiqing9006/p/8954831.html
mysql根据经纬度获取附近的商家
创建geo表
create table geo( geo_id INT NOT NULL AUTO_INCREMENT, lng float NOT NULL, lat float NOT NULL, name VARCHAR(100) NULL, PRIMARY KEY ( geo_id ) );
初始化数据
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.302416,33.958887,"实验小学"); INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.303997,33.95188,"宿迁市人民医院"); INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.302991,33.935828,"宿迁学院"); INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.28215,33.959307,"金陵名府"); INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.290081,33.925404,"润园"); INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.354751,33.959007,"国际馆");
下面是google给的解决方案(基于公里km)
SELECT geo_id, `name`,( 6371 * acos ( cos ( radians(33.958887) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(118.302416) ) + sin ( radians(33.958887) ) * sin( radians( lat ) ) ) ) AS distance FROM geo HAVING distance < 20 ORDER BY distance LIMIT 0 , 20;
根据传入的经纬度排序
Java代码
public class LocationUtils { private double rad(double d) { return d * Math.PI / 180.0; } /** * 通过经纬度获取距离(单位:米) * * @param lat1 * @param lng1 * @param lat2 * @param lng2 * @return */ public double getDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); s = s * 6378.137; s = Math.round(s * 10000d) / 10000d; s = s * 1000; return s; } }
MySQL代码(MyBatis)
数据库保存经纬度建议采用 decimal(10, 7)
ORDER BY ACOS(SIN((#{condition.lat} * 3.1415) / 180 ) *SIN((crm_hotel_base_info.lat* 3.1415) / 180 ) + COS((#{condition.lat} * 3.1415) / 180 ) * COS((crm_hotel_base_info.lat* 3.1415) / 180 ) *COS((#{condition.log} * 3.1415) / 180 - (crm_hotel_base_info.log* 3.1415) / 180 ) ) * 6380 ASC