使用orekit库计算指定时刻指定地点的太阳高度角和昼夜变化状态
考虑了大气折射模型
首先还是要初始化orekit环境
@Test
public void getSunAltitudeAngle() throws ParseException {
OrekitContext.init("orekit-data");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SunStatus elevation = AttitudesUtil.getSunStatus(formatter.parse("2023-06-06 12:00:00"), 58.5, 127.3, 83.6);
System.out.println(elevation.getAltitudeAngle());
}
太阳状态封装
@Data
public class SunStatus {
/**
* 太阳高度角
*/
private double altitudeAngle;
/**
* 晨昏状态
*/
private boolean isNight;
public SunStatus(double altitudeAngle, boolean isNight) {
this.altitudeAngle = altitudeAngle;
this.isNight = isNight;
}
}
方法实现
/**
* 计算太阳高度角
*
* @param date 北京时间
* @param latitude 纬度
* @param longitude 经度
* @param altitude 高程
* @return
*/
public static SunStatus getSunStatus(Date date, double latitude, double longitude, double altitude) {
final double equatorialRadius = Constants.WGS84_EARTH_EQUATORIAL_RADIUS;
final double flattening = Constants.WGS84_EARTH_FLATTENING;
OneAxisEllipsoid earth = new OneAxisEllipsoid(equatorialRadius, flattening, FramesFactory.getITRF(IERSConventions.IERS_2010, true));
final GeodeticPoint geodeticPoint = new GeodeticPoint(FastMath.toRadians(latitude), FastMath.toRadians(longitude), altitude);
AbsoluteDate absoluteDate = new AbsoluteDate(date, TimeScalesFactory.getUTC());
TopocentricFrame topo = new TopocentricFrame(earth, geodeticPoint, "curLocation");
//大气折射模型
AtmosphericRefractionModel refractionModel = new EarthITU453AtmosphereRefraction(geodeticPoint.getAltitude());
Vector3D position = CelestialBodyFactory.getSun().getPVCoordinates(absoluteDate, OrekitContext.frame).getPosition();
double trueElevation = topo.getElevation(position, FramesFactory.getEME2000();, absoluteDate);
double calculatedElevation = trueElevation + refractionModel.getRefraction(trueElevation);
boolean isNight = (GroundAtNightDetector.ASTRONOMICAL_DAWN_DUSK_ELEVATION - calculatedElevation) > 0;
return new SunStatus(Math.toDegrees(calculatedElevation), isNight);
}