.. We call EarthLocation.of_site here first to force the downloading .. of sites.json so that future doctest output isn't cluttered with .. "Downloading ... [done]". This can be removed once we have a better .. way of ignoring output lines based on pattern-matching, e.g.: .. https://github.com/astropy/pytest-doctestplus/issues/11 .. testsetup:: >>> from astropy.coordinates import EarthLocation >>> EarthLocation.of_site('greenwich') # doctest: +IGNORE_OUTPUT +IGNORE_WARNINGS Using and Designing Coordinate Frames ************************************* In `astropy.coordinates`, as outlined in the :ref:`astropy-coordinates-overview`, subclasses of |BaseFrame| ("frame classes") define particular coordinate frames. They can (but do not *have* to) contain representation objects storing the actual coordinate data. The actual coordinate transformations are defined as functions that transform representations between frame classes. This approach serves to separate high-level user functionality (see :doc:`skycoord`) and details of how the coordinates are actually stored (see :doc:`representations`) from the definition of frames and how they are transformed. Using Frame Objects =================== Frames without Data ------------------- Frame objects have two distinct (but related) uses. The first is storing the information needed to uniquely define a frame (e.g., equinox, observation time). This information is stored on the frame objects as (read-only) Python attributes, which are set when the object is first created:: >>> from astropy.coordinates import ICRS, FK5 >>> FK5(equinox='J1975') >>> ICRS() # has no attributes >>> FK5() # uses default equinox The specific names of attributes available for a particular frame are available as the keys of the ``frame_attributes`` dictionary:: >>> FK5.frame_attributes.keys() dict_keys(['equinox']) The defaults of the frame attributes are available as: :meth:`~astropy.coordinates.BaseCoordinateFrame.get_frame_attr_defaults`:: >>> FK5.get_frame_attr_defaults() {'equinox':