SunCalc

I came across this useful javascript and node.js function the other day. You can find the details of the original on github here. Here is the license - please respect the terms of the author if you reuse. I am also using moment.js in the webapp version. 

What is SunCalc

Here' what the author says.

"SunCalc is a tiny BSD-licensed JavaScript library for calculating sun position, sunlight phases (times for sunrise, sunset, dusk, etc.), moon position and lunar phase for the given location and time, created by Vladimir Agafonkin (@mourner) as a part of the SunCalc.net project.

Most calculations are based on the formulas given in the excellent Astronomy Answers articles about position of the sun and the planets. You can read about different twilight phases calculated by SunCalc in the Twilight article on Wikipedia."

The GAS version

The Google Apps Script version didn't need much tweaking, and I provide both a library (to include in your projects) and a webapp version (you can use as a rest server.. JSON and JSONP are supported)

The library

You can include this in your project by referencing this library MrUiju_lhzV9x8s701Cw5QSz3TLx7pV4j

Here's an example of how to use.

function testSunCalc() {

  // get today's sunlight times for empire state building
  var sun = new SunCalc.SunCalc();
  var times = sun.getTimes(new Date(), 40.7484, 73.9857);
  Logger.log(JSON.stringify(times));
  Logger.log(times.sunrise.toLocaleString());
  Logger.log(times.sunset.toLocaleString());
}

The result

{
    "solarNoon": "2014-03-31T07:09:28.774Z",
    "nadir": "2014-03-30T19:09:28.774Z",
    "sunrise": "2014-03-31T00:51:02.884Z",
    "sunset": "2014-03-31T13:27:54.664Z",
    "sunriseEnd": "2014-03-31T00:53:51.667Z",
    "sunsetStart": "2014-03-31T13:25:05.881Z",
    "dawn": "2014-03-31T00:23:27.057Z",
    "dusk": "2014-03-31T13:55:30.491Z",
    "nauticalDawn": "2014-03-30T23:50:52.414Z",
    "nauticalDusk": "2014-03-31T14:28:05.134Z",
    "nightEnd": "2014-03-30T23:17:19.113Z",
    "night": "2014-03-31T15:01:38.435Z",
    "goldenHourEnd": "2014-03-31T01:27:10.810Z",
    "goldenHour": "2014-03-31T12:51:46.738Z"
}
For help and more information join our forumfollow the blogfollow me on twitter

The Web app.

The URL for the webapp is here. 

Usage is pretty straightforward. The parameters are

 parameter  what it is  default  format  example
 date  the date to calculate times for.   Today (UTC)  UTC format date including timezone &date="2013-03-31T17:47:37.150-10:00"
 lat  the latitude of the place it applies to   51.477812  number  &lat=40.1
 lon  the longtitude of the place it applies to   -0.000725  number  &lon=15.7
 callback  callback function name will generate JSONP response  null  string  &callback=somefunction

Example

Get the sun activity times for Sao Paulo, Brasil on Christmas day this year.

https://script.google.com/macros/s/AKfycby30bIji19KtgIvTWI-QBqCkm5eDM6vgoVKV1Jxy9dSLsNEtCf-/exec?lat=23.55&lon=46.63&date=2014-12-25T12:00:00.000-03:00

result

{
    "error": null,
    "params": {
        "callback": null,
        "lat": "23.55",
        "lon": "46.63",
        "date": "2014-12-25T15:00:00+00:00"
    },
    "result": {
        "solarNoon": "2014-12-25T08:54:38.799Z",
        "nadir": "2014-12-24T20:54:38.799Z",
        "sunrise": "2014-12-25T03:34:07.338Z",
        "sunset": "2014-12-25T14:15:10.259Z",
        "sunriseEnd": "2014-12-25T03:36:40.946Z",
        "sunsetStart": "2014-12-25T14:12:36.652Z",
        "dawn": "2014-12-25T03:09:24.539Z",
        "dusk": "2014-12-25T14:39:53.059Z",
        "nauticalDawn": "2014-12-25T02:41:13.704Z",
        "nauticalDusk": "2014-12-25T15:08:03.894Z",
        "nightEnd": "2014-12-25T02:13:28.365Z",
        "night": "2014-12-25T15:35:49.233Z",
        "goldenHourEnd": "2014-12-25T04:07:34.354Z",
        "goldenHour": "2014-12-25T13:41:43.243Z"
    }
}

Note on times

All times are expressed in UTC - in other words the greenwich mean time point of view.  You can convert these to your locale using  .toLocaleString()

You can specify a timezone offset with the &date parameter, but the returned times will always be UTC. Note that  result.params.data contains your date parameter converted to UTC time.

Web app code

Code for SunCalc


You can include this in your project by referencing this library MrUiju_lhzV9x8s701Cw5QSz3TLx7pV4j

I also have a Google Apps Version version of  moments.js, which you can use from Ma8KMulU4F1uDjuQWo4W1oSz3TLx7pV4j

For help and more information join our forumfollow the blogfollow me on twitter

You want to learn Google Apps Script?

Learning Apps Script, (and transitioning from VBA) are covered comprehensively in my my book, Going Gas - from VBA to Apps script, available All formats are available now from O'Reilly,Amazon and all good bookshops. You can also read a preview on O'Reilly

If you prefer Video style learning I also have two courses available. also published by O'Reilly.
Google Apps Script for Developers and Google Apps Script for Beginners.



Comments