Building a Coordinate Reference System#

New in version 2.5.0.

PROJ strings have the potential to lose much of the information about a coordinate reference system (CRS).

More information: https://proj.org/faq.html#what-is-the-best-format-for-describing-coordinate-reference-systems

However, PROJ strings make it really simple to construct a CRS. This addition is meant to simplify the process of transitioning from the PROJ form of the string to the WKT form WKT. The CRS classes can be used in the pyproj.transformer.Transformer.from_crs() method just like the pyproj.crs.CRS class.

The current set of classes does not cover every possible use case, but hopefully it is enough to get you started. If you notice something is missing that you need, feel free to open an issue on GitHub.

Here are links to the API docs for the pieces you need to get started:

Geographic CRS#

This is a simple example of creating a lonlat projection.

PROJ string:

+proj=longlat +datum=WGS84 +no_defs
from pyproj.crs import GeographicCRS

geog_crs = GeographicCRS()
geog_wkt = geog_crs.to_wkt()

This example is meant to show off different initialization methods. It can be simplified to not use the Ellipsoid or PrimeMeridian objects.

PROJ string:

+proj=longlat +ellps=airy +pm=lisbon +no_defs
from pyproj.crs import Ellipsoid, GeographicCRS, PrimeMeridian
from pyproj.crs.datum import CustomDatum

cd = CustomDatum(
    ellipsoid=Ellipsoid.from_epsg(7001),
    prime_meridian=PrimeMeridian.from_name("Lisbon"),
)
geog_crs = GeographicCRS(datum=cd)
geog_wkt = geog_crs.to_wkt()

Projected CRS#

Simple example using defaults.

PROJ string:

+proj=aea +lat_0=0 +lon_0=0 +lat_1=0 +lat_2=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
from pyproj.crs import ProjectedCRS
from pyproj.crs.coordinate_operation import AlbersEqualAreaConversion

aeaop = AlbersEqualAreaConversion(0, 0)
proj_crs = ProjectedCRS(conversion=aeaop)
crs_wkt = proj_crs.to_wkt()

More complex example with custom parameters.

PROJ string:

+proj=utm +zone=14 +a=6378137 +b=6356752 +pm=lisbon +units=m +no_defs
from pyproj.crs import GeographicCRS, ProjectedCRS
from pyproj.crs.coordinate_operation import UTMConversion
from pyproj.crs.datum import CustomDatum, CustomEllipsoid

ell = CustomEllipsoid(semi_major_axis=6378137, semi_minor_axis=6356752)
cd = CustomDatum(ellipsoid=ell, prime_meridian="Lisbon")
proj_crs = ProjectedCRS(
    conversion=UTMConversion(14), geodetic_crs=GeographicCRS(datum=cd)
)
crs_wkt = proj_crs.to_wkt()

Bound CRS#

This is an example building a CRS with towgs84.

PROJ string:

+proj=tmerc +lat_0=0 +lon_0=15 +k=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +towgs84=-122.74,-34.27,-22.83,-1.884,-3.4,-3.03,-15.62 +units=m +no_defs
from pyproj.crs import BoundCRS, Ellipsoid, GeographicCRS, ProjectedCRS
from pyproj.crs.coordinate_operation import (
    TransverseMercatorConversion,
    ToWGS84Transformation,
)
from pyproj.crs.datum import CustomDatum
import pyproj

proj_crs = ProjectedCRS(
    conversion=TransverseMercatorConversion(
        latitude_natural_origin=0,
        longitude_natural_origin=15,
        false_easting=2520000,
        false_northing=0,
        scale_factor_natural_origin=0.9996,
    ),
    geodetic_crs=GeographicCRS(
        datum=CustomDatum(ellipsoid="International 1924 (Hayford 1909, 1910)")
    ),
)
bound_crs = BoundCRS(
    source_crs=proj_crs,
    target_crs="WGS 84",
    transformation=ToWGS84Transformation(
        proj_crs.geodetic_crs, -122.74, -34.27, -22.83, -1.884, -3.4, -3.03, -15.62
    ),
)
crs_wkt = bound_crs.to_wkt()

Compound CRS#

The PROJ string is quite lossy in this example, so it is not provided.

from pyproj.crs import CompoundCRS, GeographicCRS, ProjectedCRS, VerticalCRS
from pyproj.crs.coordinate_system import Cartesian2DCS, VerticalCS
from pyproj.crs.coordinate_operation import LambertConformalConic2SPConversion


vertcrs = VerticalCRS(
    name="NAVD88 height",
    datum="North American Vertical Datum 1988",
    vertical_cs=VerticalCS(),
    geoid_model="GEOID12B",
)
projcrs = ProjectedCRS(
    name="NAD83 / Pennsylvania South",
    conversion=LambertConformalConic2SPConversion(
        latitude_false_origin=39.3333333333333,
        longitude_false_origin=-77.75,
        latitude_first_parallel=40.9666666666667,
        latitude_second_parallel=39.9333333333333,
        easting_false_origin=600000,
        northing_false_origin=0,
    ),
    geodetic_crs=GeographicCRS(datum="North American Datum 1983"),
    cartesian_cs=Cartesian2DCS(),
)
compcrs = CompoundCRS(
    name="NAD83 / Pennsylvania South + NAVD88 height", components=[projcrs, vertcrs]
)
crs_wkt = compcrs.to_wkt()