Несколько MKPolyline на MKMapView iOS6

Я работаю с MKMapView, чтобы нарисовать маршрут, используя MKPolyline, я могу нарисовать один маршрут с массивом путевых точек. Теперь я хочу нарисовать несколько MKPolyline на MKMapView, например, синий MKPolyline от 28.102021, 77.10129 до 28.20320, 77.3021 и красный MKPolyline от 28.50930, 77.89192 до 28.60291, 77.87328. Как я могу этого добиться?

Код:

- (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];

    }
}
}

Спасибо


person Ankur Arya    schedule 27.11.2012    source источник
comment
Даже если вы не используете мой ответ ниже, есть несколько вещей, которые вы должны принять во внимание. В viewForOverlay вы игнорируете наложение, указанное в качестве параметра, и используете переменную класса routeLine. Если вы когда-нибудь надеетесь иметь два наложения на своей карте, вам нужно возвращать представление, основанное на том, которое запрашивает карта. Кроме того, что это за штука 0.0-1.0? Просто используйте -1 или готовый цвет, например [UIColor whiteColor].   -  person Craig    schedule 27.11.2012


Ответы (1)


Там много кода, который вы там показали, единственный бит, который имеет значение, это viewForOverlay. Там вам предоставляется объект, который соответствует протоколу MKOverlay, и если вы создали свой собственный класс для его реализации, вы можете добавить переменную, которая может использоваться для определения того, с каким наложением вы имеете дело в этот момент, и, таким образом, настроить свои цвета. Дальше по вашему коду я вижу, что вы создаете MKPolyline, это наложения, переданные в viewForOverlay, и поскольку они наследуются от MKShape, у них есть атрибуты title и subTitle, которые вы можете использовать.

Поэтому, когда вы создаете MKPolyline, вы можете установить title, возможно, на «typeA» и «typeB», затем в viewForOverlay вам нужно преобразовать наложение в MKPolyline и проверить, какой заголовок он должен использовать, чтобы решить, какой цвет использовать:

- (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;
    }
}
person Craig    schedule 27.11.2012
comment
Спасибо за помощь @Craig. - person Ankur Arya; 29.11.2012
comment
еще один вопрос, я могу добавить 2 MKPolylines, и если я добавлю третий так же, как я добавил второй, он не появится. есть ли ограничение на количество MKPolyline, которое мы можем добавить? - person Ankur Arya; 29.11.2012
comment
Если и есть предел, то не 2, а скорее десятки или сотни. Вероятно, вы перепутали свои переменные и сделали две из них с одинаковыми координатами или убрали одну из текущего вида карты. Опубликуйте еще один вопрос с некоторым кодом, если вы не можете его решить. - person Craig; 29.11.2012
comment
спасибо Крейг, проблема решена. Я использовал одни и те же координаты для 2 MKPolylines. - person Ankur Arya; 30.11.2012
comment
@Craig: Извините, я не знаю, как с вами связаться иначе: в ответ на SO ‹stackoverflow.com/a/16167959/ 1987726›, однажды я упомянул руководство о том, как добавить полилинию в mapView. Ссылка ‹spitzkoff.com/craig/?p=136› не работает. Я предполагаю, что это был учебник, написанный вами. Можно ли найти его в другом месте, чтобы я мог обновить свой ответ? - person Reinhard Männer; 28.08.2016
comment
@Reinhard Я не припомню, чтобы писал учебник на эту тему, и у меня нет связи со spitzkoff.com, поэтому я боюсь, что не могу вам помочь. - person Craig; 28.08.2016
comment
@Craig: В любом случае спасибо за ответ! - person Reinhard Männer; 29.08.2016