MKPolyline рисует только точки вместо линий

Я пытаюсь отслеживать маршрут пользователя и рисовать линии маршрута, но addOverlay дает мне только правильные точки, но не связывает каждую точку.

-(void)viewWillAppear:(BOOL)animated{
    self.trackPointArray = [[NSMutableArray alloc] init];
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(CLLocation *)userLocation
{
    [self.trackPointArray addObject:userLocation];

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 1000, 1000);
    [self.myMapView setRegion:[self.myMapView regionThatFits:region] animated:YES];

    NSInteger stepsNumber = self.trackPointArray.count;

    CLLocationCoordinate2D coordinates[stepsNumber];
    for (NSInteger index = 0; index < stepsNumber; index++) {
        CLLocation *location = [self.trackPointArray objectAtIndex:index];
        coordinates[index] = [location coordinate];
    }
    MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:coordinates count:stepsNumber];
    [self.myMapView addOverlay:polyLine];
}


- (MKOverlayRenderer *)mapView:(MKMapView *)myMapView rendererForOverlay:(id<MKOverlay>)overlay
{
    MKPolylineRenderer *polylineRenderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
    polylineRenderer.lineWidth = 4.0f;
    polylineRenderer.strokeColor = [UIColor redColor];
    return polylineRenderer;
}

person Jacob Gu    schedule 22.10.2014    source источник


Ответы (1)


Объект userLocation, который представление карты передает методу делегата didUpdateUserLocation, является одним и тем же объектом каждый раз.

coordinate внутри объекта может быть разным в каждый момент времени, но каждый вызов метода делегата всегда указывает на один и тот же объект-контейнер.

В частности, он всегда указывает на тот же объект, на который указывает свойство userLocation вида карты (mapView.userLocation). Вы можете увидеть это, если вы NSLog userLocation и mapView.userLocation и заметите, что их адреса памяти каждый раз одинаковы.


По этой причине, когда код делает это:

[self.trackPointArray addObject:userLocation];

он просто добавляет ссылку на один и тот же объект в массив несколько раз.

Позже, когда код перебирает массив trackPointArray, каждый вызов [location coordinate] каждый раз возвращает одну и ту же координату, потому что location всегда указывает на один и тот же объект (mapView.userLocation), а координата не меняется во время цикла.

Таким образом, каждый раз, когда вызывается метод делегата, создается полилиния с N координатами (все одинаковые), которая заканчивается рисованием «точки».

Причина, по которой вы видите несколько точек, заключается в том, что код не удаляет предыдущие наложения.


Чтобы исправить все это, один простой способ — создавать новый экземпляр CLLocation каждый раз, когда вы хотите добавить обновленные координаты:

CLLocation *tpLocation = [[CLLocation alloc] 
                           initWithLatitude:userLocation.coordinate.latitude 
                           longitude:userLocation.coordinate.longitude];
[self.trackPointArray addObject:tpLocation];

Кроме того, вы должны удалить предыдущее наложение перед добавлением обновленной строки. Вы не заметите предыдущие строки, если не сделаете этого, но они будут использовать память и производительность:

[self.myMapView removeOverlays:self.myMapView.overlays];
[self.myMapView addOverlay:polyLine];
person Community    schedule 22.10.2014