摘抄了几个方法,明天上班去测下精度
对上面的公式解释如下:
1.Lat1 Lung1 表示A点经纬度,Lat2 Lung2 表示B点经纬度;
2.a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差;
3.6378.137为地球半径,单位为公里;
计算出来的结果单位为公里。
====================================
- public class FCDTools {
- public final static double PI = 3.14159265354;
- private final static double D2R = 0.017453 ;
- private final static double a2 = 6378137.0;
- private final static double e2 = 0.006739496742337;
- public static double Distance(FCD_Point pt1, FCD_Point pt2) {
- if(pt1.lng == pt2.lng && pt1.lat == pt2.lat ) {
- return 0.0;
- } else {
- double fdLambda =(pt1.lng - pt2.lng) * D2R;
- double fdPhi = (pt1.lat - pt2.lat) * D2R;
- double fPhimean = ((pt1.lat + pt2.lat) / 2.0) * D2R;
- double fTemp = 1 - e2 * (Math.pow (Math.sin(fPhimean),2));
- double fRho = (a2 * (1 - e2)) / Math.pow (fTemp, 1.5);
- double fNu = a2 / (Math.sqrt(1 - e2 * (Math.sin(fPhimean) * Math.sin(fPhimean))));
- double fz = Math.sqrt (Math.pow(Math.sin(fdPhi / 2.0), 2) +
- Math.cos(pt2.lat * D2R) * Math.cos( pt1.lat*D2R ) * Math.pow( Math.sin(fdLambda / 2.0),2));
- fz = 2 * Math.asin(fz);
- double fAlpha = Math.cos(pt2.lat * D2R) * Math.sin(fdLambda) * 1 / Math.sin(fz);
- fAlpha = Math.asin (fAlpha);
- double fR = (fRho * fNu) / ((fRho * Math.pow( Math.sin(fAlpha),2)) + (fNu * Math.pow( Math.cos(fAlpha),2)));
- return fz * fR;
- }
- }
- }
-
测试代码:
- System.out.println(FCDTools.Distance(new FCD_Point(117.107277,31.980298),
- new FCD_Point(117.524757, 31.888227)));
- // 输出70.7公里
转:[url=http://www.cnblogs.com/computer-lzy/archive/2011/04/21/2024289.html]MISS_MY_GOD [/url]
[align=center][size=4]根据两点经纬坐标计算两点间的距离[JAVA] [/size][/align]
解决此问题的关键是要理解空间几何模型,在理解空间几何模型的基础上再利用数学公式求取两点之间的值。其解决步骤如下:
1、设两点分别为P1、P2,如果其值是用度分秒形式表示,则需将其转换成十进制度的形式,如P1点纬度为23度30分,则其纬度值转换成十进制度的形式为23.5度。如果值为十进制度的形式,则直接进入第二步。
2、分别将两点的经度、纬度值转换成弧度制形式,如P1纬度为23.5度,转换成弧度制则为:23.5*PI / 180。分别用 P1latInRad、P1LongInRad、P2latInRad、P2LongInRad表示。
3、分别求取两点间的纬度差(dlat)与经度差(dlon);
4、求取两点间的正弦与余弦值,公式如下:
A=sin2(dlat/2) + cos(P1LatInRad)*cos(P2LatInRad)*Sin2(dlon/2) (1)
5、求取两点的正切值,公式如下:
C=2*Math.Atan2(Math.Sqrt(A), Math.Sqrt(1-A)) (2)
6、返回两点间的距离:公式如下:
D=EarthRadiusKm * C (3)[code]public class distCnvter {
private final static double PI = 3.14159265358979323; // 圆周率
private final static double R = 6371229; // 地球的半径
public static double getDistance(double longt1, double lat1, double longt2,double lat2) {
double x, y, distance;
x = (longt2 - longt1) * PI * R
* Math.cos(((lat1 + lat2) / 2) * PI / 180) / 180;
y = (lat2 - lat1) * PI * R / 180;
distance = Math.hypot(x, y);
return distance;
}
}[/code]
==================================================
double hypot(double x, double y) {
return sqrt(x * x + y * y);
}
double distance(double wd1, double jd1, double wd2, double jd2) {// 根据经纬度坐标计算实际距离
double x, y, out;
double PI = 3.1415926535898;
double R = 6.371229 * 1e6;
x = (jd2 - jd1) * PI * R * cos( ( (wd1 + wd2) / 2) * PI / 180) / 180;
y = (wd2 - wd1) * PI * R / 180;
out = hypot(x, y);
return out;
}