Source code for pyproj.crs.coordinate_system

"""
This module is for building coordinate systems to be used when
building a CRS.
"""

from pyproj._crs import CoordinateSystem
from pyproj.crs.enums import (
    Cartesian2DCSAxis,
    Ellipsoidal2DCSAxis,
    Ellipsoidal3DCSAxis,
    VerticalCSAxis,
)

# useful constants to use when setting PROJ JSON units
UNIT_METRE = "metre"
UNIT_DEGREE = "degree"
UNIT_FT = {"type": "LinearUnit", "name": "foot", "conversion_factor": 0.3048}
UNIT_US_FT = {
    "type": "LinearUnit",
    "name": "US survey foot",
    "conversion_factor": 0.304800609601219,
}

_ELLIPSOIDAL_2D_AXIS_MAP = {
    Ellipsoidal2DCSAxis.LONGITUDE_LATITUDE: [
        {
            "name": "Longitude",
            "abbreviation": "lon",
            "direction": "east",
            "unit": UNIT_DEGREE,
        },
        {
            "name": "Latitude",
            "abbreviation": "lat",
            "direction": "north",
            "unit": UNIT_DEGREE,
        },
    ],
    Ellipsoidal2DCSAxis.LATITUDE_LONGITUDE: [
        {
            "name": "Latitude",
            "abbreviation": "lat",
            "direction": "north",
            "unit": UNIT_DEGREE,
        },
        {
            "name": "Longitude",
            "abbreviation": "lon",
            "direction": "east",
            "unit": UNIT_DEGREE,
        },
    ],
}


