Track user location and draw a polyline view on MKMapView.
- MapKit.framework
- CoreLocation.framework
- (void)configureRoutes
{
// define minimum, maximum points
MKMapPoint northEastPoint = MKMapPointMake(0.f, 0.f);
MKMapPoint southWestPoint = MKMapPointMake(0.f, 0.f);
// create a c array of points.
MKMapPoint* pointArray = malloc(sizeof(CLLocationCoordinate2D) * _points.count);
// for(int idx = 0; idx < pointStrings.count; idx++)
for(int idx = 0; idx < _points.count; idx++)
{
CLLocation *location = [_points objectAtIndex:idx];
CLLocationDegrees latitude = location.coordinate.latitude;
CLLocationDegrees longitude = location.coordinate.longitude;
// create our coordinate and add it to the correct spot in the array
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
MKMapPoint point = MKMapPointForCoordinate(coordinate);
// if it is the first point, just use them, since we have nothing to compare to yet.
if (idx == 0) {
northEastPoint = point;
southWestPoint = point;
} else {
if (point.x > northEastPoint.x)
northEastPoint.x = point.x;
if(point.y > northEastPoint.y)
northEastPoint.y = point.y;
if (point.x < southWestPoint.x)
southWestPoint.x = point.x;
if (point.y < southWestPoint.y)
southWestPoint.y = point.y;
}
pointArray[idx] = point;
}
if (self.routeLine) {
[self.mapView removeOverlay:self.routeLine];
}
self.routeLine = [MKPolyline polylineWithPoints:pointArray count:_points.count];
// add the overlay to the map
if (nil != self.routeLine) {
[self.mapView addOverlay:self.routeLine];
}
// clear the memory allocated earlier for the points
free(pointArray);
double width = northEastPoint.x - southWestPoint.x;
double height = northEastPoint.y - southWestPoint.y;
_routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, width, height);
// zoom in on the route.
[self.mapView setVisibleMapRect:_routeRect];
}
// MKMapViewDelegate methods
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
MKOverlayView* overlayView = nil;
if(overlay == self.routeLine)
{
// if we have not yet created an overlay view for this overlay, create it now.
if (self.routeLineView) {
[self.routeLineView removeFromSuperview];
}
self.routeLineView = [[MKPolylineView alloc] initWithPolyline:self.routeLine];
self.routeLineView.fillColor = [UIColor redColor];
self.routeLineView.strokeColor = [UIColor redColor];
self.routeLineView.lineWidth = 10;
overlayView = self.routeLineView;
}
return overlayView;
}