latitude and longitude points from MKPolyline
Asked Answered
B

2

31

I am trying to figure out a way to get all the latitude and longitude points from a MKPolyline drawn on a MKMapView on an iOS app.

I know the MKPolyline does not store latitude and longitude points, but I am looking for a way to build an array of lat and long the MKPolyline would touch on the map.

Anybody has specific possible solutions on this?

Thank you

EDIT: After seeing the first response (thank you) I think I need to explain better what my code is doing:

  1. first I call "calculateDirectionsWithCompletionHandler" on a MKDirections object
  2. I get back MKRoute object which has a "polyline" property.
  3. then I call "addOverlay" on the mapview passing in the polyline from the MKRoute object

That's all.

So, I already have a polyline built for me. So I would like to get all the points found in the polyline somehow and map them to a lat and long...

Banzai answered 18/2, 2014 at 17:42 Comment(0)
G
51

To get coordinates of the polyline from an MKRoute, use the getCoordinates:range: method.
That method is in the MKMultiPoint class which MKPolyline inherits from.

That also means this works for any polyline -- whether it was created by you or by MKDirections.

You allocate a C array big enough to hold the number of coordinates you want and specify the range (eg. all points starting from the 0th).

Example:

//route is the MKRoute in this example
//but the polyline can be any MKPolyline

NSUInteger pointCount = route.polyline.pointCount;

//allocate a C array to hold this many points/coordinates...
CLLocationCoordinate2D *routeCoordinates 
    = malloc(pointCount * sizeof(CLLocationCoordinate2D));

//get the coordinates (all of them)...
[route.polyline getCoordinates:routeCoordinates 
                         range:NSMakeRange(0, pointCount)];

//this part just shows how to use the results...
NSLog(@"route pointCount = %d", pointCount);
for (int c=0; c < pointCount; c++)
{
    NSLog(@"routeCoordinates[%d] = %f, %f", 
        c, routeCoordinates[c].latitude, routeCoordinates[c].longitude);
}

//free the memory used by the C array when done with it...
free(routeCoordinates);

Depending on the route, be prepared for hundreds or thousands of coordinates.

Guimond answered 18/2, 2014 at 21:14 Comment(0)
P
24

Swift 3 version:

I'm aware this is a very old question, but its still one of the top hits on Google when searching for this issue, with no good Swift solutions, So wanted to share my tiny extension to make life a bit easier by adding a coordinates property to MKPolyline:

https://gist.github.com/freak4pc/98c813d8adb8feb8aee3a11d2da1373f

Paddle answered 12/2, 2017 at 11:1 Comment(1)
Thank you! Works in Swift 4 as well.Percentile

© 2022 - 2024 — McMap. All rights reserved.