经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
纬度 Latitude , 相当于 垂直 y 轴 的坐标 , 纬度的取值范围 -90 度 ~ + 90 度 ;
西经 和 南纬 是负数 ;
经度使用 W ( 东经 ) 和 E ( 西经 ) 表示 , 纬度 使用 N ( 北纬 ) 和 S ( 南纬 ) 表示 ,
北京 中心 坐标为 :
地球的半径为 :
;
地球的周长为 :
经线 周长 计算 :
经线 的 周长 , 就是 地球的 周长 ;
经线 是 南北走向的 , 任意一个经线 都要经过 南极 和 北极 ;
纬线 周长 计算 :
常用的 38 度 纬度 的地球周长为 :
纬线 是 东西走向的 , 不同 纬度 的 纬线 长度是不同的 ,
上述公式中
是纬度 度数 ;
纬度 的取值范围 -90 度 ~ + 90 度 , 函数曲线如下图所示 :
;
;
经纬度坐标距离计算公式 :
, Lat1 是 坐标点一 纬度 , Lng1 是 经度 ;
, Lat2 是 坐标点一 纬度 , Lng2 是 经度 ;
, 是 两个坐标点的 纬度之差 ;
, 是 两个坐标点的 经度之差 ;
使用代码实现上述逻辑 :
public class LocationUtils {
private static final double EARTH_RADIUS = 6371; // 地球平均半径,单位为公里
public static double getDistance(double lat1, double lon1, double lat2, double lon2) {
double radLat1 = Math.toRadians(lat1);
double radLat2 = Math.toRadians(lat2);
double a = radLat1 - radLat2;
double b = Math.toRadians(lon1) - Math.toRadians(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;
s = Math.round(s * 1000) / 1000.0; // 保留三位小数
return s;
}
}
经度 ( 东西方向 ) 上 1 米 , 对应的度数是由当前的纬度决定的 ;
不同的 纬度 上 , 纬线 ( 东西方向 ) 的周长不一样 ;
赤道上 1 米对应的经度计算 :
赤道上 纬度为 0 度 , 东西方向的 纬线周长为 40030173 米 , 是最长的 ;
对应的计算过程如下 :
38° 纬度 1 米对应的经度计算 :
38° 纬度 , 东西方向的 纬线周长为 31544206 米 ;
对应的计算过程如下 :
纬度 ( 南北方向 ) 上 1 米 , 对应的度数是固定的 ;
值为
1 度经度对应东西距离 :
赤道位置的公式为 :
为地球半径 ;
非赤道位置的公式 :
38 度纬度位置 1 度经度对应的东西距离为 :
1 度纬度对应南北距离 公式 :
public class LocationUtils {
private static final double EARTH_RADIUS = 6371; // 地球平均半径,单位为公里
public static double getDistance(double lat1, double lon1, double lat2, double lon2) {
double radLat1 = Math.toRadians(lat1);
double radLat2 = Math.toRadians(lat2);
double a = radLat1 - radLat2;
double b = Math.toRadians(lon1) - Math.toRadians(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;
s = Math.round(s * 1000) / 1000.0; // 保留三位小数
return s;
}
}
public class LocationUtils {
public static final double EARTH_RADIUS = 6371.393;
public static Double km2Degree(Double km){
return (180 / EARTH_RADIUS / Math.PI) * km;
}
public static Double degree2Km(Double degree){
return EARTH_RADIUS / 180 * Math.PI * degree;
}
}
public class LocationUtils {
/**
* 将角度转换为弧度
* @param degree
* @return
*/
public static double deg2rad(double degree) {
return degree / 180 * Math.PI;
}
/**
* 将弧度转换为角度
* @param radian
* @return
*/
public static double rad2deg(double radian) {
return radian * 180 / Math.PI;
}
}
参考链接 :