geo.api.inc 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. function custom_maps_add_geodata($trackpoint) {
  3. $geodata = array(
  4. 'wkt' => 'POINT (' . (string) $trackpoint['lon'] . ' ' . (string) $trackpoint['lat'] . ')',
  5. 'geo_type' => 'point',
  6. 'lat' => (string) $trackpoint['lat'],
  7. 'lon' => (string) $trackpoint['lon'],
  8. );
  9. return $geodata;
  10. }
  11. function custom_maps_calculate_distance($geofield1, $geofield2) {
  12. return haversineGreatCircleDistance($geofield1['lat'],
  13. $geofield1['lon'],
  14. $geofield2['lat'],
  15. $geofield2['lon']);
  16. }
  17. /**
  18. * Calculates the great-circle distance between two points, with
  19. * the Haversine formula.
  20. * @param float $latitudeFrom Latitude of start point in [deg decimal]
  21. * @param float $longitudeFrom Longitude of start point in [deg decimal]
  22. * @param float $latitudeTo Latitude of target point in [deg decimal]
  23. * @param float $longitudeTo Longitude of target point in [deg decimal]
  24. * @param float $earthRadius Mean earth radius in [m]
  25. * @return float Distance between points in [m] (same as earthRadius)
  26. */
  27. function haversineGreatCircleDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000) {
  28. // convert from degrees to radians
  29. $latFrom = deg2rad($latitudeFrom);
  30. $lonFrom = deg2rad($longitudeFrom);
  31. $latTo = deg2rad($latitudeTo);
  32. $lonTo = deg2rad($longitudeTo);
  33. $latDelta = $latTo - $latFrom;
  34. $lonDelta = $lonTo - $lonFrom;
  35. $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
  36. cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
  37. return $angle * $earthRadius;
  38. }
  39. /**
  40. * Calculates the great-circle distance between two points, with
  41. * the Vincenty formula.
  42. * @param float $latitudeFrom Latitude of start point in [deg decimal]
  43. * @param float $longitudeFrom Longitude of start point in [deg decimal]
  44. * @param float $latitudeTo Latitude of target point in [deg decimal]
  45. * @param float $longitudeTo Longitude of target point in [deg decimal]
  46. * @param float $earthRadius Mean earth radius in [m]
  47. * @return float Distance between points in [m] (same as earthRadius)
  48. */
  49. function vincentyGreatCircleDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
  50. {
  51. // convert from degrees to radians
  52. $latFrom = deg2rad($latitudeFrom);
  53. $lonFrom = deg2rad($longitudeFrom);
  54. $latTo = deg2rad($latitudeTo);
  55. $lonTo = deg2rad($longitudeTo);
  56. $lonDelta = $lonTo - $lonFrom;
  57. $a = pow(cos($latTo) * sin($lonDelta), 2) +
  58. pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
  59. $b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);
  60. $angle = atan2(sqrt($a), $b);
  61. return $angle * $earthRadius;
  62. }