Дисклеймер: статья скорее больше познавательно-развлекательный, нежели полезный. И тут много картинок

На днях стало интересно увидеть динамику восхода и заката солнца за год, не спрашивайте зачем (просто любопытно). И тут мне открылись очень занимательные наблюдения.

Решил написать небольшую страничку, которая бы брала данные по восходам и закатам с http://open-meteo.com и строила график за несколько лет. Страницу писал не совсем я, использовал ИИ. Но это не главное. Главное это то, что я получил в результате.

График восходов и закатов по координатам Сан-Франциско (ИИ такие подставил)
График восходов и закатов по координатам Сан-Франциско (ИИ такие подставил)

И вот тут мне стало очень интересно. Если приглядеться, то видно что график имеет больше пилообразный вид, чем треугольный (точнее синусоидальный). Т.е. получается в некоторых местах на планете нарастание продолжительности дня и ночи происходит плавнее чем убывание. Пытался придумать почему так происходит, но пока не нашёл нормального объяснения (понятно что это зависит от наклона оси и наклона орбиты земли, но как конкретно не понял). И тут у меня заиграло воображение и я начал экспериментировать.

Для начала мне стало интересно как изменяется график на разных широтах. Взял только восход, чтобы не перегружать график данными. И тут я увидел очень много интересного.

Во-первых, первый график оказался очень забавным. Он оказался не ровным, а с какими-то «холмами». При том очень хорошо видно что с повышением широты график сглаживается.

На втором графике забавно то, что 30° и 40° широты ± очень похожи, но 50° широта отличается очень сильно. График смещён вниз и при этом увеличена амплитуда. Т.е. получается что нарастание и убывание дня в течении года тут происходит быстрее, но рассвет начинается раньше по местному времени.

А третий график очень хорошо показывает полярный день.

Начал строить «зеркальные» графики. Т.е. брал широту с + и с -. Тут чуть меньше интересного. Видно что графики в противофазе (удивительно :) ). Но по первым двум графикам (10° и 20° широты) видно что график южной широты чуть ниже (т.е. рассвет происходит раньше по местному времени) и слегка растянут по оси времени (это значит что изменение длины дня в южном полушарии происходит более резко в течении года).

Третий и четвёртый графики тоже интересные. Видно что «южный» график ± на том же уровне что и график экватора, а северный выше. Т.е. получается что на севере по времени восход происходит позже (не в ≈4 утра, а в ≈6 по местному времени).

А вот график 60 широты оказался почти одинаковым как для южной части земли, так и для северной.

Ещё два графика это разные долготы. Первый график сделан на широте +30° градусов широты, второй на +60° градусов. В целом ничего необычного. Но вот если сравнивать между собой два графика, видно что с повышением широты графики становятся уже и растянутей по оси времени. Собственно это же было видно раньше.

Тут я решил построить графики долгот на +10° широте. Как видно графики практически идентичны (удивительно :) ). Но интересное тут то, что есть графики которые ± совпадают про оси времени. При этом для абсолютно разных долгот. Только два верхних графика (+30° и -70° долготы) стоят особняком, остальные так или иначе совпадают друг с другом по местному времени.

В целом довольно познавательный опыт, наталкивающий на размышления :). Было бы замечательно если бы кто-нибудь из астрономов объяснил всё это, т.к. моей компетенции точно не хватит чтобы всё это разобрать по полочкам.

P.S. Ещё одно уточнение — данные точные, ИИ в них ничего не «испортил» т.к. данные брались с сервиса прогноза погоды (а они обычно точны в плане восходов и закатов). К тому же, весь код, который написал ИИ я перепроверил, так что у меня нет причин сомневаться в этих графиках.

UPD

Решил, на всякий случай выложить код скриптов, т.к. могут возникнуть ряд вопросов.

