# Calculate new coordinate x meters and y degree away from one coordinate

I must be missing somthing out in the docs, I thought this should be easy…

If I have one coordinate and want to get a new coordinate x meters away, in some direction. How do I do this?

I am looking for something like

`-(CLLocationCoordinate2D) translateCoordinate:(CLLocationCoordinate2D)coordinate`

translateMeters:(int)meters

translateDegrees:(double)degrees;

Thanks!

- Swift: Geofencing / geolocations near user location
- Notification from Background Geofencing in iOS 5?
- Open Graph Map layout
- iOS re-check location on load from background
- How to track the device location (iOS and Android) device using Phonegap
- Preventing annoying HTML5 geolocation alerts inside UIWebView

### 4 Solutions Collect From Internet About “Calculate new coordinate x meters and y degree away from one coordinate”

Unfortunately, there’s no such function provided in the api so you’ll have to write your own.

This site gives several calculations involving latitude/longitude and sample JavaScript code. Specifically, the section titled “Destination point given distance and bearing from start point” shows how to calculate what you’re asking.

The JavaScript code is at the bottom of that page and here’s one possible way to convert it to Objective-C:

```
- (double)radiansFromDegrees:(double)degrees
{
return degrees * (M_PI/180.0);
}
- (double)degreesFromRadians:(double)radians
{
return radians * (180.0/M_PI);
}
- (CLLocationCoordinate2D)coordinateFromCoord:
(CLLocationCoordinate2D)fromCoord
atDistanceKm:(double)distanceKm
atBearingDegrees:(double)bearingDegrees
{
double distanceRadians = distanceKm / 6371.0;
//6,371 = Earth's radius in km
double bearingRadians = [self radiansFromDegrees:bearingDegrees];
double fromLatRadians = [self radiansFromDegrees:fromCoord.latitude];
double fromLonRadians = [self radiansFromDegrees:fromCoord.longitude];
double toLatRadians = asin( sin(fromLatRadians) * cos(distanceRadians)
+ cos(fromLatRadians) * sin(distanceRadians) * cos(bearingRadians) );
double toLonRadians = fromLonRadians + atan2(sin(bearingRadians)
* sin(distanceRadians) * cos(fromLatRadians), cos(distanceRadians)
- sin(fromLatRadians) * sin(toLatRadians));
// adjust toLonRadians to be in the range -180 to +180...
toLonRadians = fmod((toLonRadians + 3*M_PI), (2*M_PI)) - M_PI;
CLLocationCoordinate2D result;
result.latitude = [self degreesFromRadians:toLatRadians];
result.longitude = [self degreesFromRadians:toLonRadians];
return result;
}
```

In the JS code, it contains this link which shows a more accurate calculation for distances greater than 1/4 of the Earth’s circumference.

Also note the above code accepts distance in km so be sure to divide meters by 1000.0 before passing.

I found one way of doing it, had to dig to find the correct structs and functions. I ended up not using degrees but meters for lat and long instead.

Here’s how I did it:

```
-(CLLocationCoordinate2D)translateCoord:(CLLocationCoordinate2D)coord MetersLat:(double)metersLat MetersLong:(double)metersLong{
CLLocationCoordinate2D tempCoord;
MKCoordinateRegion tempRegion = MKCoordinateRegionMakeWithDistance(coord, metersLat, metersLong);
MKCoordinateSpan tempSpan = tempRegion.span;
tempCoord.latitude = coord.latitude + tempSpan.latitudeDelta;
tempCoord.longitude = coord.longitude + tempSpan.longitudeDelta;
return tempCoord;
}
```

And of course, if I really need to use degrees in the future, it’s pretty easy (I think…) to do some changes to above to get it to work like I actually asked for.

Using an `MKCoordinateRegion`

has some issues—the returned region can be adjusted to fit since the two deltas may not exactly map to the projection at that latitude, if you want zero delta for one of the axes you are out of luck, etc.

This function uses `MKMapPoint`

to perform coordinate translations which allows you to move points around in the map projection’s coordinate space and then extract a coordinate from that.

```
CLLocationCoordinate2D MKCoordinateOffsetFromCoordinate(CLLocationCoordinate2D coordinate, CLLocationDistance offsetLatMeters, CLLocationDistance offsetLongMeters) {
MKMapPoint offsetPoint = MKMapPointForCoordinate(coordinate);
CLLocationDistance metersPerPoint = MKMetersPerMapPointAtLatitude(coordinate.latitude);
double latPoints = offsetLatMeters / metersPerPoint;
offsetPoint.y += latPoints;
double longPoints = offsetLongMeters / metersPerPoint;
offsetPoint.x += longPoints;
CLLocationCoordinate2D offsetCoordinate = MKCoordinateForMapPoint(offsetPoint);
return offsetCoordinate;
}
```

Nicsoft’s answer is fantastic and exactly what I needed. I’ve created a Swift 3-y version which is a little more concise and can be called directly on a `CLLocationCoordinate2D`

instance:

```
public extension CLLocationCoordinate2D {
public func transform(using latitudinalMeters: CLLocationDistance, longitudinalMeters: CLLocationDistance) -> CLLocationCoordinate2D {
let region = MKCoordinateRegionMakeWithDistance(self, latitudinalMeters, longitudinalMeters)
return CLLocationCoordinate2D(latitude: latitude + region.span.latitudeDelta, longitude: longitude + region.span.longitudeDelta)
}
}
```

- Xcode won't recognize my new provisioning profile
- Understand convertRect:toView:, convertRect:FromView:, convertPoint:toView: and convertPoint:fromView: methods
- How to add bar buttons in a UIToolBar
- “Use of undeclared type” in Swift, even though type is internal, and exists in same module
- NSDateFormatter dateFromString returns nil
- Get 'Touch Drag Inside' Distance When Setting IBAction From Storyboard
- Return Array from Function in Swift
- IOS – External (hdmi) output fills only half the screen except when coding view manually
- Reuse iOS passcode / dialer keyboard
- Frameworks are 'red' in Xcode
- A count of started touches is not equal to count of finished touches
- iOS simulator not starting up
- Loading javascript into a UIWebView from resources
- UIViewControllerHierarchyInconsistency
- Facebook SDK Swift – Use of undeclared identifier