一. 根据当前位置计算四周的经纬度
/** 根据当前位置计算四周的经纬度
* @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经纬度距离计算函数的资料请关注代码网其它相关文章!
发表评论