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

社交类 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

posted @   汀风说后端  阅读(194)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示