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的詳細內(nèi)容,更多關(guān)于PHP經(jīng)緯度距離計算函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Laravel使用swoole實現(xiàn)websocket主動消息推送的方法介紹
這篇文章主要給大家介紹了關(guān)于Laravel使用swoole實現(xiàn)websocket主動消息推送的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
php導(dǎo)出csv格式數(shù)據(jù)并將數(shù)字轉(zhuǎn)換成文本的思路以及代碼分享
最近接的一個項目,需要將一些統(tǒng)計結(jié)果之類的東西導(dǎo)出成CSV,以便做報表,根據(jù)往常經(jīng)驗,現(xiàn)將思路和代碼都發(fā)出來,如有更好的方法,希望高手指正2014-06-06
Laravel 5框架學(xué)習(xí)之向視圖傳送數(shù)據(jù)(進階篇)
上篇文章我們介紹了Laravel5框架中如何向視圖中傳送數(shù)據(jù),今天我們來研究下如何向視圖中傳送array,非常的詳細,推薦給有需要的小伙伴參考下。2015-04-04
thinkphp3.2中Lite文件替換框架入口文件或應(yīng)用入口文件的方法
這篇文章主要介紹了thinkphp3.2中Lite文件替換框架入口文件或應(yīng)用入口文件的方法,涉及ThinkPHP相關(guān)配置技巧,需要的朋友可以參考下2015-05-05
php編寫的簡單頁面跳轉(zhuǎn)功能實現(xiàn)代碼
這篇文章主要介紹了php編寫的簡單頁面跳轉(zhuǎn)功能實現(xiàn)代碼,有需要的朋友可以參考一下2013-11-11
Laravel5.* 打印出執(zhí)行的sql語句的方法
本篇文章主要介紹了Laravel5.* 打印出執(zhí)行的sql語句的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

