CS2CS(1)
π CS2CS(1) π
okay so picture this: it's the cs2cs(1) page from the PROJ manual, and it's lowkey iconic. it's a long one, so we're doing it in three parts β this is part one, bestie, buckle up π
β¨ NAME β¨
cs2cs β the cartographic coordinate system filter. that's it, that's the whole name. she filters coordinate systems and she does it fabulously π
πΈ SYNOPSIS πΈ
here's the whole vibe of how you call her:
cs2cs [-eEfIlrstvwW [args]]
[[--area <name_or_code>] | [--bbox <west_long,south_lat,east_long,north_lat>]]
[--authority <name>] [--3d]
[--accuracy <accuracy>] [--only-best[=yes|=no]] [--no-ballpark]
[--s_epoch {epoch}] [--t_epoch {epoch}]
([+opt[=arg] ...] [+to +opt[=arg] ...] | {source_crs} {target_crs})
file ...
so where does {source_crs} or {target_crs} come from? glad you asked π«Ά β each one is any of the possibilities that proj_create() accepts, provided it expresses a CRS. and bestie there are likeβ¦ a lot of possibilities:
- a proj-string,
- a WKT string,
- an object code (like
"EPSG:4326","urn:ogc:def:crs:EPSG::4326","urn:ogc:def:coordinateOperation:EPSG::1671"), - an Object name. e.g
"WGS 84","WGS 84 / UTM zone 31N". and ok listen β in that case, since uniqueness is not guaranteed, heuristics get applied to determine the appropriate best match. so it's doing its little detective work π - a CRS name and a coordinate epoch, separated with
'@'. for example"ITRF2014@2025.0". (added in 9.2) β - a OGC URN combining references for compound coordinate reference systems (e.g
"urn:ogc:def:crs,crs:EPSG::2393,crs:EPSG::5717"or the custom abbreviated syntax"EPSG:2393+5717"), - a OGC URN combining references for references for projected or derived CRSs β e.g. for Projected 3D CRS
"UTM zone 31N / WGS 84 (3D)":"β urn:ogc:def:crs,crs:EPSG::4979,cs:PROJ::ENh,coordinateOperation:EPSG::16031"(added in 6.2) π¦ - a OGC URN combining references for concatenated operations (e.g.
"β urn:ogc:def:coordinateOperation,coordinateOperation:EPSG::3895,coordinateOperation:EPSG::1618") - a PROJJSON string. the jsonschema lives at
β https://proj.org/schemas/v0.4/projjson.schema.json(added in 6.2) π - a compound CRS made from two object names separated with
" + ". e.g."WGS 84 + EGM96 height"(added in 7.1) π
Added in version 6.0.0. (she's been around a minute, ngl)
β οΈ NOTE: before 7.0.1, it was needed to add+tobetween{source_crs}and{target_crs}when adding a filename. so if you're reading ancient configs and they look weird β that's why, historical lore π
ok that's the setup, part 2 is coming and it's giving main character energy π₯
DESCRIPTION π
cs2cs does the transformation thing between a source and a destination cartographic coordinate reference system on a set of input points. Bestie, this can include translation between projected and geographic coordinates and applying datum shifts. Itβs giving βcoordinate glow-up.β
The following control parameters can appear in any order β literally any order, no cap:
-Iβ Perform the inverse transformation, that is from target CRS to source CRS. Reverse it, slay.-t<a>β Where a specifies a character employed as the first character to denote a control line to be passed through without processing. This option applicable to ASCII input only. (#is the default value).-d <n>β Added in version 5.2.0. Specify the number of decimals to round to in the output.-e <string>β Where string is an arbitrary string to be output if an error is detected during data transformations. The default value is a three character string:*\t*.-Eβ Causes the input coordinates to be copied to the output line prior to printing the converted values.-l<[=id]>β List projection identifiers that can be selected with+proj.cs2cs -l=idgives expanded description of projection id, e.g.cs2cs -l=merc.-lpβ List of all projection id that can be used with the+projparameter. Equivalent tocs2cs -l.-lPβ Expanded description of all projections that can be used with the+projparameter.-leβ List of all ellipsoids that can be selected with the+ellpsparameters.-lmβ List of hard-coded prime meridians that can be selected with the+pmparameter. Note that this list is no longer updated, and some values may conflict with other sources.-luβ List of all distance units that can be selected with the+unitsparameter.-rβ This option reverses the order of the first two expected inputs from that specified by the CRS to the opposite order. The third coordinate, typically height, remains third.-sβ This option reverses the order of the first two expected outputs from that specified by the CRS to the opposite order. The third coordinate, typically height, remains third.-f <format>β Where format is aprintfformat string to control the form of the output values. For inverse projections, the output will be in degrees when this option is employed. If a format is specified for inverse projection the output data will be in decimal degrees. The default format is"%.2f"for forward projection and DMS for inverse.-w<n>β Where n is the number of significant fractional digits to employ for seconds output (when the option is not specified,-w3is assumed).-W<n>β Where n is the number of significant fractional digits to employ for seconds output. When-Wis employed the fields will be constant width with leading zeroes. Valid range:-W0through-W8.-vβ Causes a listing of cartographic control parameters tested for and used by the program to be printed prior to input data.--area <name_or_code>β Added in version 8.0.0. Specify an area of interest to restrict the results when researching coordinate operations between 2 CRS. The area of interest can be specified either as a name (e.g"Denmark - onshore") or aAUTHORITY:CODE(EPSG:3237). This option is mutually exclusive with--bbox.--bbox <west_long,south_lat,east_long,north_lat>β Added in version 8.0.0. Specify an area of interest to restrict the results when researching coordinate operations between 2 CRS. The area of interest is specified as a bounding box with geographic coordinates, expressed in degrees in a unspecified geographic CRS.west_longandeast_longshould be in the[-180,180]range, andsouth_latandnorth_latin the[-90,90].west_longis generally lower thaneast_long, except in the case where the area of interest crosses the antimeridian.--only-best[=yes|=no]β Added in version 9.2.0. Forcecs2csto only use the best transformation known by PROJ.cs2cswill return an error if a grid needed for the best transformation is missing. Best transformation should be understood as the most accurate transformation available among all relevant for the point to transform, and if all known grids required to perform such transformation were accessible (either locally or through network). Note that the default value for this option can be also set with thePROJ_ONLY_BEST_DEFAULTenvironment variable, or with theonly_best_defaultsetting ofproj.ini(--only-bestwhen specified overrides such default value).--no-ballparkβ Added in version 8.0.0. Disallow any coordinate operation that is, or contains, a Ballpark transformation.--accuracy <accuracy>β Added in version 8.0.0. Sets the minimum desired accuracy for candidate coordinate operations.--authority <name>β Added in version 8.0.0. This option can be used to restrict the authority of coordinate operations looked up in the database. When not specified, coordinate operations from any authority will be searched, with the restrictions set in theauthority_to_authority_preferencedatabase table related to the authority of the source/target CRS themselves. If authority is set toany, then coordinate operations from any authority will be searched. If authority is a non-empty string different ofany, then coordinate operations will be searched only in that authority namespace (e.gEPSG). This option is mutually exclusive with--bbox.--3dβ Added in version 9.1. βPromoteβ 2D CRS(s) to their 3D version, where the vertical axis is the ellipsoidal height in metres, using the ellipsoid of the base geodetic CRS. Depending on PROJ versions and the exact nature of the CRS involved, especially before PROJ 9.1, a mix of 2D and 3D CRS could lead to 2D or 3D transformations. Starting with PROJ 9.1, both CRS need to be 3D for vertical transformation to possibly happen.--s_epochβ Added in version 9.4. Epoch of coordinates in the source CRS, as decimal year. Only applies to a dynamic CRS.--t_epochβ Added in version 9.4. Epoch of coordinates in the target CRS, as decimal year. Only applies to a dynamic CRS.
The +opt run-line arguments are associated with cartographic parameters.
The cs2cs program takes two coordinate reference system (CRS) definitions. These can be given in a variety of formats such as EPSG-codes, WKT-strings or legacy PROJ.4 CRS descriptions.
If there is no second CRS defined, a geographic CRS based on the datum and ellipsoid of the source CRS is assumed. Note that the source and destination CRS can both be of the same or different nature (geographic, projected, compound CRS), or one of each and may have the same or different datums.
When using a WKT definition or an AUTHORITY:CODE, the axis order of the CRS will be enforced. So for example if using EPSG:4326, the first value expected (or returned) will be a latitude.
Internally, cs2cs uses the proj_create_crs_to_crs() function to compute the appropriate coordinate operation, so implementation details of this function directly impact the results returned by the program.
The environment parameter PROJ_DATA establishes the directory for resource files (database, datum shift grids, etc.)
One or more files (processed in left to right order) specify the source of data to be transformed. A - will specify the location of processing standard input. If no files are specified, the input is assumed to be from stdin. For input data the two data values must be in the first two white space separated fields and when both input and output are ASCII all trailing portions of the input line are appended to the output line.
Input geographic data (longitude and latitude) must be in DMS or decimal degrees format and input cartesian data must be in units consistent with the ellipsoid major axis or sphere radius units. Output geographic coordinates will normally be in DMS format (use -f %.12f for decimal degrees with 12 decimal places), while projected (cartesian) coordinates will be in linear (meter, feet) units.
π Use of remote grids π
Added in version 7.0.0.
If the PROJ_NETWORK environment variable is set to ON, cs2cs will attempt to use remote grids stored on CDN (Content Delivery Network) storage, when they are not available locally.
More details are available in the Network capabilities section.
β¨ EXAMPLES β¨
This is where it all clicks, bestie β here are the actual examples from the page, with commands and outputs kept exactly as they are. No cap. π«Ά
π Using EPSG CRS codes
Transforming from WGS 84 latitude/longitude (in that order) to UTM Zone 31N/WGS 84:
cs2cs EPSG:4326 EPSG:32631 <<EOF
45N 2E
EOF
outputs:
421184.70 4983436.77 0.00
πΈ Using EPSG CRS names
Transforming from WGS 84 latitude/longitude (in that order) with EGM96 height to UTM Zone 31N/WGS 84 with WGS84 ellipsoidal height:
echo 45 2 0 | cs2cs "WGS 84 + EGM96 height" "WGS 84 / UTM zone 31N" --3d
outputs:
421184.70 4983436.77 50.69
NOTE: To get those exact values, you need to have the EGM96 grid installed locally or use networking capabilities mentioned above. πΎβ¨
π¦ Using PROJ strings
The following script:
cs2cs +proj=latlong +datum=NAD83 +to +proj=utm +zone=10 +datum=NAD27 -r <<EOF
45Β°15'33.1" 111.5W
45d15.551666667N -111d30
+45.25919444444 111d30'000w
EOF
will transform the input NAD83 geographic coordinates into NAD27 coordinates in the UTM projection with zone 10 selected. The geographic values of this example are equivalent and meant as examples of various forms of DMS input. The x-y output data will appear as three lines of:
1402285.93 5076292.58 0.00
To get those exact values, you need to have all current grids installed (in that instance the NADCON5 us_noaa_nadcon5_nad27_nad83_1986_conus.tif grid) locally or use networking capabilities mentioned above. π₯
To make sure you will get the optimal result, you may add --only-best. Assuming the above mentioned grid is not available,
echo -111.5 45.25919444444 | cs2cs --only-best +proj=latlong +datum=NAD83 +to +proj=utm +zone=10 +datum=NAD27
would return:
Attempt to use coordinate operation axis order change (2D) + Inverse of NAD27 to NAD83 (7) + axis order change (2D) + UTM zone 10N failed. Grid us_noaa_nadcon5_nad27_nad83_1986_conus.tif is not available. Consult https://proj.org/resource_files.html for guidance.
* * inf
Otherwise, if you don't have the grid available and you don't specify --only-best:
echo -111.5 45.25919444444 | cs2cs --only-best +proj=latlong +datum=NAD83 +to +proj=utm +zone=10 +datum=NAD27
would return:
1402224.57 5076275.42 0.00
which is the result when the NAD27 and NAD83 datums are dealt as identical, which is an approximation at a level of several tens of metres.
π SEE ALSO π
π BUGS π
A list of known bugs can be found at https://github.com/OSGeo/PROJ/issues, where new bug reports can be submitted to. π«Ά
π HOME PAGE π
π AUTHOR π
Frank Warmerdam
π COPYRIGHT π
1983-2026, PROJ contributors
And that's the whole page, bestie β this came from PROJ version 9.9, dated 15 Sep 2026, and it's the CS2CS(1) page signing off. Slay. π
β¨
π¦ where this page comes from
- arch rolling: proj 9.9.0-1 Β· MIT
- nixpkgs unstable: proj 9.9.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms