CLLocation distance我在计算时的位置结果不同

时间:2014-03-07 07:27:16

标签: ios objective-c distance core-location cllocation

我使用了CLLocation的distanceFromLocation:方法来计算某个位置的距离。

但是当我使用“Haversine公式”计算时,结果略有不同。

- (CLLocationDistance)distanceFromCoordinate:(CLLocationCoordinate2D)fromCoord {
  double earthRadius = 6371.0; // Earth's radius in Kilometers

  // Get the difference between our two points then convert the difference into radians
  double nDLat = RADIANS((fromCoord.latitude - self.coordinate.latitude));
  double nDLon = RADIANS((fromCoord.longitude - self.coordinate.longitude));

  double fromLat = RADIANS(self.coordinate.latitude);
  double toLat =  RADIANS(fromCoord.latitude);

  double nA = pow ( sin(nDLat/2.0), 2 ) + cos(fromLat) * cos(toLat) * pow ( sin(nDLon/2.0), 2 );

  double nC = 2.0 * atan2( sqrt(nA), sqrt( 1 - nA ));
  double nD = earthRadius * nC;

  return nD * 1000.0;
}


CLLocation * loc = [[CLLocation alloc] initWithLatitude:[location.latitude doubleValue]
                                                           longitude:[location.longitude doubleValue]];

CLLocationDistance dist = [userLocation distanceFromLocation:loc];
CLLocationDistance dist2 = [userLocation distanceFromCoordinate:loc.coordinate];

为什么两个值不同?

我应该使用horizo​​ntalAccuracy和verticalAccuracy初始化location对象吗?

4 个答案:

答案 0 :(得分:1)

略有不同,因为地球的半径并不精确 6371 km 。使用正确的地球半径,可能会得到更好的效果。

答案 1 :(得分:0)

您的结果不同,因为您使用的是不同的代码。

你没有说有多么不同。 完全不同?您的代码中存在错误。 靠近地方的巨大差异?也许你的公式有舍入错误的问题。 随着地方分开而增长的差异?也许你对距离的定义是不同的。应该是沿地球表面的最近距离。

一般来说,地球不是球体而是球体。考虑到这一点更加困难,但会给出更精确的结果。

答案 2 :(得分:0)

使用官方WGS84地球半径: 6 378 137米

我记得ios提供了完全相同的结果。

  

我应该使用horizo​​ntalAccuracy和init初始化location对象   verticalAccuracy?

不,当然不是。这些属性暗示了这个位置的确切程度 距离仅以纬度和经度计算。

公式不多:
  - 半正式公式(比余弦法慢一点,否则罚款)
  - 余弦定律(如果不使用64位精度则在小距离上存在问题)
  - 我认为,他们使用了elipsoidal earth模型。

答案 3 :(得分:-1)

我也遇到了同样的问题...所以我使用谷歌网络服务来计算距离。使用此方法,您将获得准确的距离

-(void)calculateDistance()
{
//http://maps.googleapis.com/maps/api/directions/json?origin=41.742964,-87.995971&   destination=41.811511,-87.967923&mode=driving&sensor=false
NSString *LocationUrl = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%@,%@&destination=%@,%@&mode=driving&sensor=false",origin.latitude,origin.longitude,destination.latitude,destination.latitude];
NSLog(@"Location URL:%@",LocationUrl);

NSURL *finalurl = [NSURL URLWithString: LocationUrl];

NSLog(@"Final URL = %@",finalurl);

NSData *data = [NSData dataWithContentsOfURL:finalurl];
NSLog(@"Data:-%@",data);
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data       
options:kNilOptions error:&error];

// NSLog(@"josn data of location:%@",[json description]);
NSMutableDictionary *routes = [json objectForKey:@"routes"];
NSMutableArray *legs = [routes valueForKey:@"legs"];
NSMutableDictionary *newDistance =[legs valueForKey:@"distance"];
NSMutableArray distanceList =[[newDistance valueForKey:@"text"]objectAtIndex:0];
distance = [[distanceList objectAtIndex:0]floatValue];
NSLog(@"%.1f",distance);
}

希望它能帮到你