| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- <?php
- function custom_maps_add_geodata($trackpoint) {
- $geodata = array(
- 'wkt' => 'POINT (' . (string) $trackpoint['lon'] . ' ' . (string) $trackpoint['lat'] . ')',
- 'geo_type' => 'point',
- 'lat' => (string) $trackpoint['lat'],
- 'lon' => (string) $trackpoint['lon'],
- );
- return $geodata;
- }
- function custom_maps_calculate_distance($geofield1, $geofield2) {
- return haversineGreatCircleDistance($geofield1['lat'],
- $geofield1['lon'],
- $geofield2['lat'],
- $geofield2['lon']);
- }
- /**
- * Calculates the great-circle distance between two points, with
- * the Haversine formula.
- * @param float $latitudeFrom Latitude of start point in [deg decimal]
- * @param float $longitudeFrom Longitude of start point in [deg decimal]
- * @param float $latitudeTo Latitude of target point in [deg decimal]
- * @param float $longitudeTo Longitude of target point in [deg decimal]
- * @param float $earthRadius Mean earth radius in [m]
- * @return float Distance between points in [m] (same as earthRadius)
- */
- function haversineGreatCircleDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000) {
- // convert from degrees to radians
- $latFrom = deg2rad($latitudeFrom);
- $lonFrom = deg2rad($longitudeFrom);
- $latTo = deg2rad($latitudeTo);
- $lonTo = deg2rad($longitudeTo);
- $latDelta = $latTo - $latFrom;
- $lonDelta = $lonTo - $lonFrom;
- $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
- cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
- return $angle * $earthRadius;
- }
- /**
- * Calculates the great-circle distance between two points, with
- * the Vincenty formula.
- * @param float $latitudeFrom Latitude of start point in [deg decimal]
- * @param float $longitudeFrom Longitude of start point in [deg decimal]
- * @param float $latitudeTo Latitude of target point in [deg decimal]
- * @param float $longitudeTo Longitude of target point in [deg decimal]
- * @param float $earthRadius Mean earth radius in [m]
- * @return float Distance between points in [m] (same as earthRadius)
- */
- function vincentyGreatCircleDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
- {
- // convert from degrees to radians
- $latFrom = deg2rad($latitudeFrom);
- $lonFrom = deg2rad($longitudeFrom);
- $latTo = deg2rad($latitudeTo);
- $lonTo = deg2rad($longitudeTo);
- $lonDelta = $lonTo - $lonFrom;
- $a = pow(cos($latTo) * sin($lonDelta), 2) +
- pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
- $b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);
- $angle = atan2(sqrt($a), $b);
- return $angle * $earthRadius;
- }
|