如何计算经纬度之间的距离
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何计算经纬度之间的距离相关的知识,希望对你有一定的参考价值。
参考技术A 计算两点距离的如下公式:C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)
Distance = R*Arccos(C)*Pi/180
这里,R和Distance单位是相同,如果是采用6371.004千米作为半径,那么Distance就是千米为单位,如果要使用其他单位,比如mile,还需要做单位换算,1千米=0.621371192mile
如果仅对经度作正负的处理,而不对纬度作90-Latitude(假设都是北半球,南半球只有澳洲具有应用意义)的处理,那么公式将是:
C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)
Distance = R*Arccos(C)*Pi/180
以上通过简单的三角变换就可以推出。
如果三角函数的输入和输出都采用弧度值,那么公式还可以写作:
C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)
Distance = R*Arccos(C)*Pi/180
也就是:
C = sin(LatA/57.2958)*sin(LatB/57.2958) + cos(LatA/57.2958)*cos(LatB/57.2958)*cos((MLonA-MLonB)/57.2958)
Distance = R*Arccos(C) = 6371.004*Arccos(C) kilometer = 0.621371192*6371.004*Arccos(C) mile = 3958.758349716768*Arccos(C) mile
在实际应用当中,一般是通过一个个体的邮政编码来查找该邮政编码对应的地区中心的经纬度,然 后再根据这些经纬度来计算彼此的距离,从而估算出某些群体之间的大致距离范围(比如酒店旅客的分布范围-各个旅客的邮政编码对应的经纬度和酒店的经纬度所 计算的距离范围-等等),所以,通过邮政编码查询经纬度这样一个数据库是一个很有用的资源。
附:C#代码:
private const double EARTH_RADIUS = 6378.137;//地球半径
private static double rad(double d)
return d * Math.PI / 180.0;
public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
s = s * EARTH_RADIUS;
s = Math.Round(s * 10000) / 10000;
return s;
如何计算经纬度两点之间的距离? [复制]
【中文标题】如何计算经纬度两点之间的距离? [复制]【英文标题】:How do I calculate the distance between two points of latitude and longitude? [duplicate] 【发布时间】:2010-04-16 10:29:50 【问题描述】:我有特定地点的纬度和经度,我想计算距离,那么我该如何计算呢?
【问题讨论】:
您无法从纬度和经度中获取距离。距离需要两个纬度和经度。 这是最近几个 SO 问题的主题,看看周围。 我有 2 个纬度和经度... 【参考方案1】:CLLocation *location1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:lat2 longitude:long2];
NSLog(@"Distance i meters: %f", [location1 distanceFromLocation:location2]);
[location1 release];
[location2 release];
你还需要在你的项目中添加CoreLocation.framework
,并添加import语句:
#import <CoreLocation/CoreLocation.h>
【讨论】:
【参考方案2】:这可能不是最有效的方法,但它会起作用。
您可以将由纬度和经度指定的两个位置视为向量。假设坐标已经转换为笛卡尔坐标,计算两个向量的点积。
给定 v1 = (x1, y1, z1) 和 v2 = (x2, y2, z2),那么 ...
v1 dot v2 = magnitude(v1) * magnitude(v2) * cos (theta)
方便的是,v1 和 v2 的大小将是相同的......地球的半径 (R)。
x1*x2 + y1*y2 + z1*z2 = R*R*cos(theta)
求解θ。
theta = acos ((x1*x2 + y1*y2 + z1*z2) / (R * R));
现在两个向量之间的角度以弧度表示。因此,在穿越地球表面时,两点之间的距离是......
distance = theta * R.
可能有一种更简单的方法可以完全在球坐标的上下文中执行此操作,但我在该领域的数学太模糊了——因此转换为笛卡尔坐标。
要转换为笛卡尔坐标...
设 alpha 为纬度,beta 为经度。
x = R * cos (alpha) * cos (beta)
y = R * sin (alpha)
z = R * cos (alpha) * sin (beta)
不要忘记数学函数通常以弧度为单位,而纬度/经度以度为单位。
【讨论】:
请注意,这是一个近似值,因为地球更像是一个扁球体(更准确地说,它变成了梨形),而且它的表面并不平坦。 查看proj.4
网站,了解在地球上使用球形模型 (trac.osgeo.org/proj/wiki/GeodesicCalculations) 时的错误讨论。归根结底,他们说,如果您为 R 选择了一个好的值,那么使用这种方法可以达到 1% 以内。
+1。据推测,这个答案的标题可能是“如何计算大圆路线”(航海术语)。 UPVOTE 免责声明:我验证数学的能力为零。我只是羡慕产生它的能力,我尊重清晰的呈现。【参考方案3】:
我已经完成了数学运算,现在可以大大简化解决方案。
想象一下,如果我们旋转地球,使我们的第一个向量位于 0 度纬度和 0 度经度。第二个向量将位于 (alpha2 - alpha1) 纬度和 (beta2 - beta1) 纬度。
因为...
sin(0) = 0 and cos(0) = 1
我们的点积很简单......
cos(delta_alpha) * cos(delta_beta) = cos(theta)
数学的其余部分保持不变。
theta = acos (cos(delta_alpha) * cos(delta_beta))
distance = radius * theta
希望这会有所帮助。
【讨论】:
以上是关于如何计算经纬度之间的距离的主要内容,如果未能解决你的问题,请参考以下文章