Reputation: 4723
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 MKPolyline
s 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
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 MKPolyline
s, 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