• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

【微信开发】微信小程序通过经纬度计算两地距离php代码实现 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

需求: 要求做个根据用户当前位置获取周围商家地址,并且按照由近到远排序,

 

方法一: 代码层实现

 

封装方法:

/**
 *  @desc 根据两点间的经纬度计算距离
 *  @param float $lat 纬度值
 *  @param float $lng 经度值
 *  @param $status true KM,M显示;false 只返回M
 */
function system_getdistance($lat1, $lng1, $lat2, $lng2, $status = true, $single = true)
{
    $earthRadius = 6367000;
    //approximate radius of earth in meters
    $lat1 = (floatval($lat1) * pi()) / 180;
    $lng1 = (floatval($lng1) * pi()) / 180;
    $lat2 = (floatval($lat2) * pi()) / 180;
    $lng2 = (floatval($lng2) * pi()) / 180;
    $calcLongitude = $lng2 - $lng1;
    $calcLatitude = $lat2 - $lat1;
    $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
    $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
    $calculatedDistance = $earthRadius * $stepTwo;
    if (!$single) {
        return round($calculatedDistance);
        exit;
    }
    //把大于1000米的转换成km
    if ($status) {
        $m = round($calculatedDistance) / 1000;
        return $m > 1 ? round($m, 1) . "km" : ($m * 1000) . "m";
        //return round($m,2);       //这个是我在程序中用的,以为排序比较方便,大家根据需求选用
    } else {
        return round($calculatedDistance) . "m";
    }
}

调用:

    /**
     * @param Request $request
     * @return array
     * 获取分类商店,并按距离排序
     */
    function getShop(Request $request){
        $c_id = $request->get('c_id');
        $lat1 = $request->get('lat');
        $lng1 = $request->get('lng');
        $lat1U = floatval($lat1)+0.01;
        $lat1D = floatval($lat1)-0.01;
        $lng1U = floatval($lng1)+0.01;
        $lng1D = floatval($lng1)-0.01;
        $data = db('store')
            ->where('c_id',$c_id)
            ->where('lat','<',$lat1U)      //获取周围经纬度差0.01的商家距离
            ->where('lat','>',$lat1D)
            ->where('lng','<',$lng1U)
            ->where('lng','>',$lng1D)
            ->find();
        $res = json_encode($data);
        $arr1 = json_decode($res,true);
        $arr = [];
       foreach ($arr1 as $k=>$v){
            $res = $this->system_getdistance($lat1,$lng1,$v['lat'],$v['lng']);
            $arr1[$k]['km'] = $res.'km';
            $arr[$k] = $res;
        }
        asort($arr);
        $arr2 = [];
        foreach($arr as $k=>$v){
            $arr2[] = $arr1[$k];
        }
        return $arr2;
    }

 

 

方法二: sql 层实现

SELECT
    id,
    lat,
    lng,
    ROUND(
        6378.138 * 2 * ASIN(
            SQRT(
                POW(
                    SIN(
                        (
                            $lat * PI() / 180 - lat * PI() / 180
                        ) / 2
                    ),
                    2
                ) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * POW(
                    SIN(
                        (
                            $lng * PI() / 180 - lng * PI() / 180
                        ) / 2
                    ),
                    2
                )
            )
        ) * 1000
    ) AS distance
FROM
    store
ORDER BY
    distance asc

 检索五公里范围以内的s q l

select * from (
      
SELECT
    id,
    lat,
    lng,
    ROUND(
        6378.138 * 2 * ASIN(
            SQRT(
                POW(
                    SIN(
                        (
                            $lat * PI() / 180 - lat * PI() / 180
                        ) / 2
                    ),
                    2
                ) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * POW(
                    SIN(
                        (
                            $lng * PI() / 180 - lng * PI() / 180
                        ) / 2
                    ),
                    2
                )
            )
        ) * 1000
    ) AS distance
FROM
    store
ORDER BY
    distance asc


 ) as a where a.distance<=5000

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
【小程序开发】微信小程序开发中遇到的那些坑...发布时间:2022-07-18
下一篇:
微信小程序--设置和获取剪切板内容发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap