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;
}

1 ответ

Решение

userLocation возражать didUpdateUserLocation Метод делегата всегда один и тот же объект.

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

В частности, он всегда указывает на тот же объект, что и вид карты userLocation свойство указывает на (mapView.userLocation). Вы можете увидеть это, если вы NSLoguserLocation а также 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];
Другие вопросы по тегам