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