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

    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
    Поделиться публикацией

    Комментарии 12

      +2
      спасибо, делал как раз по формулам с сайта, но отдельная либа — это прекрасно
        +2
        отличная работа
        насколько я понял из одного обращения наших пользователей это может быть также использовано в криминалистике при анализе видимости (в совокупности с прочей метео информацией)

        думаю, что при нынешнем развитии БПЛА и прочих интеллектуальных транспортных систем идентичная задача может решаться для выбора оптимальной скорости
          +1
          Да, думаю, что уже применяется, особенно в солнечных беспилотниках, хотя вряд ли на JavaScript. :)
          +2
          А в StarJs есть не только это, но и рассчёт положения планет и переход из одной координатной системы в другую… ;)
            +1
            Тоже отличное решение, но и более тяжеловесное. Тут — только самый минимум для практичных солнечных вычислений, в запакованном виде меньше килобайта.
              +2
              Кстати, добавил ссылку на StarJS в топик, спасибо за замечание!
                0
                Вам спасибо :)
              0
              Было бы интересно узнать нынешнее состояние сайта с калькулятором: нынешняя аудитория, её динамика прироста, постоянство и география… Ну затраты и доходы (если они вообще есть :)
              Любопытно, насколько популярны сейчас сайты такого жанра.
                0
                Сейчас в среднем 11 тысяч посетителей в месяц, прирост совсем медленный, но стабильный. В прошлом году было в три раза меньше, но в январе Санкалк засветился на Petapixel и по цепочке пошли посты на разных фотографических сайтах и форумах. :) Даже боюсь представить, сколько трафика может принести пост на Digital Photography School, но там хочется засветиться уже после того, как обновлю сайт (который уже давно не обновлялся).

                География — больше всего посетителей из Германии, где-то в полтора раза меньше из России, Чехии, США, остальные в основном распределено по другим странам европы.

                Затраты и доходы — никаких. :)
                +1
                Огромное спасибо за SunCalc!
                Как минимум раз в месяц, да обращаюсь к нему.

                Незаменимое решение при выборе новой съёмной квартиры или даже отеля.
                  +1
                  Спасибо, рад, что вам пригодилось :)
                  0
                  Спасибо, давно хотел заняться этим вопросом и даже были попытки, но какие-то тщетные :)

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

                  Самое читаемое