Source code for ultraplot.proj

#!/usr/bin/env python3
"""
Additional cartopy projection classes.
"""
import warnings

from .internals import ic  # noqa: F401
from .internals import docstring

try:
    from cartopy.crs import (  # stereo projections needed in geo.py
        AzimuthalEquidistant,
        Gnomonic,
        LambertAzimuthalEqualArea,
        NorthPolarStereo,
        SouthPolarStereo,
        _WarpedRectangularProjection,
    )
except ModuleNotFoundError:
    AzimuthalEquidistant = Gnomonic = LambertAzimuthalEqualArea = object
    _WarpedRectangularProjection = NorthPolarStereo = SouthPolarStereo = object

__all__ = [
    "Aitoff",
    "Hammer",
    "KavrayskiyVII",
    "WinkelTripel",
    "NorthPolarAzimuthalEquidistant",
    "SouthPolarAzimuthalEquidistant",
    "NorthPolarGnomonic",
    "SouthPolarGnomonic",
    "NorthPolarLambertAzimuthalEqualArea",
    "SouthPolarLambertAzimuthalEqualArea",
]


_reso_docstring = """
The projection resolution.
"""
_init_docstring = """
Parameters
----------
central_longitude : float, default: 0
    The central meridian longitude in degrees.
false_easting: float, default: 0
    X offset from planar origin in metres.
false_northing: float, default: 0
    Y offset from planar origin in metres.
globe : `~cartopy.crs.Globe`, optional
    If omitted, a default globe is created.
"""
docstring._snippet_manager["proj.reso"] = _reso_docstring
docstring._snippet_manager["proj.init"] = _init_docstring


