Как стать автором
Обновить

Как я развлекался с восходом солнца

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров3.2K

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

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

Решил написать небольшую страничку, которая бы брала данные по восходам и закатам с 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 и немного поправлен. Код максимально простой, в нём нет сложных формул, в нём нет кучи данных (точнее есть, но не в зашитом виде). Он не претендует на хоть сколько-нибудь серьёзные изыскания.

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

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 8: ↑7 и ↓1+7
Комментарии42

Публикации

Истории

Ближайшие события

4 – 5 апреля
Геймтон «DatsCity»
Онлайн
8 апреля
Конференция TEAMLY WORK MANAGEMENT 2025
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область