DukeAnn
做一个优雅的程序员

PHP计算定位在附近商家配送距离之内的商家店铺

 

dxvibxirndb5ulnvyvzodwlvbuvsuw9wzufgau9rsc9ll0xnntjvuxr3bny5vtnfwdzjn0lrpt0

最近呢,接到一个项目就是扩展这个功能。问题难点呢就是这个商家有个配送距离,超出配送距离的不能显示还要显示附近的,所以上网查理点资料

根据两点经纬度计算距离

计算某个经纬度的周围某段距离的正方形的四个点

根据以上的资料我就说一下我的解决思路,首先我查了查百度是没有类似的接口的,只能自己写了。

第一步在商家自己填写的位置和配送距离时计算出范围内四个正方形顶点,方法参照上面的链接,算出顶点之后存入数据库中。基本上百度也是计算矩形范围的这个就不要纠结了。而且中国的经纬度基本都是整数没什么大问题。

四个顶点存储在数据库中:

`max_lng` float DEFAULT '0' COMMENT '快送范围最大经度',
 `min_lng` float DEFAULT '0' COMMENT '快送范围最小经度',
 `max_lat` float DEFAULT '0' COMMENT '快送范围最大纬度',
 `min_lat` float DEFAULT '0' COMMENT '快送范围最小纬度',

有了四个点的值以后就可以根据这个查询数据库了,根据买家自己定位的经纬度,来比较是否在商家配送范围之内了。

贴出部分代码参考:

$lat1 = $_GET['lat'];
$lng1 = $_GET['lng'];
$condition['store_map.max_lng'] = array('egt', $lng1);
$condition['store_map.min_lng'] = array('elt', $lng1);
$condition['store_map.max_lat'] = array('egt', $lat1);
$condition['store_map.min_lat'] = array('elt', $lat1);

当然仅仅是这样查询数据库出来的数据是没有按照跟定位点的距离排序的,在查询时在增加以下Mysql距离算法进行排序。

getStoreListInfo($condition, $this->page, $lat1, $lng1)
/**
 * 移动端接口使用
 * 整合附近店铺详细信息并按照距离排序
 * @param $condition array 查询条件
 * @param $page int 每页个数
 * @return array
 * */
public function getStoreListInfo(array $condition = array(), $page = null, $lat1, $lng1)
{
    /*$sql = "SELECT *, ROUND(6378.138*2*ASIN(SQRT(POW(SIN((22.299439*PI()/180-latitude*PI()/180)/2),2)+COS(22.299439*PI()/180)*COS(latitude*PI()/180)*POW(SIN((114.173881*PI()/180-longitude*PI()/180)/2),2)))*1000) AS juli FROM map ORDER BY juli DESC;";*/
    $count  = $this->where(array())->count();
    $field = '*';
    $distance = ', ROUND(6378.138*2*ASIN(SQRT(POW(SIN(('.$lat1.'*PI()/180-store_map.baidu_lat*PI()/180)/2),2)+COS('.$lat1.'*PI()/180)*COS(store_map.baidu_lat*PI()/180)*POW(SIN(('.$lng1.'*PI()/180-store_map.baidu_lng*PI()/180)/2),2)))*1000) AS distance';
    $store_info_arr = $this->table('store_map,store')
        ->field($field.$distance)
        ->join('left')
        ->on('store_map.store_id = store.store_id')
        ->where($condition)->order('distance asc')->page($page, $count)->select();
     return $store_info_arr;
}

由于代码长度太长超出部分被隐藏了直接粘贴复制即可,就是全部代码
store_map.baidu_lat
store_map.baidu_lng

是数据库表名和字段名,由于我连表查询,所以带了表名,原始的sql 被注释了,可以参照,我这个是类似Thinkphp 的数据库查询语法,做了个分页。

仅仅是这样距离还没办法传给接口的,还要自己用PHP计算出距离组装到接口中。

PHP依次计算两点间的距离(参照上面的链接文章),将值放进接口就行了。

DukeAnn的笔记本:DukeAnn的博客 » PHP计算定位在附近商家配送距离之内的商家店铺
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址