Рассчитать координаты широты/долготы места, где Солнце находится в зените

Существует множество ресурсов, показывающих, как рассчитать зенит и азимут Солнца, когда заданы время и местоположение.

Однако мне нужно рассчитать место, где солнце находится в зените для заданного времени и даты, а не наоборот. Есть ли более или менее простой способ сделать этот расчет?

Ответы (1)

Хорошо, я нашел решение - на самом деле оно довольно простое:

  • Широта - это склонение солнца
  • Долгота – это прямое восхождение минус GMST (среднее звездное время по Гринвичу).

Пример кода для Java: (уравнения взяты отсюда ( немецкий))

private static double dateToJulianDate(Date date) {
    return date.getTime() / dayMs - 0.5 + J1970;
}



public static HashMap<String, Double> sunPos(Date date)
{
    double J = dateToJulianDate(date);
    double T = (J - J2000)/36525d;
    double M = 2*Math.PI * (0.993133 + 99.997361 * T );
    double L = 2*Math.PI * (0.7859453 + M/(2*Math.PI) + (6893.0*Math.sin(M)+72.0*Math.sin(2.0*M)+6191.2*T) / 1296000d);
    double e = 2*Math.PI * (23.43929111 + (-46.8150*T - 0.00059*T*T + 0.001813*T*T*T)/3600.0d)/360d;
    double DK = Math.asin(Math.sin(e)*Math.sin(L));
    double RA = Math.atan(Math.tan(L)*Math.cos(e));
    double GMST = Math.abs(getSiderealTime(J,0)%(2*Math.PI));


    if(RA < 0) RA      = RA + Math.PI;
    if(L > Math.PI) RA = RA + Math.PI;


    double lat = DK*57.2957795;
    double lon = (RA - GMST)*57.2957795;

    HashMap<String, Double> ret = new HashMap<String, Double>();
    ret.put("lat",lat);
    ret.put("lon",lon);

    return ret;

}