参考文档

 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