在自定义纬度/经度处创建新的 CLLocationCoordinate2D

Posted

技术标签:

【中文标题】在自定义纬度/经度处创建新的 CLLocationCoordinate2D【英文标题】:Creating a new CLLocationCoordinate2D at custom Latitude/Longitude 【发布时间】:2011-07-18 21:12:33 【问题描述】:

我觉得问这个问题很糟糕,因为这似乎是一件很容易挂断电话的事情,但我已经查看了所有我能找到的相关资源,尝试了我见过其他人的尽可能多的解决方案组合使用,没有任何效果...

我正在尝试遍历我收到的一些 XML,并解析出 XML 中坐标的纬度和经度,并将其存储在一个数组中,然后我将从中绘制它。

我的问题是,无论我使用什么类型,如何转换它,你有什么,xcode 总是会发现一些问题。

我的 .h 文件的相关部分:

CLLocationCoordinate2D Coord;
CLLocationDegrees lat;
CLLocationDegrees lon;

@property (nonatomic, readwrite) CLLocationCoordinate2D Coord;
@property (nonatomic, readwrite) CLLocationDegrees lat;
@property (nonatomic, readwrite) CLLocationDegrees lon;

我的 .m 文件的相关部分:

else if ([elementName isEqualToString:@"Lat"]) 
        checkpoint.lat = [[attributeDict objectForKey:@"degrees"] integerValue];

else if ([elementName isEqualToString:@"Lon"]) 
    checkpoint.lon = [[attributeDict objectForKey:@"degrees"] integerValue];

else if ([elementName isEqualToString:@"Coord"]) 
    checkpoint.Coord = [[CLLocation alloc] initWithLatitude:checkpoint.lat longitude:checkpoint.lon];

我得到的当前错误是:“从不兼容的类型'id''分配给'CLLocationCoordinate2D。我认为这意味着初始化函数的返回值不正确,但我不知道为什么,因为它是内置函数...

我还尝试了我看到其他人在做什么对我来说最有意义的事情:

checkpoint.Coord = CLLocationCoordinate2DMake(checkpoint.lat, checkpoint.lon);

虽然它不会立即返回错误,但当我尝试构建和运行时,它会给我:

架构 i386 的未定义符号: “_CLLocationCoordinate2DMake”,引用自: -[XMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:] 在 Checkpoint.o ld:未找到体系结构 i386 的符号 collect2: ld 返回 1 个退出状态

非常感谢任何朝着正确方向的帮助/澄清/推动,因为我现在非常没有想法。

【问题讨论】:

问这么简单的问题永远不会感到难过;这就是我们来这里的目的。 【参考方案1】:

对您来说最有意义的事情 (CLLocationCoordinate2DMake) 是正确的。您只是忘记在项目中包含 CoreLocation 框架。

而且,正如其他人所指出的,文件中的纬度/经度可能不是整数。

【讨论】:

嗯,有道理,我认为这与缺少框架有关 >. 【参考方案2】:

我所做的是: 首先创建一个 CLLocationCoordinate2D:

CLLocationCoordinate2D c2D = CLLocationCoordinate2DMake(CLLocationDegrees latitude, CLLocationDegrees longitude); 

我的经纬度是双重类型。

在您的 Imports 中确保 Mapkit 库已导入。

#import <MapKit/MapKit.h>

【讨论】:

【参考方案3】:

这应该可行。

CLLocationCoordinate2D center;
.....
else if ([elementName isEqualToString:@"Lat"]) 
    center.latitude = [[attributeDict objectForKey:@"degrees"] doubleValue];

else if ([elementName isEqualToString:@"Lon"]) 
    center.longitude = [[attributeDict objectForKey:@"degrees"] doubleValue];

【讨论】:

嘿 Kal,感谢您的快速响应,但不幸的是,我遇到了与 Joris 的建议相同的错误集。如果您(或 Joris)对原因有任何想法,我很乐意给他们一个机会。谢谢!【参考方案4】:

尝试改变

[[attributeDict objectForKey:@"degrees"] integerValue]

进入

[[attributeDict objectForKey:@"degrees"] floatValue]

还有

checkpoint.Coord = [[CLLocation alloc] ....

不可能正确,因为您将 Coord 定义为 CLLocationCoordinate2D,即

不是 CLLocation 不是类而是结构

你应该做的是:

    CLLocationCoordinate2D coordinate;    

    else if ([elementName isEqualToString:@"Lat"]) 
        coordinate.latitude = [[attributeDict objectForKey:@"degrees"] floatValue];
    
    else if ([elementName isEqualToString:@"Lon"]) 
        coordinate.longitude = [[attributeDict objectForKey:@"degrees"] floatValue];
    

    checkpoint.Coord = coordinate;

【讨论】:

嗨,乔里斯,感谢您的快速回复!我很欣赏你的澄清,这很有意义。我尝试了您建议的更改,最终得到“表达式不可分配”错误。我的代码与您建议的相同,我真的不知道为什么 xcode 不批准。如果有任何方法可以给您更多信息,请告诉我,我将编辑主要问题!谢谢! 意识到这已经很老了,但是 CLLocationDegrees 类型(由 CLLocationCoordinate2d 组成)是双精度而不是浮点...取决于您需要多少分辨率,您想改为调用 doubleValue浮动值。

以上是关于在自定义纬度/经度处创建新的 CLLocationCoordinate2D的主要内容,如果未能解决你的问题,请参考以下文章

字符串到 CLLocation 纬度和经度

CLLocation 如何实现 Equatable 协议?

如何从 CLLocation 变量中提取经度和纬度?

如何使用 iPhone 的 CLLocation 类将纬度和经度分配给变量?

从浮点 lat long 创建的 CLLocation 显示更高的精度

CLLocation + Weather(Alamofire) 问题