Код для построения первого графика
<!DOCTYPE html>
<html>
<head>
  <title>Sunrise and Sunset Chart</title>
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
  <canvas id="sunriseSunsetChart" width="800" height="400"></canvas>

  <script>
    const ctx = document.getElementById('sunriseSunsetChart').getContext('2d');

    // Replace with your desired latitude and longitude
    const latitude = 37.7749; // Example: San Francisco
    const longitude = -122.4194;

    // API parameters
    const baseUrl = 'https://api.open-meteo.com/v1/forecast';
    const dailyParams = 'sunrise,sunset';
    const timezone = 'auto';
    const startDate = `2020-01-01`;
    const endDate = `2024-12-31`;

    // Fetch data from Open-Meteo API
    async function fetchSunData() {
      const apiUrl = `${baseUrl}?latitude=${latitude}&longitude=${longitude}&daily=${dailyParams}&timezone=${timezone}&start_date=${startDate}&end_date=${endDate}`;
      const response = await fetch(apiUrl);
      const data = await response.json();

      // Extract dates, sunrises, and sunsets
      const dates = data.daily.time;
      const sunrises = data.daily.sunrise.map(time => new Date(time).getHours() + new Date(time).getMinutes() / 60);
      const sunsets = data.daily.sunset.map(time => new Date(time).getHours() + new Date(time).getMinutes() / 60);

      createChart(dates, sunrises, sunsets);
    }

    // Create the chart
    function createChart(dates, sunrises, sunsets) {
      new Chart(ctx, {
        type: 'line',
        data: {
          labels: dates,
          datasets: [
            {
              label: 'Sunrise',
              data: sunrises,
              borderColor: 'orange',
              backgroundColor: 'rgba(255, 165, 0, 0.2)',
              fill: true,
            },
            {
              label: 'Sunset',
              data: sunsets,
              borderColor: 'purple',
              backgroundColor: 'rgba(128, 0, 128, 0.2)',
              fill: true,
            }
          ]
        },
        options: {
          responsive: true,
          scales: {
            x: {
              title: {
                display: true,
                text: 'Date',
              },
              ticks: {
                maxTicksLimit: 12,
                callback: function(value, index) {
                  return dates[index].substring(0, 10); // Show only date part
                }
              }
            },
            y: {
              title: {
                display: true,
                text: 'Time (Hours)',
              },
              ticks: {
                callback: function(value) {
                  const hours = Math.floor(value);
                  const minutes = Math.round((value - hours) * 60);
                  return `${hours}:${minutes.toString().padStart(2, '0')}`;
                }
              }
            }
          }
        }
      });
    }

    fetchSunData();
  </script>
</body>
</html>

Код для построения всех остальных графиков
<!DOCTYPE html>
<html>
<head>
  <title>Sunrise Chart</title>
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
  <canvas id="sunriseChart" width="800" height="400"></canvas>

  <script>
    const ctx = document.getElementById('sunriseChart').getContext('2d');

    // Array of coordinates (latitude and longitude)
    const coordinates = [
      // { latitude: 80, longitude: 0, label: 'latitude — 80' },
      // { latitude: 70, longitude: 0, label: 'latitude — 70' },
      // { latitude: 60, longitude: 0, label: 'latitude — 60' },
      // { latitude: 50, longitude: 0, label: 'latitude — 50' },
      // { latitude: 40, longitude: 0, label: 'latitude — 40' },
      // { latitude: 30, longitude: 0, label: 'latitude — 30' },
      // { latitude: 20, longitude: 0, label: 'latitude — 20' },
      { latitude: 10, longitude: 0, label: 'latitude — 10' },
      { latitude: 0, longitude: 0, label: 'latitude — 0' },
      { latitude: -10, longitude: 0, label: 'latitude — -10' },
      // { latitude: -20, longitude: 0, label: 'latitude — -20' },
      // { latitude: -30, longitude: 0, label: 'latitude — -30' },
      // { latitude: -40, longitude: 0, label: 'latitude — -40' },
      // { latitude: -50, longitude: 0, label: 'latitude — -50' },
      // { latitude: -60, longitude: 0, label: 'latitude — -60' },
      // { latitude: -70, longitude: 0, label: 'latitude — -70' },
      // { latitude: -80, longitude: 0, label: 'latitude — -80' },
    ];

    // API parameters
    const baseUrl = 'https://api.open-meteo.com/v1/forecast';
    const dailyParams = 'sunrise';
    const timezone = 'auto';
    const startDate = `2020-01-01`;
    const endDate = `2024-12-31`;

    async function fetchSunriseData() {
      const datasets = [];

      for (const coord of coordinates) {
        const apiUrl = `${baseUrl}?latitude=${coord.latitude}&longitude=${coord.longitude}&daily=${dailyParams}&timezone=${timezone}&start_date=${startDate}&end_date=${endDate}`;
        const response = await fetch(apiUrl);
        const data = await response.json();

        // Extract dates and sunrises
        const dates = data.daily.time;
        const sunrises = data.daily.sunrise.map(time => new Date(time).getHours() + new Date(time).getMinutes() / 60);

        datasets.push({
          label: `${coord.label}`,
          data: sunrises,
          borderColor: getRandomColor(),
          backgroundColor: 'rgba(0, 0, 0, 0)',
          fill: false,
        });

        if (!window.chartLabels) {
          window.chartLabels = dates;
        }
      }

      createChart(window.chartLabels, datasets);
    }

    // Create the chart
    function createChart(dates, datasets) {
      new Chart(ctx, {
        type: 'line',
        data: {
          labels: dates,
          datasets: datasets
        },
        options: {
          responsive: true,
          scales: {
            x: {
              title: {
                display: true,
                text: 'Date',
              },
              ticks: {
                maxTicksLimit: 12,
                callback: function(value, index) {
                  return dates[index].substring(0, 10); // Show only date part
                }
              }
            },
            y: {
              title: {
                display: true,
                text: 'Time (Hours)',
              },
              ticks: {
                callback: function(value) {
                  const hours = Math.floor(value);
                  const minutes = Math.round((value - hours) * 60);
                  return `${hours}:${minutes.toString().padStart(2, '0')}`;
                }
              }
            }
          }
        }
      });
    }

    // Generate a random color for each dataset
    function getRandomColor() {
      const letters = '0123456789ABCDEF';
      let color = '#';
      for (let i = 0; i < 6; i++) {
        color += letters[Math.floor(Math.random() * 16)];
      }
      return color;
    }

    fetchSunriseData();
  </script>
