经纬度计算距离
根据经纬度计算距离公式
其中:
(Lng1, lat1)
表示A点经纬度对应弧度,(lng2, lat2)
表示B点经纬度对应弧度;
- $a=Lat1-Lat2$为两点纬度的弧度之差,$b=Lng1-Lng2$为两点经度的弧度之差;
- R为地球半径,$R=6378.137km$
- 公式计算出来的结果单位为千米。若将半径改以米为单位,则计算的结果单位为米;
- 计算经度与谷歌地图的距离经度差不多,相差范围在0.2米以下
- 这种计算方式一般都是直线距离
一般地图上显示的左边顺序为:纬度在前(范围-90 ~ 90),经度在后(范围-180 ~ 180)
使用SQL计算距离的代码
1 2 3 4
| SELECT *, 6378.138 *1000 * 2 * ASIN(SQRT(POW(SIN((lat1 * PI() / 180 - lat2 * PI() / 180) / 2), 2) + COS(lat1 * PI() / 180) * COS(lat2 * PI() / 180) * POW(SIN((lng1 * PI() / 180 - lng2 * PI() / 180) / 2), 2))) AS distance FROM distance ORDER BY distance ASC
|
使用JAVA计算距离的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private static final double EARTH_RADIUS = 6378137; private static double rad(double d){ return d * Math.PI / 180.0; } public static double GetDistance(double lon1,double lat1,double lon2, double lat2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lon1) - rad(lon2); 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; return s; }
|