根据经纬度计算两点球面距离

来源:互联网 发布:软件系统维护方案 编辑:程序博客网 时间:2024/06/05 05:29
</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);}


0 0
原创粉丝点击