风速风向计算,参考Wind Direction Quick Reference | Earth Observing Laboratory实现代码如下
public static void main(String[] args) {
double u = -10;
double v = 10;
double[] dirAndSpeed = getDirAndSpeed(u, v);
System.out.println("speed:" + dirAndSpeed[0]);
System.out.println("dir:" + dirAndSpeed[1]);
double[] uv = getUV(dirAndSpeed[0], dirAndSpeed[1]);
System.out.println("u:" + uv[0]);
System.out.println("v:" + uv[1]);
}
/**
* 计算风向风速
* 正北风为0或360
*
* @param u u经向风分量(x)
* @param v v纬向风分量(y)
* @return BigDecimal[]
*/
private static double[] getDirAndSpeed(double u, double v) {
double ws = Math.sqrt(Math.pow(u, 2) + Math.pow(v, 2));
double wd = (270 - Math.toDegrees(Math.atan2(v, u))) % 360d;
return new double[]{ws, wd};
}
/**
* 计算UV向风
*
* @param speed 风速
* @param dir 风向
* @return BigDecimal[]
*/
private static double[] getUV(double speed, double dir) {
double radians = Math.toRadians(dir);
double u = -speed * Math.sin(radians);
double v = -speed * Math.cos(radians);
return new double[]{u, v};
}