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

2019-09-05 14:40:52   PHP

  php  

社交类 app ,在模拟一些用户位置的时候,可以用此生成位置点
  1. /**
  2. * 用户的距离以及经纬度随机生成
  3. *
  4. * 距离+经纬度+扩展信息
  5. *
  6. * @Params Float $lng 经度
  7. * @Params Float $lat 维度
  8. *
  9. * 示例:北京=> lng=116.3068600000, lat=39.5838170000
  10. *
  11. * 五公里(5000m)计算
  12. * lng
  13. * ±0.0584
  14. *
  15. * lat
  16. * ±0.045
  17. */
  18. private function randDistance($lng, $lat) {
  19. $array = array();
  20. $newlng = $this->randomFloat( (float)$lng-0.0584, (float)$lng+0.0584 );
  21. $newlat = $this->randomFloat( (float)$lat-0.045, (float)$lat+0.045 );
  22. $distance = $this->getDistance($lat, $lng, $newlat, $newlng);
  23. $array['distance'] = sprintf("%.2f", $distance/1000);
  24. $array['lat'] = $newlat;
  25. $array['lng'] = $newlng;
  26. $array['ext'] = array( 'distance'=>$array['distance'] );
  27. return $array;
  28. }
  29. /**
  30. * 生成随机小数
  31. */
  32. private function randomFloat($min, $max) {
  33. $num = $min + mt_rand() / mt_getrandmax() * ($max - $min);
  34. return sprintf("%.4f", $num);
  35. }
  36. /**
  37. * 判断是否距离是否过期
  38. */
  39. private function userDistance()
  40. {
  41. }
  42. /**
  43. * @desc 根据两点间的经纬度计算距离
  44. * @param float $lat 纬度值
  45. * @param float $lng 经度值
  46. * return 单位m
  47. */
  48. private function getDistance($lat1, $lng1, $lat2, $lng2) {
  49. $earthRadius = 6367000; //approximate radius of earth in meters
  50. $lat1 = ($lat1 * pi() ) / 180;
  51. $lng1 = ($lng1 * pi() ) / 180;
  52. $lat2 = ($lat2 * pi() ) / 180;
  53. $lng2 = ($lng2 * pi() ) / 180;
  54. $calcLongitude = $lng2 - $lng1;
  55. $calcLatitude = $lat2 - $lat1;
  56. $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
  57. $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
  58. $calculatedDistance = $earthRadius * $stepTwo;
  59. return round($calculatedDistance);
  60. }
  61. /**
  62. * @desc 根据距离计算经纬度
  63. *
  64. * @param float $lat 纬度值
  65. * @param float $lng 经度值
  66. * @parma float $distance 距离(单位m)
  67. */
  68. private function getDistanceLngLat($lat1, $lng1, $distance) {
  69. $dd = pi()/180;
  70. $x1=$lat1*$dd;
  71. $y1=$lng1*$dd;
  72. $R = 6371004;
  73. $x2 = $x1- acos((2- sin($distance/2/$R) * sin($distance/2/$R) *2)/2);
  74. $y2 = $y1- acos((2- sin($distance/2/$R) * sin($distance/2/$R) *2)/2);
  75. return array($x2/$dd, $y2/$dd);
  76. }