#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 раздражает.