2012-03-20 3 views
6

В настоящее время я работаю с MKMapView, и я пытаюсь заставить данные появляться на экране. Для этого я решил выбрать небольшой MapDataProvider, который выплескивает массив объектов MKAnnotation, каждый из которых содержит координату со случайными значениями широты и долготы.Координаты широты и долготы MKMapView

Я уже убедился, что мой MKMapView подключен к моему контроллеру, и массив объектов MKAnnotation исходит из моего MapDataProvider правильно ... но по какой-то причине .. когда я пытаюсь указать координаты в Северной Америке (например, 48, -84) .. ничего не отображается в MKMapView.

После игры я узнал, что любое значение долготы меньше 0 дает мне эту проблему.

Я попытался проверить значение координаты для каждого объекта MKAnnotation в моей коллекции, но CLLocation2DIsValue() продолжает возвращать false.

Вопрос:

Какой диапазон значений можно ввести для широты и долготы для CLLocationCoordinate2D, так что мои контакты показывают в Северной Америке?

Чтобы дать немного больше контекста, вот метод будучи вызван в MapDataProvider:

+ (NSArray *) getMockMapData {

NSMutableArray *tempMapData = [[NSMutableArray alloc] initWithCapacity:15]; 

for (int i=0; i< 15; i++) { 

    double latitude = rand()%20 +50; 
    double longitude = -107 + rand()%10; 

    CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(latitude, longitude); 

    if(CLLocationCoordinate2DIsValid(coord) == NO) 
     continue; 

    [tempMapData addObject:[MockMapData 
          dataForValues:[@"Item " stringByAppendingString:[[NSNumber numberWithInt:i] description]] 
           subTitle:[@"Item " stringByAppendingString:[[NSNumber numberWithInt:i]description]] 
           coordinate:coord]]; 
    } 
    return tempMapData; 
} 
+1

Широта может быть от -90 до 90, а долгота может быть от -180 до 180, поэтому действует 48, -84. Можете ли вы опубликовать код, который добавляет аннотации? – Anna

+0

Спасибо за ваш ответ. Поиграв с ним еще немного, я отключил arcrandom для rand, и это изменило мою проблему. – dpalmajr

+0

Обновлен источник с последним исправлением. – dpalmajr

ответ

3

Ваш исходный код был такой:

double latitude = arcrandom()%20 +50; 
double longitude = -107 + arcrandom()%10; 

(На самом деле, вы, вероятно, имели arc4random, а не arcrandom.)


Функция arc4random возвращает целое число без знака.

Вычитание целого числа (-107) из этого значения привело к переполнению, которое давало значения, такие как 4294967189. Это определенно будет неправильной долготой.

Вместо переход на rand (который говорит, что документация является «плохим генератором случайных чисел»), используйте arc4random (который я считаю, является предпочтительным) и заставить вычисления с плавающей запятой в письменной форме -107.0 вместо -107:

double latitude = arc4random()%20 +50; 
double longitude = -107.0 + arc4random()%10; 


неродственное Дело в том, что если CLLocationCoordinate2DIsValid говорит NO, вы просто делаете return без отправки обратно любого значения (которое вам нужно согласно декларации методы). Либо сделайте return tempMapData; или continue;.

+0

Тщательный ответ. Спасибо, что объяснили различия между генераторами случайных чисел, с которыми я столкнулся. Что касается случайного выражения «return», вы абсолютно правы. Обычно я этого не делаю, но для того, чтобы дать каждому немного больше контекста (и просто получить что-то и запустить), я думал, что сделаю исключение. – dpalmajr

0

Canappi основан на простом языке программирования mdsl, который используется для генерации кода Objective-C для iOS. У них есть элемент управления картой, который позволяет вам получить то, что вам нужно, от простого дескриптора. Как показывает этот пример, вы можете использовать статические места канцелярской кнопки, или динамические из них:

map venuMap (32,610,708,360) { 
    Standard ; 
    show user ; 
    area .1,.1; 
    //location 30.275806,-97.740128 ('TX Capital' , '1200 N Congress'); 
    locationReference lat, long (sDetTitle, address); 
} 

сгенерированный код открыт, так что вы можете просто скопировать и вставить его обратно в приложение.

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