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

方法一: 代码层实现

封装方法:

/**
* @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

【微信开发】微信小程序通过经纬度计算两地距离php代码实现的更多相关文章

  1. Geohash-》通过经纬度计算两地距离的函数

    /**      * 根据起点坐标和终点坐标测距离      * @param  [array]   $from  [起点坐标(经纬度),例如:array(118.012951,36.810024)] ...

  2. mySQL函数根据经纬度计算两点距离 复制代码

    http://www.cnblogs.com/lujiulong/p/6185041.html https://my.oschina.net/u/2273085/blog/505172?p={{pag ...

  3. 微信小程序-获取经纬度

    微信小程序-获取经纬度 最近公司新功能 要求在外的市场人员 发送位置信息回来. 用的还是微信小程序开发.... 微信小程序 提供一个接口 getLocation 这个接口反回来的位置 相对实际位置 相 ...

  4. 微信小程序的开发——01小程序的执行流程是怎样的?

    作者:叶小钗 转载至:https://www.cnblogs.com/yexiaochai/p/9346043.html 我们这边最近一直在做基础服务,这一切都是为了完善技术体系,这里对于前端来说便是 ...

  5. 头脑王者pk答题小程序开发思路 微信pk答题小程序开发 PK答题游戏你也可以做 微信pk答题游戏

    想必大家最近的朋友圈和微信群里都被头脑王者PK答题刷屏了吧.确实很好玩,尤其是2018年的这波风口,手机答题,大家掏出手机,创建一个好友PK,然后你的好友点击进来就可以和你一起PK答题.比之前的游戏好 ...

  6. Spring Boot中的微信支付(小程序)

    前言 微信支付是企业级项目中经常使用到的功能,作为后端开发人员,完整地掌握该技术是十分有必要的. logo 一.申请流程和步骤 图1-1 注册微信支付账号 获取微信小程序APPID 获取微信商家的商户 ...

  7. .NET Core 微信公众号小程序6种获取UnionID方法,你知道哪几种?

    前言 获取UnionID是开发微信公众号/小程序中很有必要的一个环节,特别是针对一个公司拥有多个公众号小程序而推出的机制,实现打通账户一体化,用UnionID来区分多平台的唯一性. 官方的解释:如果开 ...

  8. TP3.2校验微信公众号||小程序 服务器地址

    1.在TP3.2里面,写一个控制器,用来校验微信公众号||小程序的服务器地址 <?php namespace Home\Controller; use Think\Controller; hea ...

  9. Weshop基于Spring Cloud开发的小程序商城系统

    WESHOP | 基于微服务的小程序商城系统 Weshop是基于Spring Cloud(Greenwich)开发的小程序商城系统,提供整套公共微服务服务模块,包含用户中心.商品中心.订单中心.营销中 ...

随机推荐

  1. 关于equals和hashcode问题

    默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了e ...

  2. 执行DTS包将excel导入数据库

    利用ssms生成dtsx文件,必须以32bit执行,到路径执行C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn > dtexec ...

  3. webuploader+Java如何实现分片+断点续传

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  4. CSS精灵图(王者荣耀案例)

    首先,我们应该知道引入精灵图的原因: 具体是因为,网页上面的每张图片都要经历一次请求才能展示给用户,小的图标频繁的请求服务器,降低页面的加载速度,为了有效地减少服务器接收和发送请求的次数,提高页面的加 ...

  5. JS基础_自增和自减

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...

  7. 过拟合和欠拟合(Over fitting & Under fitting)

    欠拟合(Under Fitting) 欠拟合指的是模型没有很好地学习到训练集上的规律. 欠拟合的表现形式: 当模型处于欠拟合状态时,其在训练集和验证集上的误差都很大: 当模型处于欠拟合状态时,根本的办 ...

  8. 【一起来烧脑】一步学会CSS3体系

    [外链图片转存失败(img-yfi1VPyy-1563434266398)(https://upload-images.jianshu.io/upload_images/11158618-fc8784 ...

  9. Python3文件

    open()方法 Python open()方法永于打开一个文件,并返回文件对象,并对文件进行处理过程中都需要用到这个方法,如果该文件无法被打开,则抛出OSError 注意:使用open()方法一定要 ...

  10. golang-package fmt

    package fmt import "fmt" mt包实现了类似C语言printf和scanf的格式化I/O.格式化动作('verb')源自C语言但更简单. Printing v ...