
Больше года назад я представил вашему вниманию свой проект SunCalc, позволяющий удобно изучать траектории солнца и фазы солнечного света (закат, рассвет, различные виды сумерек и т.д.) в течении заданного дня и в заданном местоположении.
Сейчас же я решил выпустить код, выполняющий непосредственное вычисление этих значений, в виде отдельной библиотеки с открытым исходным кодом, и опубликовать ее вместе с примерами и документацией на GitHub: github.com/mourner/suncalc
Библиотека написана на основе формул из статьи про положение солнца на сайте Astronomy Answers, опубликована под лицензией BSD, занимает ~1.5 кб, соответствует строгим стандартам JSLint и работает не только в браузере, но и на различных серверных платформах, таких, как Node.js.
Пример использования библиотеки
Получить объект с временами солнечных фаз для сегодняшнего дня в Лондоне:
var times = SunCalc.getTimes(new Date(), 51.5, -0.1); // (дата, широта, долгота)
Показать полученное время рассвета:
alert("Время рассвета: " + times.sunrise.getHours() + ':' + times.sunrise.getMinutes());
Получить положение солнца (азимут и высоту) во время рассвета:
var sunrisePos = SunCalc.getSunPosition(times.sunrise, 51.5, -0.1); // (время, широта, долгота)
Отобразить азимут рассвета в градусах:
alert("Азимут рассвета: " + (sunrisePos.azimuth * SunCalc.rad2deg).toFixed(2));
Возвращаемые времена суток
- sunrise: рассвет (верхний край солнца появляется на горизонте)
- sunriseEnd: конец рассвета (нижний край солнца касается горизонта)
- goldenHourEnd: конец «золотого часа» (мягкий свет, наиболее подходящее время для фотографии)
- solarNoon: солнечный полдень (солнце находится в наивысшей точке)
- goldenHour: начало «золотого часа»
- sunsetStart: начало заката (нижний край солнца касается горизонта)
- sunset: sunset (солнце полностью заходит за горизонт, начинаются вечерние гражданские сумерки — время, когда солнце уже за горизонтом, но на улице еще достаточно светло, чтобы обойтись без искусственного освещения)
- dusk: начало вечерних навигационных сумерек (времени, когда уже достаточно темно, но всё еще можно ориентироваться по горизонту в море
- nauticalDusk: начало вечерних астрономических сумерек (визуально темно, но недостаточно для астрономических наблюдений)
- night: начало ночи (достаточно темно для большинства астрономических наблюдений)
- nightEnd: конец ночи (и начало утренних астрономических сумерек)
- nauticalDawn: начало утренних навигационных сумерек
- dawn: утренняя заря (начало утренних гражданских сумерек)
Также можно добавлять фазы вручную, например:
SunCalc.addTime(20, "runAwayFromBeach", "goToBeach");
Такой код добавит к результатам функции SunCalc.getTimes
runAwayFromBeach (момент, когда солнце становится выше 20°) и goToBeach (когда солнце заходит ниже 20°).Возможные применения
На первый взгляд в голову приходят сайты для планирования путешествий, для фотографов и тому подобное. Но можно применить фантазию и сделать, например, изменение дизайна на сайте в зависимости от реального времени суток. Или строить графики освещённости с определённого угла в течении года на сайтах с недвижимостью. Помню, мне даже писали когда-то с благодарностью из какой-то фирмы по установке кондиционеров, сотрудники которой теперь активно используют SunCalc в работе… А еще было письмо из одного общества исламистов, которым он помог рассчитывать правильное время для молитвы. В общем, если подумать, применений масса!
Надеюсь, что полезное применение этой маленькой библиотеке найдёте и вы. Буду рад замечаниям и отзывам в комментариях. Спасибо!
update: добавил времена goldenHour, goldenHourEnd и возможность добавлять свои времена (соответствующие определённой высоте солнца) вручную.
update 2: хорошая альтерантива для более серьёзных задач (рассчёты для луны, планет и т.д.) от middle — github.com/monoid/starjs