MKMapView纬度和经度坐标

时间:2012-03-20 01:21:54

标签: iphone objective-c ios ios5 mkmapview

我正在使用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 个答案:

答案 0 :(得分:3)

您的原始代码是:

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

(实际上,您可能有arc4random,而不是arcrandom。)


arc4random函数返回无符号整数值。

从该值中减去一个整数(-107)会导致溢出,其值为4294967189。那肯定是无效的经度。

不是切换到rand(文档中说的是“坏的随机数生成器”),而是使用arc4random(我认为是首选)并通过编写{{来强制进行浮点计算1}}代替-107.0

-107


一个不相关的观点是,如果double latitude = arc4random()%20 +50; double longitude = -107.0 + arc4random()%10; CLLocationCoordinate2DIsValid,那么您只是在执行NO而不发回任何值(根据方法声明需要)。可以returnreturn tempMapData;

答案 1 :(得分:0)

Canappi基于一种简单的编程语言mdsl,用于为iOS生成Objective-C代码。它们有一个地图控件,允许您从简单的描述符中获得所需的内容。如此示例所示,您可以使用静态推针位置或动态位置:

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

生成的代码已打开,因此您只需将其复制并粘贴回应用即可。