Pull to refresh

SunCalc — JavaScript-библиотека для вычисления положения солнца и солнечных фаз

Reading time 3 min
Views 13K
SunCalc

Больше года назад я представил вашему вниманию свой проект 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: хорошая альтерантива для более серьёзных задач (рассчёты для луны, планет и т.д.) от middlegithub.com/monoid/starjs
Tags:
Hubs:
+43
Comments 12
Comments Comments 12

Articles