MKMapView координаты широты и долготы - PullRequest
6 голосов
/ 20 марта 2012

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

Я уже убедился, что мой 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;
}

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Ваш оригинальный код был таким:

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 голосов
/ 20 марта 2012

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

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

...