</pre><p>原文:http://www.oschina.net/question/565065_66989</p><p></p><pre name="code" class="cpp">#include <iostream>
#include <cmath>
using namespace std;
double EARTH_RADIUS = 6378.137;//地球半径
double PI=3.1415926535;
double rad(double d){
return d * PI / 180.0;
}
double round(double d){
return floor(d + 0.5);
}
double get_distance(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;
s = round(s * 10000) / 10000;
return s;
}
int main(int argc, char** argv) {
double d = get_distance(40.0706,116.588717,40.070917,116.588684);
cout<<d*1000<<"m"<<endl;
}
java版本:
public static double calcDistance(double Longitude1, double Latitude1, double Longitude2, double Latitude2){
double dRadLat1 = Rad(Latitude1);
double dRadLat2 = Rad(Latitude2);
double a = dRadLat1 - dRadLat2;
double b = Rad(Longitude1) - Rad(Longitude2);
double dRad = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(dRadLat1) * Math.cos(dRadLat2) * Math.pow(Math.sin(b / 2), 2)));
double dDistance = dRad * EARTH_RADIUS;
dDistance = round(dDistance * 10000) / 10000;
return Math.abs(dDistance * 1000);
}
private static double Rad(double dDegree){
return dDegree * PI / 180.0;
}
private static double round(double d) {
return Math.floor(d + 0.5);
}
public static void main(String[] args) {
double Longitude1 = 73.65;
double Latitude1 = 11.36911;
double Longitude2 = 73.65;
double Latitude2 = 11.36912;
double num = calcDistance(Longitude1, Latitude1, Longitude2, Latitude2);
System.out.println(num);
}