import java.util.Random;
public class LngAndLatUtil {
public static double lng1 = 104.06;
public static double lat1 = 30.67;
public static double lng2 = 104.32;
public static double lat2 = 30.88;
//平均速度 单位米/秒
public static double rice = 194.0;
//时间 单位秒
public static long time = 6;
//地球半径
public static double R = 6378137;
/**
* 可配置时间、速度 起始点经纬度
* 三点计算夹角度
*
* @param args
*/
public static void main(String[] args) {
//A边到B边距离
double distanceToB = getDistance(lng1, lat1, lng2, lat2);
System.out.println("A边到B边距离:" + distanceToB);
//B边到C边距离
double distanceByTime = getDistanceByTime(rice, time);
System.out.println("B边到C边距离:" + distanceByTime);
//C边到A边距离
//生成随机角度
double nextDouble = new Random().nextDouble() * 180;
System.out.println("偏移角度:" + nextDouble);
//根据B点经纬度、距离计算C点经纬度
double[] doubles = getLngAndLatByDistance(90, lng2, lat2, distanceByTime);
double lng3 = doubles[0];
double lat3 = doubles[1];
double distanceToC = getDistance(lng2, lat2, lng3, lat3);
System.out.println("B边到C边距离:" + distanceToC);
System.out.println(doubles[0]);
System.out.println(doubles[1]);
double[] distance2Angle = getDistance2Angle(lng1, lat1,
rice, time, nextDouble);
}
/**
* 根据角度 经纬度 速度 时间获得一个地址的经纬度
*
* @param lng 经度
* @param lat 纬度
* @param rice 速度 米/秒
* @param time 时间 秒
* @param angle 角度
* @return 经纬度
*/
public static double[] getDistance2Angle(Double lng, Double lat,
Double rice, Long time, Double angle) {
//根据时间和速度求出路程
double distance = getDistanceByTime(rice, time);
//根据角度 经纬度 距离获得一个地址的经纬度
return getLngAndLatByDistance(angle, lng, lat, distance);
}
/**
* 根据角度 经纬度 距离获得一个地址的经纬度
*
* @param lng 经度
* @param lat 纬度
* @param distance 路程
* @param angle 角度
* @return 经纬度
*/
public static double[] getDistance2Angle(Double lng, Double lat,
Double distance, Double angle) {
//根据角度 经纬度 距离获得一个地址的经纬度
return getLngAndLatByDistance(angle, lng, lat, distance);
}
/**
* @param lng1 经度1
* @param lat1 维度1
* @param lng2 经度2
* @param lat2 纬度2
* @return 单位米
*/
public static double getDistance(double lng1, double lat1,
double lng2, double lat2) {
double a, b;
lat1 = lat1 * Math.PI / 180.0;
lat2 = lat2 * Math.PI / 180.0;
a = lat1 - lat2;
b = (lng1 - lng2) * Math.PI / 180.0;
double d;
double sa2, sb2;
sa2 = Math.sin(a / 2.0);
sb2 = Math.sin(b / 2.0);
d = 2 * R * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1) * Math.cos(lat2) * sb2 * sb2));
return d;
}
/**
* @param rice 平均速度 单位米/秒
* @param time 时间 单位秒
* @return 单位米
*/
public static double getDistanceByTime(double rice, long time) {
double distance;
distance = rice * time;
return distance;
}
/**
* @param lat_a 纬度1
* @param lng_a 经度1
* @param lat_b 纬度2
* @param lng_b 经度2
* @return 单位度
*/
public static double getAngle1(double lat_a, double lng_a, double lat_b, double lng_b) {
double y = Math.sin(lng_b - lng_a) * Math.cos(lat_b);
double x = Math.cos(lat_a) * Math.sin(lat_b) - Math.sin(lat_a) * Math.cos(lat_b) * Math.cos(lng_b - lng_a);
double brng = Math.atan2(y, x);
brng = Math.toDegrees(brng);
if (brng < 0)
brng = brng + 360;
return brng;
}
/**
* 获取经度
*
* @param lng
* @param distance
* @return
*/
public static double getLng(double lng, double distance) {
return (180 * distance) / (Math.PI * R * Math.cos(lng * Math.PI / 180));
}
/**
* 获取纬度
*
* @param lat
* @param distance
* @return
*/
public static double getLat(double lat, double distance) {
return (180 * distance) / (Math.PI * R * Math.cos(lat * Math.PI / 180));
}
/**
* 根据经纬度 路程 角度 获得终点的经纬度
* @param angle
* @param startLong
* @param startLat
* @param distance
* @return
*/
public static double[] getLngAndLatByDistance(double angle, double startLong, double startLat, double distance) {
double[] result = new double[2];
//将距离转换成经度的计算公式
double v = distance / R;
// 转换为radian,否则结果会不正确
angle = Math.toRadians(angle);
startLong = Math.toRadians(startLong);
startLat = Math.toRadians(startLat);
double lat = Math.asin(Math.sin(startLat) * Math.cos(v) + Math.cos(startLat) * Math.sin(v) * Math.cos(angle));
double lon = startLong + Math.atan2(Math.sin(angle) * Math.sin(v) * Math.cos(startLat), Math.cos(v) - Math.sin(startLat) * Math.sin(lat));
// 转为正常的10进制经纬度
lon = Math.toDegrees(lon);
lat = Math.toDegrees(lat);
result[0] = lon;
result[1] = lat;
return result;
}
}
java根据角度 经纬度 速度时间等获取第三点距离
于 2021-09-02 14:40:49 首次发布