经纬度半径距离生成,以及计算位置
社交类 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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)