美文网首页PHP程序员
mysql实现通过经纬度查询到店铺的距离

mysql实现通过经纬度查询到店铺的距离

作者: php转go | 来源:发表于2020-09-05 07:30 被阅读0次

    shop 表结构

    CREATE TABLE `shop` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '店铺名字',
      `lat` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '纬度',
      `lng` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '经度',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    

    表数据

    mysql> select * from shop;
    +----+------------------+-----------+------------+
    | id | name             | lat       | lng        |
    +----+------------------+-----------+------------+
    |  1 | 太古汇           | 23.139455 | 113.338911 |
    |  2 | 天河城(东圃店) | 23.128592 | 113.411026 |
    +----+------------------+-----------+------------+
    2 rows in set (0.04 sec)
    

    计算自己距离数据库的地点距离,并且根据距离由近到远排序

    类似美团外卖,计算商家距离
    本人纬度经度由客户端传过来的,
    TP框架实例

            $lat=23.130283;
            $lng=113.401529;
            $pi= pi();//圆周率
            $radius=6371;//地球半径,单位千米,精确到米是可以用6371000
            $list=Db::connect($db)->table("shop")
                ->field("name,lat,lng,ACOS(SIN(($lat* $pi) / 180) * SIN((lat * $pi) / 180 ) + COS(($lat* $pi) / 180 ) * COS((lat * $pi) / 180 ) *COS(($lng* $pi) / 180 - (lng * $pi) / 180 ) ) * $radius as distance")
                ->order("distance asc")
                ->select();
            var_dump($list);
    

    生成的SQL

    SELECT 
           name,
        lat,
        lng,
        ACOS(
            SIN(( 23.130283 * 3.1415 ) / 180 ) * SIN(( lat * 3.1415 ) / 180 ) + COS(( 23.130283 * 3.1415 ) / 180 ) * COS(( lat * 3.1415 ) / 180 ) * COS(( 113.401529 * 3.1415 ) / 180 - ( lng * 3.1415 ) / 180 ) 
        ) * 6380 AS distance 
    FROM
        `shop` 
    ORDER BY
        `distance` ASC
    

    查询得到数据,distance就是具体距离,单位千米

    array (size=2)
      0 => 
        array (size=4)
          'name' => string '天河城(东圃店)' (length=24)
          'lat' => string '23.128592' (length=9)
          'lng' => string '113.411026' (length=10)
          'distance' => float 0.99054396644128 
      1 => 
        array (size=4)
          'name' => string '太古汇' (length=9)
          'lat' => string '23.139455' (length=9)
          'lng' => string '113.338911' (length=10)
          'distance' => float 6.4925896322261
    

    相关文章

      网友评论

        本文标题:mysql实现通过经纬度查询到店铺的距离

        本文链接:https://www.haomeiwen.com/subject/xkjzsktx.html