swisseph-wasm
Version:
High-precision Swiss Ephemeris WebAssembly library for astronomical calculations in JavaScript
303 lines (243 loc) • 9.22 kB
JavaScript
/**
* Basic Usage Examples for SwissEph Library
*
* This file demonstrates fundamental operations with the Swiss Ephemeris
* WebAssembly library including planetary calculations, time conversions,
* and coordinate transformations.
*/
import SwissEph from '../src/swisseph.js';
/**
* Example 1: Basic Planetary Position Calculation
* Calculates the position of the Sun for a specific date and time
*/
async function basicPlanetaryPosition() {
console.log('=== Basic Planetary Position ===');
const swe = new SwissEph();
await swe.initSwissEph();
try {
// Calculate Julian Day for June 15, 2023, 12:00 UTC
const jd = swe.julday(2023, 6, 15, 12.0);
console.log(`Julian Day: ${jd}`);
// Calculate Sun position
const sunPosition = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH);
console.log(`Sun Position:`);
console.log(` Longitude: ${sunPosition[0].toFixed(6)}°`);
console.log(` Latitude: ${sunPosition[1].toFixed(6)}°`);
console.log(` Distance: ${sunPosition[2].toFixed(6)} AU`);
console.log(` Speed: ${sunPosition[3].toFixed(6)}°/day`);
// Convert longitude to zodiac sign
const sign = Math.floor(sunPosition[0] / 30);
const degree = sunPosition[0] % 30;
const signs = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo',
'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'];
console.log(` Zodiac: ${degree.toFixed(2)}° ${signs[sign]}`);
} finally {
swe.close();
}
}
/**
* Example 2: Multiple Planet Calculation
* Calculates positions for all major planets
*/
async function multiplePlanets() {
console.log('\n=== Multiple Planet Positions ===');
const swe = new SwissEph();
await swe.initSwissEph();
try {
const jd = swe.julday(2023, 6, 15, 12.0);
const planets = [
{ id: swe.SE_SUN, name: 'Sun' },
{ id: swe.SE_MOON, name: 'Moon' },
{ id: swe.SE_MERCURY, name: 'Mercury' },
{ id: swe.SE_VENUS, name: 'Venus' },
{ id: swe.SE_MARS, name: 'Mars' },
{ id: swe.SE_JUPITER, name: 'Jupiter' },
{ id: swe.SE_SATURN, name: 'Saturn' },
{ id: swe.SE_URANUS, name: 'Uranus' },
{ id: swe.SE_NEPTUNE, name: 'Neptune' },
{ id: swe.SE_PLUTO, name: 'Pluto' }
];
console.log('Planet Positions for June 15, 2023:');
for (const planet of planets) {
const position = swe.calc_ut(jd, planet.id, swe.SEFLG_SWIEPH);
console.log(`${planet.name.padEnd(10)}: ${position[0].toFixed(2)}°`);
}
} finally {
swe.close();
}
}
/**
* Example 3: Time Zone Conversion
* Demonstrates proper handling of time zones
*/
async function timeZoneExample() {
console.log('\n=== Time Zone Conversion ===');
const swe = new SwissEph();
await swe.initSwissEph();
try {
// Birth time: May 15, 1990, 2:30 PM in New York (UTC-5)
const year = 1990;
const month = 5;
const day = 15;
const hour = 14; // 2 PM
const minute = 30;
const timezone = -5; // UTC-5 (Eastern Daylight Time)
// Convert to UTC
const utcHour = hour + minute / 60 - timezone;
const jd = swe.julday(year, month, day, utcHour);
console.log(`Local time: ${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hour}:${minute.toString().padStart(2, '0')} (UTC${timezone})`);
console.log(`UTC time: ${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${utcHour.toFixed(2)}`);
console.log(`Julian Day: ${jd}`);
// Calculate Sun position for this time
const sunPos = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH);
console.log(`Sun position: ${sunPos[0].toFixed(2)}°`);
} finally {
swe.close();
}
}
/**
* Example 4: Sidereal vs Tropical Comparison
* Shows the difference between tropical and sidereal calculations
*/
async function siderealVsTropical() {
console.log('\n=== Sidereal vs Tropical Comparison ===');
const swe = new SwissEph();
await swe.initSwissEph();
try {
const jd = swe.julday(2023, 6, 15, 12.0);
// Tropical calculation (default)
const tropical = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH);
// Set Lahiri ayanamsa for sidereal calculation
swe.set_sid_mode(swe.SE_SIDM_LAHIRI, 0, 0);
// Sidereal calculation
const sidereal = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH | swe.SEFLG_SIDEREAL);
// Get ayanamsa value
const ayanamsa = swe.get_ayanamsa(jd);
console.log(`Tropical Sun position: ${tropical[0].toFixed(6)}°`);
console.log(`Sidereal Sun position: ${sidereal[0].toFixed(6)}°`);
console.log(`Ayanamsa (Lahiri): ${ayanamsa.toFixed(6)}°`);
console.log(`Difference: ${(tropical[0] - sidereal[0]).toFixed(6)}°`);
} finally {
swe.close();
}
}
/**
* Example 5: Date Conversion Functions
* Demonstrates various date and time conversion utilities
*/
async function dateConversions() {
console.log('\n=== Date Conversion Functions ===');
const swe = new SwissEph();
await swe.initSwissEph();
try {
// Calculate Julian Day
const jd = swe.julday(2023, 6, 15, 12.5);
console.log(`Julian Day for 2023-06-15 12:30: ${jd}`);
// Convert back to calendar date
const date = swe.revjul(jd, swe.SE_GREG_CAL);
console.log(`Reverse conversion: ${date.year}-${date.month}-${date.day} ${date.hour.toFixed(2)}`);
// UTC to Julian Day conversion
const utcResult = swe.utc_to_jd(2023, 6, 15, 12, 30, 0, swe.SE_GREG_CAL);
console.log(`UTC to JD - ET: ${utcResult.julianDayET}, UT: ${utcResult.julianDayUT}`);
// Calculate sidereal time
const sidTime = swe.sidtime(jd);
console.log(`Sidereal time: ${sidTime.toFixed(6)} hours`);
// Calculate Delta T
const deltaT = swe.deltat(jd);
console.log(`Delta T: ${deltaT.toFixed(2)} seconds`);
// Day of week
const dayOfWeek = swe.day_of_week(jd);
const days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
console.log(`Day of week: ${days[dayOfWeek]}`);
} finally {
swe.close();
}
}
/**
* Example 6: Degree Utilities
* Shows how to work with degree values and conversions
*/
async function degreeUtilities() {
console.log('\n=== Degree Utilities ===');
const swe = new SwissEph();
await swe.initSwissEph();
try {
const degrees = 123.456789;
// Normalize degrees
console.log(`Original: ${degrees}°`);
console.log(`Normalized: ${swe.degnorm(degrees)}°`);
console.log(`Normalized (370°): ${swe.degnorm(370)}°`);
console.log(`Normalized (-10°): ${swe.degnorm(-10)}°`);
// Split degrees into components
const split = swe.split_deg(degrees, swe.SE_SPLIT_DEG_ROUND_SEC);
console.log(`Split degrees:`);
console.log(` Degrees: ${split.degree}°`);
console.log(` Minutes: ${split.min}'`);
console.log(` Seconds: ${split.second.toFixed(0)}"`);
console.log(` Zodiac sign: ${split.sign} (0=Aries, 1=Taurus, etc.)`);
// Zodiacal format
const zodiacal = swe.split_deg(degrees, swe.SE_SPLIT_DEG_ZODIACAL);
const signs = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo',
'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'];
console.log(`Zodiacal: ${zodiacal.degree}° ${zodiacal.min}' ${zodiacal.second.toFixed(0)}" ${signs[zodiacal.sign]}`);
} finally {
swe.close();
}
}
/**
* Example 7: Library Information
* Shows how to get version and other library information
*/
async function libraryInfo() {
console.log('\n=== Library Information ===');
const swe = new SwissEph();
await swe.initSwissEph();
try {
// Get version
const version = swe.version();
console.log(`Swiss Ephemeris version: ${version}`);
// Get planet names
console.log('\nPlanet names:');
for (let i = 0; i <= 9; i++) {
const name = swe.get_planet_name(i);
console.log(` ${i}: ${name}`);
}
// Show some constants
console.log('\nImportant constants:');
console.log(` AU to km: ${swe.SE_AUNIT_TO_KM}`);
console.log(` AU to light-year: ${swe.SE_AUNIT_TO_LIGHTYEAR}`);
console.log(` AU to parsec: ${swe.SE_AUNIT_TO_PARSEC}`);
} finally {
swe.close();
}
}
/**
* Run all examples
*/
async function runAllExamples() {
console.log('SwissEph Basic Usage Examples\n');
await basicPlanetaryPosition();
await multiplePlanets();
await timeZoneExample();
await siderealVsTropical();
await dateConversions();
await degreeUtilities();
await libraryInfo();
console.log('\n=== All examples completed ===');
}
// Export functions for use in other modules
export {
basicPlanetaryPosition,
multiplePlanets,
timeZoneExample,
siderealVsTropical,
dateConversions,
degreeUtilities,
libraryInfo,
runAllExamples
};
// Run examples if this file is executed directly
// Check if running in Node.js and if this is the main module
if (typeof process !== 'undefined' && process.argv && import.meta.url === `file://${process.argv[1]}`) {
runAllExamples().catch(console.error);
}