经纬度,距离,方位角相关计算(Java实现)
问题:已知地点1、地点3的经纬度和地点2相对于地点1的方位角和距离,求地点2相对于地点3的方位角和距离。
要解决这个问题,可以分为两步实现:
1.根据一点的经纬度, 到另外一点的距离, 方位角, 计算另外一点的经纬度。
2.求坐标1相对于坐标2的方位角度和距离
解法:
根据一点的经纬度, 到另外一点的距离, 方位角, 计算另外一点的经纬度。
在这个公式中,lat1和lon1是起始点的纬度和经度(以度为单位),distance是两点间的距离(以千米为单位),bearing是方位角(以度为单位),lat2和lon2是终点的纬度和经度(以弧度为单位),返回前使用Math.toDegree()函数转化为以度为单位。
/**
* 根据一点的经纬度, 到另外一点的距离, 方位角, 计算另外一点的经纬度
* @param lon1 经度 以度为单位
* @param lat1 纬度 以度为单位
* @param bearing 方位角(以度为单位)
* @param distance 移动距离 千米
* @return 返回double数组 double[经度, 纬度]
*/
public static double[] LongLatOffset(double lon1, double lat1, double bearing, double distance) {
//
// 方位角 角度转换到弧度
lon1 = Math.toRadians(lon1);
lat1 = Math.toRadians(lat1);
bearing = Math.toRadians(bearing);
double lat2 = Math.asin(Math.sin(lat1) * Math.cos(distance / arc) +
Math.cos(lat1) * Math.sin(distance / arc) * Math.cos(bearing));
double lon2 = lon1 + Math.atan2(Math.sin(bearing) * Math.sin(distance / arc) * Math.cos(lat1),
Math.cos(distance / arc) - Math.sin(lat1) * Math.sin(lat2));
return new double[]{Math.toDegrees(lon2), Math.toDegrees(lat2)};
}
求坐标1相对于坐标2的方位角度和距离
在这个公式中,lat1和lon1是坐标1的纬度和经度(以弧度为单位),lat2和lon2是坐标2的纬度和经度(以弧度为单位),bearing是坐标1相对于坐标2的方位角(以弧度为单位)。
方位角的范围是0°到360°,0°表示正北方向,90°表示正东方向,180°表示正南方向,270°表示正西方向。
/**
* 求坐标2相对于坐标1的方位角度和距离
* 单位:度
* @param lon1
* @param lat1
* @param lon2
* @param lat2
* @return 返回 double数组[方位角,距离],方位角单位: 度 距离单位: 千米
*/
public static double[] bearingDistOffset(double lon1, double lat1, double lon2, double lat2) {
lon1 = Math.toRadians(lon1);
lat1 = Math.toRadians(lat1);
lon2 = Math.toRadians(lon2);
lat2 = Math.toRadians(lat2);
// 是坐标1的纬度和经度(以弧度为单位)
double bearing = Math.atan2(Math.sin(lon2 - lon1) * Math.cos(lat2),
Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1));
bearing = Math.toDegrees(bearing);
// log.info("计算后方位角:{}°", bearing);
double distance = arc * Math.acos(Math.sin(lat1) * Math.sin(lat2) +
Math.cos(lat1) * Math.cos(lat2) *
Math.cos(lon2 - lon1));
// log.info("计算后距离:{}km", distance);
distance = distance;
return new double[]{bearing, distance};
}
注: 地球半径arc取6371.393,单位是千米