PROJINFO(1)
β¨ NAME β¨
projinfo β Geodetic object and coordinate operation queries
okay bestie, this is the PROJ manual page for projinfo, and it's literally your go-to for geodetic object and coordinate operation queries π
π SYNOPSIS π
projinfo
[-o formats] [-k crs|operation|datum|ensemble|ellipsoid] [--summary] [-q]
[[--area name_or_code] | [--bbox west_long,south_lat,east_long,north_lat]]
[--spatial-test contains|intersects]
[--crs-extent-use none|both|intersection|smallest]
[--grid-check none|discard_missing|sort|known_available]
[--pivot-crs always|if_no_direct_transformation|never|{auth:code[,auth:code]*}]
[--show-superseded] [--hide-ballpark] [--accuracy {accuracy}]
[--allow-ellipsoidal-height-as-vertical-crs]
[--boundcrs-to-wgs84]
[--authority name]
[--main-db-path path] [--aux-db-path path]*
[--dump-db-structure]
[--identify] [--3d]
[--output-id AUTH:CODE]
[--c-ify] [--single-line]
--searchpaths | --remote-data |
--list-crs [list-crs-filter] |
--dump-db-structure [{object_definition} | {object_reference}] |
{object_definition} | {object_reference} |
(-s {srs_def} [--s_epoch {epoch}] -t {srs_def} [--t_epoch {epoch}]) |
({srs_def} {srs_def})
where {object_definition} or {srs_def} is one of the possibilities
accepted by proj_create()
β’ 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". In that case
as uniqueness is not guaranteed, heuristics are applied to
determine the appropriate best match.
β’ 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
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)
β’ Extension of OGC URN for CoordinateMetadata. e.g. "β
urn:ogc:def:CoordinateMetadata:NRCAN::NAD83_CSRS_1997_MTM11_HT2_1997"
β’ 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 is 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)
{object_reference} is a filename preceded by the '@' character. The
file referenced by the {object_reference} must contain a valid
{object_definition}.
The usage of "{srs_def} {srs_def}" is equivalent to "-s {srs_def} -t
{srs_def}" (added in 9.5).
π¦ DESCRIPTION π¦
projinfo is that program that queries info on a geodetic object, coordinate reference system (CRS), or coordinate operation β specifically when the -s and -t options are specified β and then displays it in different formats: PROJ string, WKT string, or PROJJSON string π
It can also query the coordinate operations available between two CRS, which is lowkey iconic.
The program is named with some reference to the GDAL gdalsrsinfo utility, which offers partly similar services π
The following control parameters can appear in any order:
π control parameters, bestie π
-o formatsβformatsis a comma-separated combo of:all,default,PROJ,WKT_ALL,WKT2:2015,WKT2:2019,WKT1:GDAL,WKT1:ESRI,PROJJSON,SQL.
Except all and default, the other formats can be preceded by - to disable them.
NOTE:WKT2_2019was previously calledWKT2_2018.
NOTE: Before PROJ 6.3.0,WKT1:GDALwas implicitly calling--boundcrs-to-wgs84. This is no longer the case.
NOTE: WhenSQLis specified,--output-idmust be specified.
-k crs|operation|datum|ensemble|ellipsoidβ when you're querying a single object with aAUTHORITY:CODE, this determines the (k)ind of the object in case there are CRS, coordinate operations, or ellipsoids with the sameCODE. The default iscrs.--summaryβ when listing coordinate operations available between 2 CRS, returns the result in a summary format that mentions only the name of the coordinate operation, its accuracy, and its area of use.
NOTE: only used for coordinate operation computation
-qβ turns on quiet mode. Quiet mode is only available for queries on single objects, and only one output format is selected. In that mode, only the PROJ, WKT, or PROJJSON string is displayed, without other introduction output. The output is then potentially compatible with being piped into other utilities.--area name_or_codeβ specifies 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 exclusive of--bbox.
NOTE: only used for coordinate operation computation
--bbox west_long,south_lat,east_long,north_latβ specifies 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 an unspecified geographic CRS.west_longandeast_longshould be in the[-180,180]range, andsouth_latandnorth_latin the[-90,90]range.west_longis generally lower thaneast_long, except in the case where the area of interest crosses the antimeridian.
NOTE: only used for coordinate operation computation
--spatial-test contains|intersectsβ specifies how the area of use of coordinate operations found in the database are compared to the area of use specified explicitly with--areaor--bbox, or derived implicitly from the area of use of the source and target CRS. By default,projinfowill only keep coordinate operations whose area of use is strictly within the area of interest (thecontainsstrategy). If using theintersectsstrategy, the spatial test is relaxed, and any coordinate operation whose area of use at least partly intersects the area of interest is listed.
NOTE: only used for coordinate operation computation
--crs-extent-use none|both|intersection|smallestβ specifies which area of interest to consider when no explicit one is specified with--areaor--bboxoptions. By default (thesmalleststrategy), the area of use of the source or target CRS is looked at, and the one that is the smallest in terms of area is used as the area of interest. If usingnone, no area of interest is used. If usingboth, only coordinate operations that relate (contain or intersect depending on the--spatial-teststrategy) to the area of use of both CRS are selected. If usingintersection, the area of interest is the intersection of the bounding box of the area of use of the source and target CRS.
NOTE: only used for coordinate operation computation
--grid-check none|discard_missing|sort|known_availableβ specifies how the presence or absence of a horizontal or vertical shift grid required for a coordinate operation affects the results returned when researching coordinate operations between 2 CRS. The default strategy issort(ifPROJ_NETWORKis not defined). In that case, all candidate operations are returned, but the actual availability of the grids is used to determine the sorting order. That is, if a coordinate operation involves using a grid that is not available in the PROJ resource directories (determined by thePROJ_DATAenvironment variable), it will be listed at the bottom of the results. Thenonestrategy completely disables the checks of presence of grids and returns the results as if all the grids were available. Thediscard_missingstrategy discards results that involve grids not present in the PROJ resource directories. Theknown_availablestrategy discards results that involve grids not present in the PROJ resource directories and that are not known of the CDN. This is the default strategy whenPROJ_NETWORKis set toON.
NOTE: only used for coordinate operation computation
--pivot-crs always|if_no_direct_transformation|never|{auth:code[,auth:code]*}β determines if an intermediate (pivot) CRS can be used when researching coordinate operations between 2 CRS. A typical example is the WGS84 pivot. By default,projinfowill consider any potential pivot if there is no direct transformation (if_no_direct_transformation). If using theneverstrategy, only direct transformations between the source and target CRS will be used. If using thealwaysstrategy, intermediate CRS will be considered even if there are direct transformations. It is also possible to restrict the pivot CRS to consider by specifying one or several CRS by theirAUTHORITY:CODE.
NOTE: only used for coordinate operation computation
--show-supersededβ when enabled, coordinate operations that are superseded by others will be listed. Note that supersession is not equivalent to deprecation: superseded operations are still considered valid although they have a better equivalent, whereas deprecated operations have been determined to be erroneous and are not considered at all.
NOTE: only used for coordinate operation computation
--hide-ballparkβ Added in version 7.1.
Hides any coordinate operation that is, or contains, a Ballpark transformation.
NOTE: only used for coordinate operation computation
--accuracy {accuracy}β Added in version 8.0.
Sets the minimum desired accuracy for returned coordinate operations.
NOTE: only used for coordinate operation computation
--allow-ellipsoidal-height-as-vertical-crsβ Added in version 8.0.
...and it's lowkey a whole vibe change for your CRS: it lets you export a geographic or projected 3D CRS as a compound CRS, where the vertical CRS is out here representing the ellipsoidal height. π¦
β οΈ NOTE, bestie, read this twice: this one is only used for CRS, and only with the WKT1:GDAL output format. So if you're sitting there confused why nothing's happening, check your output format first, iykyk π
--boundcrs-to-wgs84β okay so when you pass this, projinfo goes research mode π and hunts for a coordinate operation from the base geographic CRS of the single CRS / source / target CRS all the way to the WGS84 geographic CRS. If it finds one? It wraps those CRS into aBoundCRSobject, slay. This is mostly for early-binding approaches, no cap.--authorityname β specify the name of the authority to restrict look-ups into, for objects β and this applies both when you're specifying an object by name and when coordinate operations get computed. Default is to allow all authorities, main character energy as always π When it's used with SQL output, this restricts the authorities that intermediate objects can belong to β and the default there isEPSGandPROJ. Heads up though: the authority of the--output-idoption will also be implicitly added. Sneaky but iconic β¨--main-db-pathpath β tell projinfo the name and path of the database it should use. The default isproj.dbsitting in the PROJ resource directories. ποΈ--aux-db-pathpath β here's where you specify name and path of auxiliary databases that get combined with the main database. Rules, bestie, there are rules: those auxiliary databases must have a table structure identical to the main database, but they can be partly filled, and their entries can refer to entries of the main database. Also it's repeatable β pass it more than once to specify several auxiliary databases. π--identifyβ when used with an object definition, this one goes and queries the PROJ database to find known objects (typically CRS) that are close or even identical to your object. Each candidate gets an approximate likelihood percentage attached, which is genuinely so useful when you're handed a WKT string with no EPSG identifier β like ESRI WKT1, ugh π. It might also be used with PROJ strings, fr. Example:+proj=utm +zone=31 +datum=WGS84 +type=crswill be identified with a likelihood of 70% toEPSG:32631. ate. π₯--dump-db-structureβ Added in version 8.1. Outputs the sequence of SQL statements needed to create a new, empty, valid auxiliary database. You can specify this as the only switch of the utility. And if you also specify a CRS object plus the--output-idoption, the definition of that object as SQL statements gets appended. π--list-crs[list-crs-filter] β Added in version 8.1. Outputs a list β authority name:code and CRS name β of the filtered CRSs from the database. If you give it no filter, it dumps all authority names and types of non deprecated CRSs. The list-crs-filter is a comma-separated combo of:allow_deprecated,geodetic,geocentric,geographic,geographic_2d,geographic_3d,vertical,projected,compoundAffected by the options--authority,--area,--bboxand--spatial-test. Want the visual version instead? There's the webpage CRS Explorer:https://crs-explorer.proj.org/?all=trueπ--3dβ Added in version 6.3. "Promotes" 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. Now, real talk: 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 either 2D or 3D transformations π. Starting with PROJ 9.1, both CRS need to be 3D for a vertical transformation to possibly happen. Periodt, that's just how it is.--output-id=AUTH:NAMEβ Added in version 8.1. The identifier to assign to the object (for SQL output).
π¨ Strongly recommended, bestie: do not add new objects into common registries likeEPSG,ESRI,IAU, etc. Use a custom authority name instead. If a new object genuinely should be added to the official EPSG registry, users are invited to follow the procedure explained athttps://epsg.org/dataset-change-requests.html.
Combined with --dump-db-structure, you can create auxiliary databases instead of directly modifying the main proj.db database β see the example on how to export to an auxiliary database. Those auxiliary databases can be specified through proj_context_set_database_path() or the PROJ_AUX_DB environment variable. π«Ά
--c-ifyβ for developers only π§βπ». Modifies the string output of the utility so it's easy to drop those strings straight into C/C++ code.--single-lineβ outputs PROJ, WKT or PROJJSON strings on a single line, instead of the multiple indented lines you get by default.--searchpathsβ Added in version 7.0. Outputs the directories where PROJ resources will be looked for (that is, if you're not using a C API likeproj_context_set_search_paths(), which will override them). π¦--remote-dataβ Added in version 7.0. Displays information about whether Network capabilities are enabled, plus the related URL. Wifi check, but for CRS π‘--s_epochβ Added in version 9.4. Epoch of coordinates in the source CRS, as a decimal year. Only applies to a dynamic CRS, so don't come at it with a static one π--t_epochβ Added in version 9.4. Epoch of coordinates in the target CRS, as a decimal year. Also only applies to a dynamic CRS. Matching set, cute π
β¨ EXAMPLES β¨
Ok bestie, this is the part where it all clicks. The commands are copied exactly and the outputs are kept character-for-character, so donβt let the cute energy fool you β this is precision work. π
- Query the CRS object corresponding to EPSG:4326
projinfo EPSG:4326
Output:
PROJ.4 string:
+proj=longlat +datum=WGS84 +no_defs +type=crs
WKT2:2019 string:
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
USAGE[
SCOPE["unknown"],
AREA["World"],
BBOX[-90,-180,90,180]],
ID["EPSG",4326]]
- List the coordinate operations between NAD27 (designed with its CRS name) and NAD83 (designed with its EPSG code
4269) within an area of interest
projinfo -s NAD27 -t EPSG:4269 --area "USA - Missouri"
Output:
DERIVED_FROM(EPSG):1241, NAD27 to NAD83 (1), 0.15 m, USA - CONUS including EEZ
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert \
+xy_in=deg +xy_out=rad +step +proj=hgridshift +grids=conus \
+step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1
WKT2:2019 string:
COORDINATEOPERATION["NAD27 to NAD83 (1)",
SOURCECRS[
GEOGCRS["NAD27",
DATUM["North American Datum 1927",
ELLIPSOID["Clarke 1866",6378206.4,294.978698213898,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]]]],
TARGETCRS[
GEOGCRS["NAD83",
DATUM["North American Datum 1983",
ELLIPSOID["GRS 1980",6378137,298.257222101,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]]]],
METHOD["CTABLE2"],
PARAMETERFILE["Latitude and longitude difference file","conus"],
OPERATIONACCURACY[0.15],
USAGE[
SCOPE["unknown"],
AREA["USA - CONUS including EEZ"],
BBOX[23.81,-129.17,49.38,-65.69]],
ID["DERIVED_FROM(EPSG)",1241]]
- Export an object as a PROJJSON string
projinfo GDA94 -o PROJJSON -q
Output:
{
"type": "GeographicCRS",
"name": "GDA94",
"datum": {
"type": "GeodeticReferenceFrame",
"name": "Geocentric Datum of Australia 1994",
"ellipsoid": {
"name": "GRS 1980",
"semi_major_axis": 6378137,
"inverse_flattening": 298.257222101
}
},
"coordinate_system": {
"subtype": "ellipsoidal",
"axis": [
{
"name": "Geodetic latitude",
"abbreviation": "Lat",
"direction": "north",
"unit": "degree"
},
{
"name": "Geodetic longitude",
"abbreviation": "Lon",
"direction": "east",
"unit": "degree"
}
]
},
"area": "Australia - GDA",
"bbox": {
"south_latitude": -60.56,
"west_longitude": 93.41,
"north_latitude": -8.47,
"east_longitude": 173.35
},
"id": {
"authority": "EPSG",
"code": 4283
}
}
- Exporting the SQL statements to insert a new CRS in an auxiliary database
# Get the SQL statements for a custom CRS
projinfo "+proj=merc +lat_ts=5 +datum=WGS84 +type=crs +title=my_crs" --output-id HOBU:MY_CRS -o SQL -q > my_crs.sql
cat my_crs.sql
# Initialize an auxiliary database with the schema of the reference database
echo ".schema" | sqlite3 /path/to/proj.db | sqlite3 aux.db
# Append the content of the definition of HOBU:MY_CRS
sqlite3 aux.db < my_crs.db
# Check that everything works OK
projinfo --aux-db-path aux.db HOBU:MY_CRS
or more simply:
# Create an auxiliary database with the definition of a custom CRS.
projinfo "+proj=merc +lat_ts=5 +datum=WGS84 +type=crs +title=my_crs" --output-id HOBU:MY_CRS --dump-db-structure | sqlite3 aux.db
# Check that everything works OK
projinfo --aux-db-path aux.db HOBU:MY_CRS
Output:
INSERT INTO geodetic_crs VALUES('HOBU','GEODETIC_CRS_MY_CRS','unknown','','geographic 2D','EPSG','6424','EPSG','6326',NULL,0);
INSERT INTO usage VALUES('HOBU','USAGE_GEODETIC_CRS_MY_CRS','geodetic_crs','HOBU','GEODETIC_CRS_MY_CRS','PROJ','EXTENT_UNKNOWN','PROJ','SCOPE_UNKNOWN');
INSERT INTO conversion VALUES('HOBU','CONVERSION_MY_CRS','unknown','','EPSG','9805','Mercator (variant B)','EPSG','8823','Latitude of 1st standard parallel',5,'EPSG','9122','EPSG','8802','Longitude of natural origin',0,'EPSG','9122','EPSG','8806','False easting',0,'EPSG','9001','EPSG','8807','False northing',0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO usage VALUES('HOBU','USAGE_CONVERSION_MY_CRS','conversion','HOBU','CONVERSION_MY_CRS','PROJ','EXTENT_UNKNOWN','PROJ','SCOPE_UNKNOWN');
INSERT INTO projected_crs VALUES('HOBU','MY_CRS','my_crs','','EPSG','4400','HOBU','GEODETIC_CRS_MY_CRS','HOBU','CONVERSION_MY_CRS',NULL,0);
INSERT INTO usage VALUES('HOBU','USAGE_PROJECTED_CRS_MY_CRS','projected_crs','HOBU','MY_CRS','PROJ','EXTENT_UNKNOWN','PROJ','SCOPE_UNKNOWN');
PROJ.4 string:
+proj=merc +lat_ts=5 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +type=crs
WKT2:2019 string:
PROJCRS["my_crs",
BASEGEOGCRS["unknown",
ENSEMBLE["World Geodetic System 1984 ensemble",
MEMBER["World Geodetic System 1984 (Transit)"],
MEMBER["World Geodetic System 1984 (G730)"],
MEMBER["World Geodetic System 1984 (G873)"],
MEMBER["World Geodetic System 1984 (G1150)"],
MEMBER["World Geodetic System 1984 (G1674)"],
MEMBER["World Geodetic System 1984 (G1762)"],
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]],
ENSEMBLEACCURACY[2.0]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
ID["HOBU","GEODETIC_CRS_MY_CRS"]],
CONVERSION["unknown",
METHOD["Mercator (variant B)",
ID["EPSG",9805]],
PARAMETER["Latitude of 1st standard parallel",5,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8823]],
PARAMETER["Longitude of natural origin",0,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8802]],
PARAMETER["False easting",0,
LENGTHUNIT["metre",1],
ID["EPSG",8806]],
PARAMETER["False northing",0,
LENGTHUNIT["metre",1],
ID["EPSG",8807]]],
CS[Cartesian,2],
AXIS["(E)",east,
ORDER[1],
LENGTHUNIT["metre",1]],
AXIS["(N)",north,
ORDER[2],
LENGTHUNIT["metre",1]],
ID["HOBU","MY_CRS"]]
- Get the WKT representation of EPSG:25832 in the WKT1:GDAL output format and on a single line
projinfo -o WKT1:GDAL --single-line EPSG:25832
Output:
WKT1:GDAL string:
PROJCS["ETRS89 / UTM zone 32N",GEOGCS["ETRS89",DATUM["European_Terrestrial_Reference_System_1989",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6258"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4258"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",9],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","25832"]]
- List CRS in an area
projinfo --list-crs --area Taiwan
Output:
EPSG:3825 "TWD97 / TM2 zone 119"
EPSG:3826 "TWD97 / TM2 zone 121"...
π SEE ALSO π
cs2cs(1), cct(1), geod(1), gie(1), proj(1), projsync(1)
π 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 π
Even Rouault
π COPYRIGHT π
1983-2026, PROJ contributors
Thatβs the whole page, bestie β PROJINFO(1) from PROJ version 9.9, dated 15 Sep 2026. Periodt. π β¨
π¦ 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