Source code for proplot.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 )