Skip to content

Deep Sky Object: Compute apparent position#220

Merged
rhannequin merged 1 commit intomainfrom
deep-sky-object-apparent-position
Oct 20, 2025
Merged

Deep Sky Object: Compute apparent position#220
rhannequin merged 1 commit intomainfrom
deep-sky-object-apparent-position

Conversation

@rhannequin
Copy link
Owner

@rhannequin rhannequin commented Oct 10, 2025

This supports the apparent position of a deep sky object.

How it works

There are three levels of precision for the apparent position, depending on how the object has been initialized:

With ephem and proper motion attributes

When computing the rotation from an astrometric to an apparent position, some corrections applied depend on the Earth's velocity at the given instant. Providing ephem allows to apply aberration correction. Same for the proper motion attributes (proper_motion_ra, proper_motion_dec, parallax, radial_velocity), which allow to apply some position correction when provided.

time = Time.utc(2025, 10, 1)
instant = Astronoby::Instant.from_time(time)
ephem = Astronoby::Ephem.load("inpop19a.bsp")
equatorial_coordinates = Astronoby::Coordinates::Equatorial.new(
  right_ascension: Astronoby::Angle.from_hms(18, 36, 56.33635),
  declination: Astronoby::Angle.from_dms(38, 47, 1.2802),
  epoch: Astronoby::JulianDate::J2000
)

vega = described_class.new(
  instant: instant,
  equatorial_coordinates: equatorial_coordinates,
  ephem: ephem,
  proper_motion_ra: Astronoby::AngularVelocity.from_milliarcseconds_per_year(200.94),
  proper_motion_dec: Astronoby::AngularVelocity.from_milliarcseconds_per_year(286.23),
  parallax: Astronoby::Angle.from_degree_arcseconds(130.23 / 1000.0),
  radial_velocity: Astronoby::Velocity.from_kilometers_per_second(-13.5)
)

apparent = vega.apparent

apparent.equatorial.right_ascension.str(:hms)
# => "18h 37m 48.7215s"

apparent.equatorial.declination.str(:dms)
# => "+38° 48′ 41.4879″"

apparent.ecliptic.latitude.str(:dms)
# => "+61° 44′ 2.4126″"

apparent.ecliptic.longitude.str(:dms)
# => "+285° 40′ 42.917″"

With only ephem

In this case, the proper motion of the object won't be applied to correct the position, but the aberration correction (which depends on the Earth's velocity) will be applied.

time = Time.utc(2025, 10, 1)
instant = Astronoby::Instant.from_time(time)
ephem = Astronoby::Ephem.load("inpop19a.bsp")
equatorial_coordinates = Astronoby::Coordinates::Equatorial.new(
  right_ascension: Astronoby::Angle.from_hms(18, 36, 56.33635),
  declination: Astronoby::Angle.from_dms(38, 47, 1.2802),
  epoch: Astronoby::JulianDate::J2000
)

vega = described_class.new(
  instant: instant,
  equatorial_coordinates: equatorial_coordinates,
  ephem: ephem
)

apparent = vega.apparent

apparent.equatorial.right_ascension.str(:hms)
# => "18h 37m 48.2808s"

apparent.equatorial.declination.str(:dms)
# => "+38° 48′ 34.1013″"

apparent.ecliptic.latitude.str(:dms)
# => "+61° 43′ 55.8069″"

apparent.ecliptic.longitude.str(:dms)
# => "+285° 40′ 29.9938″"

With no ephem nor proper motion attributes

In this case, only the precession and nutation will be applied to the initial J2000 coordinates.

time = Time.utc(2025, 10, 1)
instant = Astronoby::Instant.from_time(time)
equatorial_coordinates = Astronoby::Coordinates::Equatorial.new(
  right_ascension: Astronoby::Angle.from_hms(18, 36, 56.33635),
  declination: Astronoby::Angle.from_dms(38, 47, 1.2802),
  epoch: Astronoby::JulianDate::J2000
)

vega = described_class.new(
  instant: instant,
  equatorial_coordinates: equatorial_coordinates
)

apparent = vega.apparent

apparent.equatorial.right_ascension.str(:hms)
# => "18h 37m 48.2804s"

apparent.equatorial.declination.str(:dms)
# => "+38° 48′ 16.0412″"

