"Construct, inspect, compare, serialize, and query pyproj
Scanned 9/9/2026
Install to Claude Code
npx -y skills add VectorSpaceLab/AREX-Skill --skill crs-and-database --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Crs And Database?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/vectorspacelab-crs-and-database)More formats (shields.io, HTML) on the badges page.
---
name: crs-and-database
description: "Construct, inspect, compare, serialize, and query pyproj
coordinate reference systems, datums, coordinate systems, operations,
authorities, areas of use, and the PROJ database."
disable-model-invocation: true
metadata:
disco-role: operating
license: NOASSERTION
---
# CRS and database
Use this route when the task is to define, identify, inspect, compare, or
query a coordinate reference system (CRS) and its metadata. It owns
`CRS`, datum and ellipsoid metadata, coordinate systems and axes, conversions
embedded in a CRS, authority matching, areas of use, and PROJ database
queries.
This route describes CRS metadata; it does not execute coordinate conversion.
After the source and target CRS have passed the inspection gate, hand
coordinate execution to
[coordinate-transformations](../coordinate-transformations/SKILL.md). Hand
ellipsoidal distance, bearing, area, or other `Geod` calculations to
[geodesic-calculations](../geodesic-calculations/SKILL.md). Hand installation,
PROJ data-directory, grid, SQLite, or network failures to
[cli-data-and-network](../cli-data-and-network/SKILL.md).
## Operating sequence
1. **Normalize the input.** At an API boundary use
`CRS.from_user_input(value, **kwargs)`. Prefer `CRS.from_epsg(code)` or
`CRS.from_authority(name, code)` when an authority identifier is known.
For a known representation, use its explicit parser and keep the original
representation for recovery.
2. **Inspect the object before trusting coordinates.** Record `name`,
`type_name`, dimensional predicates, `axis_info`, `area_of_use`, `datum`,
`ellipsoid`, `prime_meridian`, `coordinate_system`, and
`coordinate_operation`. For bound CRSs inspect `source_crs` and
`target_crs`; for compound CRSs inspect every `sub_crs_list` member.
3. **Resolve identity conservatively.** Use `is_exact_same()` for strict
identity and `equals()` for semantic comparison. Use
`equals(other, ignore_axis_order=True)` only to diagnose an intentional
axis difference. Treat `to_epsg()` and `to_authority()` as confidence-
thresholded database matches, not as proof of origin.
4. **Query with evidence.** Build an `AreaOfInterest` in degree order
`(west, south, east, north)`. Query with authority, `PJType`, deprecation,
and `contains` criteria. For UTM, retain all `query_utm_crs_info()` results
and select only when the task's rule leaves exactly one candidate.
5. **Choose a representation.** Preserve an authority code, WKT2, or PROJ
JSON when CRS fidelity matters. Treat PROJ4 output and `to_dict()` as
derived compatibility forms. A CF result normally needs both the grid
mapping from `to_cf()` and coordinate-variable metadata from `cs_to_cf()`.
6. **Validate and hand off.** Assert the required type, axes, units, datum,
operation, area, authority confidence, and round-trip properties. Carry
unresolved authority matches, axis choices, and AOI ambiguity into the
handoff; never select the first plausible database row silently.
## Input, output, and failure contracts
- **Inputs:** EPSG or other authority identifiers, CRS/WKT/PROJ/JSON/CF
representations, typed CRS components, AOI bounds, database filters, and a
required confidence or selection rule.
- **Outputs:** a validated `CRS` or component object; metadata for its datum,
axes, operation, and area; serialized forms with round-trip checks; or a
candidate `CRSInfo` set with an explicit selection decision.
- **Expected observations:** axis direction and units are inspectable,
`area_of_use` is either meaningful or explicitly absent, authority matching
returns a code only at the requested confidence, and query results expose
code/name/type/deprecation/area metadata.
- **Recovery:** distinguish invalid input and no-match selection from a
missing or incompatible PROJ database. Keep the input and exception, then
route data/runtime failures to the CLI/data sibling rather than changing
data-directory state inside this workflow.
## Fast validation examples
```python
from pyproj import CRS
crs = CRS.from_epsg(26915)
assert crs.is_projected
assert crs.axis_info and crs.axis_info[0].direction == "east"
assert crs.area_of_use is not None
assert crs.to_authority() == ("EPSG", "26915")
assert crs.coordinate_operation is not None
```
```python
from pyproj import CRS
from pyproj.aoi import AreaOfInterest
from pyproj.database import query_utm_crs_info
info = query_utm_crs_info(
datum_name="WGS 84",
area_of_interest=AreaOfInterest(-93.7, 41.9, -93.5, 42.1),
)
if len(info) != 1:
raise LookupError(f"UTM selection is ambiguous or empty: {info!r}")
selected = CRS.from_epsg(info[0].code)
assert selected.is_projected and selected.utm_zone
```
## Handoff gate
Before routing to coordinate execution, provide the normalized CRS input,
authority result and confidence evidence (or an explicit no-match result),
axis names/directions/units, application coordinate order, area bounds, and
any bound, compound, deprecated, or lossy-serialization caveat. If the
authority match conflicts with axis semantics, or AOI/UTM selection is empty
or ambiguous, stop at this route and use the recovery guidance before handing
off.
Detailed recipes are in [api-reference.md](references/api-reference.md).
Format, axis, and serialization rules are in
[crs-formats-and-axis.md](references/crs-formats-and-axis.md). Failure
classification and recovery are in
[troubleshooting.md](references/troubleshooting.md).
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!