【问题标题】:CLLocation distanceFromLocationCLLocation distanceFromLocation
【发布时间】:2011-07-09 02:41:27
【问题描述】:

我正在使用 CLLocation 来计算与当前用户位置的距离以及注释。但是我只是想知道这是否正确。我目前正在为此使用 iPhone 模拟器,根据 MKMapView,iPhone 模拟器位于此处:

Lat: 0 Long: -1067024384

注解的位置是:

workingCoordinate.latitude = 40.763856;
workingCoordinate.longitude = -73.973034;

但是,如果您查看谷歌地图,您会发现这些距离有多近,但根据 CLLocation 却相距甚远。我正在使用以下代码来确定它们之间的距离。

CLLocation *loc = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:annotation.coordinate.longitude];
CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:self.mapView.userLocation.coordinate.latitude longitude:self.mapView.userLocation.coordinate.longitude];
CLLocationDistance dist = [loc distanceFromLocation:loc2];
int distance = dist
NSLog(@"%i", distance);

被NSLogged的距离是12769908。我认为这是不正确的,因此我的代码肯定有问题。

如果有请指出来!

【问题讨论】:

    标签: iphone xcode ios4 mkmapview core-location


    【解决方案1】:

    你有两个坏习惯。

    1. 在需要硬件审查状态的情况下,您不应依赖模拟器。尤其是当你想要正确的测试
    2. 您处理的类型不正确。因此,您无法正确检查值。 -1067024384 的经度是多少?经度值是度数。这意味着根据经度的定义,它的有效范围是 -90.0 ~ +90.0。

    您的经度值超出范围。这意味着其中之一。您错误地打印了值或实际值错误。模拟器可以打印错误的值。或者您使用错误的方法打印了该值。你必须尝试:

    在具有真实硬件审查器的真实设备上进行测试。

    如果之后继续出现不良结果,

    查看所有您的应用程序代码。 特别是对于打印、处理值。检查您在每种情况下都使用了正确的类型和铸件。因为你可能习惯性地在某个地方做了错误的操作。

    另外,我建议检查所有像这样的中间值。

    CLLocationCoordinate2D annocoord = annotation.coordinate;
    CLLocationCoordinate2D usercoord = self.mapView.userLocation.coordinate;
    
    NSLog(@"ANNO  = %f, %f", annocoord.latitude, annocoord.longitude);
    NSLog(@"USER = %f, %f", usercoord.latitude, usercoord.longitude);
    
    CLLocation *loc = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:annotation.coordinate.longitude];
    CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:self.mapView.userLocation.coordinate.latitude longitude:self.mapView.userLocation.coordinate.longitude];
    
    NSLog(@"LOC  = %f, %f", loc.coordinate.latitude,  loc.coordinate.longitude);
    NSLog(@"LOC2 = %f, %f", loc2.coordinate.latitude, loc2.coordinate.longitude);
    
    CLLocationDistance dist = [loc distanceFromLocation:loc2];
    
    NSLog(@"DIST: %f", dist); // Wrong formatting may show wrong value!
    

    【讨论】:

    • 我在设备上遇到了同样的错误。这是您提供的代码的输出:ANNO = 37.331741, -122.030564 USER = -180.000000, -180.000000 LOC = 37.331741,LOC2 = -180.000000, -180.000000 LOC2 = -180.000000, -180.000000 DIST: 12769908.162754
    • 我仍然像以前一样获得随机位置。
    【解决方案2】:

    尝试 @"%f" 并且不要那样转换它。

    CLLocation.h

    typedef double CLLocationDistance;
    

    【讨论】:

    • 这并没有什么不同。我已将 int 更改为 float,它在控制台中返回相同的结果。我也尝试将其更改为双精度。
    • 12769908 = 12769 公里和 908 米...顺便说一句,您的模拟器显示的位置非常奇怪。
    • 请问你是怎么做到的?怎么可能等于12769km?但 908 米听起来更逼真
    • 12769908m = 12769 公里和 908 米。 'distanceFromLocation:' 函数以米为单位返回距离。
    • @XcodeDev 当您不匹配 printf 数据类型时,输出可以完全关闭。将其转换为双精度后,您能说出它显示为输出的内容吗?顺便说一句,我在模拟器中的默认位置如下所示newLocation=<+40.71815700, -74.03419350> +/- 150.00m (speed 0.00 mps / course -1.00)
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2014-04-10
    • 2011-06-15
    • 2011-05-07
    相关资源
    最近更新 更多