Skip to main content

UCRS a single wrapper class that accepts any CRS input and lazily converts to an instance of any library you need (e.g. cartopy, osgeo).

Project description

UCRS - Unified CRS

PyPI version Python 3.10+ License: MIT

Stop juggling CRS formats. Start using UCRS.

Working with geospatial data in Python means dealing with different CRS representations:

  • pyprojpyproj.CRS
  • cartopycartopy.crs.CRS and cartopy.crs.Projection
  • GDAL/osgeoosgeo.osr.SpatialReference

Converting between these is well-documented but tedious. UCRS provides a single class that accepts any CRS input and seamlessly converts to whatever you need.

Features

  • Universal Input: Accepts EPSG codes, WKT, PROJ strings, or library-specific CRS objects
  • Lazy Conversion: Only imports and converts when you access a specific property
  • Cached Results: Conversions are cached - repeated access returns the same object
  • Type Safe: Full type annotations for IDE support
  • Inheritance: UCRS is a pyproj.CRS, so it works anywhere pyproj does

Quick Start

from ucrs import UCRS

# Create from any CRS representation
crs = UCRS(4326)                         # EPSG code
crs = UCRS("EPSG:4326")                  # EPSG string
crs = UCRS("+proj=longlat +datum=WGS84") # PROJ string
crs = UCRS(wkt_string)                   # WKT
crs = UCRS(pyproj.CRS.from_epsg(4326))   # pyproj.CRS
crs = UCRS(cartopy.crs.PlateCarree())    # cartopy CRS
crs = UCRS(srs)                          # osgeo.osr.SpatialReference

# Use as pyproj.CRS (UCRS inherits from it)
crs.to_epsg()        # Returns 4326
crs.is_geographic    # Returns True
crs.to_wkt()         # WKT string

# Convert to other libraries (lazy, cached)
crs.cartopy          # Returns cartopy CRS (requires cartopy)
crs.osgeo            # Returns SpatialReference (requires GDAL)

Example Use Cases

Working with matplotlib and cartopy:

import matplotlib.pyplot as plt
from ucrs import UCRS

# Create from EPSG code
crs = UCRS(3857)  # Web Mercator

# Use in cartopy plot
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=crs.cartopy)
ax.coastlines()

Converting between GDAL and pyproj:

from osgeo import gdal
from ucrs import UCRS

# Get CRS from GDAL dataset
dataset = gdal.Open("myfile.tif")
gdal_srs = dataset.GetSpatialRef()

# Convert to UCRS
crs = UCRS(gdal_srs)

# Now use pyproj methods
print(f"EPSG: {crs.to_epsg()}")
print(f"Is projected: {crs.is_projected}")

Transforming coordinates:

from pyproj import Transformer
from ucrs import UCRS

wgs84 = UCRS(4326)
web_mercator = UCRS(3857)

# Since UCRS inherits from pyproj.CRS, use it directly
transformer = Transformer.from_crs(wgs84, web_mercator)
x, y = transformer.transform(40.7128, -74.0060)  # NYC coordinates

How It Works

UCRS inherits from pyproj.CRS, making it a drop-in replacement that works anywhere a pyproj CRS is expected. All conversions follow this pattern:

  1. Input (any format) → pyproj.CRS (during initialization)
  2. pyproj.CRSOutput format (via lazy, cached properties)

Since UCRS inherits from pyproj.CRS, you can use all pyproj methods directly. Conversions to cartopy and osgeo are performed lazily when their properties are first accessed, then cached for subsequent use.

Requirements

  • Python 3.10+
  • pyproj (required)
  • cartopy (optional)
  • GDAL (optional)

Installation

# Minimal installation (pyproj only)
pip install ucrs

# With cartopy support
pip install ucrs[cartopy]

# With GDAL support
pip install ucrs[gdal]

# With all optional dependencies
pip install ucrs[complete]

License

MIT License - see LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ucrs-0.2.0.tar.gz (6.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ucrs-0.2.0-py3-none-any.whl (7.2 kB view details)

Uploaded Python 3

File details

Details for the file ucrs-0.2.0.tar.gz.

File metadata

  • Download URL: ucrs-0.2.0.tar.gz
  • Upload date:
  • Size: 6.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.13.7 Linux/6.17.5-arch1-1

File hashes

Hashes for ucrs-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a860c1c31068cb06c9453fc644fad403455477f082cbad52c8ed3010077b425c
MD5 760790cee2b83d5a07c211823d9c79a3
BLAKE2b-256 57ff5ca345d3c0654fd3c37b9ea423ab2be6c835d9aec7f30593fe351c19287c

See more details on using hashes here.

File details

Details for the file ucrs-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: ucrs-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 7.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.13.7 Linux/6.17.5-arch1-1

File hashes

Hashes for ucrs-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 95a845ad7c08f1063b43338370f43acf852589cdfe11b147892a1666e7e29d3d
MD5 502b631b4c552939210d152529135af0
BLAKE2b-256 d5469268865f2cd42f29add1fca3985a41ac612e7867bcb43828cf65eb085856

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page