вызов [MapView addOverlay:] не имеет никакого эффекта

#ios #mkmapview #nsdata #mkoverlay

#iOS #mkmapview #nsdata #mkoverlay

Вопрос:

По какой-то причине, когда я использую [MapView addOverlay:], ничего не происходит.

Код:

 NSData* dataLat = [[NSUserDefaults standardUserDefaults] objectForKey:@"latKey"];
NSArray* overlayLat = [NSKeyedUnarchiver unarchiveObjectWithData:dataLat];
double lats[overlayLat.count];
NSData* dataLong = [[NSUserDefaults standardUserDefaults] objectForKey:@"longKey"];
NSArray* overlayLong = [NSKeyedUnarchiver unarchiveObjectWithData:dataLong];
double longs[overlayLong.count];

for(int iii = 0; iii < overlayLat.count; iii  )
{
    NSNumber* a = (NSNumber*)[overlayLat objectAtIndex:iii];
    lats[iii] = [a doubleValue];
}

for(int iii = 0; iii < overlayLong.count; iii  )
{
    NSNumber* a = (NSNumber*)[overlayLong objectAtIndex:iii];
    longs[iii] = [a doubleValue];
}

int size = (sizeof(lats) / sizeof(lats[0]));

NSLog(@"%d", size);

MKMapPoint points[size];

for(int iii = 0; iii < overlayLong.count; iii  )
{
    MKMapPoint point = MKMapPointMake(lats[iii], longs[iii]);
    if(lats[iii] != 0)
        points[iii] = point;
}

for(int iii = 0; iii < 15; iii  )
{
    NSLog(@"Lat (x):%f", points[iii].x);
    NSLog(@"Long (y):%f", points[iii].y);
}

MKPolyline* line = [MKPolyline polylineWithPoints:points count:size];

[mapView addOverlay:line];

NSLog(@"finished");
  

Подавляющее большинство этого кода просто обращается к данным и превращает их в пригодные для использования координаты. Мой вопрос (потому что я знаю, что координаты действительны из-за NSLogs), почему ничего не добавляется в MapView при вызове addOverlay: ? При необходимости я могу опубликовать больше кода. Спасибо!

Ответ №1:

polylineWithPoints:count: Метод принимает массив MKMapPoint структур C.

An MKMapPoint — это не то же самое, что a CLLocationCoordinate2D (широта, долгота). Вы создаете MKMapPoint структуры, используя MKMapPointMake , но присваивая им значения широты и долготы. Такого MKMapPoint нет в ожидаемом месте.

Либо используйте MKMapPointForCoordinate для создания MKMapPoint из координат lat / long, либо, что, вероятно, проще, создайте массив CLLocationCoordinate2D структур C и вызовите polylineWithCoordinates:count: вместо этого.

Комментарии:

1. Отлично, хотя Крейг хорошо говорит о «недостающих элементах». Вы не устанавливаете points[iii], если lats[iii] равно 0, оставляя points [iii] со значением мусора, которое либо не понравится представлению карты, либо приведет к сбою, либо ваша полилиния будет выглядеть неправильно. Посмотрите, почему lats [iii] равны 0 для начала и / или вообще не включают их в массив точек. Я думаю, что Крейг предполагает, что этот процесс будет проще с помощью NSMutableArray, а затем перенести результаты в массив C. (Кстати, нулевая широта и долгота — это вполне допустимое и реальное местоположение.)

2. Я знаю, что местоположение 0 lat 0 long является допустимым местоположением, но оно точно не будет получать прием ячейки. Я согласен, я думаю, что при хранении данных в первую очередь должны храниться только ненулевые широты и долготы.

Ответ №2:

Может быть, ваш «размер» неверен? В вашем массиве точек также будут отсутствовать элементы в любом месте, где исходные данные имели 0. Я бы выбрал NSMutableArray и добавил к нему элементы, если они считаются действительными, затем посчитал это в конце и передал в polylineWithPoints .

Комментарии:

1. Проблема в том, что MKMapPoints не являются объектами, поэтому их помещение в NSMutableArray раздражает.