第一种:离我最近:
首先引入一个计算两点之间距离的一个方法:
//计算两点之间距离
function getDistance($lat1, $lng1, $lat2, $lng2)
{
$earthRadius = 6367000; //approximate radius of earth in meters
/*
Convert these degrees to radians
to work with the formula
*/
$lat1 = ($lat1 * pi() ) / 180;
$lng1 = ($lng1 * pi() ) / 180;
$lat2 = ($lat2 * pi() ) / 180;
$lng2 = ($lng2 * pi() ) / 180;
/*
Using the
Haversine formula
http://en.wikipedia.org/wiki/Haversine_formula
calculate the distance
*/
$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;
return round($calculatedDistance);
}
//智能排序(距离离我最近)
public function distance(){
//获取当前粉丝的经纬度
$wx_id=$_SESSION['wx_id'];
$fansdata=M('fans')->where(array('uid' => $wx_id ))->find();
$position= $fansdata['position'];
$posarray=explode(',', $position);
$lng1=$posarray['0'];//我的经度
$lat1=$posarray['1'];//我的纬度
//查询商家表,获取各自的经纬度
$where['state']=1;
$sellerdata=M('seller')
->alias('s')
->field('s.id as sellerid,s.*,sin.*')
->join('zbt_seller_infor AS sin ON s.id = sin.sid')
->where($where)
->select();
foreach ($sellerdata as $key => $value)
{
$lng2=$value['lng'];
$lat2=$value['lat'];
$distance=$this->getDistance($lat1, $lng1, $lat2, $lng2);
//echo $distance.',';
$sellerdata[$key]['distance']=$distance;
}
array_multisort(array_column($sellerdata,'distance'),SORT_ASC,$sellerdata);
$this -> assign('seller',$sellerdata);
$this -> display('mengdian/restlist');
}
第二种:指定范围查询商家,由近到远排序。
//附近(智能范围)
public function range(){
$rangemetre=I('get.rangemetre');//米
$degrees=$rangemetre*0.001*0.001;//将米先换算成千米,再换算成度
//echo $degrees;
//获取当前粉丝的经纬度
$wx_id=$_SESSION['wx_id'];
$fansdata=M('fans')->where(array('uid' => $wx_id ))->find();
$position= $fansdata['position'];
$posarray=explode(',', $position);
$lng=$posarray['0'];//我的经度
$lat=$posarray['1'];//我的纬度
$where="";
if($lat && $lng){//有经纬度
$lat1 = $lat + $degrees; $lat_1 = $lat - $degrees;//0.001度=1km=1公里
$lng1 = $lng + $degrees; $lng_1 = $lng - $degrees;//0.001度=1km=1公里
$where1= $where." lat>".$lat_1."AND lat<".$lat1." AND lng>".$lng_1." AND lng<".$lng1." ";
$askCnt = M('seller')
->alias('s')
->field('s.id as sellerid,s.*,sin.*')
->join('zbt_seller_infor AS sin ON s.id = sin.sid')
->where($where1)
->count(); //统计数量
}
//echo $askCnt;die;
if($askCnt){ //取到500条数据---根据经纬度
$gap_where = $where . " lat>".$lat_1."AND lat<".$lat1." AND lng>".$lng_1." AND lng<".$lng1." "; //附近经纬度绝对值0.001
}else{ //根据经纬度没取到数据
$gap_where = $where;
}
$arr = M("seller")
->alias('s')
->field('s.id as sellerid,s.*,sin.*')
->join('zbt_seller_infor AS sin ON s.id = sin.sid')->where($gap_where)->select();
foreach ($arr as $key => $value)
{
//var_dump($value);
$lng2=$value['lng'];
$lat2=$value['lat'];
$distance=$this->getDistance($lat, $lng, $lat2, $lng2);
//echo $distance.',';
$arr[$key]['distance']=$distance;
}
array_multisort(array_column($arr,'distance'),SORT_ASC,$arr);
$this -> assign('seller',$arr);
$this -> display('mengdian/restlist');
}
第二种视图层为:
<li class="focus">
<p>附近</p>
<ul class="select_second_ul" style="display: block;">
<li>附近(智能范围)</li>
<li><a href="__APP__/Weixin/Mengdian/range/rangemetre/500">500</a></li>
<li><a href="__APP__/Weixin/Mengdian/range/rangemetre/1000">1000</a></li>
<li><a href="__APP__/Weixin/Mengdian/range/rangemetre/1500">1500</a></li>
<li><a href="__APP__/Weixin/Mengdian/range/rangemetre/2000">2000</a></li>
</ul>
</li>