UNPKG

swisseph-wasm

Version:

High-precision Swiss Ephemeris WebAssembly library for astronomical calculations in JavaScript

264 lines (200 loc) 6.13 kB
# SwissEph Quick Reference Guide ## Basic Setup ```javascript import SwissEph from './src/swisseph.js'; const swe = new SwissEph(); await swe.initSwissEph(); // Your calculations here swe.close(); // Always clean up ``` ## Essential Functions ### Date & Time ```javascript // Julian Day calculation const jd = swe.julday(2023, 6, 15, 12.5); // UTC to Julian Day const result = swe.utc_to_jd(2023, 6, 15, 12, 30, 0, swe.SE_GREG_CAL); // Julian Day to calendar date const date = swe.revjul(jd, swe.SE_GREG_CAL); // Sidereal time const sidTime = swe.sidtime(jd); // Delta T const deltaT = swe.deltat(jd); ``` ### Planet Positions ```javascript // Basic calculation const pos = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH); // Returns: [longitude, latitude, distance, speed] // Detailed calculation const detailed = swe.calc(jd, swe.SE_MOON, swe.SEFLG_SWIEPH); // Returns: {longitude, latitude, distance, longitudeSpeed, latitudeSpeed, distanceSpeed} ``` ### Sidereal Calculations ```javascript // Set sidereal mode swe.set_sid_mode(swe.SE_SIDM_LAHIRI, 0, 0); // Calculate sidereal position const sidereal = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH | swe.SEFLG_SIDEREAL); // Get ayanamsa const ayanamsa = swe.get_ayanamsa(jd); ``` ## Planet Constants ```javascript // Major planets swe.SE_SUN = 0 swe.SE_JUPITER = 5 swe.SE_MOON = 1 swe.SE_SATURN = 6 swe.SE_MERCURY = 2 swe.SE_URANUS = 7 swe.SE_VENUS = 3 swe.SE_NEPTUNE = 8 swe.SE_MARS = 4 swe.SE_PLUTO = 9 // Lunar nodes swe.SE_MEAN_NODE = 10 swe.SE_TRUE_NODE = 11 // Asteroids swe.SE_CHIRON = 15 swe.SE_CERES = 17 swe.SE_PHOLUS = 16 swe.SE_PALLAS = 18 ``` ## Calculation Flags ```javascript // Ephemeris types swe.SEFLG_SWIEPH = 2 // Swiss Ephemeris (default) swe.SEFLG_JPLEPH = 1 // JPL Ephemeris swe.SEFLG_MOSEPH = 4 // Moshier Ephemeris // Coordinate systems swe.SEFLG_HELCTR = 8 // Heliocentric swe.SEFLG_BARYCTR = 16384 // Barycentric swe.SEFLG_TOPOCTR = 32768 // Topocentric swe.SEFLG_EQUATORIAL = 2048 // Equatorial coordinates // Special flags swe.SEFLG_SPEED = 256 // Include speed swe.SEFLG_SIDEREAL = 65536 // Sidereal positions swe.SEFLG_RADIANS = 8192 // Results in radians swe.SEFLG_J2000 = 32 // J2000 coordinates ``` ## Sidereal Modes ```javascript swe.SE_SIDM_FAGAN_BRADLEY = 0 swe.SE_SIDM_LAHIRI = 1 swe.SE_SIDM_DELUCE = 2 swe.SE_SIDM_RAMAN = 3 swe.SE_SIDM_KRISHNAMURTI = 5 swe.SE_SIDM_USER = 255 ``` ## Common Patterns ### Birth Chart Calculation ```javascript async function birthChart(year, month, day, hour, minute, timezone) { const swe = new SwissEph(); await swe.initSwissEph(); const utcHour = hour + minute / 60 - timezone; const jd = swe.julday(year, month, day, utcHour); const planets = [swe.SE_SUN, swe.SE_MOON, swe.SE_MERCURY, swe.SE_VENUS, swe.SE_MARS, swe.SE_JUPITER, swe.SE_SATURN]; const chart = {}; for (const planet of planets) { const pos = swe.calc_ut(jd, planet, swe.SEFLG_SWIEPH); chart[swe.get_planet_name(planet)] = pos[0]; } swe.close(); return chart; } ``` ### Current Planetary Positions ```javascript async function currentPositions() { const swe = new SwissEph(); await swe.initSwissEph(); const now = new Date(); const jd = swe.julday( now.getUTCFullYear(), now.getUTCMonth() + 1, now.getUTCDate(), now.getUTCHours() + now.getUTCMinutes() / 60 ); const sunPos = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH); const moonPos = swe.calc_ut(jd, swe.SE_MOON, swe.SEFLG_SWIEPH); swe.close(); return { sun: sunPos[0], moon: moonPos[0], julianDay: jd }; } ``` ### Sidereal vs Tropical ```javascript async function comparePositions(year, month, day, hour) { const swe = new SwissEph(); await swe.initSwissEph(); const jd = swe.julday(year, month, day, hour); // Tropical const tropical = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH); // Sidereal (Lahiri) swe.set_sid_mode(swe.SE_SIDM_LAHIRI, 0, 0); const sidereal = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH | swe.SEFLG_SIDEREAL); swe.close(); return { tropical: tropical[0], sidereal: sidereal[0], difference: tropical[0] - sidereal[0] }; } ``` ## Utility Functions ```javascript // Normalize degrees (0-360) const normalized = swe.degnorm(370); // Returns 10 // Split degrees into D°M'S" const split = swe.split_deg(123.456, swe.SE_SPLIT_DEG_ROUND_SEC); // Returns: {degree: 123, min: 27, second: 24, sign: 4} // Day of week (0=Monday, 6=Sunday) const dayOfWeek = swe.day_of_week(jd); // Planet name const name = swe.get_planet_name(swe.SE_SUN); // Returns "Sun" // Version info const version = swe.version(); ``` ## Error Handling Template ```javascript async function safeCalculation() { let swe = null; try { swe = new SwissEph(); await swe.initSwissEph(); // Your calculations here const jd = swe.julday(2023, 6, 15, 12); const result = swe.calc_ut(jd, swe.SE_SUN, swe.SEFLG_SWIEPH); return { success: true, data: result }; } catch (error) { return { success: false, error: error.message }; } finally { if (swe) swe.close(); } } ``` ## Performance Tips 1. **Reuse instances** for multiple calculations 2. **Batch calculations** in single session 3. **Always call close()** to prevent memory leaks 4. **Validate inputs** before calculation 5. **Use appropriate flags** for your needs ## Common Gotchas - **Time zones**: Convert to UTC before calculation - **Month numbering**: Use 1-12, not 0-11 - **Memory management**: Always call `close()` - **Async initialization**: Always `await initSwissEph()` - **Flag combinations**: Use bitwise OR (`|`) to combine flags ## Browser Requirements - WebAssembly support - ES6 modules - Modern JavaScript (async/await) ## File Structure ``` your-project/ ├── src/ │ └── swisseph.js # Main library ├── wsam/ │ ├── swisseph.js # WASM module │ └── swisseph.wasm # WASM binary └── your-app.js # Your application ```