Ankur Arya
Ankur Arya

Reputation: 4723

Multiple MKPolyline on MKMapView iOS6

I am working with MKMapView to draw route using MKPolyline, I am able to draw single route with an array of waypoints.Now I want to draw multiple MKPolylines on the MKMapView for instance, A blue MKPolyline from 28.102021, 77.10129 to 28.20320, 77.3021 and A red MKPolyline from 28.50930, 77.89192 to 28.60291, 77.87328. How can I achieve this ?

Code:

- (void)viewDidLoad
{
[super viewDidLoad];

locationManager = [[CLLocationManager alloc] init];
locationManager.desiredAccuracy = 6.0;
locationManager.distanceFilter = 1.0;
[locationManager startUpdatingLocation];
locationManager.delegate = self;
map.delegate = self;
[map setShowsUserLocation:YES];
[map setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
wayPoints = [[NSMutableArray alloc] initWithCapacity:30];
newWayPoints = [[NSMutableArray alloc]initWithCapacity:10];
totalDistance = 0.0;

stopTime = [NSDate dateWithTimeIntervalSinceNow:100];
startTime = [NSDate date];

SEL sel = @selector(timerTargetMethod);
NSInvocation* inv = [NSInvocation invocationWithMethodSignature:
                     [self methodSignatureForSelector:sel]];
[inv setTarget:self];
[inv setSelector:sel];

stopTimer = [NSTimer scheduledTimerWithTimeInterval:5 invocation:inv repeats:true];
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}



- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{
if(newLocation != nil && oldLocation != newLocation)
{
    tempNewLocation = newLocation;
    tempOldLocation = oldLocation;

}

}


- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views
{    
MKAnnotationView *annotationView = [views objectAtIndex:0];
id<MKAnnotation> mp = [annotationView annotation];
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate] ,4000,4000);

[mv setRegion:region animated:YES];
}

// MKMapViewDelegate
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
MKOverlayView* overlayView = nil;
MKPolylineView  * routeLineView = [[MKPolylineView alloc] initWithPolyline:self.routeLine];
routeLineView.fillColor = [UIColor colorWithRed:0.0-1.0 green:0.0-1.0 blue:0.0-1.0 alpha:1.0f];
routeLineView.strokeColor = [UIColor colorWithRed:0.0-1.0 green:0.0-1.0 blue:0.0-1.0 alpha:1.0f];

routeLineView.lineWidth = 3;
routeLineView.lineCap = kCGLineCapSquare;
overlayView = routeLineView;
return overlayView;

}

//define the targetmethod
-(void) timerTargetMethod 
{

if([[NSDate date] timeIntervalSinceDate:startTime] >= 100)
{
    [stopTimer invalidate];
    [locationManager stopUpdatingLocation];
    NSLog(@"Time started at %@", startTime);
    NSLog(@"Time up at %@", stopTime);
}
else if (tempOldLocation.coordinate.latitude == tempNewLocation.coordinate.latitude   && tempNewLocation.coordinate.longitude == tempOldLocation.coordinate.longitude) 
{
    NSLog(@" Fix location found ");
}
else if( [[NSDate date] timeIntervalSinceDate:startTime] >= 19 )
{
    if(roundf([[NSDate date] timeIntervalSinceDate:startTime]) == 20)
    {
        NSLog(@"First Time Location Update");
        latitudeLongitude.text = [[ NSString alloc] initWithFormat:@"%g , %g", tempNewLocation.coordinate.latitude, tempNewLocation.coordinate.longitude];

        float interval = [[NSDate date] timeIntervalSinceDate:startTime];
        int okInterval = roundf(interval);
        NSLog(@"Interval 1 , %d", okInterval );
        time.text = [[ NSString alloc] initWithFormat:@"%d", okInterval  - 20];
        speed.text = @"0";
        totalDistance =  0;
        distance.text = @"0 meters";
    }
    else
    {
        latitudeLongitude.text = [[ NSString alloc] initWithFormat:@"%g , %g", tempNewLocation.coordinate.latitude, tempNewLocation.coordinate.longitude];

        float interval = [[NSDate date] timeIntervalSinceDate:startTime];
        int okInterval = roundf(interval);
        time.text = [[ NSString alloc] initWithFormat:@"%d", okInterval  - 20];
        NSLog(@"Interval 2 , %d , %f", okInterval , interval);
        if((tempNewLocation.coordinate.latitude == tempOldLocation.coordinate.latitude && tempNewLocation.coordinate.longitude == tempOldLocation.coordinate.longitude) || tempNewLocation.speed < 0)
            speed.text = @"0";
        else
            speed.text = [[ NSString alloc] initWithFormat:@"%g meters/sec", tempNewLocation.speed];

        if(tempNewLocation.coordinate.latitude == tempOldLocation.coordinate.latitude && tempNewLocation.coordinate.longitude == tempOldLocation.coordinate.longitude)
        {

        }
        else if ([tempNewLocation distanceFromLocation:tempOldLocation] - tempNewLocation.horizontalAccuracy >= 0) 
            totalDistance +=  [tempNewLocation distanceFromLocation:tempOldLocation] - (tempNewLocation.horizontalAccuracy / 2);
        else
            totalDistance +=  [tempNewLocation distanceFromLocation:tempOldLocation];

        if (totalDistance < 0) 
            distance.text = @"0 meters";
        else
            distance.text = [[ NSString alloc] initWithFormat:@"%g meters", totalDistance];
    }


    [wayPoints addObject:tempNewLocation];
    MKMapPoint * pointsArray =
    malloc(sizeof(CLLocationCoordinate2D)*2);

    pointsArray[0]= MKMapPointForCoordinate(tempOldLocation.coordinate); 
    pointsArray[1]= MKMapPointForCoordinate(tempNewLocation.coordinate);

    routeLine = [MKPolyline polylineWithPoints:pointsArray count:2];
    free(pointsArray);

    if (tempNewLocation.coordinate.latitude - tempOldLocation.coordinate.latitude < 1) {
        [map addOverlay:routeLine];

    }
}
}

Thanks

Upvotes: 0

Views: 3087

Answers (1)

Craig
Craig

Reputation: 8294

That's a lot of code you've shown there, the only bit that is relevant is viewForOverlay. In there you are given an object that conforms to the MKOverlay protocol and if you have created your own class to implement that you could add a variable that could be used to identify which overlay you were dealing with at that point and thus adjust your colours. Further down your code I see you are creating MKPolylines, those are the overlays passed in to viewForOverlay and because they inherit from MKShape they have title and subTitle attributes you can use.

So when you create the MKPolyline you could set the title, maybe to "typeA" and "typeB", then in viewForOverlay you need to cast the overlay to a MKPolyline and check which title it has to decide which colour to use:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    if([overlay class] == MKPolyline.class)
    {
        MKOverlayView* overlayView = nil;
        MKPolyline* polyline = (MKPolyline *)overlay;
        MKPolylineView  * routeLineView = [[MKPolylineView alloc] initWithPolyline:polyline];
        if([polyline.title isEqualToString:@"typeA"])
        {
            routeLineView.fillColor = [UIColor redColor];
            routeLineView.strokeColor = [UIColor redColor];
        } else {
            routeLineView.fillColor = [UIColor blueColor];
            routeLineView.strokeColor = [UIColor blueColor];

        }
        routeLineView.lineWidth = 3;
        routeLineView.lineCap = kCGLineCapSquare;
        overlayView = routeLineView;
        return overlayView;
    } else {
        return nil;
    }
}

Upvotes: 5

Related Questions