public calculateDestination ( |
||
$point | ||
$bearing | float | the bearing angle between 0 and 360 degrees |
$distance | float | the distance to the destination point in meters |
return |
public function calculateDestination(Coordinate $point, $bearing, $distance)
{
$D = $distance / static::EARTH_RADIUS;
$B = deg2rad($bearing);
$φ = deg2rad($point->getLat());
$λ = deg2rad($point->getLng());
$Φ = asin(sin($φ) * cos($D) + cos($φ) * sin($D) * cos($B));
$Λ = $λ + atan2(sin($B) * sin($D) * cos($φ), cos($D) - sin($φ) * sin($φ));
return new Coordinate(rad2deg($Φ), rad2deg($Λ));
}
public function testIfCalculateDestinationSouthernWorksAsExpected() { $bearingCalculator = new BearingSpherical(); $point = new Coordinate(0, 0); $destination = $bearingCalculator->calculateDestination($point, 180, 111195.0837); // 1 degree in longitude at the equator: // 2πr/360 = 40030230.1407 meters/360 = 111195.0837 meters $this->assertEquals(-1.0, $destination->getLat(), '', 0.0001); $this->assertEquals(0.0, $destination->getLng(), '', 0.0001); }