[docs] class Aitoff(_WarpedRectangularProjection): """ The `Aitoff <https://en.wikipedia.org/wiki/Aitoff_projection>`__ projection. """ #: Registered projection name. name = "aitoff" @docstring._snippet_manager def __init__( self, central_longitude=0, globe=None, false_easting=None, false_northing=None ): """ %(proj.init)s """ from cartopy.crs import WGS84_SEMIMAJOR_AXIS, Globe if globe is None: globe = Globe(semimajor_axis=WGS84_SEMIMAJOR_AXIS, ellipse=None) a = globe.semimajor_axis or WGS84_SEMIMAJOR_AXIS b = globe.semiminor_axis or a if b != a or globe.ellipse is not None: warnings.warn( f"The {self.name!r} projection does not handle elliptical globes." ) proj4_params = {"proj": "aitoff", "lon_0": central_longitude} super().__init__( proj4_params, central_longitude, false_easting=false_easting, false_northing=false_northing, globe=globe, ) @docstring._snippet_manager @property def threshold(self): # how finely to interpolate line data, etc. """ %(proj.reso)s """ return 1e5
[docs] class Hammer(_WarpedRectangularProjection): """ The `Hammer <https://en.wikipedia.org/wiki/Hammer_projection>`__ projection. """ #: Registered projection name. name = "hammer" @docstring._snippet_manager def __init__( self, central_longitude=0, globe=None, false_easting=None, false_northing=None ): """ %(proj.init)s """ from cartopy.crs import WGS84_SEMIMAJOR_AXIS, Globe if globe is None: globe = Globe(semimajor_axis=WGS84_SEMIMAJOR_AXIS, ellipse=None) a = globe.semimajor_axis or WGS84_SEMIMAJOR_AXIS b = globe.semiminor_axis or a if b != a or globe.ellipse is not None: warnings.warn( f"The {self.name!r} projection does not handle elliptical globes." ) proj4_params = {"proj": "hammer", "lon_0": central_longitude} super().__init__( proj4_params, central_longitude, false_easting=false_easting, false_northing=false_northing, globe=globe, ) @docstring._snippet_manager @property def threshold(self): # how finely to interpolate line data, etc. """ %(proj.reso)s """ return 1e5
[docs] class KavrayskiyVII(_WarpedRectangularProjection): """ The `Kavrayskiy VII \ <https://en.wikipedia.org/wiki/Kavrayskiy_VII_projection>`__ projection. """ #: Registered projection name. name = "kavrayskiyVII" @docstring._snippet_manager def __init__( self, central_longitude=0, globe=None, false_easting=None, false_northing=None ): """ %(proj.init)s """ from cartopy.crs import WGS84_SEMIMAJOR_AXIS, Globe if globe is None: globe = Globe(semimajor_axis=WGS84_SEMIMAJOR_AXIS, ellipse=None) a = globe.semimajor_axis or WGS84_SEMIMAJOR_AXIS b = globe.semiminor_axis or a if b != a or globe.ellipse is not None: warnings.warn( f"The {self.name!r} projection does not handle elliptical globes." ) proj4_params = {"proj": "kav7", "lon_0": central_longitude} super().__init__( proj4_params, central_longitude, false_easting=false_easting, false_northing=false_northing, globe=globe, ) @docstring._snippet_manager @property def threshold(self): """ %(proj.reso)s """ return 1e5
[docs] class WinkelTripel(_WarpedRectangularProjection): """ The `Winkel tripel (Winkel III) \ <https://en.wikipedia.org/wiki/Winkel_tripel_projection>`__ projection. """ #: Registered projection name. name = "winkeltripel" @docstring._snippet_manager def __init__( self, central_longitude=0, globe=None, false_easting=None, false_northing=None ): """ %(proj.init)s """ from cartopy.crs import WGS84_SEMIMAJOR_AXIS, Globe if globe is None: globe = Globe(semimajor_axis=WGS84_SEMIMAJOR_AXIS, ellipse=None) a = globe.semimajor_axis or WGS84_SEMIMAJOR_AXIS b = globe.semiminor_axis or a if b != a or globe.ellipse is not None: warnings.warn( f"The {self.name!r} projection does not handle " "elliptical globes." ) proj4_params = {"proj": "wintri", "lon_0": central_longitude} super().__init__( proj4_params, central_longitude, false_easting=false_easting, false_northing=false_northing, globe=globe, ) @docstring._snippet_manager @property def threshold(self): """ %(proj.reso)s """ return 1e5
[docs] class NorthPolarAzimuthalEquidistant(AzimuthalEquidistant): """ Analogous to `~cartopy.crs.NorthPolarStereo`. """ @docstring._snippet_manager def __init__(self, central_longitude=0.0, globe=None): """ %(proj.init)s """ super().__init__( central_latitude=90, central_longitude=central_longitude, globe=globe )
[docs] class SouthPolarAzimuthalEquidistant(AzimuthalEquidistant): """ Analogous to `~cartopy.crs.SouthPolarStereo`. """ @docstring._snippet_manager def __init__(self, central_longitude=0.0, globe=None): """ %(proj.init)s """ super().__init__( central_latitude=-90, central_longitude=central_longitude, globe=globe )
[docs] class NorthPolarLambertAzimuthalEqualArea(LambertAzimuthalEqualArea): """ Analogous to `~cartopy.crs.NorthPolarStereo`. """ @docstring._snippet_manager def __init__(self, central_longitude=0.0, globe=None): """ %(proj.init)s """ super().__init__( central_latitude=90, central_longitude=central_longitude, globe=globe )
[docs] class SouthPolarLambertAzimuthalEqualArea(LambertAzimuthalEqualArea): """ Analogous to `~cartopy.crs.SouthPolarStereo`. """ @docstring._snippet_manager def __init__(self, central_longitude=0.0, globe=None): """ %(proj.init)s """ super().__init__( central_latitude=-90, central_longitude=central_longitude, globe=globe )
[docs] class NorthPolarGnomonic(Gnomonic): """ Analogous to `~cartopy.crs.NorthPolarStereo`. """ @docstring._snippet_manager def __init__(self, central_longitude=0.0, globe=None): """ %(proj.init)s """ super().__init__( central_latitude=90, central_longitude=central_longitude, globe=globe )
[docs] class SouthPolarGnomonic(Gnomonic): """ Analogous to `~cartopy.crs.SouthPolarStereo`. """ @docstring._snippet_manager def __init__(self, central_longitude=0.0, globe=None): """ %(proj.init)s """ super().__init__( central_latitude=-90, central_longitude=central_longitude, globe=globe )