经纬度半径距离生成,以及计算位置

社交类 app ,在模拟一些用户位置的时候,可以用此生成位置点

<?php

/**
 * 用户的距离以及经纬度随机生成
 *
 * 距离+经纬度+扩展信息
 *
 * @Params Float $lng 经度
 * @Params Float $lat 维度
 *
 * 示例:北京=> lng=116.3068600000, lat=39.5838170000
 *
 * 五公里(5000m)计算
 * lng
 * ±0.0584
 *
 * lat
 * ±0.045
*/
private function randDistance($lng, $lat) {
	$array = array();
	$newlng = $this->randomFloat( (float)$lng-0.0584, (float)$lng+0.0584 );
	$newlat = $this->randomFloat( (float)$lat-0.045, (float)$lat+0.045 );
	$distance = $this->getDistance($lat, $lng, $newlat, $newlng);
	$array['distance'] = sprintf("%.2f", $distance/1000);
	$array['lat'] = $newlat;
	$array['lng'] = $newlng;
	$array['ext'] = array( 'distance'=>$array['distance'] );
	return $array;
}

/**
 * 生成随机小数
*/
private function randomFloat($min, $max) {
	$num = $min + mt_rand() / mt_getrandmax() * ($max - $min);
	return sprintf("%.4f", $num);

}

/**
 * 判断是否距离是否过期
*/
private function userDistance()
{

}


/**
 * @desc 根据两点间的经纬度计算距离
 * @param float $lat 纬度值
 * @param float $lng 经度值
 * return 单位m
 */
private function getDistance($lat1, $lng1, $lat2, $lng2) {
	$earthRadius = 6367000; //approximate radius of earth in meters
	$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);
}

/**
 * @desc 根据距离计算经纬度
 *
 * @param float $lat 纬度值
 * @param float $lng 经度值
 * @parma float $distance 距离(单位m)
*/
private function getDistanceLngLat($lat1, $lng1, $distance) {
	$dd = pi()/180;
	$x1=$lat1*$dd;
	$y1=$lng1*$dd;
	$R = 6371004;
	$x2 = $x1- acos((2- sin($distance/2/$R) * sin($distance/2/$R) *2)/2);
	$y2 = $y1- acos((2- sin($distance/2/$R) * sin($distance/2/$R) *2)/2);
	return   array($x2/$dd, $y2/$dd);
}

https://blog.cvrrr.com/article/13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汀风说后端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值