I have a CLLocation defined, and I\'d like to move that point x meters to the east and y meters to the south. How may I achieve that?
Slight adjustment to @CocoaChris answer: now a category on CLLocation, and using the built-in units.
#import
@interface CLLocation (Movement)
- (CLLocation *)locationByMovingDistance:(double)distanceMeters withBearing:(CLLocationDirection)bearingDegrees;
@end
@implementation CLLocation (Movement)
- (CLLocation *)locationByMovingDistance:(double)distanceMeters withBearing:(CLLocationDirection)bearingDegrees
{
const double distanceRadians = distanceMeters / (6372797.6); // earth radius in meters
const double bearingRadians = bearingDegrees * M_PI / 180;
float lat1 = self.coordinate.latitude * M_PI / 180;
float lon1 = self.coordinate.longitude * M_PI / 180;
float lat2 = asin(sin(lat1) * cos(distanceRadians) + cos(lat1) * sin(distanceRadians) * cos(bearingRadians));
float lon2 = lon1 + atan2(sin(bearingRadians) * sin(distanceRadians) * cos(lat1),
cos(distanceRadians) - sin(lat1) * sin(lat2) );
return [[CLLocation alloc] initWithLatitude:lat2 * 180 / M_PI
longitude:lon2 * 180 / M_PI];
}
@end