原文地址: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;
}