CLLocation distanceFromLocation

时间:2011-03-04 20:36:56

标签: iphone xcode ios4 mkmapview core-location

我正在使用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.我认为这是不正确的,因此我的代码一定存在问题。

如果有,请你指出来!

2 个答案:

答案 0 :(得分:9)

你有两个坏习惯。

  1. 在需要硬件审查状态的情况下,您不应该依赖模拟器。特别是当你想要正确的测试时。
  2. 您正在错误地处理类型。因此您无法正确检查值。经度-1067024384怎么样?经度值是度。这意味着根据经度的定义,它的有效范围限制为-90.0~ + 90.0。
  3. 您的经度值超出范围。这意味着其中之一。您错误地打印了值或实际值是错误的。模拟器可以打印错误的值。或者您使用错误的方法打印了值。你必须尝试:

      

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

    如果在此之后结果不好,

      

    查看应用代码的所有。   特别适用于印刷,处理价值。检查您是否在>中使用了正确的类型和铸件。每种情况。因为您可能会在某些地方习惯性地进行错误操作

    而且,我建议像这样检查所有中间值。

    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!
    

答案 1 :(得分:1)

尝试@“%f”,不要这样投。

CLLocation.h

typedef double CLLocationDistance;