2013-05-30 3 views
2

Я пытаюсь отобразить полилинию на моей карте, но линия не отображается. Я много пробовал, но, похоже, работает.iOS SDK: MapKit MKPolyLine не отображается

Я проверил функции Core Data, и он возвращает данные, так что это не проблема. Это должно быть где-то в создании или создании карты на карте (я думаю). Я уверен, что это где-то ошибка, но я не могу ее найти.

Моего код:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    mapView.delegate = self; 
} 

- (void)createLine 
{ 
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Logs" inManagedObjectContext:context]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDescription]; 

    NSError *error; 
    NSArray *logs = [context executeFetchRequest:request error:&error]; 

    int logsCount = [logs count]; 
    MKMapPoint points[logsCount]; 

    // loop logs 
    for (int i = 0; i < logsCount; i++) 
    { 
     MKMapPoint point; 
     point = MKMapPointMake([[[logs objectAtIndex:i] valueForKey:@"lat"] doubleValue], [[[logs objectAtIndex:i] valueForKey:@"lng"] doubleValue]); 

     points[i] = point; 
    } 

    MKPolyline *routeLine = [MKPolyline polylineWithPoints:points count:logsCount]; 
    [mapView addOverlay:routeLine]; 
} 

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{ 
    MKOverlayView *mapOverlayView = [[MKOverlayView alloc] initWithOverlay:overlay]; 
    return mapOverlayView; 
} 
+0

Как выглядит ваш метод 'mapView: viewForOverlay:'? –

+0

Также обратите внимание, что код назначает lat/long MKMapPoint. MKMapPoint не _ широта/долгота. Используйте CLLocationCoordinate2D вместо MKMapPoint, CLLocationCoordinate2DMake вместо MKMapPointMake и polylineWithCoordinates вместо polylineWithPoints. – Anna

+0

Я изменил его на MKMapPoint, потому что думал, что это проблема. Я верну его обратно в CLLocationCoordinate2D. Я также добавил свой mapView: viewForOverlay. –

ответ

2

Есть две проблем с кодом показано:

  1. Ломаными создаются с помощью MKMapPoint с, что неправильно установленными значениями широты/долготы. Значение MKMapPoint не является степенью широты/долготы. Это преобразование x/y на длине плоской карты. Либо конвертировать значения широты/долготы в MKMapPoint с использованием MKMapPointForCoordinate или использовать только CLLocationCoordinate2D. Просто используя CLLocationCoordinate2D, когда у вас есть lat/long, намного проще кодировать и понимать.
  2. В viewForOverlay код создает пустой MKOverlayView который невидимый. Создайте вместо этого MKPolylineView (подкласс MKOverlayView, который рисует MKPolyline s) и устанавливает его strokeColor.


Для первого вопроса, использование:

  • CLLocationCoordinate2D вместо MKMapPoint,
  • CLLocationCoordinate2DMake вместо MKMapPointMake,
  • и polylineWithCoordinates вместо polylineWithPoints


Для второго вопроса, вот пример:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolyline class]]) 
    { 
     MKPolylineView *mapOverlayView = [[MKPolylineView alloc] initWithPolyline:overlay]; 
     //add autorelease if not using ARC 
     mapOverlayView.strokeColor = [UIColor redColor]; 
     mapOverlayView.lineWidth = 2; 
     return mapOverlayView; 
    } 

    return nil; 
} 


Несколько других вещей:

  • Вместо valueForKey:@"lat", я хотел бы использовать objectForKey:@"lat" (то же самое для @"lng").
  • Удостоверьтесь, что delegate имеет вид карты, иначе метод делегирования viewForOverlay не будет вызван даже при всех других изменениях.
+0

Спасибо за очень обширный ответ!Он работает сейчас :-) Одна нота: объектForKey: @ "" не работает (получена ошибка, говорящая, что на этом объекте нет такого селектора), поэтому я использую valueForKey: @ "". Зачем использовать objectForKey вместо valueForKey? –

+0

Я думал, вы назвали его в NSDictionary. См. Http://stackoverflow.com/questions/1062183/difference-between-objectforkey-and-valueforkey. – Anna

Смежные вопросы