Geometry.php 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. <?php
  2. declare(strict_types=1);
  3. namespace algorithm;
  4. /**
  5. * 地理算法
  6. */
  7. class Geometry
  8. {
  9. /**
  10. * 火星坐标Gcj02 转 百度地图坐标BD09
  11. * 腾讯地图用的也是GCJ02坐标
  12. * @param double $lat 纬度
  13. * @param double $lng 经度
  14. */
  15. public static function convertGcj02ToBd09($lat, $lng)
  16. {
  17. $lat = floatval($lat);
  18. $lng = floatval($lng);
  19. $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  20. $x = $lng;
  21. $y = $lat;
  22. $z =sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $x_pi);
  23. $theta = atan2($y, $x) + 0.000003 * cos($x * $x_pi);
  24. $lng = $z * cos($theta) + 0.0065;
  25. $lat = $z * sin($theta) + 0.006;
  26. $lng = round($lng,6);
  27. $lat = round($lat,6);
  28. return array('lng'=>$lng,'lat'=>$lat);
  29. }
  30. /**
  31. * 百度地图坐标Bd09 转 火星坐标Gcj02
  32. * @param double $lat 纬度
  33. * @param double $lng 经度
  34. */
  35. public static function convertBd09ToGcj02($lat, $lng)
  36. {
  37. $lat = floatval($lat);
  38. $lng = floatval($lng);
  39. $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  40. $x = $lng - 0.0065;
  41. $y = $lat - 0.006;
  42. $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);
  43. $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);
  44. $lng = $z * cos($theta);
  45. $lat = $z * sin($theta);
  46. $lng = round($lng,6);
  47. $lat = round($lat,6);
  48. return array('lng'=>$lng,'lat'=>$lat);
  49. }
  50. }