欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP實現(xiàn)的7組經(jīng)緯度與距離的計算函數(shù)demo

 更新時間:2023年05月25日 09:38:55   作者:北橋蘇  
這篇文章主要為大家介紹了PHP實現(xiàn)的7組經(jīng)緯度與距離的計算函數(shù)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一. 根據(jù)當(dāng)前位置計算四周的經(jīng)緯度

/** 根據(jù)當(dāng)前位置計算四周的經(jīng)緯度
 * @param $lng
 * @param $lat
 * @param float $distance
 * @return array
 */
function returnSquarePoint($lng, $lat, $distance = 0.5)
{
    $earthRadius = 6378138;
    $dlng = 2 * asin(sin($distance / (2 * $earthRadius)) / cos(deg2rad($lat)));
    $dlng = rad2deg($dlng);
    $dlat = $distance / $earthRadius;
    $dlat = rad2deg($dlat);
    return array(
        'left-top' => array('lat' => $lat + $dlat, 'lng' => $lng - $dlng),
        'right-top' => array('lat' => $lat + $dlat, 'lng' => $lng + $dlng),
        'left-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng - $dlng),
        'right-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng + $dlng)
    );
}

二. 根據(jù)經(jīng)緯度計算范圍

/** 根據(jù)經(jīng)緯度計算范圍
 * @param $lat1
 * @param $lng1
 * @param $lat2
 * @param $lng2
 * @return float
 */
function getDistance($lat1, $lng1, $lat2, $lng2)
{
    $earthRadius = 6378138;
    // 近似地球半徑米                          // 轉(zhuǎn)換為弧度
    $lat1 = ($lat1 * pi()) / 180;
    $lng1 = ($lng1 * pi()) / 180;
    $lat2 = ($lat2 * pi()) / 180;
    $lng2 = ($lng2 * pi()) / 180;           // 使用半正矢公式  用尺規(guī)來計算
    $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);
}

三. 通過經(jīng)緯度根據(jù)距離從近到遠排序

/** 通過經(jīng)緯度根據(jù)距離從近到遠排序
 * @param $lat
 * @param $lng
 * @return mixed
 */
function computePoint($lat, $lng)
{
    $page = 1;
    $pageSize = 7;
    $EARTH = 6378.137;         // 固定參數(shù) 地球半徑
    $PI = 3.1415926535898;  // 固定參數(shù) 圓周率
    $list = db('work')->alias('wk')
        ->field("
        wk.id,wk.work_name,wk.age,wk.teach,wk.gwbqid,wk.start_money,wk.work_description,wk.xz_id,
        wk.category,cp.company_id,cp.company_name,cp.la,cp.lo,
        (2 * $EARTH* ASIN(SQRT(POW(SIN($PI*(" . $lat . "-cp.la)/360),2)+COS($PI*" . $lat . "/180)* COS(cp.la * $PI/180)*POW(SIN($PI*(" . $lng . "-cp.lo)/360),2)))) as juli
        ")
        ->order('create_time desc,juli asc')
        ->page($page, $pageSize)
        ->select()->toArray();
    return $list;
}

四. 根據(jù)經(jīng)緯度查詢地理位置

/** 根據(jù)經(jīng)緯度查詢地理位置
 * @param $lat
 * @param $lng
 */
function myLocation($lat, $lng)
{
    $url = "http://api.map.baidu.com/geocoder/v2/?ak=YQH8OyfGcvOsPlHdnssSpkulaSNVgL0N&callback=renderReverse&location=$lat,$lng&output=json&pois=1";
    $res = file_get_contents($url);
    $lres = ltrim($res, "renderReverse && renderReverse(");
    $rres = rtrim($lres, ")");
    echo $rres;
}

五. 根據(jù)經(jīng)緯度計算直線距離

/**
 * 根據(jù)經(jīng)緯度計算直線距離
 * @param $lat1
 * @param $lng1
 * @param $lat2
 * @param $lng2
 * @return float|int
 */
function getDistances($lat1, $lng1, $lat2, $lng2)
{
    define('PI', 3.1415926535898);
    define('EARTH_RADIUS', 6378.137);
    $radLat1 = $lat1 * (PI / 180);
    $radLat2 = $lat2 * (PI / 180);
    $a = $radLat1 - $radLat2;
    $b = ($lng1 * (PI / 180)) - ($lng2 * (PI / 180));
    $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
    $s = $s * EARTH_RADIUS;
    $s = round($s * 10000) / 10000;
    return $s * 1000;
}

六. 根據(jù)經(jīng)緯度和半徑計算出范圍

/** 根據(jù)經(jīng)緯度和半徑計算出范圍
 * @param string $lat 緯度
 * @param String $lng 經(jīng)度
 * @param float $radius 半徑
 * @return Array 范圍數(shù)組
 */
function calcScope($lat, $lng, $radius)
{
    $degree = (24901 * 1609) / 360.0;
    $dpmLat = 1 / $degree;
    $radiusLat = $dpmLat * $radius;
    $minLat = $lat - $radiusLat;       // 最小緯度
    $maxLat = $lat + $radiusLat;       // 最大緯度
    $mpdLng = $degree * cos($lat * (3.141592 / 180));
    $dpmLng = 1 / $mpdLng;
    $radiusLng = $dpmLng * $radius;
    $minLng = $lng - $radiusLng;      // 最小經(jīng)度
    $maxLng = $lng + $radiusLng;      // 最大經(jīng)度
    /** 返回范圍數(shù)組 */
    $scope = array(
        'minLat' => $minLat,
        'maxLat' => $maxLat,
        'minLng' => $minLng,
        'maxLng' => $maxLng
    );
    return $scope;
}

七. 獲取兩個經(jīng)緯度之間的距離

/** 獲取兩個經(jīng)緯度之間的距離
 * @param string $lat1 緯一
 * @param String $lng1 經(jīng)一
 * @param String $lat2 緯二
 * @param String $lng2 經(jīng)二
 * @return float  返回兩點之間的距離
 */
function calcDistance($lat1, $lng1, $lat2, $lng2)
{
    if (empty($lat1) || empty($lng1) || empty($lat2) || empty($lng2)) {
        return false;
    }
    /** 轉(zhuǎn)換數(shù)據(jù)類型為 double */
    $lat1 = doubleval($lat1);
    $lng1 = doubleval($lng1);
    $lat2 = doubleval($lat2);
    $lng2 = doubleval($lng2);
    $theta = $lng1 - $lng2;
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515;
    return ($miles * 1.609344);
}

以上就是PHP實現(xiàn)的7組經(jīng)緯度與距離的計算函數(shù)demo的詳細(xì)內(nèi)容,更多關(guān)于PHP經(jīng)緯度距離計算函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論