ホームページ  >  記事  >  バックエンド開発  >  経度と緯度を使用して、特定の範囲内で顧客に最も近い店舗を特定します (たとえば、特定の店舗から 1,000 メートル以内に最も近い店舗はどれか)。

経度と緯度を使用して、特定の範囲内で顧客に最も近い店舗を特定します (たとえば、特定の店舗から 1,000 メートル以内に最も近い店舗はどれか)。

WBOY
WBOYオリジナル
2016-08-08 09:27:362242ブラウズ

最近、会社は顧客の配送先住所を使用して、顧客の住所に最も近い店舗を確認する必要があります。顧客は最寄りの店舗に商品を受け取ることができます。

それでは、どの店舗が 1,000 メートル以内にあるかをどのように計算すればよいのでしょうか。顧客の住所は次のとおりです

1. 顧客の住所の経度と緯度を取得します ($address は顧客の住所です)。 1000 メートル以内の店舗です。1000 メートル以内の距離を計算する必要があります。経度と緯度の範囲です。

    //百度接口获取经纬度
    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);
    }

3. データベース内の各店舗がこの店舗の経度と緯度の情報を保存していることがわかりました。 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;
    }
上記 コードは実際の状況に応じて記述する必要があります。主に SQL ステートメント $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メートル以内の店舗はどこですか? れーれー

以上、ある店舗から1000メートル以内にどの店舗が近いかなど、経度と緯度から一定の範囲内でどの店舗が顧客に近いかを判断する方法を内容も含めて紹介しましたので、興味のある友人の参考になれば幸いです。 PHP チュートリアルで。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。