zoukankan      html  css  js  c++  java
  • 【转】那我们是如何计算出客户地址多少米范围内有哪些门店呢

    最近公司需要通过客户的收货地址查询离客户地址最近有哪些门店,客户可以去最近的门店取货.

    那我们是如何计算出客户地址1000米内有哪些门店呢?我们可以通过下面几部计算出来.

    1.获取客户地址的经纬度,我们可以通过百度地图提供的接口获取.($address为客户地址)

    [php] view plain copy
     
    1. //百度接口获取经纬度  
    2. public function getlat($address) {  
    3.     $url = 'http://api.map.baidu.com/geocoder/v2/?city=上海&address=' . $address . '&output=json&ak=' . $this->ak;  
    4.   
    5.     $ch = curl_init($url);  
    6.     curl_setopt($ch, CURLOPT_URL, $url);  
    7.     curl_setopt($ch, CURLOPT_HEADER, 0);  
    8.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
    9.     curl_setopt($ch, CURLOPT_NOSIGNAL, 1);  
    10.     $data = curl_exec($ch);  
    11.     curl_close($ch);  
    12.     $data = json_decode($data, true);  
    13.     $ret['lat'] = $data['result']['location']['lat'];  
    14.     $ret['lng'] = $data['result']['location']['lng'];  
    15.     echo json_encode($ret);  
    16. }  

    2.如果是1000米内的店,我们需要计算出1000米内的经纬度范围.

    [php] view plain copy
     
    1. /* 
    2.  * 计算经纬度范围 
    3.  * $lat 纬度 
    4.  * $lon 经度 
    5.  * $raidus 半径(米) 
    6.  */  
    7.   
    8. function getAround($lat, $lon, $raidus) {  
    9.     $PI = 3.14159265;  
    10.     $EARTH_RADIUS = 6378137;  
    11.     $RAD = $PI / 180.0;  
    12.   
    13.     $latitude = $lat;  
    14.     $longitude = $lon;  
    15.     $degree = (24901 * 1609) / 360.0;  
    16.     $raidusMile = $raidus;  
    17.     $dpmLat = 1 / $degree;  
    18.     $data = array();  
    19.     $radiusLat = $dpmLat * $raidusMile;  
    20.     $minLat = $latitude - $radiusLat;  
    21.     $maxLat = $latitude + $radiusLat;  
    22.     $data["maxLat"] = $maxLat;  
    23.     $data["minLat"] = $minLat;  
    24.     $mpdLng = $degree * cos($latitude * ($PI / 180));  
    25.     $dpmLng = 1 / $mpdLng;  
    26.     $radiusLng = $dpmLng * $raidusMile;  
    27.     $minLng = $longitude - $radiusLng;  
    28.     $maxLng = $longitude + $radiusLng;  
    29.     $data["maxLng"] = $maxLng;  
    30.     $data["minLng"] = $minLng;  
    31.     //print_r($data);  
    32.     return $data;  
    33. }  

    3.我们知道数据库内每一家店都储存了这家店的经纬度信息,现在我们可以通过上面计算出的经纬度范围来查询出1000米内有哪些门店了.

    [php] view plain copy
     
    1. //计算出半径范围内的店  
    2. public function getdz($lat, $lng) {  
    3.     include_once('my_db.php');  
    4.     $this->qu = new MY_DB_ALL("QUICK");  
    5.     //$ret = json_decode($this->getlat($address), true);  
    6.     //print_r($ret);exit;  
    7.     $data = $this->getAround($lat, $lng, 2000);  
    8.     //print_r($data);  
    9.     $sql = "select * from shop where baidu_lat between '" . $data['minLat'] . "' and '" . $data['maxLat'] . "' and baidu_lng between '" . $data['minLng'] . "' and '" . $data['maxLng'] . "' and status=1 and ztd_flag=2";  
    10.     $rett = $this->qu->rquery($sql);  
    11.     for ($i=0;$i<count($rett);$i++) {  
    12.         $array[$i]["shop_id"] = $rett[$i]["shop_id"];  
    13.         $array[$i]["shop_name"] = iconv("gbk","utf-8",$rett[$i]["shop_name"]);  
    14.         $array[$i]["shop_address"] = iconv("gbk","utf-8",$rett[$i]["shop_address"]);  
    15.         $array[$i]["shop_date"] = $rett[$i]["shop_date"];  
    16.         $array[$i]['shop_phone'] = $rett[$i]["shop_phone"];  
    17.         $array[$i]['area'] = $rett[$i]["area"];  
    18.     }  
    19.     //echo "<pre>";print_r($array);exit;  
    20.     echo json_encode($array);  
    21. }  


    上面的代码需要根据自己实际情况来编写哦.大家主要看$sql这个sql语句就行了.嘿嘿

    4.如果想计算出离客户址最近的一家店是哪家,我需要一个计算距离的方法,如下:

    [php] view plain copy
     
    1. /** 
    2.  *  @desc 根据两点间的经纬度计算距离 
    3.  *  @param float $lat 纬度值 
    4.  *  @param float $lng 经度值 
    5.  */  
    6. public function getDistance($lat1, $lng1, $lat2, $lng2) {  
    7.     $earthRadius = 6367000; //地球半径  
    8.   
    9.     $lat1 = ($lat1 * pi() ) / 180;  
    10.     $lng1 = ($lng1 * pi() ) / 180;  
    11.   
    12.     $lat2 = ($lat2 * pi() ) / 180;  
    13.     $lng2 = ($lng2 * pi() ) / 180;  
    14.   
    15.     $calcLongitude = $lng2 - $lng1;  
    16.     $calcLatitude = $lat2 - $lat1;  
    17.     $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);  
    18.     $stepTwo = 2 * asin(min(1, sqrt($stepOne)));  
    19.     $calculatedDistance = $earthRadius * $stepTwo;  
    20.   
    21.     return round($calculatedDistance);  
    22. }  


    5.最后我们通过计算比较1000米内那几家店最少距离就可以知道最近是哪个店了.

    [php] view plain copy
     
      1. //计算出最近的一家店  
      2. public function zjd($address) {  
      3.     $ret = $this->getdz($address);  
      4.     $jwd = $this->getlat($address);  
      5.     if ($ret) {  
      6.         $arr = array();  
      7.         foreach ($ret as $k => $v) {  
      8.             $arr[$k] = $this->getDistance($jwd['lat'], $jwd['lng'], $v['baidu_lat'], $v['baidu_lng']);  
      9.         }  
      10.         asort($arr);  
      11.         //print_r($arr);  
      12.         foreach ($arr as $k1 => $v1) {  
      13.             $data[] = $ret[$k1];  
      14.         }  
      15.         print_r($data);  
      16.     } else {  
      17.         echo '无最近的门店';  
      18.     }  
      19. }  
  • 相关阅读:
    Window 窗口类
    使用 Bolt 实现 GridView 表格控件
    lua的table库
    Windows编程总结之 DLL
    lua 打印 table 拷贝table
    使用 xlue 实现简单 listbox 控件
    使用 xlue 实现 tips
    extern “C”
    COleVariant如何转换为int double string cstring
    原来WIN32 API也有GetOpenFileName函数
  • 原文地址:https://www.cnblogs.com/showker/p/7615092.html
Copyright © 2011-2022 走看看