我使用了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];
为什么两个值不同?
我应该使用horizontalAccuracy和verticalAccuracy初始化location对象吗?
答案 0 :(得分:1)
略有不同,因为地球的半径并不精确 6371 km 。使用正确的地球半径,可能会得到更好的效果。
答案 1 :(得分:0)
您的结果不同,因为您使用的是不同的代码。
你没有说有多么不同。 完全不同?您的代码中存在错误。 靠近地方的巨大差异?也许你的公式有舍入错误的问题。 随着地方分开而增长的差异?也许你对距离的定义是不同的。应该是沿地球表面的最近距离。
一般来说,地球不是球体而是球体。考虑到这一点更加困难,但会给出更精确的结果。
答案 2 :(得分:0)
使用官方WGS84地球半径: 6 378 137米
我记得ios提供了完全相同的结果。
我应该使用horizontalAccuracy和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);
}
希望它能帮到你