最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
PHP实现的7组经纬度与距离的计算函数demo
时间:2026-09-21 17:10:02 编辑:袖梨 来源:一聚教程网
这篇文章主要为大家介绍了PHP实现的7组经纬度与距离的计算函数demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
一.根据当前位置计算四周的经纬度
/** 根据当前位置计算四周的经纬度 * @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.ma***p.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);}
相关文章
- phpstrncmp函数原型源码分析 09-21
- ThinkPHP5中如何实现模板完全静态化详解 09-21
- PHP实现给用户发微信消息提醒功能 09-21
- 以PHP代码为实例详解RabbitMQ消息队列中间件的6种模式 09-21
- 通用 LLM 流式对话:前后端完整链路实现 09-21
- PHPStudyhosts文件可能不存在或被阻止打开及同步hosts失败问题 09-21