PHP实现的7组经纬度与距离的计算函数demo

2023-12-08 0 249
目录
  • 一.根据当前位置计算四周的经纬度
  • 二.根据经纬度计算范围
  • 三.通过经纬度根据距离从近到远排序
  • 四.根据经纬度查询地理位置
  • 五.根据经纬度计算直线距离
  • 六.根据经纬度和半径计算出范围
  • 七.获取两个经纬度之间的距离

一.根据当前位置计算四周的经纬度

/** 根据当前位置计算四周的经纬度
* @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)
);
}

二.根据经纬度计算范围

/** 根据经纬度计算范围
* @param $lat1
* @param $lng1
* @param $lat2
* @param $lng2
* @return float
*/
function getDistance($lat1, $lng1, $lat2, $lng2)
{
$earthRadius = 6378138;
// 近似地球半径米 // 转换为弧度
$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);
}

三.通过经纬度根据距离从近到远排序

/** 通过经纬度根据距离从近到远排序
* @param $lat
* @param $lng
* @return mixed
*/
function computePoint($lat, $lng)
{
$page = 1;
$pageSize = 7;
$EARTH = 6378.137; // 固定参数 地球半径
$PI = 3.1415926535898; // 固定参数 圆周率
$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;
}

四.根据经纬度查询地理位置

/** 根据经纬度查询地理位置
* @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;
}

五.根据经纬度计算直线距离

/**
* 根据经纬度计算直线距离
* @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;
}

六.根据经纬度和半径计算出范围

/** 根据经纬度和半径计算出范围
* @param string $lat 纬度
* @param String $lng 经度
* @param float $radius 半径
* @return Array 范围数组
*/
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; // 最小经度
$maxLng = $lng + $radiusLng; // 最大经度
/** 返回范围数组 */
$scope = array(
\’minLat\’ => $minLat,
\’maxLat\’ => $maxLat,
\’minLng\’ => $minLng,
\’maxLng\’ => $maxLng
);
return $scope;
}

七.获取两个经纬度之间的距离

/** 获取两个经纬度之间的距离
* @param string $lat1 纬一
* @param String $lng1 经一
* @param String $lat2 纬二
* @param String $lng2 经二
* @return float 返回两点之间的距离
*/
function calcDistance($lat1, $lng1, $lat2, $lng2)
{
if (empty($lat1) || empty($lng1) || empty($lat2) || empty($lng2)) {
return false;
}
/** 转换数据类型为 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实现的7组经纬度与距离的计算函数demo的详细内容,更多关于PHP经纬度距离计算函数的资料请关注悠久资源网其它相关文章!

您可能感兴趣的文章:

  • golang与php实现计算两个经纬度之间距离的方法
  • PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
  • PHP根据两点间的经纬度计算距离
  • PHP计算2点经纬度之间的距离代码
  • php根据地址获取百度地图经纬度的实例方法
  • 定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
  • PHP/Laravel如何通过经纬度计算距离获取附近商家

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 PHP PHP实现的7组经纬度与距离的计算函数demo https://www.u-9.cn/biancheng/php/128324.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务