>  기사  >  백엔드 개발  >  경도와 위도를 사용하여 특정 범위 내에서 고객에게 가장 가까운 매장(예: 1,000미터 내에서 특정 매장에 가장 가까운 매장)을 확인하세요.

경도와 위도를 사용하여 특정 범위 내에서 고객에게 가장 가까운 매장(예: 1,000미터 내에서 특정 매장에 가장 가까운 매장)을 확인하세요.

WBOY
WBOY원래의
2016-08-08 09:27:362306검색

최근 회사에서는 고객의 배송 주소를 이용하여 고객의 주소와 가장 가까운 매장이 어디인지 확인해야 합니다.

그러면 어떤 매장을 방문해야 할지 어떻게 계산하나요? 매장이 고객 주소로부터 1,000미터 이내에 있습니까? 다음 단계를 통해 계산할 수 있습니다.

1. 고객 주소의 위도와 경도를 얻으려면 바이두 지도에서 제공하는 인터페이스를 통해 얻을 수 있습니다. ($address는 고객 주소입니다)

    //百度接口获取经纬度
    public function getlat($address) {
        $url = 'http://api.map.baidu.com/geocoder/v2/?city=上海&address=' . $address . '&output=json&ak=' . $this->ak;

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
        $data = curl_exec($ch);
        curl_close($ch);
        $data = json_decode($data, true);
        $ret['lat'] = $data['result']['location']['lat'];
        $ret['lng'] = $data['result']['location']['lng'];
        echo json_encode($ret);
    }

2. 1000미터 이내의 매장이라면 1000미터 이내의 경도와 위도 범위를 계산해야 합니다.

    /*
     * 计算经纬度范围
     * $lat 纬度
     * $lon 经度
     * $raidus 半径(米)
     */

    function getAround($lat, $lon, $raidus) {
        $PI = 3.14159265;
        $EARTH_RADIUS = 6378137;
        $RAD = $PI / 180.0;

        $latitude = $lat;
        $longitude = $lon;
        $degree = (24901 * 1609) / 360.0;
        $raidusMile = $raidus;
        $dpmLat = 1 / $degree;
        $data = array();
        $radiusLat = $dpmLat * $raidusMile;
        $minLat = $latitude - $radiusLat;
        $maxLat = $latitude + $radiusLat;
        $data["maxLat"] = $maxLat;
        $data["minLat"] = $minLat;
        $mpdLng = $degree * cos($latitude * ($PI / 180));
        $dpmLng = 1 / $mpdLng;
        $radiusLng = $dpmLng * $raidusMile;
        $minLng = $longitude - $radiusLng;
        $maxLng = $longitude + $radiusLng;
        $data["maxLng"] = $maxLng;
        $data["minLng"] = $minLng;
        //print_r($data);
        return $data;
    }
3. 데이터베이스의 각 매장에는 이 매장의 경도 및 위도 정보가 저장되어 있음을 알고 있습니다. 이제 위에서 계산한 위도 및 경도 범위를 사용하여 1000미터 이내에 어떤 매장이 있는지 확인할 수 있습니다. >

위 코드는 실제 상황에 맞게 작성하시면 됩니다. 주로 $sql문을 보시면 됩니다.

4. 고객의 주소와 가장 가까운 매장을 계산하려면 다음과 같이 거리를 계산하는 방법이 필요합니다.
    //计算出半径范围内的店
    public function getdz($lat, $lng) {
        include_once('my_db.php');
        $this->qu = new MY_DB_ALL("QUICK");
        //$ret = json_decode($this->getlat($address), true);
        //print_r($ret);exit;
        $data = $this->getAround($lat, $lng, 2000);
        //print_r($data);
        $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";
        $rett = $this->qu->rquery($sql);
        for ($i=0;$i<count($rett);$i++) {
            $array[$i]["shop_id"] = $rett[$i]["shop_id"];
            $array[$i]["shop_name"] = iconv("gbk","utf-8",$rett[$i]["shop_name"]);
            $array[$i]["shop_address"] = iconv("gbk","utf-8",$rett[$i]["shop_address"]);
            $array[$i]["shop_date"] = $rett[$i]["shop_date"];
            $array[$i][&#39;shop_phone&#39;] = $rett[$i]["shop_phone"];
            $array[$i][&#39;area&#39;] = $rett[$i]["area"];
        }
        //echo "<pre class="brush:php;toolbar:false">";print_r($array);exit;
        echo json_encode($array);
    }

5. 마지막으로 매장을 계산하고 비교합니다. 1000미터 이내 각 매장 간의 거리를 알면 가장 가까운 매장을 알 수 있습니다.

    /**
     *  @desc 根据两点间的经纬度计算距离
     *  @param float $lat 纬度值
     *  @param float $lng 经度值
     */
    public function getDistance($lat1, $lng1, $lat2, $lng2) {
        $earthRadius = 6367000; //地球半径

        $lat1 = ($lat1 * pi() ) / 180;
        $lng1 = ($lng1 * pi() ) / 180;

        $lat2 = ($lat2 * pi() ) / 180;
        $lng2 = ($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;

        return round($calculatedDistance);
    }

위 내용은 1000미터 내에서 특정 매장과 가장 가까운 매장이 어디인지 등 경도와 위도를 통해 일정 범위 내에서 고객에게 가장 가까운 매장을 확인하는 방법을 내용을 포함해 소개한 것입니다. PHP 튜토리얼에서.
    //计算出最近的一家店
    public function zjd($address) {
        $ret = $this->getdz($address);
        $jwd = $this->getlat($address);
        if ($ret) {
            $arr = array();
            foreach ($ret as $k => $v) {
                $arr[$k] = $this->getDistance($jwd['lat'], $jwd['lng'], $v['baidu_lat'], $v['baidu_lng']);
            }
            asort($arr);
            //print_r($arr);
            foreach ($arr as $k1 => $v1) {
                $data[] = $ret[$k1];
            }
            print_r($data);
        } else {
            echo '无最近的门店';
        }
    }

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.