[docs] class Ellipsoidal2DCS(CoordinateSystem): """ .. versionadded:: 2.5.0 This generates an Ellipsoidal 2D Coordinate System """
[docs] def __new__( cls, axis: Ellipsoidal2DCSAxis | str = Ellipsoidal2DCSAxis.LONGITUDE_LATITUDE, ): """ Parameters ---------- axis: :class:`pyproj.crs.enums.Ellipsoidal2DCSAxis` or str, optional This is the axis order of the coordinate system. Default is :attr:`pyproj.crs.enums.Ellipsoidal2DCSAxis.LONGITUDE_LATITUDE`. """ return cls.from_json_dict( { "type": "CoordinateSystem", "subtype": "ellipsoidal", "axis": _ELLIPSOIDAL_2D_AXIS_MAP[Ellipsoidal2DCSAxis.create(axis)], } )
_ELLIPSOIDAL_3D_AXIS_MAP = { Ellipsoidal3DCSAxis.LONGITUDE_LATITUDE_HEIGHT: [ { "name": "Longitude", "abbreviation": "lon", "direction": "east", "unit": UNIT_DEGREE, }, { "name": "Latitude", "abbreviation": "lat", "direction": "north", "unit": UNIT_DEGREE, }, { "name": "Ellipsoidal height", "abbreviation": "h", "direction": "up", "unit": UNIT_METRE, }, ], Ellipsoidal3DCSAxis.LATITUDE_LONGITUDE_HEIGHT: [ { "name": "Latitude", "abbreviation": "lat", "direction": "north", "unit": UNIT_DEGREE, }, { "name": "Longitude", "abbreviation": "lon", "direction": "east", "unit": UNIT_DEGREE, }, { "name": "Ellipsoidal height", "abbreviation": "h", "direction": "up", "unit": UNIT_METRE, }, ], }
[docs] class Ellipsoidal3DCS(CoordinateSystem): """ .. versionadded:: 2.5.0 This generates an Ellipsoidal 3D Coordinate System """
[docs] def __new__( cls, axis: Ellipsoidal3DCSAxis | str = Ellipsoidal3DCSAxis.LONGITUDE_LATITUDE_HEIGHT, ): """ Parameters ---------- axis: :class:`pyproj.crs.enums.Ellipsoidal3DCSAxis` or str, optional This is the axis order of the coordinate system. Default is :attr:`pyproj.crs.enums.Ellipsoidal3DCSAxis.LONGITUDE_LATITUDE_HEIGHT`. """ return cls.from_json_dict( { "type": "CoordinateSystem", "subtype": "ellipsoidal", "axis": _ELLIPSOIDAL_3D_AXIS_MAP[Ellipsoidal3DCSAxis.create(axis)], } )
_CARTESIAN_2D_AXIS_MAP = { Cartesian2DCSAxis.EASTING_NORTHING: [ { "name": "Easting", "abbreviation": "E", "direction": "east", "unit": UNIT_METRE, }, { "name": "Northing", "abbreviation": "N", "direction": "north", "unit": UNIT_METRE, }, ], Cartesian2DCSAxis.NORTHING_EASTING: [ { "name": "Northing", "abbreviation": "N", "direction": "north", "unit": UNIT_METRE, }, { "name": "Easting", "abbreviation": "E", "direction": "east", "unit": UNIT_METRE, }, ], Cartesian2DCSAxis.EASTING_NORTHING_FT: [ {"name": "Easting", "abbreviation": "X", "direction": "east", "unit": UNIT_FT}, { "name": "Northing", "abbreviation": "Y", "direction": "north", "unit": UNIT_FT, }, ], Cartesian2DCSAxis.NORTHING_EASTING_FT: [ { "name": "Northing", "abbreviation": "Y", "direction": "north", "unit": UNIT_FT, }, {"name": "Easting", "abbreviation": "X", "direction": "east", "unit": UNIT_FT}, ], Cartesian2DCSAxis.EASTING_NORTHING_US_FT: [ { "name": "Easting", "abbreviation": "X", "direction": "east", "unit": UNIT_US_FT, }, { "name": "Northing", "abbreviation": "Y", "direction": "north", "unit": UNIT_US_FT, }, ], Cartesian2DCSAxis.NORTHING_EASTING_US_FT: [ { "name": "Northing", "abbreviation": "Y", "direction": "north", "unit": UNIT_US_FT, }, { "name": "Easting", "abbreviation": "X", "direction": "east", "unit": UNIT_US_FT, }, ], Cartesian2DCSAxis.NORTH_POLE_EASTING_SOUTH_NORTHING_SOUTH: [ { "name": "Easting", "abbreviation": "E", "direction": "south", "unit": UNIT_METRE, }, { "name": "Northing", "abbreviation": "N", "direction": "south", "unit": UNIT_METRE, }, ], Cartesian2DCSAxis.SOUTH_POLE_EASTING_NORTH_NORTHING_NORTH: [ { "name": "Easting", "abbreviation": "E", "direction": "north", "unit": UNIT_METRE, }, { "name": "Northing", "abbreviation": "N", "direction": "north", "unit": UNIT_METRE, }, ], Cartesian2DCSAxis.WESTING_SOUTHING: [ { "name": "Easting", "abbreviation": "Y", "direction": "west", "unit": UNIT_METRE, }, { "name": "Northing", "abbreviation": "X", "direction": "south", "unit": UNIT_METRE, }, ], }
[docs] class Cartesian2DCS(CoordinateSystem): """ .. versionadded:: 2.5.0 This generates an Cartesian 2D Coordinate System """
[docs] def __new__( cls, axis: Cartesian2DCSAxis | str = Cartesian2DCSAxis.EASTING_NORTHING ): """ Parameters ---------- axis: :class:`pyproj.crs.enums.Cartesian2DCSAxis` or str, optional This is the axis order of the coordinate system. Default is :attr:`pyproj.crs.enums.Cartesian2DCSAxis.EASTING_NORTHING`. """ return cls.from_json_dict( { "type": "CoordinateSystem", "subtype": "Cartesian", "axis": _CARTESIAN_2D_AXIS_MAP[Cartesian2DCSAxis.create(axis)], } )
_VERTICAL_AXIS_MAP = { VerticalCSAxis.GRAVITY_HEIGHT: { "name": "Gravity-related height", "abbreviation": "H", "direction": "up", "unit": UNIT_METRE, }, VerticalCSAxis.GRAVITY_HEIGHT_US_FT: { "name": "Gravity-related height", "abbreviation": "H", "direction": "up", "unit": UNIT_US_FT, }, VerticalCSAxis.GRAVITY_HEIGHT_FT: { "name": "Gravity-related height", "abbreviation": "H", "direction": "up", "unit": UNIT_FT, }, VerticalCSAxis.DEPTH: { "name": "Depth", "abbreviation": "D", "direction": "down", "unit": UNIT_METRE, }, VerticalCSAxis.DEPTH_US_FT: { "name": "Depth", "abbreviation": "D", "direction": "down", "unit": UNIT_US_FT, }, VerticalCSAxis.DEPTH_FT: { "name": "Depth", "abbreviation": "D", "direction": "down", "unit": UNIT_FT, }, VerticalCSAxis.UP: { "name": "up", "abbreviation": "H", "direction": "up", "unit": UNIT_METRE, }, VerticalCSAxis.UP_FT: { "name": "up", "abbreviation": "H", "direction": "up", "unit": UNIT_FT, }, VerticalCSAxis.UP_US_FT: { "name": "up", "abbreviation": "H", "direction": "up", "unit": UNIT_US_FT, }, }
[docs] class VerticalCS(CoordinateSystem): """ .. versionadded:: 2.5.0 This generates an Vertical Coordinate System """
[docs] def __new__(cls, axis: VerticalCSAxis | str = VerticalCSAxis.GRAVITY_HEIGHT): """ Parameters ---------- axis: :class:`pyproj.crs.enums.VerticalCSAxis` or str, optional This is the axis direction of the coordinate system. Default is :attr:`pyproj.crs.enums.VerticalCSAxis.GRAVITY_HEIGHT`. """ return cls.from_json_dict( { "type": "CoordinateSystem", "subtype": "vertical", "axis": [_VERTICAL_AXIS_MAP[VerticalCSAxis.create(axis)]], } )