原文地址:http://blog.chinaunix.net/space.php?uid=22363424&do=blog&cuid=2108521
2009-02-13 11:14:40 发表于电子技术 本文链接: 通过经纬度计算距离的公式
在去年cosbeta曾经发布了一个网页计算工具,这个作用就是根据地球上两点之间的经纬度计算两点之间的直线距离。经纬度到距离的计算在通信工程中应用比较广泛,所以cosbeta通过搜索找到了一个js的计算脚本(其实是google map的计算脚本,应该算是比较准确了),做成了这个经纬度算距离的工具。
今天有人给cosbeta发邮件,询问计算的公式是什么样的。其实,若是把地球当作一个正常的球体(其实它是椭球)来说,球面两点之间的距离计算并不复杂,运用球坐标很容易就能计算出两点之间的弧长。当然这都是高中的知识,我和你一样,也没有那个耐心来将其推导,所以我就利用google map的经纬度到距离计算的js脚本,将球面弧长的公式给还原出来(估计这个公式是经过部分修正的),还原出来的公式如下:
对上面的公式解释如下:
公式中经纬度均用弧度表示,角度到弧度的转化应该是很简单的了吧,若不会,依然请参考这个这个经纬度算距离的工具;
Lat1 Lung1 表示A点经纬度,Lat2 Lung2 表示B点经纬度;
a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差;
6378.137为地球半径,单位为公里;
计算出来的结果单位为公里;
http://www.storyday.com/wp-content/uploads/2008/09/latlung_dis.html
从google maps的脚本里扒了段代码,没准啥时会用上。大家一块看看是怎么算的。
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;
}
整理好后的完整程序如下:
#include <stdio.h>
#include <math.h>
#define EARTH_RADIUS 6378.137
#define PI 3.1415926
double rad(double d)
{
return d * PI / 180.0;
}
double dis(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 * asin(sqrt(pow(sin(a/2),2) + cos(radLat1)*cos(radLat2)*pow(sin(b/2),2)));
s = s * EARTH_RADIUS;
return s;
}
int main()
{
double lat1,lng1,lat2,lng2,distance;
printf("please input lat1:\n");
scanf("%lf:",&lat1);
printf("please input lng1:\n");
scanf("%lf:",&lng1);
printf("please input lat2:\n");
scanf("%lf:",&lat2);
printf("please input lng2:\n");
scanf("%lf:",&lng2);
distance=dis(lat1,lng1,lat2,lng2);
printf("the distance is %f Km\n:",distance);
return 0;
}