See this discussion: https://github.com/cosinekitty/astronomy/issues/150 For the case of calculating a map, where each pixel on the map represents a different location on the Earth, it is more efficient to factor out expensive calculation of sidereal times, assuming the entire map represents some phenomenon at a single moment in time. For example, to determine whether the Moon is visible at different places on the Earth, the following functions can be calculated across thousands of different (lat, lon) geographic coordinates around the world: ObserverVector Rotation_EQD_HOR Before iterating over the map pixels, a program can call GeoMoon, then convert EQJ coordinates to EQD. Then by passing the same time value in a loop to ObserverVector and Rotation_EQD_HOR, the program can calculate a vector from the observer to the Moon in EQD coordinates, then convert EQD to HOR. The z-coordinate of the horizontal coordinates determines whether the Moon is above or below the observer's horizon at that point on the Earth. This calculation pattern performed redundant sidereal time calculations for each pixel on the map. I changed the code for all 4 languages to cache sidereal time so that it only needs to be calculated once. In the C version of Astronomy Engine, this resulted in a speedup factor of about 2.3 in the above use case. (See the function MapPerformanceTest in generate/ctest.c.)
JavaScript examples for Node.js
The source file
astronomy.js
works as a Node.js module. Download the file into your project directory.
Then in your own source file, do this:
const Astronomy = require('astronomy.js');
or install the package with npm i astronomy-engine and:
import { SearchMoonQuarter } from 'astronomy-engine';
There are no external dependencies!
Astronomy Engine is completely self-contained, and it always will be.
(By the way, you can use the same file astronomy.browser.js for
astronomy calculations inside the browser.)
Culmination
Finds when the Sun, Moon, and planets reach their highest position in the sky on a given date, as seen by an observer at a specified location on the Earth. Culmination is also the moment a body crosses the meridian, the imaginary semicircle in the sky that passes from due north on the horizon, through the zenith (straight up), and then toward due south on the horizon.
Equator of Date
Given the right ascension and declination of a star, expressed in J2000 coordinates, converts those coordinates to right ascension and declination expressed in the Earth's equator at any given date and time. This example illustrates how to use rotation matrices to convert one coordinate system to another.
Horizon Intersection
This is a more advanced example. It shows how to use coordinate transforms to find where the ecliptic intersects with an observer's horizon at a given date and time.
Lunar Eclipse
Calculates details about the first 10 partial/total lunar eclipses after the given date and time.
Moon Phase Calculator
This example shows how to determine the Moon's current phase, and how to predict when the next few quarter phases will occur.
Positions
Calculates equatorial and horizontal coordinates of the Sun, Moon, and planets.
Rise/Set
Shows how to calculate sunrise, sunset, moonrise, and moonset times.
Seasons
Calculates the equinoxes and solstices for a given calendar year.
Triangulate
Given the geographic coordinates of two observers, and angular
directions they are looking in, determines geographic coordinates
of the point they are both looking at. This example demonstrates
use of the geoid functions VectorObserver and ObserverVector
that convert between geographic coordinates and vectors.
API Reference
Complete documentation for all the functions and types available in the JavaScript version of Astronomy Engine.