apparent.ecliptic.latitude.str(:dms)
# => "+61° 43′ 37.9199″"

apparent.ecliptic.longitude.str(:dms)
# => "+285° 40′ 24.7275″"

Why supporting 3 different initialization?

The first reason is that only stars have proper motion data available. When creating a DeepSkyObject instance for a cluster or a nebulae, most of the time there will be no proper motion data available to apply.

The second reason is that, as you can see above, the difference between a fully corrected position and a position with no aberration nor proper motion corrections is very similar.
I want Astronoby to provide maximum accuracy, but I also want users who don't require maximum to benefit from great performance and simplicity.

One use case is calculating rising and setting times for a deep sky object. Because most deep sky objects are quite large (at least several arcminutes), a difference of a few arcseconds between a corrected position and not fully corrected position won't drastically change the compute times. In that case, it can be beneficial to use a simpler a more performant initialization.

Precision

Apparent equatorial coordinates are less than 1 arcsecond different from Skyfield and less than a few arcseconds different from Astropy, Stellarium and SkySafari.

@rhannequin rhannequin self-assigned this Oct 10, 2025
@rhannequin rhannequin force-pushed the deep-sky-object-astrometric-position branch from 2612764 to 4f86015 Compare October 14, 2025 21:03
@rhannequin rhannequin force-pushed the deep-sky-object-apparent-position branch from a0fc3cd to c1a4c70 Compare October 14, 2025 21:03
Base automatically changed from deep-sky-object-astrometric-position to main October 20, 2025 09:09
@rhannequin rhannequin force-pushed the deep-sky-object-apparent-position branch from c1a4c70 to fbedc28 Compare October 20, 2025 09:10
@rhannequin rhannequin merged commit b7a523a into main Oct 20, 2025
41 of 42 checks passed
@rhannequin rhannequin deleted the deep-sky-object-apparent-position branch October 20, 2025 09:11
@rhannequin rhannequin mentioned this pull request Oct 25, 2025
rhannequin added a commit that referenced this pull request Oct 31, 2025
## 0.9.0 - 2025-10-31

_If you are upgrading: please see [UPGRADING.md]._

### Features

* Add `#approaching_primary?` and `#receding_from_primary?` to solar system bodies ([#211])
* Calculate apoapsis and periapsis events ([#213])
* Improve precision of ΔT ([#219])
* Deep Sky Object: Compute astrometric position ([#217])
* Deep Sky Object: Compute apparent position ([#220])
* Deep Sky Object: Handle velocities properly ([#222])
* Deep Sky Object: Compute topocentric position ([#226])
* Deep Sky Object: difference between the body and the position ([#227])
* Deep Sky Object: Add support for RiseTransitSetCalculator ([#228])

### Improvements

* Drop `Astronoby::Apparent#angular_diameter` ([#221])
* Bump rubyzip from 3.0.2 to 3.2.1 by @dependabot ([#210], [#215], [#223], [#233])
* Bump standard from 1.50.0 to 1.51.1 by @dependabot ([#212], [#214])
* Be proud about the precision achieved ([#218])
* Use local apparent instead of local mean sidereal time for hour angle ([#225])
* Bump rspec from 3.13.1 to 3.13.2 by @dependabot ([#229])
* Bump benchmark from 0.4.1 to 0.5.0 by @dependabot ([#230])
* Add documentation for deep-sky objects ([#232])
* Bump rake from 13.3.0 to 13.3.1 by @dependabot ([#235])

### Backward-incompatible changes

* Drop `Astronoby::Apparent#angular_diameter` ([#221])
* Use local apparent instead of local mean sidereal time for hour angle ([#225])

**Full Changelog**: v0.8.0...v0.9.0

[#210]: #210
[#211]: #211
[#212]: #212
[#213]: #213
[#214]: #214
[#215]: #215
[#217]: #217
[#218]: #218
[#219]: #219
[#220]: #220
[#221]: #221
[#222]: #222
[#223]: #223
[#225]: #225
[#226]: #226
[#227]: #227
[#228]: #228
[#229]: #229
[#230]: #230
[#232]: #232
[#233]: #233
[#235]: #235
[UPGRADING.md]: https://github.com/rhannequin/astronoby/blob/main/UPGRADING.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant