首页 > 数据库技术 > 详细

MySQL根据经纬度按距离排序

时间:2020-06-04 09:20:16      阅读:61      评论:0      收藏:0      [点我收藏+]

1、新建表

DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
  `id` int(11) unsigned NOT NULL auto_increment COMMENT 自增主键,
  `name` varchar(50) NOT NULL COMMENT 名称,
  `lon` double(9,6) NOT NULL COMMENT 经度,
  `lat` double(8,6) NOT NULL COMMENT 纬度,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT=商户表;

 

2、插入数据

INSERT INTO `customer` VALUES (1, 天津市区, 117.315575, 39.133462);
INSERT INTO `customer` VALUES (2, 北京市区, 116.407999, 39.894073);
INSERT INTO `customer` VALUES (3, 保定, 115.557124, 38.853490);
INSERT INTO `customer` VALUES (4, 石家庄, 114.646458, 38.072369);
INSERT INTO `customer` VALUES (5, 昌平区1, 116.367180, 40.009561);
INSERT INTO `customer` VALUES (6, 海淀区2, 116.313425, 39.973078);
INSERT INTO `customer` VALUES (7, 海淀区1, 116.329236, 39.987231);

3、计算方法

一:

SELECT
    *,
    ROUND(
        6378.138 * 2 * ASIN(
            SQRT(
                POW(
                    SIN(
                        (
                            40.0497810000 * PI() / 180 - lat * PI() / 180
                        ) / 2
                    ),
                    2
                ) + COS(40.0497810000 * PI() / 180) * COS(lat * PI() / 180) * POW(
                    SIN(
                        (
                            116.3424590000 * PI() / 180 - lon * PI() / 180
                        ) / 2
                    ),
                    2
                )
            )
        )
    ) AS juli
FROM
    customer
ORDER BY
    juli ASC

二:

st_distance 计算的结果单位是度,需要乘111195(地球半径6371000*PI/180)是将值转化为米。
SELECT
    *,
    (st_distance (point (lon,lat),point (116.3424590000,40.0497810000))*111195/1000 )as juli
FROM
    customer
ORDER BY
    juli ASC    

 

MySQL根据经纬度按距离排序

原文:https://www.cnblogs.com/chbyl/p/13041103.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!