</body>
</html>

Ещё раз уточню что код был сделан за пару минут с помощью ChatGPT и немного поправлен. Код максимально простой, в нём нет сложных формул, в нём нет кучи данных (точнее есть, но не в зашитом виде). Он не претендует на хоть сколько-нибудь серьёзные изыскания.

Не стоит воспринимать эту статью серьёзно. Это просто способ поделится интересными наблюдениями (возможно кого-то заинтересовать) и услышать ответы на некоторые вопросы от людей, которые лучше разбираются в астрономии и астрофизике.

Комментарии (42)


  1. Jury_78
    18.01.2025 07:14

    увидеть динамику восхода и заката солнца

    Это высота солнца над горизонтом?


    1. andreybold Автор
      18.01.2025 07:14

      нет. Это время восхода и заката


      1. Jury_78
        18.01.2025 07:14

        Максимум на кривой тогда что?

        Вы бы все ж определились с терминами. Вам может и понятно, а другим - нет.


        1. andreybold Автор
          18.01.2025 07:14

          Максимум это летнее солнцестояние, миниму зимнее солнцестояние.


      1. Andy_U
        18.01.2025 07:14

        Это время восхода и заката

        Это время прохода центра Солнца через линию горизонта или верхнего/нижнего края? Рефракция учитывается?


        1. vis_inet
          18.01.2025 07:14

          данные брались с сервиса прогноза погоды

          Там обычно указывается просто время в часах и минутах.


          1. Andy_U
            18.01.2025 07:14

            Там обычно указывается просто время в часах и минутах.

            Вы догадываетесь, что определение момента восхода/заката может отличаться в астрономии и метеорологии?


            1. vis_inet
              18.01.2025 07:14

              Вопрос в величине этого различия.

              Насколько оно значимо?


              1. Andy_U
                18.01.2025 07:14

                На экваторе время прохождения Солнца через горизонт от касания нижней частью до полного исчезновения, вроде около 2х с половиной минут. За полярным кругом до полгода :). И значимо, для чего?


  1. 3epka
    18.01.2025 07:14

    Пилообразность графика, наверное, объясняется движением планеты по орбите вокруг солнца (то есть вращение вокруг оси дает чистую синусоиду, но одновременное скольжение по орбите ее как-бы сдвигает)


    1. Rsa97
      18.01.2025 07:14

      Само вращение вокруг оси ничего не даёт, кроме факта смены дня и ночи. Синусоида возникает из-за наклона земной оси относительно перпендикуляра к плоскости орбиты (~23.44°). А разный угол наклона возникает из-за эксцентриситета земной орбиты (0.0167).


      1. Vest
        18.01.2025 07:14

        Позвольте поучиться. Я правильно понимаю, что из-за эксцентриситета, положение земли в пространстве каждый год разное? Поэтому мы не можем увидеть две совпадающие синусоиды в для одной и той же широты, времени, но разных лет? Ну или не так, чтобы плюс-минус год-два.


        1. Rsa97
          18.01.2025 07:14

          Эксцентриситет влияет на расстояние Земля-Солнце и скорость движения по орбите. Но от витка к витку, то есть каждый астрономический год, параметры орбиты не меняются. Какое-то влияние даёт разница между календарным и астрономическим годами, та самая, из-за которой приходится вводить високосные годы. Но эта погрешность в пределах одной минуты.


          1. Vest
            18.01.2025 07:14

            То есть, в принципе, достаточно «иметь» синусоиду для конкретной широты и она будет совпадать с другими годами. Максимум будет небольшой фазовый сдвиг?

            Правильно я понимаю?


            1. Rsa97
              18.01.2025 07:14

              Да. С учётом того, что надо брать не местное (поясное), а среднее солнечное время для конкретной долготы.


              1. Vest
                18.01.2025 07:14

                Спасибо вам. Я понял.

                Вот почему где-то здесь обсуждалось, что всё это уже рассчитано и никто не измеряет положение солнца.


                1. Rsa97
                  18.01.2025 07:14

                  Да, с учётом орбитального движения Земли, вращения Земли вокруг оси, угла наклона этой оси, широты, высоты точки наблюдения над поверхностью и рефракции атмосферы получаем геометрическое построение, которое даёт расчётную формулу.


            1. Andy_U
              18.01.2025 07:14

              То есть, в принципе, достаточно «иметь» синусоиду для конкретной широты и она будет совпадать с другими годами. Максимум будет небольшой фазовый сдвиг?

              Ну, вообще-то и у орбиты Земли вокруг Солнца есть небольшая прецессия, и у оси вращения самой Земли тоже. И длительность астрономического года не кратна суткам. Да и угловая скорость вращения чуть "плавает". Там какую-то секунду изредка приходится прибавлять или убавлять, причем нерегулярно. Про величину эффектов не скажу.


          1. Andy_U
            18.01.2025 07:14

            Какое-то влияние даёт разница между календарным и астрономическим годами, та самая, из-за которой приходится вводить високосные годы.

            Нет, високосные годы появляются из-за того, что время оборота Земли по орбите не кратно 24 часам.


  1. mikelavr
    18.01.2025 07:14

    Когда то время восхода и захода солнца было наблюдательной величиной. "Бог сделал так!".

    Потом наука смогла понять небесную механику ("Природа сделала так"), и вывести математический аппарат для предсказаний времени восхода и захода. Именно эти формулы и используются в расчетах на сайтах погоды, там наблюдений не делают.

    Вы же наблюдали не солнце, а сайты. Это уже какой то второй уровень абстракции...

    Про эксцентриситет орбиты Земли уже написали.


  1. MaxMxMz
    18.01.2025 07:14

    Обычно в прогнозе погоды время восхода/ захода солнца берется не по центру а по краям диска, что дает некоторую прибавку к продолжительности дня + учитывается рефракция. Это еще минут 5 к продолжительности дня. Проверить можно посмотрев на какой день приходится равноденствие. Или оно где-то 17-18 марта или 20. + Некруглость земли заставляет "дрожать" время восх/зах


    1. vesowoma
      18.01.2025 07:14

      А высота над уровнем моря разве не учитывается в прогнозах для конкретной точки? В астрономических программах ее обязательно указывать наряду с естественно, координатами


      1. Dima954
        18.01.2025 07:14

        Так тут и вопрос, какие именно данные учитывались при расчете времени восхода на конкретном сайте. Ну и насколько корректны вычисления там.

        Навскидку помимо чисто астрономической геометрии, и, как уже сказано, высоты места наблюдения, атмосферной рефракции, ещё может учитываться форма Земли, отсюда изменения графиков по широте.


  1. HardWrMan
    18.01.2025 07:14

    Я, кстати, тоже заметил, что прирост/убывание дня в течении года не равномерно в плане позиции восхода и заката. В моей широте восход отодвигается быстрее, закат отстаёт. И обратно так же. Делал скрины солнцестояний.

    Скрытый текст


  1. andy_p
    18.01.2025 07:14

    Смотрим в сторону "уравнение движения Солнца" или "уравнение времени".


    1. MishaRash
      18.01.2025 07:14

      Более конкретно, уравнение восхода/заката + уравнение времени (+ постоянный сдвиг, если работать в поясном времени). Причём для более простого на первый взгляд уравнения восхода нужно знать склонение Солнца из его движения по кругу эклиптики, слегка неравномерного из-за эллиптичности орбиты Земли; в английской Вики есть приблизительные формулы и более подробное объяснение.


      1. andy_p
        18.01.2025 07:14

        Смотрите эту книжку: Монтенбрук О., Пфлегер Т.Астрономия на персональном компьютере.


        1. MishaRash
          18.01.2025 07:14

          Смотрите эту книжку: Монтенбрук О., Пфлегер Т. Астрономия на персональном компьютере.

          На первый взгляд определённо приятно, что там есть готовый и не слишком сложный код (особенно если добыть версию с приложенными файлами-исходниками), но не уверен, что пояснения очень хороши для начинающих (хотя мне уже сложно об этом судить).


  1. Rsa97
    18.01.2025 07:14

    Но интересное тут то, что есть графики которые ± совпадают про оси времени.

    Если приведёте время к реальному географическому положению, то графики для одной широты вообще совпадут. А так, местное время может расходиться на часы от истинного. Например, Москва живёт по времени +03:00, в то время, как по географическому положению (37°37′03″E) истинное время +02:30:28.


  1. CBET_TbMbI
    18.01.2025 07:14

    Надо бы добавить подпись под каждый график (график чего от чего и что там показано). Иначе неудобно смотреть. Особенно там, где графики накладываются друг на друга.

    Что касается асимметрии, это связано с эллиптичностью орбиты Земли. Будь орбита идеально круглая, думаю, были бы симметричные синусоиды. Но это ещё несколько осложняется тем, что точка максимального приближение (и удаления) от Солнца не совпадает с днями солнцестояния или равноденствия. В общем, Земля быстрее всего движется по орбите в начале января, а медленнее всего в начале июля. Это и вносит асимметрию.

    Этот же фактор влияет на точность солнечных часов - они то спешат, то отстают. Посмотрите на графики тут: https://ru.wikipedia.org/wiki/Уравнение_времени Думаю, найдёте сходство:)


  1. Proscrito
    18.01.2025 07:14

    Данные с сервисов прогноза погоды посчитаны по формулам, поэтому точны. Вы не думали просто взять эти формулы и построить по ним графики?

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


  1. smrl
    18.01.2025 07:14

    Ну если это не троллинг, а реально ситуация в стиле "угадал все буквы, не смог назвать слово"...

    опыт, наталкивающий на размышления :).

    Толкал он, прямо скажем, вас несильно. Неужели совсем ничего в графиках не намекает, что стоило бы попробовать разложить по Фурье?
    А вдруг там похоже на сумму трех синусоид?
    У первой амплитуда зависит от широты (и ее хорошо видно на графиках больших широт).
    Вторая чуть сдвинута по фазе (из-за нее на первом же графике заметно, что не совпадают пики у восходов и закатов).
    А у третьей удвоенная частота (из-за нее на графиках малых широт повышенная горбатость).
    И может быть, если потом еще поглядеть на фазу каждой синусоиды, то окажется, что вторая хорошо ложится на особые даты орбитального движения Земли? Кто знает...


  1. radioxoma
    18.01.2025 07:14

    Парсить сайт с погодой, при возможности самостоятельного расчёта - это сильно.

    Я просто оставлю это здесь. Гражданские сумерки и всё такое прочее. https://github.com/forrestguice/SuntimesWidget


    1. andreybold Автор
      18.01.2025 07:14

      Никто ничего не парсил. С помощью ChatGPT был составлен скрипт, который обращался к API погодного сайта брал оттуда данные и строил на их основе графики.

      Ссылки (вторую я использую) полезные. Но здесь «задача» была другая.

      при возможности самостоятельного расчёта

      Это не совсем то, что «нужно было» в данном случае. Этот инструмент слишком узко заточен и скорей всего не подошёл бы для моих целей.


  1. Sadok
    18.01.2025 07:14

    мда... "влияние шипящих суффиксов поэзии Вознесенского на людей работающих за Полярным кругом"


  1. CyrK
    18.01.2025 07:14

    Время надо брать не по местному времени. Ведь его государство назначает как ему хочется. А оно должно соответствовать географической долготе. Каждые 15 градусов долготы оно должно увеличиваться на час. Кстати, готовые графики на сайте https://voshod-solnca.ru/sun


    1. andreybold Автор
      18.01.2025 07:14

      не совсем точно выразился. По местному имеется в виду UTC зона тех координат по которым брались данные.

      Конкретно в этом случае думаю это не супер критично, это же не научное исследование, а просто «развлекательно-познавательный» пост.


    1. andreybold Автор
      18.01.2025 07:14

      за ссылку, кстати, спасибо. Интересный сайт, но всё же не совсем подходит под эту статью. В закладки добавил :)


  1. aabzel
    18.01.2025 07:14

    Зная время восхода и заката можно сделать солнечный навигатор.

    https://habr.com/ru/articles/687640/


  1. jmnemonik
    18.01.2025 07:14

    Я так и не понял, какой параметр оценивался. Высота над горизонтом? Уровень освещённости в данной местности? Длительность дня?


    1. andreybold Автор
      18.01.2025 07:14

      время восхода. Во сколько восходит солнце на протяжении года


  1. d2ab
    18.01.2025 07:14

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