Proj
Proj
software library
Release 7.1.1
PROJ contributors
1 About 1
1.1 Citation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 License . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 News 3
2.1 7.1.1 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.2 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 7.1.0 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.2 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 7.0.1 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.2 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 6.3.2 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4.1 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5 7.0.0 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5.2 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5.3 Breaking changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.6 6.3.1 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.6.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.6.2 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.7 6.3.0 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.7.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.7.2 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.8 6.2.1 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.8.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.8.2 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.9 6.2.0 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.9.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.9.2 Bug Fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.10 6.1.1 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.10.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.10.2 Bug Fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.11 6.1.0 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.11.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.11.2 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.12 6.0.0 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.12.1 UPDATES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
i
2.12.2 BUG FIXES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.13 PROJ 5.2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.13.1 UPDATES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.13.2 BUG FIXES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.14 PROJ 5.1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.14.1 UPDATES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.14.2 BUG FIXES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.15 PROJ 5.0.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.15.1 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.16 PROJ 5.0.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.16.1 Versioning and naming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.16.2 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.16.3 Bug fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3 Download 23
3.1 Current Release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2 Past Releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4 Installation 25
4.1 Installation from package management systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.1.1 Cross platform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.1.1.1 Conda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.1.1.2 Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.1.2 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.1.3 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.1.3.1 Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.1.3.2 Fedora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.1.3.3 Red Hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.1.4 Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.2 Compilation and installation from source code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.2.1 Build requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.2.2 Autotools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2.2.1 Autotools configure options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2.3 CMake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2.3.1 CMake configure options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2.4 Building on Windows with vcpkg and Visual Studio 2017 or 2019 . . . . . . . . . . . . . . 32
4.2.4.1 Install git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.4.2 Install Vcpkg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.4.3 Install PROJ dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.4.4 Checkout PROJ sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.4.5 Build PROJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.4.6 Run PROJ tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2.5 Building on Windows with Conda dependencies and Visual Studio 2017 or 2019 . . . . . . 33
4.2.5.1 Install git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2.5.2 Install miniconda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2.5.3 Install PROJ dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2.5.4 Checkout PROJ sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2.5.5 Build PROJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2.5.6 Run PROJ tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5 Using PROJ 35
5.1 Quick start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2 Cartographic projection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.2.1 Units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
ii
5.2.2 False Easting/Northing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2.3 Longitude Wrapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2.4 Prime Meridian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2.5 Axis orientation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.3 Geodetic transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.3.1 Transformation pipelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.3.2 PROJ 4.x/5.x paradigm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.3.3 Grid Based Datum Adjustments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.3.3.1 Skipping Missing Grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.3.3.2 The null Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.3.3.3 Caveats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.4 Environment variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.5 Known differences between versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.5.1 Version 4.6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.5.2 Version 5.0.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.5.2.1 Longitude wrapping when using custom central meridian . . . . . . . . . . . . . . 45
5.5.3 Version 6.0.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.5.3.1 Removal of proj_def.dat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.5.3.2 Changes to deformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.5.4 Version 6.3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.5.4.1 projinfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.5.5 Version 7.0.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.5.5.1 proj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.5.5.2 cs2cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.5.5.3 UTF-8 adoption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.6 Network capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.6.1 CDN of GeoTIFF grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.6.2 How to enable network capabilities ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.6.3 Setting endpoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.6.4 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.6.5 Download API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.6.6 Download utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.6.7 Mirroring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.6.8 Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6 Applications 49
6.1 cct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.1.1 Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.1.2 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.1.3 Use of remote grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.1.4 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.1.5 Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2 cs2cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2.1 Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2.2 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.2.2.1 Use of remote grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2.3 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2.3.1 Using PROJ strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2.3.2 Using EPSG CRS codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2.3.3 Using EPSG CRS names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.3 geod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.3.1 Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.3.2 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.3.3 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
iii
6.3.4 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.4 gie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.4.1 Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.4.2 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.4.3 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4.4 gie command language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4.5 Strict mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.4.6 Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.5 proj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.5.1 Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.5.2 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.5.3 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.6 projinfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.6.1 Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.6.2 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.6.3 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.7 projsync . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.7.1 Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.7.2 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.7.3 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7 Coordinate operations 73
7.1 Projections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.1.1 Adams Hemisphere in a Square . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.1.1.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.1.2 Adams World in a Square I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.1.2.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.1.3 Adams World in a Square II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.1.3.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
7.1.4 Albers Equal Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
7.1.4.1 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
7.1.5 Azimuthal Equidistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.1.5.1 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.1.6 Airy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.1.6.1 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.1.7 Aitoff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.1.7.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.1.8 Modified Stererographics of Alaska . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.1.8.1 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.1.9 Apian Globular I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.1.9.1 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.1.10 August Epicycloidal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
7.1.10.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
7.1.11 Bacon Globular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
7.1.11.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.1.12 Bertin 1953 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.1.12.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.1.12.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
7.1.12.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
7.1.13 Bipolar conic of western hemisphere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
7.1.13.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
7.1.14 Boggs Eumorphic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
7.1.14.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
7.1.15 Bonne (Werner lat_1=90) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
iv
7.1.15.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.1.16 Cal Coop Ocean Fish Invest Lines/Stations . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.1.16.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.1.16.2 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.1.16.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.1.16.4 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.1.17 Cassini (Cassini-Soldner) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
7.1.17.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
7.1.17.2 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
7.1.17.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
7.1.17.4 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
7.1.18 Central Cylindrical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
7.1.18.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
7.1.19 Central Conic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
7.1.19.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.1.19.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.1.19.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.1.19.4 Reference values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.1.20 Equal Area Cylindrical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.1.20.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.1.21 Chamberlin Trimetric . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.1.21.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.1.22 Collignon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.1.22.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.1.23 Compact Miller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.1.23.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.1.24 Craster Parabolic (Putnins P4) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.1.24.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.1.25 Denoyer Semi-Elliptical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.1.25.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.1.26 Eckert I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.1.26.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.1.27 Eckert II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.1.27.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.1.28 Eckert III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
7.1.28.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
7.1.29 Eckert IV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.1.29.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
7.1.30 Eckert V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
7.1.30.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
7.1.31 Eckert VI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
7.1.31.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
7.1.32 Equidistant Cylindrical (Plate Carrée) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
7.1.32.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7.1.32.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
7.1.32.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
7.1.32.4 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
7.1.33 Equidistant Conic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
7.1.33.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
7.1.34 Equal Earth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
7.1.34.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
7.1.34.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
7.1.34.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
7.1.35 Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
v
7.1.35.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
7.1.36 Fahey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
7.1.36.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
7.1.37 Foucaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
7.1.37.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
7.1.38 Foucaut Sinusoidal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.1.38.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.1.39 Gall (Gall Stereographic) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
7.1.39.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
7.1.39.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
7.1.39.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.1.39.4 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.1.40 Geostationary Satellite View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.1.40.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
7.1.40.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
7.1.41 Ginsburg VIII (TsNIIGAiK) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
7.1.41.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
7.1.42 General Sinusoidal Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
7.1.42.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
7.1.43 Gnomonic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
7.1.43.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
7.1.44 Goode Homolosine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
7.1.44.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
7.1.45 Mod. Stererographics of 48 U.S. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
7.1.45.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
7.1.46 Mod. Stererographics of 50 U.S. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
7.1.46.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
7.1.47 Guyou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
7.1.47.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
7.1.48 Hammer & Eckert-Greifendorff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
7.1.48.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
7.1.49 Hatano Asymmetrical Equal Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
7.1.49.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
7.1.50 HEALPix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
7.1.50.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
7.1.50.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
7.1.50.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.1.51 rHEALPix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.1.51.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
7.1.51.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.1.51.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.1.52 Interrupted Goode Homolosine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.1.52.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
7.1.53 Interrupted Goode Homolosine (Oceanic View) . . . . . . . . . . . . . . . . . . . . . . . . 151
7.1.53.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
7.1.54 International Map of the World Polyconic . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
7.1.54.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
7.1.55 Icosahedral Snyder Equal Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
7.1.55.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
7.1.56 Kavraisky V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
7.1.56.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
7.1.57 Kavraisky VII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
7.1.57.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.1.58 Krovak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
vi
7.1.58.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.1.59 Laborde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
7.1.59.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
7.1.60 Lambert Azimuthal Equal Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
7.1.60.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
7.1.61 Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
7.1.61.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
7.1.62 Larrivee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
7.1.62.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
7.1.63 Laskowski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
7.1.63.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
7.1.64 Lambert Conformal Conic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
7.1.64.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
7.1.64.2 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
7.1.65 Lambert Conformal Conic Alternative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
7.1.65.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.1.66 Lambert Equal Area Conic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.1.66.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.1.67 Lee Oblated Stereographic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
7.1.67.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
7.1.68 Loximuthal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
7.1.68.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7.1.69 Space oblique for LANDSAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7.1.69.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7.1.70 McBryde-Thomas Flat-Polar Sine (No. 1) . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.1.70.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.1.71 McBryde-Thomas Flat-Pole Sine (No. 2) . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
7.1.71.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
7.1.72 McBride-Thomas Flat-Polar Parabolic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
7.1.72.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
7.1.73 McBryde-Thomas Flat-Polar Quartic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
7.1.73.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
7.1.74 McBryde-Thomas Flat-Polar Sinusoidal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
7.1.74.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
7.1.75 Mercator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
7.1.75.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
7.1.75.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
7.1.75.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
7.1.75.4 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.1.76 Miller Oblated Stereographic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.1.76.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.1.77 Miller Cylindrical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
7.1.77.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
7.1.77.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.1.77.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.1.77.4 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.1.78 Space oblique for MISR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
7.1.78.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.1.79 Mollweide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.1.79.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.1.80 Murdoch I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
7.1.80.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
7.1.81 Murdoch II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
7.1.81.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
vii
7.1.82 Murdoch III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
7.1.82.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
7.1.83 Natural Earth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
7.1.83.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
7.1.83.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
7.1.83.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
7.1.84 Natural Earth II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
7.1.84.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
7.1.85 Nell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
7.1.85.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
7.1.86 Nell-Hammer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
7.1.86.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
7.1.87 Nicolosi Globular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
7.1.87.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
7.1.88 Near-sided perspective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
7.1.88.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
7.1.89 New Zealand Map Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
7.1.89.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
7.1.90 General Oblique Transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
7.1.90.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
7.1.90.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
7.1.91 Oblique Cylindrical Equal Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
7.1.91.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
7.1.92 Oblated Equal Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
7.1.92.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
7.1.93 Oblique Mercator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
7.1.93.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
7.1.93.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
7.1.94 Ortelius Oval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
7.1.94.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
7.1.95 Orthographic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
7.1.95.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
7.1.96 Patterson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
7.1.96.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
7.1.97 Perspective Conic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
7.1.97.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
7.1.98 Peirce Quincuncial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
7.1.98.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
7.1.99 Polyconic (American) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
7.1.99.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
7.1.100 Putnins P1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
7.1.100.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
7.1.101 Putnins P2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
7.1.101.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
7.1.102 Putnins P3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
7.1.102.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
7.1.103 Putnins P3’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
7.1.103.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
7.1.104 Putnins P4’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
7.1.104.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
7.1.105 Putnins P5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
7.1.105.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
7.1.106 Putnins P5’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
7.1.106.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
viii
7.1.107 Putnins P6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
7.1.107.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
7.1.108 Putnins P6’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
7.1.108.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
7.1.109 Quartic Authalic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
7.1.109.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
7.1.110 Quadrilateralized Spherical Cube . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
7.1.110.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
7.1.110.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
7.1.110.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
7.1.111 Robinson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
7.1.111.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
7.1.112 Roussilhe Stereographic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
7.1.112.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
7.1.113 Rectangular Polyconic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
7.1.113.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
7.1.114 Spherical Cross-track Height . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
7.1.114.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
7.1.115 Sinusoidal (Sanson-Flamsteed) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
7.1.115.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
7.1.116 Swiss Oblique Mercator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
7.1.116.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
7.1.117 Stereographic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
7.1.117.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
7.1.118 Oblique Stereographic Alternative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
7.1.118.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
7.1.119 Gauss-Schreiber Transverse Mercator (aka Gauss-Laborde Reunion) . . . . . . . . . . . . . 243
7.1.119.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
7.1.120 Transverse Central Cylindrical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
7.1.120.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
7.1.121 Transverse Cylindrical Equal Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
7.1.121.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
7.1.122 Times . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
7.1.122.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
7.1.123 Tissot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
7.1.123.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
7.1.124 Transverse Mercator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
7.1.124.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
7.1.124.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
7.1.124.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
7.1.124.4 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.1.125 Tobler-Mercator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.1.125.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.1.125.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.1.125.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
7.1.126 Two Point Equidistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
7.1.126.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
7.1.127 Tilted perspective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
7.1.127.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
7.1.128 Universal Polar Stereographic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
7.1.128.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
7.1.129 Urmaev V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
7.1.129.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
7.1.130 Urmaev Flat-Polar Sinusoidal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
ix
7.1.130.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
7.1.131 Universal Transverse Mercator (UTM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
7.1.131.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
7.1.131.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
7.1.131.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
7.1.132 van der Grinten (I) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
7.1.132.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
7.1.133 van der Grinten II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
7.1.133.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
7.1.134 van der Grinten III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
7.1.134.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
7.1.135 van der Grinten IV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
7.1.135.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
7.1.136 Vitkovsky I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
7.1.136.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
7.1.137 Wagner I (Kavraisky VI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
7.1.137.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
7.1.138 Wagner II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
7.1.138.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
7.1.139 Wagner III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
7.1.139.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
7.1.140 Wagner IV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
7.1.140.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
7.1.141 Wagner V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
7.1.141.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
7.1.142 Wagner VI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
7.1.142.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
7.1.143 Wagner VII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
7.1.144 Web Mercator / Pseudo Mercator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
7.1.144.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.1.144.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.1.144.3 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.1.144.4 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
7.1.145 Werenskiold I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
7.1.145.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
7.1.146 Winkel I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
7.1.146.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
7.1.147 Winkel II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
7.1.147.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
7.1.148 Winkel Tripel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
7.1.148.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
7.2 Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
7.2.1 Axis swap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
7.2.1.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
7.2.1.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
7.2.2 Geodetic to cartesian conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
7.2.2.1 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
7.2.2.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
7.2.3 Geocentric Latitude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
7.2.3.1 Mathematical definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
7.2.3.2 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
7.2.3.3 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
7.2.4 Lat/long (Geodetic alias) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
7.2.4.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
x
7.2.5 No operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
7.2.6 Pop coordinate value to pipeline stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
7.2.6.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
7.2.6.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
7.2.6.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
7.2.7 Push coordinate value to pipeline stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
7.2.7.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
7.2.7.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
7.2.7.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
7.2.8 Set coordinate value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
7.2.8.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
7.2.8.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
7.2.9 Unit conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
7.2.9.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
7.2.9.2 Distance units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
7.2.9.3 Angular units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
7.2.9.4 Time units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
7.3 Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
7.3.1 Affine transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
7.3.1.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
7.3.2 Multi-component time-based deformation model . . . . . . . . . . . . . . . . . . . . . . . 299
7.3.2.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
7.3.2.2 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
7.3.3 Kinematic datum shifting utilizing a deformation model . . . . . . . . . . . . . . . . . . . . 299
7.3.3.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
7.3.3.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
7.3.3.3 Mathematical description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
7.3.3.4 See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
7.3.4 Geographic offsets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
7.3.4.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
7.3.4.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
7.3.5 Helmert transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
7.3.5.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
7.3.5.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
7.3.5.3 Mathematical description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
7.3.6 Horner polynomial evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
7.3.6.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
7.3.6.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
7.3.6.3 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
7.3.7 Molodensky transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
7.3.7.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
7.3.7.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
7.3.8 Molodensky-Badekas transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
7.3.8.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
7.3.8.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
7.3.8.3 Mathematical description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
7.3.9 Horizontal grid shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
7.3.9.1 Temporal gridshifting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
7.3.9.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
7.3.10 Vertical grid shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
7.3.10.1 Temporal gridshifting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
7.3.10.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
7.3.11 Geocentric grid shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
7.3.11.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
xi
7.4 The pipeline operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
7.4.1 Rules for pipelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
7.4.2 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
7.4.2.1 Required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
7.4.2.2 Optional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
7.5 Computation of coordinate operations between two CRS . . . . . . . . . . . . . . . . . . . . . . . . 321
7.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
7.5.2 Geographic CRS to Geographic CRS, with known identifiers . . . . . . . . . . . . . . . . . 322
7.5.3 Filtering and sorting of coordinate operations . . . . . . . . . . . . . . . . . . . . . . . . . 323
7.5.4 Geodetic/geographic CRS to Geodetic/geographic CRS, without known identifiers . . . . . 324
7.5.5 Geodetic/geographic CRS to Geodetic/geographic CRS, without direct transformation . . . 326
7.5.6 Projected CRS to any target CRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
7.5.7 Vertical CRS to a Geographic CRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
7.5.8 Vertical CRS to a Vertical CRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
7.5.9 Compound CRS to a Geographic CRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
7.5.10 CompoundCRS to CompoundCRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
7.5.11 When the source or target CRS is a BoundCRS . . . . . . . . . . . . . . . . . . . . . . . . 335
10 Development 349
xii
10.1 Quick start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
10.2 Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
10.3 Error handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
10.4 Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
10.4.1 Key Thread Safety Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
10.4.2 projCtx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
10.4.3 src/multistresstest.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
10.5 Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
10.5.1 Data types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
10.5.1.1 Transformation objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
10.5.1.2 2 dimensional coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
10.5.1.3 3 dimensional coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
10.5.1.4 Spatiotemporal coordinate types . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
10.5.1.5 Ancillary types for geodetic computations . . . . . . . . . . . . . . . . . . . . . . 357
10.5.1.6 Complex coordinate types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
10.5.1.7 Projection derivatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
10.5.1.8 List structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
10.5.1.9 Info structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
10.5.1.10 Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
10.5.1.11 Setting custom I/O functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
10.5.1.12 Network related functionality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
10.5.1.13 C API for ISO-19111 functionality . . . . . . . . . . . . . . . . . . . . . . . . . . 366
10.5.2 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
10.5.2.1 Threading contexts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
10.5.2.2 Transformation setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
10.5.2.3 Area of interest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
10.5.2.4 Coordinate transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
10.5.2.5 Error reporting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
10.5.2.6 Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
10.5.2.7 Info functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
10.5.2.8 Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
10.5.2.9 Distances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
10.5.2.10 Various . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
10.5.2.11 Setting custom I/O functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
10.5.2.12 Network related functionality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
10.5.2.13 Cleanup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
10.5.2.14 C API for ISO-19111 functionality . . . . . . . . . . . . . . . . . . . . . . . . . . 387
10.5.3 C++ API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
10.5.3.1 General documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
10.5.3.2 common namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
10.5.3.3 util namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
10.5.3.4 metadata namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
10.5.3.5 cs namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
10.5.3.6 datum namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
10.5.3.7 crs namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
10.5.3.8 operation namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
10.5.3.9 io namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
10.5.4 Deprecated API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
10.5.4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
10.5.4.2 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
10.5.4.3 API Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
10.6 Using PROJ in CMake projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
10.7 Language bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
10.7.1 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
xiii
10.7.2 Ruby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.7.3 Rust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.7.4 Go (Golang) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.7.5 Julia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.7.6 TCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.7.7 MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.7.8 Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.7.9 Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.7.10 Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.8 Version 4 to 6 API Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
10.8.1 Code example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
10.8.2 Function mapping from old to new API . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
10.8.3 Backward incompatibilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
10.8.4 Feedback from downstream projects on the PROJ 6 migration . . . . . . . . . . . . . . . . 560
10.9 Version 4 to 5 API Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
10.9.1 Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
10.9.2 Code example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
10.9.3 Function mapping from old to new API . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
11 Specifications 565
11.1 PROJJSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
11.1.1 Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
11.1.2 History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
11.1.3 Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
11.1.4 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
11.1.4.1 GeographicCRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
11.1.4.2 ProjectedCRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
11.2 Geodetic TIFF grids (GTG) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
11.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
11.2.2 General description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
11.2.3 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
11.2.4 Multi-grid storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
11.2.5 Examples of multi-grid dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
12 Community 581
12.1 Communication channels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
12.1.1 Mailing list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
12.1.2 GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
12.1.3 Gitter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
12.2 Contributing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
12.2.1 Help a fellow PROJ user . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
12.2.2 Adding bug reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
12.2.3 Feature requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
12.2.4 Write documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
12.2.5 Code contributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
12.2.5.1 Legalese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
12.2.6 Additional Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
12.2.7 Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
12.3 Guidelines for PROJ code contributors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
12.3.1 Code contributions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
12.3.1.1 Making Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
12.3.1.2 Submitting Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
12.3.1.3 Coding conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
12.3.2 Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
xiv
12.3.2.1 Reformatting C++ code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
12.3.2.2 cppcheck static analyzer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
12.3.2.3 CLang Static Analyzer (CSA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
12.3.2.4 Typo detection and fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
12.3.2.5 Include What You Use (IWYU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
12.4 Code of Conduct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
12.4.1 Our Pledge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
12.4.2 Our Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
12.4.3 Our Responsibilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
12.4.4 Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
12.4.5 Enforcement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
12.4.6 Attribution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
12.5 Request for Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
12.5.1 PROJ RFC 1: Project Committee Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . 588
12.5.1.1 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
12.5.1.2 List of PSC Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
12.5.1.3 Detailed Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
12.5.1.4 When is Vote Required? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
12.5.1.5 Observations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
12.5.1.6 Committee Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
12.5.1.7 Membership Responsibilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
12.5.1.8 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
12.5.2 PROJ RFC 2: Initial integration of “GDAL SRS barn” work . . . . . . . . . . . . . . . . . 592
12.5.2.1 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
12.5.2.2 Related standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
12.5.2.3 Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
12.5.2.4 Code repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
12.5.2.5 Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
12.5.2.6 Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
12.5.2.7 Impacted files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
12.5.2.8 C API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
12.5.2.9 Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
12.5.2.10 Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
12.5.2.11 Build requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
12.5.2.12 Runtime requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
12.5.2.13 Backward compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
12.5.2.14 Future work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
12.5.2.15 Adoption status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
12.5.3 PROJ RFC 3: Dependency management . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
12.5.3.1 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
12.5.3.2 Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
12.5.3.3 C and C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
12.5.3.4 Software dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
12.5.3.5 Bootstrapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
12.5.3.6 Adoption status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
12.5.4 PROJ RFC 4: Remote access to grids and GeoTIFF grids . . . . . . . . . . . . . . . . . . . 609
12.5.4.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
12.5.4.2 Summary of work planned by this RFC . . . . . . . . . . . . . . . . . . . . . . . . 609
12.5.4.3 Network access to grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
12.5.4.4 Grids in GeoTIFF format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
12.5.4.5 Dropping grid catalog functionality . . . . . . . . . . . . . . . . . . . . . . . . . . 619
12.5.4.6 Backward compatibility issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
12.5.4.7 Potential future related work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
12.5.4.8 Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
xv
12.5.4.9 Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
12.5.4.10 Proposed implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
12.5.4.11 Adoption status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
12.5.5 PROJ RFC 5: Adopt GeoTIFF-based grids for grids delivered with PROJ . . . . . . . . . . 621
12.5.5.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
12.5.5.2 Summary of work planned by this RFC and related decisions . . . . . . . . . . . . 621
12.5.5.3 Backward compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
12.5.5.4 Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
12.5.5.5 Proposed implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
12.5.5.6 Adoption status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
12.6 Conference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
13 FAQ 625
13.1 Which file formats does PROJ support? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
13.2 Can I transform from abc to xyz? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
13.3 Coordinate reference system xyz is not in the EPSG registry, what do I do? . . . . . . . . . . . . . . 626
13.4 I found a bug in PROJ, how do I get it fixed? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
13.5 How do I contribute to PROJ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
13.6 How do I calculate distances/directions on the surface of the earth? . . . . . . . . . . . . . . . . . . 626
13.7 What is the best format for describing coordinate reference systems? . . . . . . . . . . . . . . . . . 626
13.8 Why is the axis ordering in PROJ not consistent? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
13.9 Why am I getting the error “Cannot find proj.db”? . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
13.10 What happened to PROJ.4? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
14 Glossary 629
Bibliography 631
Index 635
xvi
CHAPTER
ONE
ABOUT
PROJ is a generic coordinate transformation software that transforms geospatial coordinates from one coordinate
reference system (CRS) to another. This includes cartographic projections as well as geodetic transformations. PROJ
is released under the X/MIT open source license
PROJ includes command line applications for easy conversion of coordinates from text files or directly from user
input. In addition to the command line utilities PROJ also exposes an application programming interface, or API
in short. The API lets developers use the functionality of PROJ in their own software without having to implement
similar functionality themselves.
PROJ started purely as a cartography application letting users convert geodetic coordinates into projected coordinates
using a number of different cartographic projections. Over the years, as the need has become apparent, support for
datum shifts has slowly worked its way into PROJ as well. Today PROJ supports more than a hundred different map
projections and can transform coordinates between datums using all but the most obscure geodetic techniques.
1.1 Citation
@Manual{,
title = {{PROJ} coordinate transformation software library},
author = {{PROJ contributors}},
organization = {Open Source Geospatial Foundation},
year = {2020},
url = {https://proj.org/},
}
1
PROJ coordinate transformation software library, Release 7.1.1
1.2 License
PROJ uses the MIT license. The software was initially released by the USGS in the public domain. When Frank
Warmerdam took over the development of PROJ it was moved under the MIT license. The license is as follows:
Copyright (c) 2000, Frank Warmerdam
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associ-
ated documentation files (the “Software”), to deal in the Software without restriction, including without
limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARIS-
ING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
2 Chapter 1. About
CHAPTER
TWO
NEWS
2.1.1 Updates
• WKT parser: do not raise warning when parsing a WKT2:2015 TIMECRS whose TIMEUNIT is at the CS level,
and not inside (#2281)
• Parse ‘+proj=something_not_latlong +vunits=’ without +geoidgrids as a Projected3D CRS and not a compound
CRS with a unknown datum (#2289)
• C API: Avoid crashing due to missing SANITIZE_CTX() in entry points (#2293)
• CMake build: Check “target_clones” before use (#2297)
• PROJ string export of +proj=krovak +czech: make sure we export +czech. . . (#2301)
• Helmert 2D: do not require a useless +convention= parameter (#2305)
• Fix a few spelling errors (“vgridshit” vs. “vgridshift”) (#2307)
• Fix ability to identify EPSG:2154 as a candidate for ‘RGF93_Lambert_93’ (#2316)
• WKT importer: tune for Oracle WKT and ‘Lambert Conformal Conic’ (#2322)
• Revert compiler generated Fused Multiply Addition optimized routines (#2328)
3
PROJ coordinate transformation software library, Release 7.1.1
2.2.1 Updates
• New transformations
– Add a +proj=defmodel transformation for multi-component time-based deformation models (#2206):
• New projections
– Add square conformal projections from libproject (#2148):
4 Chapter 2. News
PROJ coordinate transformation software library, Release 7.1.1
– createFromUserInput(): allow compound CRS with the 2 parts given by names, e.g. ‘WGS 84 +
EGM96 height’ (#2126)
– createOperations(): when converting CompoundCRS<–>Geographic3DCrs, do not use discard
change of ellipsoidal height if a Helmert transformation is involved (#2227)
• Optimizations
– tmerc/utm: add a +algo=auto/evenden_snyder/poder_engsager parameter (#2030)
– Extended tmerc (Poder/Engsager): speed optimizations (#2036)
– Approximate tmerc (Snyder): speed optimizations (#2039)
– pj_phi2(): speed-up computation (and thus inverse ellipsoidal Mercator and LCC) (#2052)
– Inverse cart: speed-up computation by 33% (#2145)
– Extended tmerc: speed-up forward path by ~5% (#2147)
• Various
– Follow PDAL’s CMake RPATH strategy (#2009)
– WKT import/export: add support for WKT1_ESRI VERTCS synta (#2024)
– projinfo: add a --hide-ballpark option (#2127)
– gie: implement a strict mode with <gie-strict> </gie-strict> (#2168)
– Allow importing WKT1 COMPD_CS with a VERT_DATUM[Ellipsoid,2002] (#2229)
– Add runtime checking that sqlite3 is >= 3.11 (#2235)
• createOperations(): do not remove ballpark transformation if there are only grid based operations, even
if they cover the whole area of use (#2155)
• createFromProjString(): handle default parameters of ‘+krovak +type=crs’, and handle +czech cor-
rectly (#2200)
• ProjectedCRS::identify(): fix identification of EPSG:3059 (#2215)
• Database: add a ‘WGS84’ alias for the EPSG:4326 CRS (#2218)
• Fixes related to CompoundCRS and BoundCRS (#2222)
• Avoid 2 warnings about missing database indices (#2223)
• Make projinfo --3d --boundcrs-to-wgs84 work better (#2224)
• Many fixes regarding BoundCRS, CompoundCRS, Geographic3D CRS with non-metre units (#2234)
• Fix identification of (one of the) ESRI WKT formulations of EPSG:3035 (#2240)
• Avoid using deprecated and removed Windows API function with Mingw32 (#2246)
• normalizeForVisualization(): make it switch axis for EPSG:5482 (RSRGD2000 / RSPS2000)
(#2256)
• Fix access violation in proj_context_get_database_metadata() (#2260)
2.3.1 Updates
6 Chapter 2. News
PROJ coordinate transformation software library, Release 7.1.1
• hgridshift/vgridshift: defer grid opening when grid has already been opened (#2132)
• Resolve a few shadowed declaration warnings (#2142)
• ProjectedCRS identification: deal with switched 1st/2nd std parallels for LCC_2SP(#2153)
• Fix Robinson inverse projection (#2154)
• createOperations(): do not remove ballpark transformation if there are only grid based operations, even
if they cover the whole area of use (#2156)
• createFromCoordinateReferenceSystemCodes(): ‘optimization’ to avoid using C++ exceptions
(#2161)
• Ingestion of WKT1_GDAL: correctly map ‘Cylindrical_Equal_Area’ (#2167)
• Add limited support for non-conformant WKT1 LAS COMPD_CS[] (#2172)
• PROJ4 string import: take into correctly non-metre unit when the string looks like the one for WGS 84 / Pseudo
Mercator (#2177)
• io.hpp: avoid dependency to proj_json_streaming_writer.hpp (#2184)
• Fix support of WKT1_GDAL with netCDF rotated pole formulation (#2186)
Warning: PROJ 7 will be last major release version that includes the proj_api.h header. The functionality in
proj_api.h is deprecated and only supported in maintenance mode. It is inferior to the functionality provided
by functions in the proj.h header and all projects still relying on proj_api.h are encouraged to migrate to
the new API in proj.h. See Version 4 to 6 API Migration. for more info on how to migrate from the old to the
new API.
2.5.1 Updates
8 Chapter 2. News
PROJ coordinate transformation software library, Release 7.1.1
• Horizontal grid shift: fix failures on points slightly outside a subgrid (#209)
• Fix ASAN issue with SQLite3VFS class (#1902)
• tests: force use of bash for proj_add_test_script_sh (#1905)
2.6.1 Updates
• Fix wrong use of derivingConversionRef() that caused issues with use of +init=epsg:XXXX by GDAL (affecting
R spatial libraries) or in MapServer
• fix exporting CoordinateSystem to PROJ JSON with ID
• projinfo: use No. abbreviation instead of UTF-8 character (#1828)
• CompoundCRS::identify(): avoid exception when horiz/vertical part is a BoundCRS
• createOperations(): fix dealing with projected 3D CRS whose Z units != metre
• WKT1_GDAL export: limit datum name massaging to names matching EPSG (#1835)
• unitconvert with mjd time format: avoid potential integer overflow (ossfuzz 20072)
• ProjectedCRS::identify(): fix wrong identification of some ESRI WKT linked to units
• Database: add a geoid_like value for proj_method column of grid_alternatives, fix related entries and sim-
plify/robustify logic to deal with EPSG ‘Geographic3D to GravityRelatedHeight’ methods
• Fix ingestion of +proj=cea with +k_0 (#1881)
• Fix performance issue, affecting PROJ.4 string generation of EPSG:7842 (#1913)
• Fix identification of ESRI-style datum names starting with D_ but without alias (#1911)
• cart: Avoid discontinuity at poles in the inverse case (#1906)
• Various updates to make regression test suite pass with gcc on i386 (#1906)
2.7.1 Updates
10 Chapter 2. News
PROJ coordinate transformation software library, Release 7.1.1
• Horizontal grid shift: fix issue on iterative inverse computation when switching between (sub)grids (#1797)
• createOperations(): make filtering out of ‘uninteresting’ operations less aggressive (#1788)
• Make EPSG:102100 resolve to ESRI:102100 (#1786)
• ob_tran: restore traditional handling of +to_meter with pj_transform() and proj utility (#1783)
• CRS identification: use case insensitive comparison for authority name (#1780)
• normalizeForVisualization() and other methods applying on a ProjectedCRS: do not mess the de-
rivingConversion object of the original object (#1746)
• createOperations(): fix transformation computation from/to a CRS with +geoidgrids and +vunits
!= m (#1731)
• Fix proj_assign_context()/pj_set_ctx() with pipelines and alternative coord operations (#1726)
• Database: add an auxiliary concatenated_operation_step table to allow arbitrary number of steps (#1696)
• Fix errors running gie-based tests in Debug mode on Windo (#1688)
2.8.1 Updates
2.9.1 Updates
12 Chapter 2. News
PROJ coordinate transformation software library, Release 7.1.1
2.10.1 Updates
• Take the passed authority into account when identifying objects (#1466)
• Avoid exception when transforming from NAD83 to projected CRS using NAD83(2011) (#1477)
• Avoid off-by-one reading of name argument if name of resource file has length 1 (#11489)
• Do not include PROJ_LIB in proj_info().searchpath when context search path is set (#1498)
• Use correct delimiter for the current platform when parsing PROJ_LIB (#1497)
• Do not confuse ‘ID74’ CRS with WKT2 ID[] node (#1506)
• WKT1 importer: do case insensitive comparison for axis direction (#1509)
• Avoid compile errors on GCC 4.9.3 (#1512)
• Make sure that pipelines including +proj=ob_tran can be created (#1526)
2.11.1 Updates
• Have gie return non-zero code when file can’t be opened (#1312)
• CMake cross-compilation fix (#1316)
• Use 1st eccentricity instead of 2nd eccentricity in Molodensky (#1324)
• Make sure to include grids when doing Geocentric to CompoundCRS with nadgrids+geoidgrids transformations
(#1326)
• Handle coordinates outside of bbox better (#1333)
• Enable system error messages in command line automatically in builds (#1336)
• Make sure to install projinfo man page with CMake (#1347)
• Add data dir to pkg-config file proj.pc (#1348)
• Fix GCC 9 warning about useless std::move() (#1352)
• Grid related fixes (#1369)
• Make sure that ISO19111 C++ code sets pj_errno on errors (#1405)
• vgridshift: handle longitude wrap-around for grids with 360deg longitude extent (#1429)
• proj/cs2cs: validate value of -f parameter to avoid potential crashes (#1434)
• Many division by zero and similar bug fixes found by OSS Fuzz.
14 Chapter 2. News
PROJ coordinate transformation software library, Release 7.1.1
Late-binding coordinate operation capabilities, that takes metadata such as area of use and accuracy into account, has
been added. This can avoid in a number of situations the past requirement of using WGS84 as a pivot system, which
could cause unneeded accuracy loss, or was not doable at all sometimes when transformation to WGS84 was not
available. Those late-binding capabilities are now used by the proj_create_crs_to_crs() function and the cs2cs utility.
A new command line utility, projinfo, has been added to query information about a geodetic object of the database,
import and export geodetic objects from/into WKT and PROJ strings, and display coordinate operations available
between two CRSs.
2.12.1 UPDATES
• Read +towgs84 values correctly on locales not using dot as comma separator (#1136)
• Fixed file offset for reading of shift values in NTv1 files (#1144)
• Avoid problems with PTHREAD_MUTEX_RECURSIVE when using CMake (#1158)
• Avoid raising errors when setting ellipsoid flattening to zero (#1191)
• Fixed lower square calculations in rHealpix projection (#1206)
• Allow Molodensky transform parameters to be zero (#1194)
• Fixed wrong parameter in ITRF2000 init file (#1240)
• Fixed use of grid paths including spaces (#1152)
• Robinson: fix wrong values for forward path for latitudes >= 87.5, and fix inaccurate inverse method (#1172)
2.13.1 UPDATES
• Do not pivot over WGS84 when doing cs2cs-emulation with geocent (#1026)
• Do not scan past the end of the read data in pj_ctx_fgets() (#1042)
• Make sure proj_errno_string() is available in DLL (#1050)
• Respect +to_meter setting when doing cs2cs-emulation (#1053)
• Fixed unit conversion factors for geod (#1075)
• Fixed test failures related to GCC 8 (#1084)
• Improved handling of +geoc flag (#1093)
• Calculate correct projection factors for Webmercator (#1095)
16 Chapter 2. News
PROJ coordinate transformation software library, Release 7.1.1
• cs2cs now always outputs degrees when transformed coordinates are in angular units (#1112)
2.14.1 UPDATES
18 Chapter 2. News
PROJ coordinate transformation software library, Release 7.1.1
The decision to break the existing API has not been easy, but has ultimately been deemed necessary to ensure the long
term survival of the project. Not only by improving the maintainability immensely, but also by extending the potential
user (and hence developer) community.
The end goal is to deliver a generic coordinate transformation software package with a clean and concise code base
appealing to both users and developers.
For the first time in more than 25 years the major version number of the software is changed. The decision to do this
is based on the many new features and new API. While backwards compatibility remains - except in a few rare corner
cases - the addition of a new and improved programming interface warrants a new major release.
The new major version number unfortunately leaves the project in a bit of a conundrum regarding the name. For the
majority of the life-time of the product it has been known as PROJ.4, but since we have now reached version 5 the
name is no longer aligned with the version number.
Hence we have decided to decouple the name from the version number and from this version and onwards the product
will simply be called PROJ.
In recognition of the history of the software we are keeping PROJ.4 as the name of the organizing project. The same
project team also produces the datum-grid package.
In summary:
• The PROJ.4 project provides the product PROJ, which is now at version 5.0.0.
• The foundational component of PROJ is the library libproj.
• Other PROJ components include the application proj, which provides a command line interface to libproj.
• The PROJ.4 project also distributes the datum-grid package, which at the time of writing is at version 1.6.0.
2.16.2 Updates
– At the most generic level, a coordinate operation is a change of coordinates, based on a one-to-one rela-
tionship, from one coordinate reference system to another.
– A transformation is a coordinate operation in which the two coordinate reference systems are based on
different datums, e.g. a change from a global reference frame to a regional frame.
– A conversion is a coordinate operation in which both coordinate reference systems are based on the same
datum, e.g. change of units of coordinates.
– A projection is a coordinate conversion from an ellipsoidal coordinate system to a plane. Although pro-
jections are simply conversions according to the standard, they are treated as separate entities in PROJ as
they make up the vast majority of operations in the library.
• New operations
– The pipeline operator (pipeline)
– Transformations
20 Chapter 2. News
PROJ coordinate transformation software library, Release 7.1.1
22 Chapter 2. News
CHAPTER
THREE
DOWNLOAD
Here you can download current and previous releases of PROJ. We only supply a distribution of the source code and
various resource file archives. See Installation for information on how to get pre-built packages of PROJ.
Note: The proj-datumgrid packages have been deprecated with PROJ 7.0.0. The proj-data package should be used
with PROJ 7.0.0 and newer
The proj-datumgrid packages should be used with PROJ releases from the 5.x and 6.x branches.
23
PROJ coordinate transformation software library, Release 7.1.1
• 2020-05-01 proj-7.0.1.tar.gz
• 2020-03-01 proj-7.0.0.tar.gz
• 2020-02-11 proj-6.3.1.tar.gz
• 2020-01-01 proj-6.3.0.tar.gz
• 2019-11-01 proj-6.2.1.tar.gz
• 2019-09-01 proj-6.2.0.tar.gz
• 2019-07-01 proj-6.1.1.tar.gz
• 2019-05-15 proj-6.1.0.tar.gz
• 2019-03-01 proj-6.0.0.tar.gz
• 2018-09-15 proj-5.2.0.tar.gz
• 2018-06-01 proj-5.1.0.tar.gz
• 2018-04-01 proj-5.0.1.tar.gz
• 2018-03-01 proj-5.0.0.tar.gz
• 2016-09-02 proj-4.9.3.tar.gz
• 2015-09-13 proj-4.9.2.tar.gz
• 2015-03-04 proj-4.9.1.tar.gz
• 2020-03-01 proj-data-1.0.tar.gz
• 2018-03-01 proj-datumgrid-1.7.zip
• 2016-09-11 proj-datumgrid-1.6.zip
• 2019-09-01 proj-datumgrid-europe-1.5.zip
• 2019-09-01 proj-datumgrid-europe-1.4.zip
• 2019-07-01 proj-datumgrid-europe-1.3.zip
• 2019-03-01 proj-datumgrid-europe-1.2.zip
• 2018-09-15 proj-datumgrid-europe-1.1.zip
• 2018-03-01 proj-datumgrid-europe-1.0.zip
• 2019-03-01 proj-datumgrid-north-america-1.3.zip
• 2019-03-01 proj-datumgrid-north-america-1.2.zip
• 2018-09-15 proj-datumgrid-north-america-1.1.zip
• 2018-03-01 proj-datumgrid-north-america-1.0.zip
• 2018-03-01 proj-datumgrid-oceania-1.1.zip
• 2018-03-01 proj-datumgrid-oceania-1.0.zip
24 Chapter 3. Download
CHAPTER
FOUR
INSTALLATION
These pages describe how to install PROJ on your computer without compiling it yourself. Below are guides for
installing on Windows, Linux and Mac OS X. This is a good place to get started if this is your first time using PROJ.
More advanced users may want to compile the software themselves.
4.1.1.1 Conda
The conda package manager includes several PROJ packages. We recommend installing from the conda-forge
channel:
Using conda you can also install the PROJ data package. Here’s how to install the proj-data package:
Tip: Read more about the various datumgrid packages available here.
4.1.1.2 Docker
A Docker image with just PROJ binaries and a full compliment of grid shift files is available on DockerHub. Get the
package with:
25
PROJ coordinate transformation software library, Release 7.1.1
4.1.2 Windows
The simplest way to install PROJ on Windows is to use the OSGeo4W software distribution. OSGeo4W provides
easy access to many popular open source geospatial software packages. After installation you can use PROJ from the
OSGeo4W shell. To install PROJ do the following:
Note: If you have already installed software via OSGeo4W on your computer it is likely that PROJ is already installed.
C:\temp\osgeo4w-setup-x86-64.exe -q -k -r -A -s https://download.osgeo.org/osgeo4w/ -
˓→a x86_64 -P proj
4.1.3 Linux
How to install PROJ on Linux depends on which distribution you are using. Below is a few examples for some of the
more common Linux distributions:
4.1.3.1 Debian
On Debian and similar systems (e.g. Ubuntu) the APT package manager is used:
26 Chapter 4. Installation
PROJ coordinate transformation software library, Release 7.1.1
4.1.3.2 Fedora
4.1.4 Mac OS X
The classic way of installing PROJ is via the source code distribution. The most recent version is available from the
download page.
The following guides show how to compile and install the software using the Autotools and CMake build systems.
• C99 compiler
• C++11 compiler
• SQLite3 >= 3.11 (headers, library and executable)
• libtiff >= 4.0 (headers and library)
• optional (but recommended): curl >= 7.29.0
• GNU make for autotools build or CMake >= 3.9
4.2.2 Autotools
Note: The Autotools build system is only available on UNIX-like systems. Follow the CMake installation guide if
you are not using a UNIX-like operating system.
The default destination path prefix for installed files is /usr/local. Results from the installation script will be
placed into subdirectories bin, include, lib, and man/man1. If this default path prefix is proper, then execute:
./configure
./configure --prefix=/my/path
In either case, the directory of the prefix path must exist and be writable by the installer.
If you are building from the git repository you have to first run:
./autogen.sh
which will generate a configure script that can be used as described above.
With the data files in place we can now build and install PROJ:
make
make install
make check
With a successful install of PROJ we can now install data files using the projsync utility:
projsync --system-directory
which will download all resource files currently available for PROJ. If less than the entire collection of resource files
is needed the call to projsync can be modified to suit the users needs. See projsync for more options.
Note: The use of projsync requires that network support is enabled (the default option). If the resource files are
not installed using projsync PROJ will attempt to fetch them automatically when a transformation needs a specific
data file. This requires that PROJ_NETWORK is set to ON.
As an alternative on systems where network access is disabled, the proj-data package can be downloaded and added
to the PROJ_LIB directory.
28 Chapter 4. Installation
PROJ coordinate transformation software library, Release 7.1.1
Most POSIX systems may not require any options to ./configure if all PROJ requirements are met, installed into
common directories, and a “default” behavior is desired.
Some influential environment variables are used by ./configure, with no expected defaults:
CC
C compiler command.
CFLAGS
C compiler flags.
CXX
C++ compiler command.
CXXFLAGS
C++ compiler flags
See ./configure --help for all options, here are a few key options:
--enable-lto
Enable compiler’s Link Time Optimization, default disabled.
--disable-tiff
TIFF support is enabled by default to use PROJ-data resource files, but this can be disabled, if required.
--with-curl=ARG
Enable CURL support (ARG=path to curl-config).
--without-mutex
Disable real mutex locks (lacking pthreads).
4.2.3 CMake
With the CMake build system you can compile and install PROJ on more or less any platform. After unpacking the
source distribution archive step into the source- tree:
cd proj-7.1.1
mkdir build
cd build
From the build directory you can now configure CMake, build and install the binaries:
cmake ..
cmake --build .
cmake --build . --target install
If the SQLite3 dependency is installed in a custom location, specify the paths to the include directory and the library:
With a successful install of PROJ we can now install data files using the projsync utility:
projsync --system-directory
which will download all resource files currently available for PROJ. If less than the entire collection of resource files
is needed the call to projsync can be modified to suit the users needs. See projsync for more options.
Note: The use of projsync requires that network support is enabled (the default option). If the resource files are
not installed using projsync PROJ will attempt to fetch them automatically when a transformation needs a specific
data file. This requires that PROJ_NETWORK is set to ON.
As an alternative on systems where network access is disabled, the proj-data package can be downloaded and added
to the PROJ_LIB directory.
Options to configure a CMake are provided using -D<var>=<value>. All cached entries can be viewed using
cmake -LAH from a build directory.
BUILD_CCT=ON
Build cct, default ON.
BUILD_CS2CS=ON
Build cs2cs, default ON.
BUILD_GEOD=ON
Build geod, default ON.
BUILD_GIE=ON
Build gie, default ON.
BUILD_PROJ=ON
Build proj, default ON.
BUILD_PROJINFO=ON
Build projinfo, default ON.
BUILD_PROJSYNC=ON
Build projsync, default ON.
BUILD_SHARED_LIBS
Build PROJ library shared. Default for Windows is OFF, building only a static library. Default for all others is
ON. See also the CMake documentation for BUILD_SHARED_LIBS.
Changed in version 7.0: Renamed from BUILD_LIBPROJ_SHARED
BUILD_TESTING=ON
CTest option to build the testing tree, which also downloads and installs Googletest. Default is ON, but can be
turned OFF if tests are not required.
Changed in version 7.0: Renamed from PROJ_TESTS
30 Chapter 4. Installation
PROJ coordinate transformation software library, Release 7.1.1
CMAKE_BUILD_TYPE
Choose the type of build, options are: None (default), Debug, Release, RelWithDebInfo, or MinSizeRel. See
also the CMake documentation for CMAKE_BUILD_TYPE.
Note: A default build is not optimized without specifying -DCMAKE_BUILD_TYPE=Release (or similar)
during configuration, or by specifying --config Release with CMake multi-configuration build tools (see
example below).
CMAKE_C_COMPILER
C compiler. Ignored for some generators, such as Visual Studio.
CMAKE_C_FLAGS
Flags used by the C compiler during all build types. This is initialized by the CFLAGS environment variable.
CMAKE_CXX_COMPILER
C++ compiler. Ignored for some generators, such as Visual Studio.
CMAKE_CXX_FLAGS
Flags used by the C++ compiler during all build types. This is initialized by the CXXFLAGS environment
variable.
CMAKE_INSTALL_PREFIX
Default for Windows is based on the environment variable OSGEO4W_ROOT (if set), otherwise is c:/
OSGeo4W. Default for Unix-like is /usr/local/.
ENABLE_IPO=OFF
Build library using the compiler’s interprocedural optimization (IPO), if available, default OFF.
Changed in version 7.0: Renamed from ENABLE_LTO.
EXE_SQLITE3
Path to an sqlite3 or sqlite3.exe executable.
SQLITE3_INCLUDE_DIR
Path to an include directory with the sqlite3.h header file.
SQLITE3_LIBRARY
Path to a shared or static library file, such as sqlite3.dll, libsqlite3.so, sqlite3.lib or other
name.
ENABLE_CURL=ON
Enable CURL support, default ON.
CURL_INCLUDE_DIR
Path to an include directory with the curl directory.
CURL_LIBRARY
Path to a shared or static library file, such as libcurl.dll, libcurl.so, libcurl.lib, or other name.
ENABLE_TIFF=ON
Enable TIFF support to use PROJ-data resource files, default ON.
TIFF_INCLUDE_DIR
Path to an include directory with the tiff.h header file.
TIFF_LIBRARY_RELEASE
Path to a shared or static library file, such as tiff.dll, libtiff.so, tiff.lib, or other name. A similar
variable TIFF_LIBRARY_DEBUG can also be specified to a similar library for building Debug releases.
4.2.4 Building on Windows with vcpkg and Visual Studio 2017 or 2019
This method is the preferred one to generate Debug and Release builds.
Install git
cd c:\dev
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
Note: The tiff and curl dependencies are only needed since PROJ 7.0
cd c:\dev
git clone https://github.com/OSGeo/PROJ.git
cd c:\dev\PROJ
mkdir build_vs2019
cd build_vs2019
cmake -DCMAKE_TOOLCHAIN_FILE=C:\dev\vcpkg\scripts\buildsystems\vcpkg.cmake ..
cmake --build . --config Debug -j 8
32 Chapter 4. Installation
PROJ coordinate transformation software library, Release 7.1.1
cd c:\dev\PROJ\build_vs2019
ctest -V --build-config Debug
4.2.5 Building on Windows with Conda dependencies and Visual Studio 2017 or
2019
Variant of the above method but using Conda for SQLite3, TIFF and CURL dependencies. It is less appropriate for
Debug builds of PROJ than the method based on vcpkg.
Install git
Install miniconda
cd c:\dev
conda create --name proj
conda activate proj
conda install sqlite libtiff curl cmake
Note: The libtiff and curl dependencies are only needed since PROJ 7.0
cd c:\dev
git clone https://github.com/OSGeo/PROJ.git
cd c:\dev\PROJ
cd _build.vs2019
ctest -V --build-config Release
34 Chapter 4. Installation
CHAPTER
FIVE
USING PROJ
The main purpose of PROJ is to transform coordinates from one coordinate reference system to another. This can be
achieved either with the included command line applications or the C API that is a part of the software package.
Coordinate transformations are defined by, what in PROJ terminology is known as, “proj-strings”. A proj-string
describes any transformation regardless of how simple or complicated it might be. The simplest case is projection of
geodetic coordinates. This section focuses on the simpler cases and introduces the basic anatomy of the proj-string.
The complex cases are discussed in Geodetic transformation.
A proj-strings holds the parameters of a given coordinate transformation, e.g.
I.e. a proj-string consists of a projection specifier, +proj, a number of parameters that applies to the projection and,
if needed, a description of a datum shift. In the example above geodetic coordinates are transformed to projected
space with the Mercator projection with the latitude of true scale at 56.5 degrees north on the GRS80 ellipsoid. Every
projection in PROJ is identified by a shorthand such as merc in the above example.
By using the above projection definition as parameters for the command line utility proj we can convert the geodetic
coordinates to projected space:
If called as above proj will be in interactive mode, letting you type the input data manually and getting a response
presented on screen. proj works as any UNIX filter though, which means that you can also pipe data to the utility,
for instance by using the echo command:
PROJ also comes bundled with the cs2cs utility which is used to transform from one coordinate reference system to
another. Say we want to convert the above Mercator coordinates to UTM, we can do that with cs2cs:
Notice the +to parameter that separates the source and destination projection definitions.
If you happen to know the EPSG identifiers for the two coordinates reference systems you are transforming between
you can use those with cs2cs:
35
PROJ coordinate transformation software library, Release 7.1.1
In the above example we transform geodetic coordinates in the WGS84 reference frame to UTM zone 32N coordinates
in the ETRS89 reference frame. UTM coordinates
The foundation of PROJ is the large number of projections available in the library. This section is devoted to the
generic parameters that can be used on any projection in the PROJ library.
Below is a list of PROJ parameters which can be applied to most coordinate system definitions. This table does
not attempt to describe the parameters particular to particular projection types. These can be found on the pages
documenting the individual projections.
Parameter Description
+a Semimajor radius of the ellipsoid axis
+axis Axis orientation
+b Semiminor radius of the ellipsoid axis
+ellps Ellipsoid name (see proj -le)
+k Scaling factor (deprecated)
+k_0 Scaling factor
+lat_0 Latitude of origin
+lon_0 Central meridian
+lon_wrap Center longitude to use for wrapping (see below)
+over Allow longitude output outside -180 to 180 range, disables wrapping (see below)
+pm Alternate prime meridian (typically a city name, see below)
+proj Projection name (see proj -l)
+units meters, US survey feet, etc.
+vunits vertical units.
+x_0 False easting
+y_0 False northing
5.2.1 Units
Horizontal units can be specified using the +units keyword with a symbolic name for a unit (ie. us-ft). Alterna-
tively the translation to meters can be specified with the +to_meter keyword (ie. 0.304800609601219 for US feet).
The -lu argument to cs2cs or proj can be used to list symbolic unit names. The default unit for projected coor-
dinates is the meter. A few special projections deviate from this behavior, most notably the latlong pseudo-projection
that returns degrees.
Vertical (Z) units can be specified using the +vunits keyword with a symbolic name for a unit (ie. us-ft). Alter-
natively the translation to meters can be specified with the +vto_meter keyword (ie. 0.304800609601219 for US
feet). The -lu argument to cs2cs or proj can be used to list symbolic unit names. If no vertical units are specified,
the vertical units will default to be the same as the horizontal coordinates.
Note: proj do not handle vertical units at all and hence the +vto_meter argument will be ignored.
Scaling of output units can be done by applying the +k_0 argument. The returned coordinates are scaled by the value
assigned with the +k_0 parameter.
Virtually all coordinate systems allow for the presence of a false easting (+x_0) and northing (+y_0). Note that these
values are always expressed in meters even if the coordinate system is some other units. Some coordinate systems
(such as UTM) have implicit false easting and northing values.
By default PROJ wraps output longitudes in the range -180 to 180. The +over switch can be used to disable the
default wrapping which is done at a low level in pj_inv(). This is particularly useful with projections like the
equidistant cylindrical where it would be desirable for X values past -20000000 (roughly) to continue past -180
instead of wrapping to +180.
The +lon_wrap option can be used to provide an alternative means of doing longitude wrapping within
pj_transform(). The argument to this option is a center longitude. So +lon_wrap=180 means wrap lon-
gitudes in the range 0 to 360. Note that +over does not disable +lon_wrap.
A prime meridian may be declared indicating the offset between the prime meridian of the declared coordinate system
and that of greenwich. A prime meridian is declared using the “pm” parameter, and may be assigned a symbolic name,
or the longitude of the alternative prime meridian relative to greenwich.
Currently prime meridian declarations are only utilized by the pj_transform() API call, not the pj_inv() and
pj_fwd() calls. Consequently the user utility cs2cs does honour prime meridians but the proj user utility ignores
them.
The following predeclared prime meridian names are supported. These can be listed using with cs2cs -lm.
Meridian Longitude
greenwich 0dE
lisbon 9d07’54.862”W
paris 2d20’14.025”E
bogota 74d04’51.3”E
madrid 3d41’16.48”W
rome 12d27’8.4”E
bern 7d26’22.5”E
jakarta 106d48’27.79”E
ferro 17d40’W
brussels 4d22’4.71”E
stockholm 18d3’29.8”E
athens 23d42’58.815”E
oslo 10d43’22.5”E
Example of use. The location long=0, lat=0 in the greenwich based lat/long coordinates is translated to lat/long
coordinates with Madrid as the prime meridian.
Starting in PROJ 4.8.0, the +axis argument can be used to control the axis orientation of the coordinate system. The
default orientation is “easting, northing, up” but directions can be flipped, or axes flipped using combinations of the
axes in the +axis switch. The values are:
• “e” - Easting
• “w” - Westing
• “n” - Northing
• “s” - Southing
• “u” - Up
• “d” - Down
They can be combined in +axis in forms like:
• +axis=enu - the default easting, northing, elevation.
• +axis=neu - northing, easting, up - useful for “lat/long” geographic coordinates, or south orientated transverse
mercator.
• +axis=wnu - westing, northing, up - some planetary coordinate systems have “west positive” coordinate
systems
Note: The +axis argument does not work with the proj command line utility.
PROJ can do everything from the most simple projection to very complex transformations across many reference
frames. While originally developed as a tool for cartographic projections, PROJ has over time evolved into a powerful
generic coordinate transformation engine that makes it possible to do both large scale cartographic projections as well
as coordinate transformation at a geodetic high precision level. This chapter delves into the details of how geodetic
transformations of varying complexity can be performed.
In PROJ, two frameworks for geodetic transformations exists, the PROJ 4.x/5.x / cs2cs / pj_transform() frame-
work and the transformation pipelines framework. The first is the original, and limited, framework for doing geodetic
transforms in PROJ The latter is a newer addition that aims to be a more complete transformation framework. Both
are described in the sections below. Large portions of the text are based on [EversKnudsen2017].
Before describing the details of the two frameworks, let us first remark that most cases of geodetic transformations can
be expressed as a series of elementary operations, the output of one operation being the input of the next. E.g. when
going from UTM zone 32, datum ED50, to UTM zone 32, datum ETRS89, one must, in the simplest case, go through
5 steps:
1. Back-project the UTM coordinates to geographic coordinates
2. Convert the geographic coordinates to 3D cartesian geocentric coordinates
3. Apply a Helmert transformation from ED50 to ETRS89
The homology between the above steps and a Unix shell style pipeline is evident. It is there the main architectural
inspiration behind the transformation pipeline framework. The pipeline framework is realized by utilizing a special
“projection”, that takes as its user supplied arguments, a series of elementary operations, which it strings together in
order to implement the full transformation needed. Additionally, a number of elementary geodetic operations, includ-
ing Helmert transformations, general high order polynomial shifts and the Molodensky transformation are available
as part of the pipeline framework. In anticipation of upcoming support for full time-varying transformations, we also
introduce a 4D spatiotemporal data type, and a programming interface (API) for handling this.
The Molodensky transformation converts directly from geodetic coordinates in one datum, to geodetic coordinates in
another datum, while the (typically more accurate) Helmert transformation converts from 3D cartesian to 3D cartesian
coordinates. So when using the Helmert transformation one typically needs to do an initial conversion from geodetic
to cartesian coordinates, and a final conversion the other way round, to arrive at the desired result. Fortunately, this
three-step compound transformation has the attractive characteristic that each step depends only on the output of the
immediately preceding step. Hence, we can build a geodetic-to-geodetic Helmert transformation by tying together
the outputs and inputs of 3 steps (geodetic-to-cartesian → Helmert → cartesian-to-geodetic), pipeline style. The
pipeline driver, makes this kind of chained transformations possible. The implementation is compact, consisting
of just one pseudo-projection, called pipeline, which takes as its arguments strings of elementary projections
(note: “projection” is the, slightly misleading, PROJ term used for any kind of transformation). The pipeline pseudo
projection is supplemented by a number of elementary transformations, all in all providing a framework for building
high accuracy solutions for a wide spectrum of geodetic tasks.
As a first example, let us take a look at the iconic geodetic → Cartesian → Helmert → geodetic case (steps 2 to 4 in
the example in the introduction). In PROJ it can be implemented as
proj=pipeline
step proj=cart ellps=intl
step proj=helmert convention=coordinate_frame
x=-81.0703 y=-89.3603 z=-115.7526
rx=-0.48488 ry=-0.02436 rz=-0.41321 s=-0.540645
step proj=cart inv ellps=GRS80
The pipeline can be expanded at both ends to accommodate whatever coordinate type is needed for input and output:
In the example below, we transform from the deprecated Danish System 45, a 2D system with some tension in the
original defining network, to UTM zone 33, ETRS89. The tension is reduced using a polynomial transformation (the
init=./s45b. . . step, s45b.pol is a file containing the polynomial coefficients), taking the S45 coordinates to a technical
coordinate system (TC32), defined to represent “UTM zone 32 coordinates, as they would look if the Helmert transfor-
mation between ED50 and ETRS89 was perfect”. The TC32 coordinates are then converted back to geodetic(ED50)
coordinates, using an inverse UTM projection, further to cartesian(ED50), then to cartesian(ETRS89), using the rel-
evant Helmert transformation, and back to geodetic(ETRS89), before finally being projected onto the UTM zone 33,
ETRS89 system. All in all a 6 step pipeline, implementing a transformation with centimeter level accuracy from a
deprecated system with decimeter level tensions.
proj=pipeline
step init=./s45b.pol:s45b_tc32
step proj=utm inv ellps=intl zone=32
step proj=cart ellps=intl
step proj=helmert convention=coordinate_frame
x=-81.0703 y=-89.3603 z=-115.7526
rx=-0.48488 ry=-0.02436 rz=-0.41321 s=-0.540645
(continues on next page)
With the pipeline framework spatiotemporal transformation is possible. This is possible by leveraging the time di-
mension in PROJ that enables 4D coordinates (three spatial components and one temporal component) to be passed
through a transformation pipeline. In the example below a transformation from ITRF93 to ITRF2000 is defined. The
temporal component is given as GPS weeks in the input data, but the 14-parameter Helmert transform expects tem-
poral units in decimalyears. Hence the first step in the pipeline is the unitconvert pseudo-projection that makes sure
the correct units are passed along to the Helmert transform. Most parameters of the Helmert transform are taken from
[Altamimi2002], except the epoch which is the epoch of the transformation. The last step in the pipeline is converting
the coordinate timestamps back to GPS weeks.
proj=pipeline
step proj=unitconvert t_in=gps_week t_out=decimalyear
step proj=helmert convention=coordinate_frame
x=0.0127 y=0.0065 z=-0.0209 s=0.00195
rx=0.00039 ry=-0.00080 rz=0.00114
dx=-0.0029 dy=-0.0002 dz=-0.0006 ds=0.00001
drx=0.00011 dry=0.00019 drz=-0.00007
t_epoch=1988.0
step proj=unitconvert t_in=decimalyear t_out=gps_week
Parameter Description
+datum Datum name (see proj -ld)
+geoidgrids Filename of GTX grid file to use for vertical datum transforms
+nadgrids Filename of NTv2 grid file to use for datum transforms
+towgs84 3 or 7 term datum transform parameters
+to_meter Multiplier to convert map units to 1.0m
+vto_meter Vertical conversion to meters
Warning: This section documents the behavior of PROJ 4.x and 5.x. In PROJ 6.x, cs2cs has been reworked to
use proj_create_crs_to_crs() internally, with late binding capabilities, and thus is no longer constrained
to using WGS84 as a pivot (also called as early binding method). When cs2cs of PROJ 6 is used with PROJ.4
expanded strings to describe the CRS, including +towgs84, +nadgrids and +geoidgrids, it will generally
give the same results as earlier PROJ versions. When used with AUTHORITY:CODE CRS descriptions, it may
return different results.
The cs2cs framework in PROJ 4 and 5 delivers a subset of the geodetic transformations available with the pipeline
framework. Coordinate transformations done in this framework were transformed in a two-step process with WGS84
as a pivot datum. That is, the input coordinates are transformed to WGS84 geodetic coordinates and then transformed
from WGS84 coordinates to the specified output coordinate reference system, by utilizing either the Helmert trans-
form, datum shift grids or a combination of both. Datum shifts can be described in a proj-string with the parameters
+towgs84, +nadgrids and +geoidgrids. An inverse transform exists for all three and is applied if specified
in the input proj-string. The most common is +towgs84, which is used to define a 3- or 7-parameter Helmert shift
from the input reference frame to WGS84. Exactly which realization of WGS84 is not specified, hence a fair amount
of uncertainty is introduced in this step of the transformation. With the +nadgrids parameter a non-linear planar cor-
rection derived from interpolation in a correction grid can be applied. Originally this was implemented as a means to
transform coordinates between the North American datums NAD27 and NAD83, but corrections can be applied for
any datum for which a correction grid exists. The inverse transform for the horizontal grid shift is “dumb”, in the sense
that the correction grid is applied verbatim without taking into account that the inverse operation is non-linear. Similar
to the horizontal grid correction, +geoidgrids can be used to perform grid corrections in the vertical component.
Both grid correction methods allow inclusion of more than one grid in the same transformation
In contrast to the transformation pipeline framework, transformations with the cs2cs framework in PROJ 4 and 5 were
expressed as two separate proj-strings. One proj-string to WGS84 and one from WGS84. Together they form the
mapping from the source coordinate reference system to the destination coordinate reference system. When used with
the cs2cs the source and destination CRS’s are separated by the special +to parameter.
The following example demonstrates converting from the Greek GGRS87 datum to WGS84 with the +towgs84
parameter.
Note: With PROJ 6, the order of coordinates for EPSG geographic coordinate reference systems is latitude first,
longitude second.
The EPSG database provides this example for transforming from WGS72 to WGS84 using an approximated 7 param-
eter transformation.
With PROJ 6, you can simply use the following (note the reversed order for latitude and longitude)
In many places (notably North America and Australia) national geodetic organizations provide grid shift files for
converting between different datums, such as NAD27 to NAD83. These grid shift files include a shift to be applied at
each grid location. Actually grid shifts are normally computed based on an interpolation between the containing four
grid points.
PROJ supports use of grid files for shifting between various reference frames. The grid shift table formats are ctable,
NTv1 (the old Canadian format), and NTv2 (.gsb - the new Canadian and Australian format).
The text in this section is based on the cs2cs framework. Gridshifting is off course also possible with the pipeline
framework. The major difference between the two is that the cs2cs framework is limited to grid mappings to WGS84,
whereas with transformation pipelines it is possible to perform grid shifts between any two reference frames, as long
as a grid exists.
Use of grid shifts with cs2cs is specified using the +nadgrids keyword in a coordinate system definition. For
example:
In this case the /usr/local/share/proj/ntv1_can.dat grid shift file was loaded, and used to get a grid
shift value for the selected point.
It is possible to list multiple grid shift files, in which case each will be tried in turn till one is found that contains the
point being transformed.
The special prefix @ may be prefixed to a grid to make it optional. If it not found, the search will continue to the next
grid. Normally any grid not found will cause an error. For instance, the following would use the ntv2_0.gsb file if
available, otherwise it would fallback to using the ntv1_can.dat file.
A special null grid shift file is distributed with PROJ. This file provides a zero shift for the whole world. It may be
listed at the end of a nadgrids file list if you want a zero shift to be applied to points outside the valid region of all the
other grids. Normally if no grid is found that contains the point to be transformed an error will occur.
5.3.3.3 Caveats
• Where grids overlap (such as conus and ntv1_can.dat for instance) the first found for a point will be used
regardless of whether it is appropriate or not. So, for instance, +nadgrids=ntv1_can.dat,conus would
result in the Canadian data being used for some areas in the northern United States even though the conus data is
the approved data to use for the area. Careful selection of files and file order is necessary. In some cases border
spanning datasets may need to be pre-segmented into Canadian and American points so they can be properly
grid shifted
• Additional detail on the grid shift being applied can be found by setting the PROJ_DEBUG environment variable
to a value. This will result in output to stderr on what grid is used to shift points, the bounds of the various grids
loaded and so forth
PROJ can be controlled by setting environment variables. Most users will have a use for the PROJ_LIB.
On UNIX systems environment variables can be set for a shell-session with:
Environment variables on UNIX are usually removed with the unset command:
$ unset VAR
On windows systems environment variables can be set in the command line with:
`VAR will be available for the entire session, unless it is unset. This is done by setting the variable with no content:
PROJ_LIB
The location of PROJ resource files.
Starting with PROJ 6, multiple directories can be specified. On Unix, they should be separated by the colon (:)
character. on Windows, by the semi-colon (;) character.
PROJ is hardcoded to look for resource files in other locations as well, amongst those are the installation direc-
tory (usually share/proj under the PROJ installation root) and the current folder.
You can also set the location of the resource files using proj_context_set_search_paths() in the
proj.h API header.
Changed in version 6.1.0: Starting with PROJ version 6.1.0, the paths set by
proj_context_set_search_paths() will have priority over the PROJ_LIB to allow for multiple ver-
sions of PROJ resource files on your system without conflicting.
PROJ_DEBUG
Set the debug level of PROJ. The default debug level is zero, which results in no debug output when using PROJ.
A number from 1-3, whit 3 being the most verbose setting.
PROJ_NETWORK
New in version 7.0.0.
If set to ON, enable the capability to use remote grids stored on CDN (Content Delivery Network) storage, when
grids are not available locally. Alternatively, the proj_context_set_enable_network() function can
be used.
PROJ_NETWORK_ENDPOINT
New in version 7.0.0.
Define the endpoint of the CDN storage. Normally defined through the proj.ini configuration file locale in
PROJ_LIB. Alternatively, the proj_context_set_url_endpoint() function can be used.
Once in a while, a new version of PROJ causes changes in the existing behavior. In this section we track deliberate
changes to PROJ that break from previous behavior. Most times that will be caused by a bug fix. Unfortunately, some
bugs have existed for so long that their faulty behavior is relied upon by software that uses PROJ.
Behavioural changes caused by new bugs are not tracked here, as they should be fixed in later versions of PROJ.
The default datum application behavior changed with the 4.6.0 release. PROJ will now only apply a datum shift if
both the source and destination coordinate system have valid datum shift information.
The PROJ 4.6.0 Release Notes states
MAJOR: Rework pj_transform() to avoid applying ellipsoid to ellipsoid transformations as a datum
shift when no datum info is available.
By default PROJ wraps output longitudes in the range -180 to 180. Previous to PROJ 5, this was handled incorrectly
when a custom central meridian was set with +lon_0. This caused a change in sign on the resulting easting as seen
below:
$ proj +proj=merc +lon_0=110
-70 0
-20037508.34 0.00
290 0
20037508.34 0.00
From PROJ 5 on onwards, the same input now results in same coordinates, as seen from the example below where
PROJ 5 is used:
$ proj +proj=merc +lon_0=110
-70 0
-20037508.34 0.00
290 0
-20037508.34 0.00
The change is made on the basis that 𝜆 = 290∘ is a full rotation of the circle larger than 𝜆 = −70∘ and hence should
return the same output for both.
Adding the +over flag to the projection definition provides the old behavior.
Before PROJ 6, the proj_def.dat was used to provide general and per-projection parameters, when +no_defs
was not specified. It has now been removed. In case, no ellipsoid or datum specification is provided in the PROJ
string, the default ellipsoid is GRS80 (was WGS84 in previous PROJ versions).
In the initial version of the of deformation operation the time span between 𝑡𝑜𝑏𝑠 and 𝑡𝑐 was determined by the expres-
sion
𝑑𝑡 = 𝑡𝑐 − 𝑡𝑜𝑏𝑠
With version 6.0.0 this has been reversed in order to behave similarly to the Helmert operation, which determines time
differences as
𝑑𝑡 = 𝑡𝑜𝑏𝑠 − 𝑡𝑐
Effectively this means that the direction of the operation has been reversed, so that what in PROJ 5 was a forward
operation is now an inverse operation and vice versa.
Pipelines written for PROJ 5 can be migrated to PROJ 6 by adding +inv to forward steps involving the deformation
operation. Similarly +inv should be removed from inverse steps to be compatible with PROJ 6.
The +t_obs parameter was confusing for users since it effectively overwrote the observation time in input coordi-
nates. To make it more clear what is the operation is doing, users are now required to directly specify the time span
for which they wish to apply a given deformation. The parameter +dt has been added for that purpose. The new
parameter is mutually exclusive with +t_epoch. +dt is used when deformation for a set amount of time is needed
and +t_epoch is used (in conjunction with the observation time of the input coordinate) when deformation from a
specific epoch to the observation time is needed.
5.5.4.1 projinfo
Before PROJ 6.3.0, WKT1:GDAL was implicitly calling –boundcrs-to-wgs84, to add a TOWGS84[] node in some
cases. This is no longer the case.
5.5.5.1 proj
Removed -ld option from application, since it promoted use of deprecated parameters like +towgs and +datum.
5.5.5.2 cs2cs
Removed -ld option from application, since it promoted use of deprecated parameters like +towgs and +datum.
The value of all path, filenames passed to PROJ through function calls, PROJ strings or environment variables should
be encoded in UTF-8.
Files are accessed by default through a CDN (Content Delivery Network), accessible through https://cdn.proj.org,
that contains Geodetic TIFF grids (GTG) datasets which are mirrored and managed by the https://github.com/OSGeo/
PROJ-data/ GitHub project. Files in the CDN are designed to be used by PROJ 7 or later, but any software project
wishing to use the CDN for shifting support are encouraged to participate in the project and leverage the CDN.
This capability assumes that PROJ has been build against libcurl, and that the user authorizes network access.
Authorizing network access can be done in multiple ways:
• enabling / uncommenting the network = on line of proj.ini
• definiting the PROJ_NETWORK environment variable to ON
• or using the proj_context_set_enable_network() with a enabled = TRUE value.
Note: Instead of using the libcurl implementation, an application using the PROJ API can supply its own network
implementation through C function callbacks with proj_context_set_network_callbacks(). Enabling
network use must still be done with one of the above mentioned method.
When this is enabled, and a grid is not found in the various locations where resource files are looked for,
PROJ will then attempt at loading the file from a remote server, which defaults to https://cdn.proj.org in
proj.ini. This location can be changed with the PROJ_NETWORK_ENDPOINT environment variable or with
proj_context_set_url_endpoint().
5.6.4 Caching
To avoid repeated access to network, a local cache of downloaded chunks of grids is implemented as SQLite3 database,
cache.db, stored in the PROJ user writable directory.
This local caching is enabled by default (can be changed in proj.ini or with proj_grid_cache_set_enable()).
The default maximum size of the cache is 300 MB, which is more than half of the total size of grids available, at time
of writing. This size can also be customized in proj.ini or with proj_grid_cache_set_max_size()
When on-demand loading of grid is not desirable, the PROJ API also offers the capability to down-
load whole grids in the PROJ user writable directory by using the proj_is_download_needed() and
proj_download_file() functions.
5.6.7 Mirroring
If you are able, you are encouraged to mirror the grids via AWS S3 command line:
If direct S3 access is not possible, you can also use wget to locally mirror the data:
5.6.8 Acknowledgments
The s3://cdn.proj.org bucket is hosted by the Amazon Public Datasets program. CDN services are provided by the
AWS Public Dataset team via CloudFront
SIX
APPLICATIONS
Bundled with PROJ comes a set of small command line utilities. The proj program is limited to converting be-
tween geographic and projection coordinates within one datum. The cs2cs program operates similarly, but allows
translation between any pair of definable coordinate systems, including support for datum transformation. The geod
program provides the ability to do geodesic (great circle) computations. gie is the program used for regression tests
in PROJ. cct, a 4D equivalent to the proj program, performs transformation coordinate systems on a set of in-
put points. projinfo performs queries for geodetic objects and coordinate operations. projsync is a tool for
synchronizing PROJ datum and transformation support data.
6.1 cct
6.1.1 Synopsis
6.1.2 Description
cct is a 4D equivalent to the proj projection program, performs transformation coordinate systems on a set of input
points. The coordinate system transformation can include translation between projected and geographic coordinates
as well as the application of datum shifts.
The following control parameters can appear in any order:
-c <x,y,z,t>
Specify input columns for (up to) 4 input parameters. Defaults to 1,2,3,4.
-d <n>
New in version 5.2.0.
Specify the number of decimals in the output.
-I
Do the inverse transformation.
-o <output file name>, --output=<output file name>
Specify the name of the output file.
-t <time>, --time=<time>
Specify a fixed observation time to be used for all input data.
-z <height>, --height=<height>
Specify a fixed observation height to be used for all input data.
49
PROJ coordinate transformation software library, Release 7.1.1
-s <n>, --skip-lines=<n>
New in version 5.1.0.
Skip the first n lines of input. This applies to any kind of input, whether it comes from STDIN, a file or
interactive user input.
-v, --verbose
Write non-essential, but potentially useful, information to stderr. Repeat for additional information (-vv, -vvv,
etc.)
--version
Print version number.
The +opt arguments are associated with coordinate operation parameters. Usage varies with operation.
cct is an acronym meaning Coordinate Conversion and Transformation.
The acronym refers to definitions given in the OGC 08-015r2/ISO-19111 standard “Geographical Information – Spatial
Referencing by Coordinates”, which defines two different classes of coordinate operations:
Coordinate Conversions, which are coordinate operations where input and output datum are identical (e.g. conversion
from geographical to cartesian coordinates) and
Coordinate Transformations, which are coordinate operations where input and output datums differ (e.g. change of
reference frame).
6.1.4 Examples
1. The operator specs describe the action to be performed by cct. So the following script
will transform the input geographic coordinates into UTM zone 32 coordinates. Hence, the command
4. As (2) but specify input columns for longitude, latitude, height and time:
50 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
5. As (2) but specify fixed height and time, hence needing only 2 cols in input:
6. Auxiliary data following the coordinate input is forward to the output stream:
6.1.5 Background
cct also refers to Carl Christian Tscherning (1942–2014), professor of Geodesy at the University of Copenhagen,
mentor and advisor for a generation of Danish geodesists, colleague and collaborator for two generations of global
geodesists, Secretary General for the International Association of Geodesy, IAG (1995–2007), fellow of the American
Geophysical Union (1991), recipient of the IAG Levallois Medal (2007), the European Geosciences Union Vening
Meinesz Medal (2008), and of numerous other honours.
cct, or Christian, as he was known to most of us, was recognized for his good mood, his sharp wit, his tireless work,
and his great commitment to the development of geodesy – both through his scientific contributions, comprising more
than 250 publications, and by his mentoring and teaching of the next generations of geodesists.
As Christian was an avid Fortran programmer, and a keen Unix connoisseur, he would have enjoyed to know that his
initials would be used to name a modest Unix style transformation filter, hinting at the tireless aspect of his personality,
which was certainly one of the reasons he accomplished so much, and meant so much to so many people.
Hence, in honour of cct (the geodesist) this is cct (the program).
6.2 cs2cs
6.2.1 Synopsis
6.2. cs2cs 51
PROJ coordinate transformation software library, Release 7.1.1
• a OGC URN combining references for references for projected or derived CRSs e.g. for Pro-
jected 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 is at https://proj.org/schemas/v0.2/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)
New in version 6.0.0.
Note: before 7.0.1, it was needed to add +to between {source_crs} and {target_crs} when adding a
filename
6.2.2 Description
cs2cs performs transformation between the source and destination cartographic coordinate reference system on a
set of input points. The coordinate reference system transformation can include translation between projected and
geographic coordinates as well as the application of datum shifts.
The following control parameters can appear in any order:
-I
Method to specify inverse translation, convert from +to coordinate system to the primary coordinate system
defined.
-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>
New in version 5.2.0.
Specify the number of decimals 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=id gives expanded description of pro-
jection id, e.g. cs2cs -l=merc.
-lp
List of all projection id that can be used with the +proj parameter. Equivalent to cs2cs -l.
-lP
Expanded description of all projections that can be used with the +proj parameter.
-le
List of all ellipsoids that can be selected with the +ellps parameters.
52 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
-lu
List of all distance units that can be selected with the +units parameter.
-r
This options 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 options 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 a printf format 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, -w3 is assumed).
-W<n>
Where n is the number of significant fractional digits to employ for seconds output. When -W is employed the
fields will be constant width with leading zeroes.
-v
Causes a listing of cartographic control parameters tested for and used by the program to be printed prior to
input data.
The cs2cs program requires two coordinate reference system (CRS) definitions. The first (or primary is defined
based on all projection parameters not appearing after the +to argument. All projection parameters appearing after the
+to argument are considered the definition of the second CRS. 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 of
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 a 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 oper-
ation, so implementation details of this function directly impact the results returned by the program.
The environment parameter PROJ_LIB 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.
6.2. cs2cs 53
PROJ coordinate transformation software library, Release 7.1.1
6.2.3 Examples
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:
Transforming from WGS 84 latitude/longitude (in that order) to UTM Zone 31N/WGS 84
outputs
Transforming from WGS 84 latitude/longitude (in that order) with EGM96 height to UTM Zone 31N/WGS 84 with
WGS84 ellipsoidal height
outputs
54 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
6.3 geod
6.3.1 Synopsis
6.3.2 Description
geod (direct) and invgeod (inverse) perform geodesic (Great Circle) computations for determining latitude, longi-
tude and back azimuth of a terminus point given a initial point latitude, longitude, azimuth and distance (direct) or the
forward and back azimuths and distance between an initial and terminus point latitudes and longitudes (inverse). The
results are accurate to round off for |𝑓 | < 1/50, where 𝑓 is flattening.
invgeod may not be available on all platforms; in this case use geod -I instead.
The following command-line options can appear in any order:
-I
Specifies that the inverse geodesic computation is to be performed. May be used with execution of geod as an
alternative to invgeod execution.
-a
Latitude and longitudes of the initial and terminal points, forward and back azimuths and distance are output.
-t<a>
Where a specifies a character employed as the first character to denote a control line to be passed through without
processing.
-le
Gives a listing of all the ellipsoids that may be selected with the +ellps= option.
-lu
Gives a listing of all the units that may be selected with the +units= option.
-f <format>
Where format is a printf format string to control the output form of the geographic coordinate values. The
default mode is DMS for geographic coordinates and "%.3f" for distance.
-F <format>
Where format is a printf format string to control the output form of the distance value (-F). The default mode is
DMS for geographic coordinates and "%.3f" for distance.
-w<n>
Where n is the number of significant fractional digits to employ for seconds output (when the option is not
specified, -w3 is assumed).
-W<n>
Where n is the number of significant fractional digits to employ for seconds output. When -W is employed the
fields will be constant width with leading zeroes.
-p
This option causes the azimuthal values to be output as unsigned DMS numbers between 0 and 360 degrees.
Also note -f.
The +opt command-line options are associated with geodetic parameters for specifying the ellipsoidal or sphere to
use. controls. The options are processed in left to right order from the command line. Reentry of an option is ignored
with the first occurrence assumed to be the desired value.
6.3. geod 55
PROJ coordinate transformation software library, Release 7.1.1
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 direct determinations input data must be in latitude, longitude, azimuth and distance order and output will be
latitude, longitude and back azimuth of the terminus point. Latitude, longitude of the initial and terminus point are
input for the inverse mode and respective forward and back azimuth from the initial and terminus points are output
along with the distance between the points.
Input geographic coordinates (latitude and longitude) and azimuthal data must be in decimal degrees or DMS format
and input distance data must be in units consistent with the ellipsoid major axis or sphere radius units. The latitude
must lie in the range [-90d,90d]. Output geographic coordinates will be in DMS (if the -f switch is not employed) to
0.001” with trailing, zero-valued minute-second fields deleted. Output distance data will be in the same units as the
ellipsoid or sphere radius.
The Earth’s ellipsoidal figure may be selected in the same manner as program proj by using +ellps=, +a=, +es=,
etc.
geod may also be used to determine intermediate points along either a geodesic line between two points or along an
arc of specified distance from a geographic point. In both cases an initial point must be specified with +lat_1=lat and
+lon_1=lon parameters and either a terminus point +lat_2=lat and +lon_2=lon or a distance and azimuth from the
initial point with +S=distance and +A=azimuth must be specified.
If points along a geodesic are to be determined then either +n_S=integer specifying the number of intermediate points
and/or +del_S=distance specifying the incremental distance between points must be specified.
To determine points along an arc equidistant from the initial point both +del_A=angle and +n_A=integer must be
specified which determine the respective angular increments and number of points to be determined.
6.3.3 Examples
The following script determines the geodesic azimuths and distance in U.S. statute miles from Boston, MA, to Portland,
OR:
where the first two values are the azimuth from Boston to Portland, the back azimuth from Portland to Boston followed
by the distance.
An example of forward geodesic use is to use the Boston location and determine Portland’s location by azimuth and
distance:
which gives:
Note: Lack of precision in the distance value compromises the precision of the Portland location.
56 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
1. GeographicLib.
2. C. F. F. Karney, Algorithms for Geodesics, J. Geodesy 87(1), 43–55 (2013); addenda.
3. A geodesic bibliography.
6.4 gie
6.4.1 Synopsis
6.4.2 Description
gie, the Geospatial Integrity Investigation Environment, is a regression testing environment for the PROJ transforma-
tion library. Its primary design goal is to be able to perform regression testing of code that are a part of PROJ, while
not requiring any other kind of tooling than the same C compiler already employed for compiling the library.
-h, --help
Print usage information
-o <file>, --output <file>
Specify output file name
-v, --verbose
Verbose: Provide non-essential informational output. Repeat -v for more verbosity (e.g. -vv)
-q, --quiet
Quiet: Opposite of verbose. In quiet mode not even errors are reported. Only interaction is through the return
code (0 on success, non-zero indicates number of FAILED tests)
-l, --list
List the PROJ internal system error codes
--version
Print version number
Tests for gie are defined in simple text files. Usually having the extension .gie. Test for gie are written in
the purpose-build command language for gie. The basic functionality of the gie command language is implemented
through just 3 command verbs: operation, which defines the PROJ operation to test, accept, which defines the
input coordinate to read, and expect, which defines the result to expect.
A sample test file for gie that uses the three above basic commands looks like:
<gie>
--------------------------------------------
Test output of the UTM projection
--------------------------------------------
operation +proj=utm +zone=32 +ellps=GRS80
--------------------------------------------
accept 12 55
expect 691_875.632_14 6_098_907.825_05
</gie>
6.4. gie 57
PROJ coordinate transformation software library, Release 7.1.1
Parsing of a gie file starts at <gie> and ends when </gie> is reached. Anything before <gie> and after </gie>
is not considered. Test cases are created by defining an operation which accept an input coordinate and expect
an output coordinate.
Because gie tests are wrapped in the <gie>/</gie> tags it is also possible to add test cases to custom made init
files. The tests will be ignore by PROJ when reading the init file with +init and gie ignores anything not wrapped in
<gie>/</gie>.
gie tests are defined by a set of commands like operation, accept and expect in the example above. Together
the commands make out the gie command language. Any line in a gie file that does not start with a command is
ignored. In the example above it is seen how this can be used to add comments and styling to gie test files in order to
make them more readable as well as documenting what the purpose of the various tests are.
Below the gie command language is explained in details.
6.4.3 Examples
operation <+args>
Define a PROJ operation to test. Example:
# test 2D function
accept 12 56
expect 687071.4391 6210141.3267
58 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
See gie --list for a list of error codes that can be expected.
tolerance <tolerance>
The tolerance command controls how much accepted coordinates can deviate from the expected coordinate.
This is handy to test that an operation meets a certain numerical tolerance threshold. Some operations are ex-
pected to be accurate within millimeters where others might only be accurate within a few meters. tolerance
should
operation proj=merc
# test coordinate as returned by ```echo 12 55 | proj +proj=merc``
tolerance 1 cm
accept 12 55
expect 1335833.89 7326837.72
The default tolerance is 0.5 mm. See proj -lu for a list of possible units.
roundtrip <n> <tolerance>
Do a roundtrip test of an operation. roundtrip needs a operation and a accept command to function.
The accepted coordinate is passed to the operation first in it’s forward mode, then the output from the forward
operation is passed back to the inverse operation. This procedure is done n times. If the resulting coordinate is
within the set tolerance of the initial coordinate, the test is passed.
Example with the default 100 iterations and the default tolerance:
operation proj=merc
accept 12 55
roundtrip
operation proj=merc
accept 12 55
roundtrip 10000
operation proj=merc
accept 12 55
roundtrip 10000 5 mm
direction <direction>
The direction command specifies in which direction an operation is performed. This can either be forward
6.4. gie 59
PROJ coordinate transformation software library, Release 7.1.1
or inverse. An example of this is seen below where it is tested that a symmetrical transformation pipeline
returns the same results in both directions.
accept 12 55 0 0
expect 12 55 0 0
# Now the inverse direction (still same result: the pipeline is symmetrical)
direction inverse
expect 12 55 0 0
See gie --list for a list of error codes that can be ignored.
require_grid <grid_name>
Checks the availability of the grid <grid_name>. If it is not found, then all accept/expect pairs until the next
operation will be skipped. require_grid can be repeated several times to specify several grids whose
presence is required.
echo <text>
Add user defined text to the output stream. See the example below.
<gie>
echo ** Mercator projection tests **
operation +proj=merc
accept 0 0
expect 0 0
</gie>
which returns
-------------------------------------------------------------------------------
Reading file 'test.gie'
** Mercator projection test **
-------------------------------------------------------------------------------
total: 1 tests succeeded, 0 tests skipped, 0 tests failed.
-------------------------------------------------------------------------------
skip
Skip any test after the first occurrence of skip. In the example below only the first test will be performed. The
second test is skipped. This feature is mostly relevant for debugging when writing new test cases.
60 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
<gie>
operation proj=merc
accept 0 0
expect 0 0
skip
accept 0 1
expect 0 110579.9
</gie>
<gie-strict>
# This is a comment. The following line with multiple repeated characters too
-------------------------------------------------
# A command on several lines must use " \" continuation
operation proj=hgridshift +grids=nzgd2kgrid0005.gsb \
ellps=GRS80
tolerance 1 mm
ignore pjd_err_failed_to_load_grid
accept 172.999892181021551 -45.001620431954613
expect 173 -45
</gie-strict>
6.4.6 Background
More importantly than being an acronym for “Geospatial Integrity Investigation Environment”, gie were also the
initials, user id, and USGS email address of Gerald Ian Evenden (1935–2016), the geospatial visionary, who, already
in the 1980s, started what was to become the PROJ of today.
Gerald’s clear vision was that map projections are just special functions. Some of them rather complex, most of them
of two variables, but all of them just special functions, and not particularly more special than the sin(), cos(),
tan(), and hypot() already available in the C standard library.
And hence, according to Gerald, they should not be particularly much harder to use, for a programmer, than the
sin()’s, tan()’s and hypot()’s so readily available.
Gerald’s ingenuity also showed in the implementation of the vision, where he devised a comprehensive, yet simple,
system of key-value pairs for parameterising a map projection, and the highly flexible PJ struct, storing run-time
compiled versions of those key-value pairs, hence making a map projection function call, pj_fwd(PJ, point),
as easy as a traditional function call like hypot(x,y).
While today, we may have more formally well defined metadata systems (most prominent the OGC WKT2 representa-
tion), nothing comes close being as easily readable (“human compatible”) as Gerald’s key-value system. This system
in particular, and the PROJ system in general, was Gerald’s great gift to anyone using and/or communicating about
geodata.
It is only reasonable to name a program, keeping an eye on the integrity of the PROJ system, in honour of Gerald.
6.4. gie 61
PROJ coordinate transformation software library, Release 7.1.1
So in honour, and hopefully also in the spirit, of Gerald Ian Evenden (1935–2016), this is the Geospatial Integrity
Investigation Environment.
6.5 proj
6.5.1 Synopsis
6.5.2 Description
proj and invproj perform respective forward and inverse conversion of cartographic data to or from cartesian data
with a wide range of selectable projection functions.
invproj may not be available on all platforms; in this case use proj -I instead.
The following control parameters can appear in any order
-b
Special option for binary coordinate data input and output through standard input and standard output. Data
is assumed to be in system type double floating point words. This option is to be used when proj is a child
process and allows bypassing formatting operations.
-d <n>
New in version 5.2.0: Specify the number of decimals in the output.
-i
Selects binary input only (see -b).
-I
Alternate method to specify inverse projection. Redundant when used with invproj.
-o
Selects binary output only (see -b).
-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).
-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*. Note that if the -b, -i or -o options are employed, an error is returned
as HUGE_VAL value for both return values.
-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. proj -l=id gives expanded description of projec-
tion id, e.g. proj -l=merc.
-lp
List of all projection id that can be used with the +proj parameter. Equivalent to proj -l.
-lP
Expanded description of all projections that can be used with the +proj parameter.
62 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
-le
List of all ellipsoids that can be selected with the +ellps parameters.
-lu
List of all distance units that can be selected with the +units parameter.
-r
This options reverses the order of the expected input from longitude-latitude or x-y to latitude-longitude or y-x.
-s
This options reverses the order of the output from x-y or longitude-latitude to y-x or latitude-longitude.
-S
Causes estimation of meridional and parallel scale factors, area scale factor and angular distortion, and maximum
and minimum scale factors to be listed between <> for each input point. For conformal projections meridional
and parallel scales factors will be equal and angular distortion zero. Equal area projections will have an area
factor of 1.
-m <mult>
The cartesian data may be scaled by the mult parameter. When processing data in a forward projection mode the
cartesian output values are multiplied by mult otherwise the input cartesian values are divided by mult before
inverse projection. If the first two characters of mult are 1/ or 1: then the reciprocal value of mult is employed.
-f <format>
Where format is a printf format string to control the form of the output values. For inverse projections, the
output will be in degrees when this option is employed. 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, -w3 is assumed).
-W<n>
Where n is the number of significant fractional digits to employ for seconds output. When -W is employed the
fields will be constant width with leading zeroes.
-v
Causes a listing of cartographic control parameters tested for and used by the program to be printed prior to
input data.
-V
This option causes an expanded annotated listing of the characteristics of the projected point. -v is implied
with this option.
The +opt run-line arguments are associated with cartographic parameters. Additional projection control parameters
may be contained in two auxiliary control files: the first is optionally referenced with the +init=file:id and the second
is always processed after the name of the projection has been established from either the run-line or the contents of
+init file. The environment parameter PROJ_LIB establishes the default directory for a file reference without an
absolute path. This is also used for supporting files like datum shift files.
One or more files (processed in left to right order) specify the source of data to be converted. A - will specify the
location of processing standard input. If no files are specified, the input is assumed to be from stdin. For ASCII 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
be in DMS (if the -w switch is not employed) and precise to 0.001” with trailing, zero-valued minute-second fields
deleted.
6.5. proj 63
PROJ coordinate transformation software library, Release 7.1.1
6.5.3 Example
will perform UTM forward projection with a standard UTM central meridian nearest longitude 112W. 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:
460769.27 5011648.45
6.6 projinfo
6.6.1 Synopsis
projinfo
[-o formats] [-k crs|operation|datum|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]
[–boundcrs-to-wgs84]
[–main-db-path path] [–aux-db-path path]*
[–identify] [–3d]
[–c-ify] [–single-line]
–searchpaths | –remote-data | {object_definition} |
{object_reference} | (-s {srs_def} -t {srs_def})
64 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
6.6.2 Description
projinfo is a program that can query information on a geodetic object, coordinate reference system (CRS) or
coordinate operation, when the -s and -t options are specified, and display it under different formats (PROJ string,
WKT string or PROJJSON string).
It can also be used to query coordinate operations available between two CRS.
The program is named with some reference to the GDAL gdalsrsinfo that offers partly similar services.
The following control parameters can appear in any order:
-o formats
formats is a comma separated combination of: all, default, PROJ, WKT_ALL, WKT2:2015, WKT2:2019,
WKT1:GDAL, WKT1:ESRI, PROJJSON.
Except all and default, other formats can be preceded by - to disable them.
Note: Before PROJ 6.3.0, WKT1:GDAL was implicitly calling –boundcrs-to-wgs84. This is no longer the
case.
-k crs|operation|datum|ellipsoid
When used to query a single object with a AUTHORITY:CODE, determines the (k)ind of the object in case
there are CRS, coordinate operations or ellipsoids with the same CODE. The default is crs.
--summary
When listing coordinate operations available between 2 CRS, return the result in a summary format, mentioning
only the name of the coordinate operation, its accuracy and its area of use.
-q
Turn 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 of being piped in other utilities.
--area name_or_code
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 a AUTHORITY:CODE (EPSG:3237)
This option is exclusive of --bbox.
6.6. projinfo 65
PROJ coordinate transformation software library, Release 7.1.1
--bbox west_long,south_lat,east_long,north_lat
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_long and east_long should be in the [-180,180] range, and south_lat and north_lat in the
[-90,90]. west_long is generally lower than east_long, except in the case where the area of interest crosses the
antimeridian.
--spatial-test contains|intersects
Specify how the area of use of coordinate operations found in the database are compared to the area of use
specified explicitly with --area or --bbox, or derived implicitly from the area of use of the source and
target CRS. By default, projinfo will only keep coordinate operations whose are of use is strictly within the
area of interest (contains strategy). If using the intersects strategy, the spatial test is relaxed, and any
coordinate operation whose area of use at least partly intersects the area of interest is listed.
--crs-extent-use none|both|intersection|smallest
Specify which area of interest to consider when no explicit one is specified with --area or --bbox options.
By default (smallest strategy), the area of use of the source or target CRS will be looked, and the one that is
the smallest one in terms of area will be used as the area of interest. If using none, no area of interest is used. If
using both, only coordinate operations that relate (contain or intersect depending of the --spatial-test
strategy) to the area of use of both CRS are selected. If using intersection, the area of interest is the
intersection of the bounding box of the area of use of the source and target CRS
--grid-check none|discard_missing|sort|known_available
Specify 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 is sort
(if PROJ_NETWORK is 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 the PROJ_LIB environment variable, it will be
listed in the bottom of the results. The none strategy completely disables the checks of presence of grids and
this returns the results as if all the grids where available. The discard_missing strategy discards results
that involve grids not present in the PROJ resource directories. The known_available strategy 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 is PROJ_NETWORK is set to ON.
--pivot-crs always|if_no_direct_transformation|never|{auth:code[,auth:code]*}
Determine if intermediate (pivot) CRS can be used when researching coordinate operation between 2 CRS. A
typical example is the WGS84 pivot. By default, projinfo will consider any potential pivot if there is no direct
transformation ( if_no_direct_transformation). If using the never strategy, only direct transforma-
66 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
tions between the source and target CRS will be used. If using the always strategy, 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 their AUTHORITY:CODE.
--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.
--hide-ballpark
New in version 7.1.
Hides any coordinate operation that is, or contains, a Ballpark transformation
--boundcrs-to-wgs84
When specified, this option researches a coordinate operation from the base geographic CRS of the single CRS,
source or target CRS to the WGS84 geographic CRS, and if found, wraps those CRS into a BoundCRS object.
This is mostly to be used for early-binding approaches.
--main-db-path path
Specify the name and path of the database to be used by projinfo. The default is proj.db in the PROJ resource
directories.
--aux-db-path path
Specify the name and path of auxiliary databases, that are to be combined with the main database. Those
auxiliary databases must have a table structure that is identical to the main database, but can be partly filled and
their entries can refer to entries of the main database. The option may be repeated to specify several auxiliary
databases.
--identify
When used with an object definition, this queries the PROJ database to find known objects, typically CRS,
that are close or identical to the object. Each candidate object is associated with an approximate likelihood
percentage. This is useful when used with a WKT string that lacks a EPSG identifier, such as ESRI WKT1.
This might also be used with PROJ strings. For example, +proj=utm +zone=31 +datum=WGS84 +type=crs
will be identified with a likelihood of 70% to EPSG:32631
--3d
New in version 6.3.
“Promote” the CRS(s) to their 3D version. In the context of researching available coordinate transformations,
explicitly specifying this option is not necessary, because when one of the source or target CRS has a vertical
component but not the other one, the one that has no vertical component is automatically promoted to a 3D
version, where its vertical axis is the ellipsoidal height in metres, using the ellipsoid of the base geodetic CRS.
--c-ify
For developers only. Modify the string output of the utility so that it is easy to put those strings in C/C++ code
--single-line
Output WKT or PROJJSON strings on a single line, instead of multiple intended lines by default.
6.6. projinfo 67
PROJ coordinate transformation software library, Release 7.1.1
--searchpaths
New in version 7.0.
Output the directories into which PROJ resources will be looked for (if not using C API such as
proj_context_set_search_paths() that will override them.
--remote-data
New in version 7.0.
Display information regarding if Network capabilities is enabled, and the related URL.
6.6.3 Examples
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]]
2. List the coordinate operations between NAD27 (designed with its CRS name) and NAD83 (designed with its
EPSG code 4269) within an area of interest
Output:
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:
(continues on next page)
68 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
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": {
(continues on next page)
6.6. projinfo 69
PROJ coordinate transformation software library, Release 7.1.1
6.7 projsync
6.7.1 Synopsis
projsync
[–endpoint URL]
[–local-geojson-file FILENAME]
([–user-writable-directory] | [–system-directory] | [–target-dir DIRNAME])
[–bbox west_long,south_lat,east_long,north_lat]
[–spatial-test contains|intersects]
[–source-id ID] [–area-of-use NAME]
[–file NAME]
[–all] [–exclude-world-coverage]
[–quiet] [–dry-run] [–list-files]
70 Chapter 6. Applications
PROJ coordinate transformation software library, Release 7.1.1
6.7.2 Description
projsync is a program that downloads remote resource files into a local directory. This is an alternative to down-
loading a proj-data-X.Y.Z archive file, or using the on-demand networking capabilities of PROJ.
The following control parameters can appear in any order:
--endpoint URL
Defines the URL where to download the master files.geojson file and then the resource files. Defaults to
the value set in proj.ini
--local-geojson-file FILENAME
Defines the filename for the master GeoJSON files that references resources. Defaults to ${end-
point}/files.geojson
--user-writable-directory
Specifies that resource files must be downloaded in the user writable directory. This is the default.
--system-directory
Specifies that resource files must be downloaded in the ${installation_prefix}/share/proj directory. The user
launching projsync should make sure it has writing rights in that directory.
--target-dir DIRNAME
Directory into which resource files must be downloaded.
--bbox west_long,south_lat,east_long,north_lat
Specify an area of interest to restrict the resources to download. The area of interest is specified as a bound-
ing box with geographic coordinates, expressed in degrees in a unspecified geographic CRS. west_long and
east_long should be in the [-180,180] range, and south_lat and north_lat in the [-90,90]. west_long is generally
lower than east_long, except in the case where the area of interest crosses the antimeridian.
--spatial-test contains|intersects
Specify how the extent of the resource files are compared to the area of use specified explicitly with --bbox.
By default, any resource files whose extent intersects the value specified by --bbox will be selected. If using
the contains strategy, only resource files whose extent is contained in the value specified by --bbox will be
selected.
--source-id ID
Restrict resource files to be downloaded to those whose source_id property contains the ID value. Specifying ?
as ID will list all possible values.
--area-of-use NAME
Restrict resource files to be downloaded to those whose area_of_use property contains the NAME value. Spec-
ifying ? as NAME will list all possible values.
--file NAME
Restrict resource files to be downloaded to those whose name property contains the NAME value. Specifying ?
as NAME will list all possible values.
--all
Ask to download all files.
--exclude-world-coverage
Exclude files which have world coverage.
-q / --quiet
Quiet mode
--dry-run
Simulate the behavior of the tool without downloading resource files.
6.7. projsync 71
PROJ coordinate transformation software library, Release 7.1.1
--list-files
List file names, with the source_id and area_of_use properties.
At least one of --list-files, --file, --source-id, --area-of-use, --bbox or --all must be spec-
ified.
Options --file, --source-id, --area-of-use and --bbox are combined with a AND logic.
6.7.3 Examples
projsync --all
72 Chapter 6. Applications
CHAPTER
SEVEN
COORDINATE OPERATIONS
Coordinate operations in PROJ are divided into three groups: Projections, conversions and transformations. Projec-
tions are purely cartographic mappings of the sphere onto the plane. Technically projections are conversions (according
to ISO standards), though in PROJ projections are distinguished from conversions. Conversions are coordinate oper-
ations that do not exert a change in reference frame. Operations that do exert a change in reference frame are called
transformations.
7.1 Projections
Projections are coordinate operations that are technically conversions but since projections are so fundamental to PROJ
we differentiate them from conversions.
Projections map the spherical 3D space to a flat 2D space.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias adams_hemi
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.1.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
73
PROJ coordinate transformation software library, Release 7.1.1
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias adams_ws1
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.2.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward and inverse, spherical
Defined area Global
Alias adams_ws2
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1. Projections 75
PROJ coordinate transformation software library, Release 7.1.1
7.1. Projections 77
PROJ coordinate transformation software library, Release 7.1.1
7.1.3.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Conic
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias aea
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.4.1 Options
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1. Projections 79
PROJ coordinate transformation software library, Release 7.1.1
Classification Azimuthal
Available forms Forward and inverse, spherical and ellipsoidal
Alias aeqd
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.5.1 Options
Note: All options are optional for the Azimuthal Equidistant projection.
+guam
Use Guam ellipsoidal formulas. Only accurate near the Island of Guam (𝜆 ≈ 144.5∘ , 𝜑 ≈ 13.5∘ )
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+lat_ts=<value>
Latitude of true scale. Defines the latitude where scale is not distorted. Takes precedence over +k_0 if both
options are used together.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
7.1.6 Airy
The Airy projection is an azimuthal minimum error projection for the region within the small or great circle defined
by an angular distance, 𝜑𝑏 , from the tangency point of the plane (𝜆0 , 𝜑0 ).
Classification Azimuthal
Available forms Forward spherical projection
Defined area Global
Alias airy
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1. Projections 81
PROJ coordinate transformation software library, Release 7.1.1
7.1.6.1 Options
+lat_b
Angular distance from tangency point of the plane (𝜆0 , 𝜑0 ) where the error is kept at minimum.
Defaults to 90° (suitable for hemispherical maps).
+no_cut
Do not cut at hemisphere limit
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
7.1.7 Aitoff
Classification Miscellaneous
Available forms Forward and inverse spherical projection
Defined area Global
Alias aitoff
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.7.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
7.1. Projections 83
PROJ coordinate transformation software library, Release 7.1.1
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.8.1 Options
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
7.1. Projections 85
PROJ coordinate transformation software library, Release 7.1.1
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias apian
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.9.1 Options
Note: All options are optional for the Apian Globular projection.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias august
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1. Projections 87
PROJ coordinate transformation software library, Release 7.1.1
7.1.10.1 Parameters
Note: All options are optional for the August Epicycloidal projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias bacon
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.11.1 Parameters
Note: All parameters are optional for the Bacon Globular projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward, spherical projection
Defined area Global
Alias bertin1953
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
The Bertin 1953 projection is intended for making world maps. Created by Jacques Bertin in 1953, this projection was
the go-to choice of the French cartographic school when they wished to represent phenomena on a global scale. The
projection was formulated in 2017 by Philippe Rivière for visionscarto.net.
7.1.12.1 Usage
The Bertin 1953 projection has no special options. Its rotation parameters are fixed. Here is an example of a forward
projection with scale 1:
$ echo 122 47 | src/proj +proj=bertin1953 +R=1 0.72 0.73
7.1. Projections 89
PROJ coordinate transformation software library, Release 7.1.1
7.1.12.2 Parameters
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward and inverse spherical projection
Defined area Global
Alias bipc
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1. Projections 91
PROJ coordinate transformation software library, Release 7.1.1
7.1.13.1 Parameters
Note: All options are optional for the Bipolar Conic projection.
+ns
Return non-skewed cartesian coordinates.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward spherical projection
Defined area Global
Alias boggs
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.14.1 Parameters
Note: All options are optional for the Boggs Eumorphic projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias bonne
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1. Projections 93
PROJ coordinate transformation software library, Release 7.1.1
7.1.15.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The CalCOFI pseudo-projection is the line and station coordinate system of the California Cooperative Oceanic Fish-
eries Investigations program, known as CalCOFI, for sampling offshore of the west coast of the U.S. and Mexico.
The coordinate system is based on the Mercator projection with units rotated -30 degrees from the meridian so that they
are oriented with the coastline of the Southern California Bight and Baja California. Lines increase from Northwest
to Southeast. A unit of line is 12 nautical miles. Stations increase from inshore to offshore. A unit of station is equal
to 4 nautical miles. The rotation point is located at line 80, station 60, or 34.15 degrees N, -121.15 degrees W, and
is depicted by the red dot in the figure. By convention, the ellipsoid of Clarke 1866 is used to calculate CalCOFI
coordinates.
The CalCOFI program is a joint research effort by the U.S. National Oceanic and Atmospheric Administration, Uni-
versity of California Scripps Oceanographic Institute, and California Department of Fish and Game. Surveys have
been conducted for the CalCOFI program since 1951, creating one of the oldest and most scientifically valuable joint
oceanographic and fisheries data sets in the world. The CalCOFI line and station coordinate system is now used by
several other programs including the Investigaciones Mexicanas de la Corriente de California (IMECOCAL) program
offshore of Baja California. The figure depicts some commonly sampled locations from line 40 to line 156.7 and
offshore to station 120. Blue numbers indicate line (bottom) or station (left) numbers along the grid. Note that lines
spaced at approximate 3-1/3 intervals are commonly sampled, e.g., lines 43.3 and 46.7.
7.1. Projections 95
PROJ coordinate transformation software library, Release 7.1.1
7.1.16.1 Usage
A typical forward CalCOFI projection would be from lon/lat coordinates on the Clark 1866 ellipsoid. For example:
The reverse projection from line/station coordinates to lon/lat would be entered as:
7.1.16.2 Options
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
The algorithm used to make conversions is described in [EberHewitt1979] with a few corrections reported in
[WeberMoore2013].
Although the Cassini projection has been largely replaced by the Transverse Mercator, it is still in limited use outside
the United States and was one of the major topographic mapping projections until the early 20th century.
7.1.17.1 Usage
There has been little usage of the spherical version of the Cassini, but the ellipsoidal Cassini-Soldner version was
adopted by the Ordnance Survey for the official survey of Great Britain during the second half of the 19th century
[Steers1970]. Many of these maps were prepared at a scale of 1:2,500. The Cassini-Soldner was also used for the
detailed mapping of many German states during the same period.
Example using EPSG 30200 (Trinidad 1903, units in clarke’s links):
˓→+b=6356617.987679838 +to_meter=0.201166195164
66644.94 82536.22
31343.05 7932.76
7.1.17.2 Options
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
7.1. Projections 97
PROJ coordinate transformation software library, Release 7.1.1
+y_0=<value>
False northing.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
The formulas describing the Cassini projection are taken from [Snyder1987].
𝜑0 is the latitude of origin that match the center of the map (default to 0). It can be set with +lat_0.
Spherical form
Forward projection
𝑥 = arcsin(cos(𝜑) sin(𝜆))
Inverse projection
𝜑 = arcsin(sin(𝑦 + 𝜑0 ) cos(𝑥))
Ellipsoidal form
Forward projection
𝑁 = (1 − 𝑒2 sin2 (𝜑))−1/2
𝑇 = tan2 (𝜑)
𝐴 = 𝜆 cos(𝜑)
𝑒2
𝐶= 𝑐𝑜𝑠2 (𝜑)
1 − 𝑒2
𝐴3 𝐴5
𝑥 = 𝑁 (𝐴 − 𝑇 − (8 − 𝑇 + 8𝐶)𝑇 )
6 120
7.1. Projections 99
PROJ coordinate transformation software library, Release 7.1.1
𝐴2 𝐴4
𝑦 = 𝑀 (𝜑) − 𝑀 (𝜑0 ) + 𝑁 tan(𝜑)( + (5 − 𝑇 + 6𝐶) )
2 24
and M() is the meridional distance function.
Inverse projection
𝜑′ = 𝑀 −1 (𝑀 (𝜑0 ) + 𝑦)
if 𝜑′ = 𝜋
2 then 𝜑 = 𝜑′ and 𝜆 = 0
otherwise evaluate T and N above using 𝜑′ and
𝐷 = 𝑥/𝑁
𝑁 𝐷2 𝐷4
𝜑 = 𝜑′ − tan 𝜑′ ( − (1 + 3𝑇 ) )
𝑅 2 24
3 5
(𝐷 − 𝑇 𝐷3 + (1 + 3𝑇 )𝑇 𝐷
15 )
𝜆= ′
cos 𝜑
1. Wikipedia
2. EPSG, POSC literature pertaining to Coordinate Conversions and Transformations including Formulas
Classification Cylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias cc
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.18.1 Parameters
Note: All parameters are optional for the Central Cylindricla projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Conic
Available forms Forward and inverse, spherical projection
Defined area Global, but best used near the standard parallel
Alias ccon
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.19.1 Usage
This simple projection is rarely used, as it is not equidistant, equal-area, nor conformal.
An example of usage (and the main reason to implement this projection in proj4) is the ATPOL geobotanical grid of
Poland, developed in Institute of Botany, Jagiellonian University, Krakow, Poland in 1970s [Zajac1978]. The grid was
originally handwritten on paper maps and further copied by hand. The projection (together with strange Earth radius)
was chosen by its creators as the compromise fit to existing maps during first software development in DOS era. Many
years later it is still de facto standard grid in Polish geobotanical research.
The ATPOL coordinates can be achieved with with the following parameters:
7.1.19.2 Parameters
Required
+lat_1=<value>
Standard parallel of projection.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Forward projection
𝑟 = cot 𝜑0 − tan(𝜑 − 𝜑0 )
𝑥 = 𝑟 sin(𝜆 sin 𝜑0 )
Inverse projection
𝑦 = cot 𝜑0 − 𝑦
√︀
𝜑 = 𝜑0 − tan−1 ( 𝑥2 + 𝑦 2 − cot 𝜑0 )
√︀
tan−1 𝑥2 + 𝑦 2
𝜆=
sin 𝜑0
#!/bin/bash
cat << EOF | src/cs2cs -v -f "%E" +proj=ccon +lat_1=52 +lat_0=52 +lon_0=19 +axis=esu
˓→+a=6390000 +x_0=330000 +y_0=-350000 +to +proj=longlat
0 0
0 700000
700000 0
700000 700000
330000 350000
EOF
cat << EOF | src/cs2cs -v -f "%E" +proj=longlat +to +proj=ccon +lat_1=52 +lat_0=52
˓→+lon_0=19 +axis=esu +a=6390000 +x_0=330000 +y_0=-350000
24 55
15 49
24 49
19 52
EOF
Classification Cylindrical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias cea
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.20.1 Parameters
Note: All parameters are optional for the Equal Area Cylindrical projection.
+lat_ts=<value>
Latitude of true scale. Defines the latitude where scale is not distorted. Takes precedence over +k_0 if both
options are used together.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Note: lat_ts and k_0 are mutually exclusive. If lat_ts is specified, it is equivalent to setting k_0 to
√ cos 𝜑𝑡𝑠2
1−𝑒2 sin 𝜑𝑡𝑠
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias chamb
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.21.1 Parameters
Required
+lat_1=<value>
Latitude of the first control point.
+lon_1=<value>
Longitude of the first control point.
+lat_2=<value>
Latitude of the second control point.
+lon_2=<value>
Longitude of the second control point.
+lat_3=<value>
Latitude of the third control point.
+lon_3=<value>
Longitude of the third control point.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.22 Collignon
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias collg
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.22.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The Compact Miller projection is a cylindrical map projection with a height-to-width ratio of 0.6:1.
See [Jenny2015]
Classification Cylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias comill
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.23.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias crast
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.24.1 Parameters
Note: All parameters are optional for the Craster Parabolic projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias denoy
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.25.1 Parameters
Note: All parameters are optional for the Denoyer Semi-Elliptical projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.26 Eckert I
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias eck1
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
√︀
𝑥 = 2 2/3𝜋𝜆(1 − |𝜑|/𝜋)
√︀
𝑦 = 2 2/3𝜋𝜑
7.1.26.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.27 Eckert II
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias eck2
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.27.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias eck3
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.28.1 Parameters
Note: All parameters are optional for the Eckert III projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.29 Eckert IV
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias eck4
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
√
𝑥 = 𝜆(1 + 𝑐𝑜𝑠𝜑)/ 2 + 𝜋
√
𝑦 = 2𝜑/ 2 + 𝜋
7.1.29.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.30 Eckert V
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias eck5
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.30.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.31 Eckert VI
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias eck6
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.31.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The simplest of all projections. Standard parallels (0° when omitted) may be specified that determine latitude of true
scale (k=h=1).
7.1.32.1 Usage
Because of the distortions introduced by this projection, it has little use in navigation or cadastral mapping and finds
its main use in thematic mapping. In particular, the plate carrée has become a standard for global raster datasets, such
as Celestia and NASA World Wind, because of the particularly simple relationship between the position of an image
pixel on the map and its corresponding geographic location on Earth.
The following table gives special cases of the cylindrical equidistant projection.
222638.98 5232016.07
Example using Plate Carrée projection with true scale at latitude 30° and central meridian 90°W:
7.1.32.2 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+lat_ts=<value>
Latitude of true scale. Defines the latitude where scale is not distorted. Takes precedence over +k_0 if both
options are used together.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
The formulas describing the Equidistant Cylindrical projection are all taken from [Snyder1987].
𝜑𝑡𝑠 is the latitude of true scale, that mean the standard parallels where the scale of the projection is true. It can be set
with +lat_ts.
𝜑0 is the latitude of origin that match the center of the map. It can be set with +lat_0.
Forward projection
𝑥 = 𝜆 cos 𝜑𝑡𝑠
𝑦 = 𝜑 − 𝜑0
Inverse projection
𝜆 = 𝑥/𝑐𝑜𝑠𝜑𝑡𝑠
𝜑 = 𝑦 + 𝜑0
1. Wikipedia
2. Wolfram Mathworld
Classification Conic
Available forms Forward and inverse, ellipsoidal
Defined area Global
Alias eqdc
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.33.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The Equal Earth projection is intended for making world maps. Equal Earth is a projection inspired by the Robinson
projection, but unlike the Robinson projection retains the relative size of areas. The projection was designed in 2018
by Bojan Savric, Tom Patterson and Bernhard Jenny [Savric2018].
7.1.34.1 Usage
The Equal Earth projection has no special options. Here is an example of an forward projection on a sphere with a
radius of 1 m:
7.1.34.2 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
1. Bojan Savric, Tom Patterson & Bernhard Jenny (2018). The Equal Earth map projection, International Journal
of Geographical Information Science
7.1.35 Euler
Classification Miscellaneous
Available forms Forward and inverse, spherical projection
Defined area Global
Alias euler
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.35.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.36 Fahey
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias fahey
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.36.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.37 Foucaut
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias fouc
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.37.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias fouc_s
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
The y-axis is based upon a weighted mean of the cylindrical equal-area and the sinusoidal projections. Parameter
𝑛 = 𝑛 is the weighting factor where 0 <= 𝑛 <= 1.
For the inverse, the Newton-Raphson method can be used to determine 𝜑 from the equation for 𝑦 above. As 𝑛 → 0
and 𝜑 → 𝜋/2, convergence is slow but for 𝑛 = 0, 𝜑 = sin1 𝑦
7.1.38.1 Parameters
Note: All parameters are optional for the Foucaut Sinusoidal projection.
+n=<value>
Weighting factor. Value should be in the interval 0-1.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The Gall stereographic projection, presented by James Gall in 1855, is a cylindrical projection. It is neither equal-area
nor conformal but instead tries to balance the distortion inherent in any projection.
7.1.39.1 Usage
The need for a world map which avoids some of the scale exaggeration of the Mercator projection has led to some
commonly used cylindrical modifications, as well as to other modifications which are not cylindrical. The earliest
common cylindrical example was developed by James Gall of Edinburgh about 1855 (Gall, 1885, p. 119-123). His
meridians are equally spaced, but the parallels are spaced at increasing intervals away from the Equator. The parallels
of latitude are actually projected onto a cylinder wrapped about the sphere, but cutting it at lats. 45° N. and S., the
point of perspective being a point on the Equator opposite the meridian being projected. It is used in several British
atlases, but seldom in the United States. The Gall projection is neither conformal nor equal-area, but has a blend of
various features. Unlike the Mercator, the Gall shows the poles as lines running across the top and bottom of the map.
Example using Gall Stereographical
7.1.39.2 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
The formulas describing the Gall Stereographical are all taken from [Snyder1993].
Spherical form
Forward projection
𝜆
𝑥= √
2
√
2
𝑦 = (1 + ) tan(𝜑/2)
2
Inverse projection
𝑦
𝜑 = 2 arctan( √ )
2
1+ 2
√
𝜆= 2𝑥
1. Wikipedia
2. Cartographic Projection Procedures for the UNIX Environment-A User’s Manual
The geos projection pictures how a geostationary satellite scans the earth at regular scanning angle intervals.
Classification Azimuthal
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias geos
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.40.1 Usage
In order to project using the geos projection you can do the following:
The required argument h is the viewing point (satellite position) height above the earth.
The projection coordinate relate to the scanning angle by the following simple relation:
The viewing instrument on-board geostationary satellites described by this projection have a two-axis gimbal viewing
geometry. This means that the different scanning positions are obtained by rotating the gimbal along a N/S axis (or y)
and a E/W axis (or x).
In the image above, the outer-gimbal axis, or sweep-angle axis, is the N/S axis (y) while the inner-gimbal axis, or
fixed-angle axis, is the E/W axis (x).
This example represents the scanning geometry of the Meteosat series satellite. However, the GOES satellite series
use the opposite scanning geometry, with the E/W axis (x) as the sweep-angle axis, and the N/S (y) as the fixed-angle
axis.
The sweep argument is used to tell PROJ which on which axis the outer-gimbal is rotating. The possible values are
x or y, y being the default. Thus, the scanning geometry of the Meteosat series satellite should take sweep as y, and
GOES should take sweep as x.
7.1.40.2 Parameters
Required
+h=<value>
Height of the view point above the Earth and must be in the same units as the radius of the sphere or semimajor
axis of the ellipsoid.
Optional
+sweep=<axis>
Sweep angle axis of the viewing instrument. Valid options are “x” and “y”.
Defaults to “y”.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward spherical projection
Defined area Global
Alias gins8
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.41.1 Parameters
Note: All parameters are optional for the Ginsburg VIII projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias gn_sinu
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.42.1 Parameters
Note: All parameters are optional for the General Sinusoidal Series projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.43 Gnomonic
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias gnom
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.43.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias goode
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.44.1 Parameters
Note: All parameters are optional for the Goode Homolosine projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward and inverse, spherical and ellipsoidal
Defined area The lower 48 states of the U.S.
Alias gs48
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.45.1 Parameters
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward and inverse, spherical and ellipsoidal
Defined area All 50 states of the U.S.
Alias gs50
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.46.1 Parameters
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.47 Guyou
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias guyou
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.47.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward and inverse, spherical projection
Defined area Global
Alias hammer
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.48.1 Parameters
+W=<value>
Set to 0.5 for the Hammer projection and 0.25 for the Eckert-Greifendorff projection. +W has to be larger than
zero.
Defaults to 0.5.
+M=<value>
+M has to be larger than zero.
Defaults to 1.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.49.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Mathematical Definition
Forward
𝑥 = 0.85𝜆 cos 𝜃
𝑦 = 𝐶𝑦 sin 𝜃
𝑃 (𝜃) = 2𝜃 + sin 2𝜃 − 𝐶𝑝 sin 𝜑
𝑃 ′ (𝜃) = 2(1 + cos 2𝜃)
𝜃0 = 2𝜑
Condition 𝐶𝑦 𝐶𝑝
For 𝜑 > 0 1.75859 2.67595
For 𝜑 < 0 1.93052 2.43763
Further reading
7.1.50 HEALPix
Classification Miscellaneous
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias healpix
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
The HEALPix projection is area preserving and can be used with a spherical and ellipsoidal model. It was initially
developed for mapping cosmic background microwave radiation. The image below is the graphical representation
of the mapping and consists of eight isomorphic triangular interrupted map graticules. The north and south contains
four in which straight meridians converge polewards to a point and unequally spaced horizontal parallels. HEALPix
provides a mapping in which points of equal latitude and equally spaced longitude are mapped to points of equal
latitude and equally spaced longitude with the module of the polar interruptions.
7.1.50.1 Usage
To run a forward HEALPix projection on a unit sphere model, use the following command:
7.1.50.2 Parameters
+rot_xy
New in version 6.3.0.
Rotation of the HEALPix map in degrees. A positive value results in a clockwise rotation around (x_0, y_0) in
the cartesian / projected coordinate space.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
1. NASA
2. Wikipedia
7.1.51 rHEALPix
Classification Miscellaneous
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias rhealpix
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
rHEALPix is a projection based on the HEALPix projection. The implementation of rHEALPix uses the HEALPix
projection. The rHEALPix combines the peaks of the HEALPix into a square. The square’s position can be translated
and rotated across the x-axis which is a novel approach for the rHEALPix projection. The initial intention of using
rHEALPix in the Spatial Computation Engine Science Collaboration Environment (SCENZGrid).
7.1.51.1 Usage
To run a rHEALPix projection on a WGS84 ellipsoidal model, use the following command:
7.1.51.2 Parameters
+north_square
Position of the north polar square. Valid inputs are 0–3.
Defaults to 0.0.
+south_square
Position of the south polar square. Valid inputs are 0–3.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
1. NASA
2. Wikipedia
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias igh
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.52.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias igh_o
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.53.1 Parameters
Note: All parameters are optional for the projection. A value of +lon_0=-160 is recommended.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudoconical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias imw_p
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.54.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Snyder’s Icosahedral Equal Area map projections on polyhedral globes for the dodecahedron and truncated icosa-
hedron offer relatively low scale and angular distortion. The equations involved are relatively straight-forward, and
for certain instructional tools and databases, the projections are useful for world maps. The interruptions remain a
disadvantage, as with any low-error projection system applied to the entire globe [Snyder1992].
7.1.55.1 Parameters
+orient=<string>
Can be set to either isea or pole.
+azi=<value>
Azimuth.
Defaults to 0.0
+aperture=<value>
Defaults to 3.0
+resolution=<value>
Defaults to 4.0
+mode=<string>
Can be either plane, di, dd or hex.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.56 Kavraisky V
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias kav5
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.56.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias kav7
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.57.1 Parameters
Note: All parameters are optional for the Kavraisky VII projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.58 Krovak
Classification Conical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global, but more accurate around Czechoslovakia
Alias krovak
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.58.1 Parameters
+czech
Reverse the sign of the output coordinates, as is tradition in the Czech Republic.
+lon_0=<value>
Longitude of projection center.
Defaults to 24°50’ (24.8333333333333)
+lat_0=<value>
Latitude of projection center.
Defaults to 49.5
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 0.9999
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.59 Laborde
Classification Cylindrical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global, but more accurate around Madagascar
Alias labrd
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.59.1 Parameters
Required
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
Optional
+azi=<value>
Azimuth of the central line.
Defaults to 0.0
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias laea
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.60.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.61 Lagrange
Classification Miscellaneous
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias lagrng
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.61.1 Parameters
+W=<value>
The factor +W is the ratio of the difference in longitude from the central meridian to the a circular meridian to
90. +W must be a positive value.
Defaults to 2.0
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.62 Larrivee
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias larr
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.62.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.63 Laskowski
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias lask
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.63.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
A Lambert Conformal Conic projection (LCC) is a conic map projection used for aeronautical charts, portions of
the State Plane Coordinate System, and many national and regional mapping systems. It is one of seven projections
introduced by Johann Heinrich Lambert in 1772.
It has several different forms: with one and two standard parallels (referred to as 1SP and 2SP in EPSG guidance
notes). Additionally we provide “2SP Michigan” form which is very similar to normal 2SP, but with a scaling factor
on the ellipsoid (given as k_0 parameter). It is implemented as per EPSG Guidance Note 7-2 (version 54, August
2018, page 25). It is used in a few systems in the EPSG database which justifies adding this otherwise non-standard
projection.
7.1.64.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
+k_0=<value>
This parameter can represent two different values depending on the form of the projection. In LCC 1SP it
determines the scale factor at natural origin. In LCC 2SP Michigan it determines the ellipsoid scale factor.
Defaults to 1.0.
1. Wikipedia
2. Wolfram Mathworld
3. John P. Snyder “Map projections: A working manual” (pp. 104-110)
4. ArcGIS documentation on “Lambert Conformal Conic”
5. EPSG Guidance Note 7-2 (version 54, August 2018, page 25)
Classification Conical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias lcca
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.65.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Conical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias leac
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.66.1 Parameters
Note: All parameters are optional for the Lambert Equal Area Conic projection.
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+south
Sets the second standard parallel to 90°S. When the flag is off the second standard parallel is set to 90°N.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias lee_os
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.67.1 Parameters
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.68 Loximuthal
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias loxim
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.68.1 Parameters
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Cylindrical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias lsat
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.69.1 Parameters
Required
+lsat=<value>
Landsat satellite used for the projection. Value between 1 and 5.
+path=<value>
Selected path of satellite. Value between 1 and 253 when +lsat is set to 1,2 or 3, otherwise valid input is
between 1 and 233.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias mbt_s
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.70.1 Parameters
Note: All parameters are optional for the McBryde-Thomas Flat-Polar Sine projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias mbt_fps
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.71.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias mbtfpp
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.72.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias mbtfpq
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.73.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias mbtfps
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.74.1 Parameters
Note: All parameters are optional for the McBryde-Thomas Flat-Polar Sinusoidal projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.75 Mercator
The Mercator projection is a cylindrical map projection that origins from the 15th century. It is widely recognized as
the first regularly used map projection. The projection is conformal which makes it suitable for navigational purposes.
7.1.75.1 Usage
Applications should be limited to equatorial regions, but is frequently used for navigational charts with latitude of true
scale (+lat_ts) specified within or near chart’s boundaries. Often inappropriately used for world maps since the
regions near the poles cannot be shown [Evenden1995].
Example using latitude of true scale:
Note that +lat_ts and +k_0 are mutually exclusive. If used together, +lat_ts takes precedence over +k_0.
7.1.75.2 Parameters
+lat_ts=<value>
Latitude of true scale. Defines the latitude where scale is not distorted. Takes precedence over +k_0 if both
options are used together.
Defaults to 0.0.
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
The formulas describing the Mercator projection are all taken from G. Evenden’s libproj manuals [Evenden2005].
Spherical form
For the spherical form of the projection we introduce the scaling factor:
𝑘0 = cos 𝜑𝑡𝑠
Forward projection
𝑥 = 𝑘0 𝜆
[︂ (︂ )︂]︂
𝜋 𝜑
𝑦 = 𝑘0 ln tan +
4 2
Inverse projection
𝑥
𝜆=
𝑘0
𝜋 [︁ ]︁
𝜑= − 2 arctan 𝑒−𝑦/𝑘0
2
Ellisoidal form
For the ellipsoidal form of the projection we introduce the scaling factor:
𝑘0 = 𝑚 (𝜑𝑡𝑠 )
Note: m() and t() should be described properly on a separate page about the theory of projections on the ellipsoid.
Forward projection
𝑥 = 𝑘0 𝜆
𝑦 = 𝑘0 ln 𝑡 (𝜑)
Inverse projection
𝑥
𝜆=
𝑘0
[︁ ]︁
𝜑 = 𝑡−1 𝑒−𝑦/𝑘0
1. Wikipedia
2. Wolfram Mathworld
Classification Azimuthal
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias mil_os
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.76.1 Parameters
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The Miller cylindrical projection is a modified Mercator projection, proposed by Osborn Maitland Miller in 1942. The
latitude is scaled by a factor of 54 , projected according to Mercator, and then the result is multiplied by 54 to retain scale
along the equator.
7.1.77.1 Usage
The Miller Cylindrical projection is used for world maps and in several atlases, including the National Atlas of the
United States (USGS, 1970, p. 330-331) [Snyder1987].
Example using Central meridian 90°W:
7.1.77.2 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The formulas describing the Miller projection are all taken from [Snyder1987].
Forward projection
𝑥=𝜆
[︁ (︁ 𝜋 )︁]︁
𝑦 = 1.25 * ln tan + 0.4 * 𝜑
4
Inverse projection
𝜆=𝑥
]︀ 𝜋
𝜑 = 2.5 * (arctan 𝑒0.8*𝑦 − )
[︀
4
1. Wikipedia
Classification Conformal
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias misrsom
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.78.1 Parameters
Required
+path=<value>
Selected path of satellite. Value between 1 and 233.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.79 Mollweide
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias moll
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.79.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.80 Murdoch I
Classification Conical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias murd1
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.80.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.81 Murdoch II
Classification Conical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias murd2
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.81.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Conical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias murd3
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.82.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The Natural Earth projection is intended for making world maps. A distinguishing trait is its slightly rounded corners
fashioned to emulate the spherical shape of Earth. The meridians (except for the central meridian) bend acutely inward
as they approach the pole lines, giving the projection a hint of three-dimensionality. This bending also suggests that
the meridians converge at the poles instead of truncating at the top and bottom edges. The distortion characteristics of
the Natural Earth projection compare favorably to other world map projections.
7.1.83.1 Usage
The Natural Earth projection has no special options so usage is simple. Here is an example of an inverse projection on
a sphere with a radius of 7500 m:
7.1.83.2 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
1. Wikipedia
The Natural Earth II projection is intended for making world maps. At high latitudes, meridians bend steeply toward
short pole lines resulting in a map with highly rounded corners that resembles an elongated globe.
See [Savric2015]
7.1.84.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.85 Nell
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias nell
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.85.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.86 Nell-Hammer
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias nell_h
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.86.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudoconical
Available forms Forward spherical projection
Defined area Global
Alias nicol
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.87.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The near-sided perspective projection simulates a view from a height ℎ similar to how a satellite in orbit would see it.
7.1.88.1 Parameters
Required
+h=<value>
Height of the view point above the Earth and must be in the same units as the radius of the sphere or semimajor
axis of the ellipsoid.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.89.1 Parameters
Note: All standard projection parameters are hard-coded for this projection
Classification Cylindrical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias ob_tran
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.90.1 Usage
All of the projections of spherical library can be used as an oblique projection by means of the General Oblique
Transformation. The user performs the oblique transformation by selecting the oblique projection +proj=ob_tran,
specifying the translation factors, +o_lat_p, and +o_lon_p, and the projection to be used, +o_proj. In the
example of the Fairgrieve projection, the latitude and longitude of the North pole of the unrotated geographic CRS, 𝛼
and 𝛽 respectively, expressed in the rotated geographic CRS, are to be placed at 45°N and 90°W and the Mollweide
projection is used. Because the central meridian of the translated coordinates will follow the 𝛽 meridian it is necessary
to translate the translated system so that the Greenwich meridian will pass through the center of the projection by
offsetting the central meridian.
The final control for this projection is:
7.1.90.2 Parameters
Required
+o_proj=<projection>
Oblique projection.
In addition to specifying an oblique projection, how to rotate the projection should be specified. This is done in one
of three ways: Define a new pole, rotate the projection about a given point or define a new “equator” spanned by two
points on the sphere. See the details below.
New pole
+o_lat_p=<latitude>
Latitude of the North pole of the unrotated source CRS, expressed in the rotated geographic CRS.
+o_lon_p=<longitude>
Longitude of the North pole of the unrotated source CRS, expressed in the rotated geographic CRS.
+o_alpha=<value>
Angle to rotate the projection with.
+o_lon_c=<value>
Longitude of the point the projection will be rotated about.
+o_lat_c=<value>
Latitude of the point the projection will be rotated about.
+lon_1=<value>
Longitude of first point.
+lat_1=<value>
Latitude of first point.
+lon_2=<value>
Longitude of second point.
+lat_2=<value>
Latitude of second point.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Cylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias ocea
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.91.1 Parameters
Required
For the Oblique Cylindrical Equal Area projection a pole of rotation is needed. The pole can be defined in two ways:
By a point and azimuth or by providing to points that make up the pole.
+lonc=<value>
Longitude of rotational pole point.
+alpha=<value>
Angle of rotational pole.
Two points
+lon_1=<value>
Longitude of first point.
+lat_1=<value>
Latitude of first point.
+lon_2=<value>
Longitude of second point.
+lat_2=<value>
Latitude of second point.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward and inverse, spherical projection
Defined area Global
Alias oea
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
Described in [Snyder1988].
7.1.92.1 Parameters
Required
+m=<value>
+n=<value>
Optional
+theta=<value>
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The Oblique Mercator projection is a cylindrical map projection that closes the gap between the Mercator and the
Transverse Mercator projections.
Figuratively, the cylinder used for developing the Mercator projection touches the planet along the Equator, while that
of the Transverse Mercator touches the planet along a meridian, i.e. along a line perpendicular to the Equator.
The cylinder for the Oblique Mercator, however, touches the planet along a line at an arbitrary angle with the Equator.
Hence, the Oblique Mercator projection is useful for mapping areas having their greatest extent along a direction that
is neither north-south, nor east-west.
The Mercator and the Transverse Mercator projections are both limiting forms of the Oblique Mercator: The Mercator
projection is equivalent to an Oblique Mercator with central line along the Equator, while the Transverse Mercator is
equivalent to an Oblique Mercator with central line along a meridian.
For the sphere, the construction of the Oblique Mercator projection can be imagined as “tilting the cylinder of a plain
Mercator projection”, so the cylinder, instead of touching the equator, touches an arbitrary great circle on the sphere.
The great circle is defined by the tilt angle of the central line, hence putting land masses along that great circle near
the centre of the map, where the Equator would go in the plain Mercator case.
The ellipsoidal case, developed by Hotine, and refined by Snyder [Snyder1987] is more complex, involving initial
steps projecting from the ellipsoid to another curved surface, the “aposphere”, then projection from the aposphere to
the skew uv-plane, before finally rectifying the skew uv-plane onto the map XY plane.
7.1.93.1 Usage
The tilt angle (azimuth) of the central line can be given in two different ways. In the first case, the azimuth is given
directly, using the option +alpha and defining the centre of projection using the options +lonc and +lat_0. In the
second case, the azimuth is given indirectly by specifying two points on the central line, using the options +lat_1,
+lon_1, +lat_2, and +lon_2.
Example: Verify that the Mercator projection is a limiting form of the Oblique Mercator
˓→+ellps=GRS80
200000.13 199999.89
The input coordinate represents the System 34 datum point “Agri Bavnehoj”, with coordinates (200000, 200000) by
definition. So at the datum point, the approximation is off by about 17 cm. This use case represents a datum shift from
a cylinder projection on an old, slightly misaligned datum, to a similar projection on a modern datum.
7.1.93.2 Parameters
+alpha=<value>
Azimuth of centerline clockwise from north at the center point of the line. If +gamma is not given then +alpha
determines the value of +gamma.
+gamma=<value>
Azimuth of centerline clockwise from north of the rectified bearing of centre line. If +alpha is not given, then
+gamma is used to determine +alpha.
+lonc=<value>
Longitude of the central point.
+lat_0=<value>
Latitude of the central point.
+lon_1=<value>
Longitude of first point.
+lat_1=<value>
Latitude of first point.
+lon_2=<value>
Longitude of second point.
+lat_2=<value>
Latitude of second point.
Optional
+no_rot
No rectification (not “no rotation” as one may well assume). Do not take the last step from the skew uv-plane to
the map XY plane.
Note: This option is probably only marginally useful, but remains for (mostly) historical reasons.
+no_off
Do not offset origin to center of projection.
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward spherical projection
Defined area Global
Alias ortel
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.94.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.95 Orthographic
The orthographic projection is a perspective azimuthal projection centered around a given latitude and longitude.
Classification Azimuthal
Available forms Forward and inverse, spherical projection
Defined area Global, although only one hemisphere can be seen at a time
Alias ortho
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.95.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.96 Patterson
The Patterson projection is a cylindrical map projection designed for general-purpose mapmaking.
See [Patterson2014]
Classification Cylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias patterson
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.96.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Conical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias pconic
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.97.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias peirce_q
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.98.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudoconical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias poly
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.99.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.100 Putnins P1
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias putp1
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.100.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.101 Putnins P2
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias putp2
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.101.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.102 Putnins P3
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias putp3
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.102.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias putp3p
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.103.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias putp4p
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.104.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.105 Putnins P5
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias putp5
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.105.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias putp5p
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.106.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.107 Putnins P6
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias putp6
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.107.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias putp6p
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.108.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias qua_aut
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.109.1 Parameters
Note: All parameters are optional for the Quartic Authalic projection.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward and inverse, ellipsoidal
Defined area Global
Alias qsc
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
The purpose of the Quadrilateralized Spherical Cube (QSC) projection is to project a sphere surface onto the six sides
of a cube:
For this purpose, other alternatives can be used, notably Gnomonic or HEALPix. However, QSC projection has the
following favorable properties:
It is an equal-area projection, and at the same time introduces only limited angular distortions. It treats all cube sides
equally, i.e. it does not use different projections for polar areas and equatorial areas. These properties make QSC
projection a good choice for planetary-scale terrain rendering. Map data can be organized in quadtree structures for
each cube side. See [LambersKolb2012] for an example.
The QSC projection was introduced by [ONeilLaubscher1976], building on previous work by [ChanONeil1975]. For
clarity: The earlier QSC variant described in [ChanONeil1975] became known as the COBE QSC since it was used
by the NASA Cosmic Background Explorer (COBE) project; it is an approximately equal-area projection and is not
the same as the QSC projection.
See also [CalabrettaGreisen2002] Sec. 5.6.2 and 5.6.3 for a description of both and some analysis.
In this implementation, the QSC projection projects onto one side of a circumscribed cube. The cube side is selected
by choosing one of the following six projection centers:
Furthermore, this implementation allows the projection to be applied to ellipsoids. A preceding shift to a sphere is
performed automatically; see [LambersKolb2012] for details.
7.1.110.1 Usage
The following example uses QSC projection via GDAL to create the six cube side maps from a world map for the
WGS84 ellipsoid:
Explanation:
• QSC projection is selected with +wktext +proj=qsc.
• The WGS84 ellipsoid is specified with +ellps=WGS84.
• The cube side is selected with +lat_0=... +lon_0=....
• The -wo options are necessary for GDAL to avoid holes in the output maps.
• The -te option limits the extends of the output map to the major axis diameter (from -radius to +radius in both
x and y direction). These are the dimensions of one side of the circumscribing cube.
The resulting images can be laid out in a grid like below.
7.1.110.2 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
1. Wikipedia
2. NASA
7.1.111 Robinson
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias robin
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.111.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias rouss
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.112.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudoconical
Available forms Forward spherical projection
Defined area Global
Alias rpoly
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.113.1 Parameters
+lat_ts=<value>
Latitude of true scale. Defines the latitude where scale is not distorted. Takes precedence over +k_0 if both
options are used together.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward and inverse.
Defined area Global
Alias sch
Domain 3D
Input type 3D coordinates
Output type Projected coordinates
7.1.114.1 Parameters
Required
+plat_0=<value>
Peg latitude (in degree)
+plon_0=<value>
Peg longitude (in degree)
+phdg_0=<value>
Peg heading (in degree)
Optional
+h_0=<value>
Average height (in metre)
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias sinu
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
MacBryde and Thomas developed generalized formulas for several of the pseudocylindricals with sinusoidal meridi-
ans:
𝑥 = 𝐶𝜆(𝑚 + 𝑐𝑜𝑠𝜃)/(𝑚 + 1)
𝑦 = 𝐶𝜃
√︀
𝐶 = (𝑚 + 1)/𝑛
7.1.115.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.116.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.117 Stereographic
Classification Azimuthal
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias stere
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.117.1 Parameters
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+lat_ts=<value>
Defines the latitude where scale is not distorted. It is only taken into account for Polar Stereographic formula-
tions (+lat_0 = +/- 90 ), and then defaults to the +lat_0 value. If set to a value different from +/- 90, it takes
precedence over +k_0 if both options are used together.
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward and inverse, spherical and ellipsoidal
Defined area Global
Alias sterea
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.118.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Conformal
Available forms Forward and inverse, spherical projection
Defined area Global
Alias gstmerc
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.119.1 Parameters
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Cylindrical
Available forms Forward spherical projection
Defined area Global
Alias tcc
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.120.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Cylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias tcea
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.121.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.122 Times
Classification Cylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias times
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.122.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.123 Tissot
7.1.123.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The transverse Mercator projection in its various forms is the most widely used projected coordinate system for world
topographical and offshore mapping.
7.1.124.1 Usage
Prior to the development of the Universal Transverse Mercator coordinate system, several European nations demon-
strated the utility of grid-based conformal maps by mapping their territory during the interwar period. Calculating
the distance between two points on these maps could be performed more easily in the field (using the Pythagorean
theorem) than was possible using the trigonometric formulas required under the graticule-based system of latitude and
longitude. In the post-war years, these concepts were extended into the Universal Transverse Mercator/Universal Polar
Stereographic (UTM/UPS) coordinate system, which is a global (or universal) system of grid-based maps.
The following table gives special cases of the Transverse Mercator projection.
3500000.00 5651505.56
2520000.00 4649858.60
7.1.124.2 Parameters
+approx
New in version 6.0.0.
Use the algorithm described in section “Ellipsoidal Form” below. It is faster than the default algorithm, but also
diverges faster as the distance from the central meridian increases.
+algo=auto/evenden_snyder/poder_engsager
New in version 7.1.
Selects the algorithm to use. The hardcoded value and the one defined in proj.ini default to poder_engsager,
that is the most precise one.
When using auto, a heuristics based on the input coordinate to transform is used to determine if the faster
Evenden-Snyder method can be used, for faster computation, without causing an error greater than 0.1 mm (for
an ellipsoid of the size of Earth)
Note that +approx and +algo are mutually exclusive.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The formulas describing the Transverse Mercator below are quoted from Evenden’s [Evenden2005].
𝜑0 is the latitude of origin that match the center of the map. It can be set with +lat_0.
𝑘0 is the scale factor at the natural origin (on the central meridian). It can be set with +k_0.
𝑀 (𝜑) is the meridional distance.
Spherical form
Forward projection
𝐵 = cos 𝜑 sin 𝜆
𝑘0 1+𝐵
𝑥= ln( )
2 1−𝐵
tan(𝜑)
𝑦 = 𝑘0 (arctan( ) − 𝜑0 )
cos 𝜆
Inverse projection
𝑦
𝐷= + 𝜑0
𝑘0
𝑥
𝑥′ =
𝑘0
sin 𝐷
𝜑 = arcsin( )
cosh 𝑥′
sinh 𝑥′
𝜆 = arctan( )
cos 𝐷
Ellipsoidal form
The formulas below describe the algorithm used when giving the +approx option. They are originally from
[Snyder1987], but here quoted from [Evenden1995]. The default algorithm is given by Poder and Engsager in
[Poder1998]
Forward projection
𝑘0
𝑁=
(1 − 𝑒2 sin2 𝜑)1/2
𝑘0 (1 − 𝑒2 )
𝑅=
(1 − 𝑒2 sin2 𝜑)3/2
𝑡 = tan(𝜑)
𝑒2
𝜂= 𝑐𝑜𝑠2 𝜑
1 − 𝑒2
𝑥 = 𝑘0 𝜆 cos 𝜑
𝑘0 𝜆3 cos3 𝜑
+ (1 − 𝑡2 + 𝜂 2 )
3!
𝑘0 𝜆5 cos5 𝜑
+ (5 − 18𝑡2 + 𝑡4 + 14𝜂 2 − 58𝑡2 𝜂 2 )
5!
𝑘0 𝜆7 cos7 𝜑
+ (61 − 479𝑡2 + 179𝑡4 − 𝑡6 )
7!
𝑦 = 𝑀 (𝜑)
𝑘0 𝜆2 sin(𝜑) cos 𝜑
+
2!
𝑘0 𝜆4 sin(𝜑) cos3 𝜑
+ (5 − 𝑡2 + 9𝜂 2 + 4𝜂 4 )
4!
𝑘0 𝜆6 sin(𝜑) cos5 𝜑
+ (61 − 58𝑡2 + 𝑡4 + 270𝜂 2 − 330𝑡2 𝜂 2 )
6!
𝑘0 𝜆8 sin(𝜑) cos7 𝜑
+ (1385 − 3111𝑡2 + 543𝑡4 − 𝑡6 )
8!
Inverse projection
𝜑1 = 𝑀 − 1(𝑦)
𝑘0
𝑁1 =
1 − 𝑒2 sin2 𝜑1 )1/2
𝑘0 (1 − 𝑒2 )
𝑅1 =
(1 − 𝑒2 sin2 𝜑1 )3/2
𝑡1 = tan(𝜑1 )
𝑒2
𝜂1 = 𝑐𝑜𝑠2 𝜑1
1 − 𝑒2
𝜑 = 𝜑1
𝑡 1 𝑥2
−
2!𝑅1 𝑁1
𝑡 1 𝑥4
+ (5 + 3𝑡21 + 𝜂12 − 4𝜂14 − 9𝜂12 𝑡21 )
4!𝑅1 𝑁13
𝑡1 𝑥6
− (61 + 90𝑡21 + 46𝜂12 + 45𝑡41 − 252𝑡21 𝜂12 )
6!𝑅1 𝑁15
𝑡 1 𝑥8
+ (1385 + 3633𝑡21 + 4095𝑡41 + 1575𝑡61 )
8!𝑅1 𝑁17
𝑥
𝜆=
cos 𝜑𝑁1
𝑥3
− (1 + 2𝑡21 + 𝜂12 )
3! cos 𝜑𝑁13
𝑥5
+ (5 + 6𝜂12 + 28𝑡21 − 3𝜂12 + 8𝑡21 𝜂12 )
5! cos 𝜑𝑁15
𝑥7
− (61 + 662𝑡21 + 1320𝑡41 + 720𝑡61 )
7! cos 𝜑𝑁17
1. Wikipedia
2. EPSG, POSC literature pertaining to Coordinate Conversions and Transformations including Formulas
7.1.125 Tobler-Mercator
7.1.125.1 Usage
The inappropriate use of the Mercator projection has declined but still occasionally occurs. One method of contrasting
the Mercator projection is to present an alternative in the form of an equal area projection. The map projection derived
here is thus not simply a pretty Christmas tree ornament: it is instead a complement to Mercator’s conformal navigation
anamorphose and can be displayed as an alternative. The equations for the new map projection preserve the latitudinal
stretching of the Mercator while adjusting the longitudinal spacing. This allows placement of the new map adjacent to
that of Mercator. The surface area, while drastically warped, maintains the correct magnitude.
7.1.125.2 Parameters
+k_0=<value>
Scale factor. Determines scale factor used in the projection.
Defaults to 1.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
The formulas describing the Tobler-Mercator are taken from Waldo Tobler’s article [Tobler2018]
Spherical form
For the spherical form of the projection we introduce the scaling factor:
𝑘0 = cos2 𝜑𝑡𝑠
Forward projection
𝑥 = 𝑘0 𝜆
[︂ (︂ )︂]︂
𝜋 𝜑
𝑦 = 𝑘0 ln tan +
4 2
Inverse projection
𝑥
𝜆=
𝑘0
𝜋 [︁ ]︁
𝜑= − 2 arctan 𝑒−𝑦/𝑘0
2
Classification Azimuthal
Available forms Forward and inverse, spherical projection
Defined area Global
Alias tpeqd
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.126.1 Parameters
+lon_1=<value>
Longitude of first point.
+lat_1=<value>
Latitude of first point.
+lon_2=<value>
Longitude of second point.
+lat_2=<value>
Latitude of second point.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward and inverse, spherical projection
Defined area Global
Alias tpers
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
Tilted Perspective is similar to Near-sided perspective (nsper) in that it simulates a perspective view from a height.
Where nsper projects onto a plane tangent to the surface, Tilted Perspective orients the plane towards the direction of
the view. Thus, extra parameters specifying azimuth and tilt are required beyond nsper`’s h. As with nsper, lat_0
& lon_0 are also required for satellite position.
7.1.127.1 Parameters
Required
+h=<value>
Height of the view point above the Earth and must be in the same units as the radius of the sphere or semimajor
axis of the ellipsoid.
Optional
+azi=<value>
Bearing in degrees away from north.
Defaults to 0.0.
+tilt=<value>
Angle in degrees away from nadir.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+lat_0=<value>
Latitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.128.1 Parameters
+south
South polar aspect.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.129 Urmaev V
7.1.129.1 Parameters
Required parameters
+n=<value>
Set the 𝑛 constant. Value between 0 and 1.
Optional parameters
+q=<value>
Set the 𝑞 constant.
+alpha=<value>
Set the 𝛼 constant.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.130.1 Parameters
+n=<value>
Set the 𝑛 constant. Value between 0 and 1.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The Universal Transverse Mercator is a system of map projections divided into sixty zones across the globe, with each
zone corresponding to 6 degrees of longigude.
UTM projections are really the Transverse Mercator to which specific parameters, such as central meridians, have
been applied. The Earth is divided into 60 zones each generally 6° wide in longitude. Bounding meridians are evenly
divisible by 6°, and zones are numbered from 1 to 60 proceeding east from the 180th meridian from Greenwich with
minor exceptions [Snyder1987].
7.1.131.1 Usage
7.1.131.2 Parameters
Required
+zone=<value>
Select which UTM zone to use. Can be a value between 1-60.
Optional
+south
Add this flag when using the UTM on the southern hemisphere.
+approx
New in version 6.0.0.
Use faster, less accurate algorithm for the Transverse Mercator.
+algo=auto/evenden_snyder/poder_engsager
New in version 7.1.
Selects the algorithm to use. The hardcoded value and the one defined in proj.ini default to poder_engsager,
that is the most precise one.
When using auto, a heuristics based on the input coordinate to transform is used to determine if the faster
Evenden-Snyder method can be used, for faster computation, without causing an error greater than 0.1 mm (for
an ellipsoid of the size of Earth)
Note that +approx and +algo are mutually exclusive.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
1. Wikipedia
Classification Miscellaneous
Available forms Forward and inverse, spherical projection
Defined area Global
Alias vandg
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.132.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias vandg2
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.133.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias vandg3
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.134.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Miscellaneous
Available forms Forward spherical projection
Defined area Global
Alias vandg4
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.135.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.136 Vitkovsky I
Classification Conical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias vitk1
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.136.1 Parameters
Required
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lat_2=<value>
Second standard parallel.
Defaults to 0.0.
Optional
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias wag1
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.137.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.138 Wagner II
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias wag2
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
𝑥 = 0.92483𝜆 cos 𝜃
𝑦 = 1.38725𝜃
sin 𝜃 = 0.88022 sin(0.8855𝜑)
7.1.138.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias wag3
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.139.1 Parameters
+lat_ts=<value>
Latitude of true scale. Defines the latitude where scale is not distorted. Takes precedence over +k_0 if both
options are used together.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.140 Wagner IV
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias wag4
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.140.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.141 Wagner V
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias wag5
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.141.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.142 Wagner VI
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias wag6
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.142.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Azimuthal
Available forms Forward spherical projection
Defined area Global
Alias wag7
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.144.1 Usage
Example:
7.1.144.2 Parameters
Note: All parameters for the projection are optional, except the ellipsoid definition, which is WGS84 for the typical
use case of EPSG:3857. In which case, the other parameters are set to their default 0 value.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
The formulas describing the Mercator projection are all taken from G. Evenden’s libproj manuals [Evenden2005].
Forward projection
𝑥=𝜆
[︂ (︂ )︂]︂
𝜋 𝜑
𝑦 = ln tan +
4 2
Inverse projection
𝜆=𝑥
𝜋
− 2 arctan 𝑒−𝑦
[︀ ]︀
𝜑=
2
1. Wikipedia
7.1.145 Werenskiold I
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias weren
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.145.1 Parameters
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.146 Winkel I
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias wink1
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.146.1 Parameters
+lat_ts=<value>
Latitude of true scale. Defines the latitude where scale is not distorted. Takes precedence over +k_0 if both
options are used together.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.1.147 Winkel II
Classification Pseudocylindrical
Available forms Forward and inverse, spherical projection
Defined area Global
Alias wink2
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.147.1 Parameters
+lat_ts=<value>
Latitude of true scale. Defines the latitude where scale is not distorted. Takes precedence over +k_0 if both
options are used together.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
Classification Pseudoazimuthal
Available forms Forward spherical projection
Defined area Global
Alias wintri
Domain 2D
Input type Geodetic coordinates
Output type Projected coordinates
7.1.148.1 Parameters
+lat_1=<value>
First standard parallel.
Defaults to 0.0.
+lon_0=<value>
Longitude of projection center.
Defaults to 0.0.
+R=<value>
Radius of the sphere given in meters. If used in conjunction with +ellps +R takes precedence.
+x_0=<value>
False easting.
Defaults to 0.0.
+y_0=<value>
False northing.
Defaults to 0.0.
7.2 Conversions
Conversions are coordinate operations in which both coordinate reference systems are based on the same datum. In
PROJ projections are differentiated from conversions.
Alias axisswap
Domain 2D, 3D or 4D
Input type Any
Output type Any
Each of the possible four axes are numbered with 1–4, such that the first input axis is 1, the second is 2 and so on. The
output ordering is controlled by a list of the input axes re-ordered to the new mapping.
7.2.1.1 Usage
+proj=axisswap +order=4,3,2,1
+proj=axisswap +order=2,1,3,4
The direction, or sign, of an axis can be changed by adding a minus in front of the axis-number:
+proj=axisswap +order=1,-2,3,4
It is only necessary to specify the axes that are affected by the swap operation:
+proj=axisswap +order=2,1
7.2.1.2 Parameters
+order=<list>
Ordered comma-separated list of axis, e.g. +order=2,1,3,4. Adding a minus in front of an axis number results
in a change of direction for that axis, e.g. southward instead of northward.
Required.
Alias cart
Domain 3D
Input type Geodetic coordinates
Output type Geocentric cartesian coordinates
This conversion converts geodetic coordinate values (longitude, latitude, elevation above ellipsoid) to their geocentric
(X, Y, Z) representation, where the first axis (X) points from the Earth centre to the point of longitude=0, latitude=0,
the second axis (Y) points from the Earth centrer to the point of longitude=90, latitude=0 and the third axis (Z) points
to the North pole.
7.2.2.1 Usage
7.2.2.2 Parameters
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
Alias geoc
Domain 2D
Input type Geodetic coordinates
Output type Geocentric angular coordinates
The geodetic (or geographic) latitude (also called planetographic latitude in the context of non-Earth bodies) is the
angle between the equatorial plane and the normal (vertical) to the ellipsoid surface at the considered point. The
geodetic latitude is what is normally used everywhere in PROJ when angular coordinates are expected or produced.
The geocentric latitude (also called planetocentric latitude in the context of non-Earth bodies) is the angle between the
equatorial plane and a line joining the body centre to the considered point.
Note: This conversion must be distinguished fom the Geodetic to cartesian conversion which converts geodetic
coordinates to geocentric coordinates in the cartesian domain.
The formulas describing the conversion are taken from [Snyder1987] (equation 3-28)
Let 𝜑′ to be the geocentric latitude and 𝜑 the geodetic latitude, then
The geocentric latitude is consequently lesser (in absolute value) than the geodetic latitude, except at the equator and
the poles where they are equal.
On a sphere, they are always equal.
7.2.3.2 Usage
+proj=geoc +ellps=GRS80
7.2.3.3 Parameters
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
7.2.4.1 Parameters
No parameters will affect the output of the operation if used on it’s own. However, the parameters below can be used
in a declarative manner when used with cs2cs or in a transformation pipeline .
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+datum=<value>
Declare the datum used with the coordinates. See cs2cs -l for a list of available datums.
+towgs84=<list>
A list of three or seven Helmert parameters that maps the input coordinates to the WGS84 datum.
7.2.5 No operation
Alias noop
Domain 4D
Input type Any
Output type Any
The no operation is a dummy operation that returns whatever is passed to it as seen in this example:
The operation has no options and default options will not affect the output.
Alias pop
Domain 4D
Input type Any
Output type Any
This operations makes it possible to retrieve coordinate components that was saved in previous pipeline steps. A
retrieved coordinate component is loaded, or popped, from a memory stack that is part of a pipeline. The pipeline
coordinate stack is inspired by the stack data structure that is commonly used in computer science. There’s four stacks
available: One four each coordinate dimension. The dimensions, or coordinate components, are numbered 1–4. It is
only possible to move data to and from the stack within the same coordinate component number. Values can be saved
to the stack by using the push operation.
If the pop operation is used by itself, e.g. not in a pipeline, it will function as a no-operation that passes the coordinate
through unchanged. Similarly, if no coordinate component is available on the stack to be popped the operation does
nothing.
7.2.6.1 Examples
A common use of the push and pop operations is in 3D Helmert transformations where only the horizontal components
are needed. This is often the case when combining heights from a legacy vertical reference with a modern geocentric
reference. Below is a an example of such a transformation, where the horizontal part is transformed with a Helmert
operation but the vertical part is kept exactly as the input was.
Note that the third coordinate component in the output is the same as the input.
The same transformation without the push and pop operations would look like this:
7.2.6.2 Parameters
+v_1
Retrieves the first coordinate component from the pipeline stack
+v_2
Retrieves the second coordinate component from the pipeline stack
+v_3
Retrieves the third coordinate component from the pipeline stack
+v_4
Retrieves the fourth coordinate component from the pipeline stack
Alias push
Domain 4D
Input type Any
Output type Any
This operations allows for components of coordinates to be saved for application in a later step. A saved coordinate
component is moved, or pushed, to a memory stack that is part of a pipeline. The pipeline coordinate stack is inspired
by the stack data structure that is commonly used in computer science. There’s four stacks available: One four each
coordinate dimension. The dimensions, or coordinate components, are numbered 1–4. It is only possible to move data
to and from the stack within the same coordinate component number. Values can be moved off the stack again by
using the pop operation.
If the push operation is used by itself, e.g. not in a pipeline, it will function as a no-operation that passes the coordinate
through unchanged.
7.2.7.1 Examples
A common use of the push and pop operations is in 3D Helmert transformations where only the horizontal components
are needed. This is often the case when combining heights from a legacy vertical reference with a modern geocentric
reference. Below is a an example of such a transformation, where the horizontal part is transformed with a Helmert
operation but the vertical part is kept exactly as the input was.
Note that the third coordinate component in the output is the same as the input.
The same transformation without the push and pop operations would look like this:
7.2.7.2 Parameters
+v_1
Stores the first coordinate component on the pipeline stack
+v_2
Stores the second coordinate component on the pipeline stack
+v_3
Stores the third coordinate component on the pipeline stack
+v_4
Stores the fourth coordinate component on the pipeline stack
Alias set
Domain 4D
Input type Any
Output type Any
This operations allows for components of coordinates to be set to a fixed value. This may be useful in pipeline when
a step requires some component, typically an elevation or a date, to be set to a fixed value.
7.2.8.1 Example
In the ETRS89 to Dutch RD with NAP height transformation, the used ellipsoidal height for the Helmert transforma-
tion is not the NAP height, but the height is set to 0 m. This is an unconventional trick to get the same results as when
the effect of the Helmert transformation is included in the horizontal NTv2 grid. For the forward transformation from
ETRS89 to RD with NAP height, we need to set the ellipsoidal ETRS89 height for the Helmert transformation to the
equivalent of 0 m NAP. This is 43 m for the centre of the Netherlands and this value can be used as an approximation
elsewhere (the effect of this approximation is below 1 mm for the horizontal coordinates, in an area up to hundreds of
km outside the Netherlands).
The +proj=set +v_3=0 close to the end of the pipeline is to make it usable in the reverse direction.
$ cct -t 0 -d 4 +proj=pipeline \
+step +proj=unitconvert +xy_in=deg +xy_out=rad \
+step +proj=axisswap +order=2,1 \
+step +proj=vgridshift +grids=nlgeo2018.gtx \
+step +proj=push +v_3 \
+step +proj=set +v_3=43 \
+step +proj=cart +ellps=GRS80 \
+step +proj=helmert +x=-565.7346 +y=-50.4058 +z=-465.2895 +rx=-0.395023 +ry=0.
˓→330776 +rz=-1.876073 +s=-4.07242 +convention=coordinate_frame +exact \
7.2.8.2 Parameters
+v_1=value
Set the first coordinate component to the specified value
+v_2=value
Set the second coordinate component to the specified value
+v_3=value
Set the third coordinate component to the specified value
+v_4=value
Set the fourth coordinate component to the specified value
Alias unitconvert
Domain 2D, 3D or 4D
Input type Any
Output type Any
There are many examples of coordinate reference systems that are expressed in other units than the meter. There are
also many cases where temporal data has to be translated to different units. The unitconvert operation takes care of
that.
Many North American systems are defined with coordinates in feet. For example in Vermont:
+proj=pipeline
+step +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k_0=0.999964286 +x_0=500000.00001016 +y_
˓→0=0
Often when working with GNSS data the timestamps are presented in GPS-weeks, but when the data transformed with
the helmert operation timestamps are expected to be in units of decimalyears. This can be fixed with unitconvert:
+proj=pipeline
+step +proj=unitconvert +t_in=gps_week +t_out=decimalyear
+step +proj=helmert +epoch=2000.0 +t_obs=2017.5 ...
7.2.9.1 Parameters
+xy_in=<unit> or <conversion_factor>
Horizontal input units. See Distance units and Angular units for a list of available units. <conversion_factor>
is the conversion factor from the input unit to metre for linear units, or to radian for angular units.
+xy_out=<unit> or <conversion_factor>
Horizontal output units. See Distance units and Angular units for a list of available units. <conversion_factor>
is the conversion factor from the output unit to metre for linear units, or to radian for angular units.
+z_in=<unit> or <conversion_factor>
Vertical output units. See Distance units and Angular units for a list of available units. <conversion_factor> is
the conversion factor from the input unit to metre for linear units, or to radian for angular units.
+z_out=<unit> or <conversion_factor>
Vertical output units. See Distance units and Angular units for a list of available units. <conversion_factor> is
the conversion factor from the output unit to metre for linear units, or to radian for angular units.
+t_in=<unit>
Temporal input units. See Time units for a list of available units.
+t_out=<unit>
Temporal output units. See Time units for a list of available units.
In the table below all distance units supported by PROJ are listed. The same list can also be produced on the command
line with proj or cs2cs, by adding the -lu flag when calling the utility.
Label Name
km Kilometer
m Meter
dm Decimeter
cm Centimeter
mm Millimeter
kmi International Nautical Mile
in International Inch
ft International Foot
yd International Yard
mi International Statute Mile
fath International Fathom
ch International Chain
link International Link
us-in U.S. Surveyor’s Inch
us-ft U.S. Surveyor’s Foot
us-yd U.S. Surveyor’s Yard
us-ch U.S. Surveyor’s Chain
us-mi U.S. Surveyor’s Statute Mile
ind-yd Indian Yard
ind-ft Indian Foot
ind-ch Indian Chain
Label Name
deg Degree
grad Grad
rad Radian
In the table below all time units supported by PROJ are listed.
Label Name
mjd Modified Julian date
decimalyear Decimal year
gps_week GPS Week
yyyymmdd Date in yyyymmdd format
7.3 Transformations
Transformations coordinate operation in which the two coordinate reference systems are based on different datums.
Alias affine
Domain 4D
Input type XYZT
output type XYZT
By default, the parameters are set for an identity transforms. The transformation is reversible unless the determinant
of the sji matrix is 0, or tscale is 0
7.3.1.1 Parameters
Optional
+xoff=<value>
Offset in X. Default value: 0
+yoff=<value>
Offset in Y. Default value: 0
+zoff=<value>
Offset in Z. Default value: 0
+toff=<value>
Offset in T. Default value: 0
+s11=<value>
Rotation/scaling term. Default value: 1
+s12=<value>
Rotation/scaling term. Default value: 0
+s13=<value>
Rotation/scaling term. Default value: 0
+s21=<value>
Rotation/scaling term. Default value: 0
+s22=<value>
Rotation/scaling term. Default value: 1
+s23=<value>
Rotation/scaling term. Default value: 0
+s31=<value>
Rotation/scaling term. Default value: 0
+s32=<value>
Rotation/scaling term. Default value: 0
+s33=<value>
Rotation/scaling term. Default value: 1
+tscale=<value>
Time scaling term. Default value: 1
Mathematical description
⎡ ⎤𝑑𝑒𝑠𝑡 ⎡ ⎤ ⎡ ⎤ ⎡ ⎤𝑠𝑜𝑢𝑟𝑐𝑒
𝑋 𝑥𝑜𝑓 𝑓 𝑠11 𝑠12 𝑠13 0 𝑋
⎢𝑌 ⎥ ⎢𝑦𝑜𝑓 𝑓 ⎥ ⎢𝑠21 𝑠22 𝑠23 0 ⎥ ⎥ ⎢𝑌 ⎥
⎢ ⎥
⎢ ⎥
⎣𝑍 ⎦ =⎣
⎢ ⎥ + ⎢ (7.1)
𝑧𝑜𝑓 𝑓 ⎦ ⎣𝑠31 𝑠32 𝑠33 0 ⎦ ⎣𝑍 ⎦
𝑇 𝑡𝑜𝑓 𝑓 0 0 0 𝑡𝑠𝑐𝑎𝑙𝑒 𝑇
Alias defmodel
Input type Geodetic or projected coordinates (horizontal), meters (vertical), decimalyear (temporal)
Output type Geodetic or projected coordinates (horizontal), meters (vertical), decimalyear (temporal)
Domain 4D
Available forms Forward and inverse
The defmodel transformation can be used to represent most deformation models currently in use, in particular for areas
subject to complex deformation, including large scale secular crustal deformation near plate boundaries and vertical
deformation due to Glacial Isostatic Adjustment (GIA). These can often be represented by a constant velocity model.
Additionally, many areas suffer episodic deformation events such as earthquakes and aseismic slow slip event.
The transformation relies on a “master” JSON file, describing general metadata on the deformation model, its spatial
and temporal extent, and listing spatial components whose values are stored in Geodetic TIFF grids (GTG). The valua-
tion of each component is modulated by a time function (constant, step, reverse step, velocity, piecewise, exponential).
All details on the content of this JSON file are given in the Proposal for encoding of a Deformation Model
If input coordinates are given in the geographic domain (resp. projected domain), the output will also be in the
geographic domain (resp. projected domain). The domain should be the corresponding to the source_crs metadata of
the model.
This transformation is a generalization of the Kinematic datum shifting utilizing a deformation model transformation.
7.3.2.1 Parameters
Required
+model=<filename>
Filename to the JSON master file for the deformation model.
7.3.2.2 Example
Alias deformation
Input type Cartesian coordinates (spatial), decimalyears (temporal).
Output type Cartesian coordinates (spatial), decimalyears (temporal).
Domain 4D
Input type Geodetic coordinates
Output type Geodetic coordinates
The deformation operation is used to adjust coordinates for intraplate deformations. Usually the transformation param-
eters for regional plate-fixed reference frames such as the ETRS89 does not take intraplate deformation into account.
It is assumed that tectonic plate of the region is rigid. Often times this is true, but near the plate boundary and in
areas with post-glacial uplift the assumption breaks. Intraplate deformations can be modelled and then applied to the
coordinates so that they represent the physical world better. In PROJ this is done with the deformation operation.
The horizontal grid is stored in CTable2 format and the vertical grid is stored in the GTX format. Both grids are
expected to contain grid-values in units of mm/year. GDAL both reads and writes both file formats. Using GDAL for
construction of new grids is recommended.
Starting with PROJ 7.0, use of a GeoTIFF format is recommended to store both the horizontal and vertical velocities.
More complex deformations can be done with the Multi-component time-based deformation model transformation.
7.3.3.1 Example
In [Hakli2016] coordinate transformation including a deformation model is described. The paper describes how co-
ordinates from the global ITRFxx frames are transformed to the local Nordic realisations of ETRS89. Scandinavia is
an area with significant post-glacial rebound. The deformations from the post-glacial uplift is not accounted for in the
official ETRS89 transformations so in order to get accurate transformations in the Nordic countries it is necessary to
apply the deformation model. The transformation from ITRF2008 to the Danish realisation of ETRS89 is in PROJ
described as:
From this we can see that the transformation from ITRF2008 to the Danish realisation of ETRS89 is a combination of
Helmert transformations and adjustments with a deformation model. The first use of the deformation operation is:
Here we set the central epoch of the transformation, 2000.0. The observation epoch is expected as part of the input
coordinate tuple. The deformation model is described by two grids, specified with +xy_grids and +z_grids. The
first is the horizontal part of the model and the second is the vertical component.
7.3.3.2 Parameters
+xy_grids=<list>
Comma-separated list of grids to load. If a grid is prefixed by an @ the grid is considered optional and PROJ
will the not complain if the grid is not available.
Grids for the horizontal component of a deformation model is expected to be in CTable2 format.
+z_grids=<list>
Comma-separated list of grids to load. If a grid is prefixed by an @ the grid is considered optional and PROJ
will the not complain if the grid is not available.
Grids for the vertical component of a deformation model is expected to be in either GTX format.
+grids=<list>
New in version 7.0.0.
Comma-separated list of grids to load. If a grid is prefixed by an @ the grid is considered optional and PROJ
will the not complain if the grid is not available.
Grids should be in GeoTIFF format with the first 3 components being respectively the easting, northing and up
velocities in mm/year. Setting the Description and Unit Type GDAL band metadata items is strongly recom-
mended, so that gdalinfo reports:
+t_epoch=<value>
Central epoch of transformation given in decimalyears. Will be used in conjunction with the observation time
from the input coordinate to determine 𝑑𝑡 as used in eq. (7.1) below.
+dt=<value>
New in version 6.0.0.
𝑑𝑡 as used in eq. (7.1) below. Is useful when no observation time is available in the input coordinate or when a
deformation for a specific timespan needs to be applied in a transformation. 𝑑𝑡 is given in units of decimalyears.
Mathematically speaking, application of a deformation model is simple. The deformation model is represented as a
grid of velocities in three dimensions. Coordinate corrections are applied in cartesian space. For a given coordinate,
(𝑋, 𝑌, 𝑍), velocities (𝑉𝑋 , 𝑉𝑌 , 𝑉𝑍 ) can be interpolated from the gridded model. The time span between 𝑡𝑜𝑏𝑠 and 𝑡𝑐
determine the magnitude of the coordinate correcton as seen in eq. (7.1) below.
⎛ ⎞ ⎛ ⎞ ⎛ ⎞
𝑋 𝑋 𝑉𝑋
⎝ 𝑌 ⎠ = ⎝ 𝑌 ⎠ + (𝑡𝑜𝑏𝑠 − 𝑡𝑐 ) ⎝ 𝑉𝑌 ⎠ (7.1)
𝑍 𝐵 𝑍 𝐴 𝑉𝑍
where 𝜑 and 𝜆 are the latitude and longitude of the coordinate that is searched for in the grid. (𝐸, 𝑁, 𝑈 ) are the grid
values in ENU-space and (𝑋, 𝑌, 𝑍) are the corrections converted to cartesian space.
Alias geogoffset
Domain 3D
Input type Geodetic coordinates (horizontal), meters (vertical)
output type Geodetic coordinates (horizontal), meters (vertical)
This method is normally only used when low accuracy is tolerated. It is documented as coordinate operation method
code 9619 (for geographic 2D) and 9660 (for geographic 3D) in the EPSG dataset ([IOGP2018])
It can also be used to implement the method Geographic2D with Height Offsets (code 9618) by noting that the input
vertical component is a gravity-related height and the output vertical component is the ellipsoid height (dh being the
geoid undulation).
It can also be used to implement the method Vertical offset (code 9616)
The reverse transformation simply consists in subtracting the offsets.
This method is a conveniency wrapper for the more general Affine transformation.
7.3.4.1 Examples
Geographic offset from the old Greek geographic 2D CRS to the newer GGRS87 CRS:
proj=geogoffset dh=0.4
7.3.4.2 Parameters
Optional
+dlon=<value>
Offset in longitude, expressed in arc-second, to add.
+dlat=<value>
Offset in latitude, expressed in arc-second, to add.
+dh=<value>
Offset in height, expressed in meter, to add.
Alias helmert
Domain 2D, 3D and 4D
Input type Cartesian coordinates (spatial), decimalyears (temporal).
Output type Cartesian coordinates (spatial), decimalyears (temporal).
Input type Cartesian coordinates
Output type Cartesian coordinates
The Helmert transform, in all its various incarnations, is used to perform reference frame shifts. The transformation
operates in cartesian space. It can be used to transform planar coordinates from one datum to another, transform 3D
cartesian coordinates from one static reference frame to another or it can be used to do fully kinematic transformations
from global reference frames to local static frames.
All of the parameters described in the table above are marked as optional. This is true as long as at least one parameter
is defined in the setup of the transformation. The behavior of the transformation depends on which parameters are
used in the setup. For instance, if a rate of change parameter is specified a kinematic version of the transformation is
used.
The kinematic transformations require an observation time of the coordinate, as well as a central epoch for the trans-
formation. The latter is usually documented alongside the rest of the transformation parameters for a given trans-
formation. The central epoch is controlled with the parameter t_epoch. The observation time is given as part of the
coordinate when using PROJ’s 4D-functionality.
7.3.5.1 Examples
proj=helmert convention=position_vector
x=0.0127 y=0.0065 z=-0.0209 s=0.00195
dx=-0.0029 dy=-0.0002 dz=-0.0006 ds=0.00001
rx=-0.00039 ry=0.00080 rz=-0.00114
drx=-0.00011 dry=-0.00019 drz=0.00007
t_epoch=1988.0
7.3.5.2 Parameters
Note: All parameters are optional but at least one should be used, otherwise the operation will return the coordinates
unchanged.
+convention=coordinate_frame/position_vector
New in version 5.2.0.
Indicates the convention to express the rotational terms when a 3D-Helmert / 7-parameter more transform is
involved. As soon as a rotational parameter is specified (one of rx, ry, rz, drx, dry, drz), convention is
required.
The two conventions are equally popular and a frequent source of confusion. The coordinate frame convention
is also described as an clockwise rotation of the coordinate frame. It corresponds to EPSG method code 1032
(in the geocentric domain) or 9607 (in the geographic domain) The position vector convention is also described
as an anticlockwise (counter-clockwise) rotation of the coordinate frame. It corresponds to as EPSG method
code 1033 (in the geocentric domain) or 9606 (in the geographic domain).
This parameter is ignored when only a 3-parameter (translation terms only: x, y, z) , 4-parameter (3-parameter
and theta) or 6-parameter (3-parameter and their derivative terms) is used.
The result obtained with parameters specified in a given convention can be obtained in the other convention by
negating the rotational parameters (rx, ry, rz, drx, dry, drz)
Note: This parameter obsoletes transpose which was present in PROJ 5.0 and 5.1, and is forbidden starting
with PROJ 5.2
+x=<value>
Translation of the x-axis given in meters.
+y=<value>
Translation of the y-axis given in meters.
+z=<value>
Translation of the z-axis given in meters.
+s=<value>
Scale factor given in ppm.
+rx=<value>
X-axis rotation in the 3D Helmert given arc seconds.
+ry=<value>
Y-axis rotation in the 3D Helmert given in arc seconds.
+rz=<value>
Z-axis rotation in the 3D Helmert given in arc seconds.
+theta=<value>
Rotation angle in the 2D Helmert given in arc seconds.
+dx=<value>
Translation rate of the x-axis given in m/year.
+dy=<value>
Translation rate of the y-axis given in m/year.
+dz=<value>
Translation rate of the z-axis given in m/year.
+ds=<value>
Scale rate factor given in ppm/year.
+drx=<value>
Rotation rate of the x-axis given in arc seconds/year.
+dry=<value>
Rotation rate of the y-axis given in arc seconds/year.
+drz=<value>
Rotation rate of the y-axis given in arc seconds/year.
+t_epoch=<value>
Central epoch of transformation given in decimalyear. Only used spatiotemporal transformations.
+exact
Use exact transformation equations.
See (7.6)
+transpose
Deprecated since version 5.2.0: (removed)
Transpose rotation matrix and follow the Position Vector rotation convention. If +transpose is not added
the Coordinate Frame rotation convention is used.
In the notation used below, 𝑃ˆ is the rate of change of a given transformation parameter 𝑃 . 𝑃˙ is the kinematically
adjusted version of 𝑃 , described by
𝑃˙ = 𝑃 + 𝑃ˆ (𝑡 − 𝑡𝑐𝑒𝑛𝑡𝑟𝑎𝑙 ) (7.1)
where 𝑡 is the observation time of the coordinate and 𝑡𝑐𝑒𝑛𝑡𝑟𝑎𝑙 is the central epoch of the transformation. Equation (7.1)
can be used to propagate all transformation parameters in time.
Superscripts of vectors denote the reference frame the coordinates in the vector belong to.
2D Helmert
The simplest version of the Helmert transform is the 2D case. In the 2-dimensional case only the horizontal coordinates
are changed. The coordinates can be translated, rotated and scale. Translation is controlled with the x and y parameters.
The rotation is determined by theta and the scale is controlled with the s parameters.
Note: The scaling parameter s is unitless for the 2D Helmert, as opposed to the 3D version where the scaling
parameter is given in units of ppm.
(7.2) can be extended to a time-varying kinematic version by adjusting the parameters with (7.1) to (7.2), which yields
the kinematic 2D Helmert transform:
[︂ ]︂𝐵 [︂ ]︂ ]︂ [︂ ]︂𝐴
𝑇˙𝑥 cos 𝜃˙ sin 𝜃˙ 𝑋
[︂
𝑋
= ˙ + 𝑠(𝑡) (7.2)
𝑌 𝑇𝑦 − sin 𝜃˙ cos 𝜃˙ 𝑌
All parameters in (7.2) are determined by the use of (7.1), which applies the rate of change to each individual parameter
for a given timespan between 𝑡 and 𝑡𝑐𝑒𝑛𝑡𝑟𝑎𝑙 .
3D Helmert
𝑉 𝐵 = 𝑇 + 1 + 𝑠 × 10−6 R𝑉 𝐴
(︀ )︀
(7.2)
Where 𝑇 is a vector consisting of the three translation parameters, 𝑠 is the scaling factor and R is a rotation matrix.
𝑉 𝐴 and 𝑉 𝐵 are coordinate vectors, with 𝑉 𝐴 being the input coordinate and 𝑉 𝐵 is the output coordinate.
In the Position Vector convention, we define 𝑅𝑥 = 𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑥), 𝑅𝑧 = 𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑦) and 𝑅𝑧 = 𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑧)
In the Coordinate Frame convention, 𝑅𝑥 = −𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑥), 𝑅𝑧 = −𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑦) and 𝑅𝑧 = −𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑧)
The rotation matrix is composed of three rotation matrices, one for each axis.
⎡ ⎤
1 0 0
R𝑋 = ⎣0 cos 𝑅𝑥 − sin 𝑅𝑥 ⎦ (7.2)
0 sin 𝑅𝑥 cos 𝑅𝑥
⎡ ⎤
cos 𝑅𝑦 0 sin 𝑅𝑦
R𝑌 = ⎣ 0 1 0 ⎦ (7.3)
− sin 𝑅𝑦 0 cos 𝑅𝑦
⎡ ⎤
cos 𝑅𝑧 − sin 𝑅𝑧 0
R𝑍 = ⎣ sin 𝑅𝑧 cos 𝑅𝑧 0⎦ (7.4)
0 0 1
The three rotation matrices can be combined in one:
R = RX RY RY (7.5)
Using the small angle approxition the rotation matrix can be simplified to
⎡ ⎤
1 −𝑅𝑧 𝑅𝑦
R = ⎣ 𝑅𝑧 1 −𝑅𝑥 ⎦ (7.7)
−𝑅𝑦 𝑅𝑥 1
Which allow us to express the most common version of the Helmert transform, using the approximated rotation matrix:
⎡ ⎤𝐵 ⎡ ⎤ ⎡ ⎤ ⎡ ⎤𝐴
𝑋 𝑇𝑥 1 −𝑅𝑧 𝑅𝑦 𝑋
⎣ 𝑌 ⎦ = ⎣𝑇𝑦 ⎦ + 1 + 𝑠 × 10−6 ⎣ 𝑅𝑧
(︀ )︀
1 −𝑅𝑥 ⎦ ⎣ 𝑌 ⎦ (7.7)
𝑍 𝑇𝑧 −𝑅𝑦 𝑅𝑥 1 𝑍
If the rotation matrix is transposed, or the sign of the rotation terms negated, the rotational part of the transformation
is effectively reversed. This is what happens when switching between the 2 conventions position_vector and
coordinate_frame
Applying (7.1) we get the kinematic version of the approximated 3D Helmert:
⎡ ⎤𝐵 ⎡ ⎤ ⎤ ⎡ ⎤𝐴
𝑇˙𝑥 −𝑅˙𝑧 𝑅˙𝑦
⎡
𝑋 1 𝑋
⎣ 𝑌 ⎦ = ⎣𝑇˙𝑦 ⎦ + 1 + 𝑠˙ × 10−6 ⎣ 𝑅˙𝑧 −𝑅˙𝑥 ⎦ ⎣ 𝑌 ⎦
(︀ )︀
1 (7.7)
𝑍 𝑇˙𝑧 −𝑅˙𝑦 𝑅˙𝑥 1 𝑍
The Helmert transformation can be applied without using the rotation parameters, in which case it becomes a simple
translation of the origin of the coordinate system. When using the Helmert in this version equation (7.2) simplifies to:
⎡ ⎤𝐵 ⎡ ⎤ ⎡ ⎤𝐴
𝑋 𝑇𝑥 𝑋
⎣ 𝑌 ⎦ = ⎣𝑇𝑦 ⎦ + ⎣ 𝑌 ⎦ (7.7)
𝑍 𝑇𝑧 𝑍
Alias horner
Domain 2D and 3D
Input type Geodetic and projected coordinates
Output type Geodetic and projected coordinates
The Horner polynomial evaluation scheme is used for transformations between reference frames where one or both
are inhomogenous or internally distorted. This will typically be reference frames created before the introduction of
space geodetic techniques such as GPS.
Horner polynomials, or Multiple Regression Equations as they are also known as, have their strength in being able to
create complicated mappings between coordinate reference frames while still being lightweight in both computational
cost and disk space used.
PROJ implements two versions of the Horner evaluation scheme: Real and complex polynomial evaluation. Below
both are briefly described. For more details consult [Ruffhead2016] and [IOGP2018].
The polynomial evaluation in real number space is defined by the following equations:
∑︁
∆𝑋 = 𝑢𝑖,𝑗 𝑈 𝑖 𝑉 𝑗
𝑖,𝑗
∑︁ (7.7)
∆𝑌 = 𝑣𝑖,𝑗 𝑈 𝑖 𝑉 𝑗
𝑖,𝑗
where
𝑈 = 𝑋𝑖𝑛 − 𝑋𝑜𝑟𝑖𝑔𝑖𝑛
(7.8)
𝑉 = 𝑌𝑖𝑛 − 𝑌𝑜𝑟𝑖𝑔𝑖𝑛
and 𝑢𝑖,𝑗 and 𝑣𝑖,𝑗 are coefficients that make up the polynomial.
The final coordinates are determined as
𝑋𝑜𝑢𝑡 = 𝑋𝑖𝑛 + ∆𝑋
(7.9)
𝑌𝑜𝑢𝑡 = 𝑌𝑖𝑛 + ∆𝑌
The inverse transform is the same as the above but requires a different set of coefficients.
Evaluation of the complex polynomials are defined by the following equations:
𝑛
∑︁
∆𝑋 + 𝑖∆𝑌 = (𝑐2𝑗−1 + 𝑖𝑐2𝑗 )(𝑈 + 𝑖𝑉 )𝑗 (7.10)
𝑗=1
Where 𝑛 is the degree of the polynomial. 𝑈 and 𝑉 are defined as in (7.8) and the resulting coordinates are again
determined by (7.9).
7.3.6.1 Examples
Mapping between Danish TC32 and ETRS89/UTM zone 32 using polynomials in real number space:
+proj=horner
+ellps=intl
+range=500000
+fwd_origin=877605.269066,6125810.306769
+inv_origin=877605.760036,6125811.281773
+deg=4
+fwd_v=6.1258112678e+06,9.9999971567e-01,1.5372750011e-10,5.9300860915e-15,2.
˓→2609497633e-19,4.3188227445e-05,2.8225130416e-10,7.8740007114e-16,-1.7453997279e-19,
˓→1.6877465415e-10,-1.1234649773e-14,-1.7042333358e-18,-7.9303467953e-15,-5.
˓→2906832535e-19,3.9984284847e-19
+fwd_u=8.7760574982e+05,9.9999752475e-01,2.8817299305e-10,5.5641310680e-15,-1.
˓→5544700949e-18,-4.1357045890e-05,4.2106213519e-11,2.8525551629e-14,-1.9107771273e-
˓→18,3.3615590093e-10,2.4380247154e-14,-2.0241230315e-18,1.2429019719e-15,5.
˓→3886155968e-19,-1.0167505000e-18
+inv_v=6.1258103208e+06,1.0000002826e+00,-1.5372762184e-10,-5.9304261011e-15,-2.
˓→2612705361e-19,-4.3188331419e-05,-2.8225549995e-10,-7.8529116371e-16,1.7476576773e-
˓→19,-1.6875687989e-10,1.1236475299e-14,1.7042518057e-18,7.9300735257e-15,5.
˓→2881862699e-19,-3.9990736798e-19
+inv_u=8.7760527928e+05,1.0000024735e+00,-2.8817540032e-10,-5.5627059451e-15,1.
˓→5543637570e-18,4.1357152105e-05,-4.2114813612e-11,-2.8523713454e-14,1.9109017837e-
˓→18,-3.3616407783e-10,-2.4382678126e-14,2.0245020199e-18,-1.2441377565e-15,-5.
˓→3885232238e-19,1.0167203661e-18
Mapping between Danish System Storebælt and ETRS89/UTM zone 32 using complex polynomials:
+proj=horner
+ellps=intl
+range=500000
+fwd_origin=4.94690026817276e+05,6.13342113183056e+06
+inv_origin=6.19480258923588e+05,6.13258568148837e+06
+deg=3
+fwd_c=6.13258562111350e+06,6.19480105709997e+05,9.99378966275206e-01,-2.
˓→82153291753490e-02,-2.27089979140026e-10,-1.77019590701470e-09,1.08522286274070e-14,
˓→2.11430298751604e-15
+inv_c=6.13342118787027e+06,4.94690181709311e+05,9.99824464710368e-01,2.
˓→82279070814774e-02,7.66123542220864e-11,1.78425334628927e-09,-1.05584823306400e-14,-
˓→3.32554258683744e-15
7.3.6.2 Parameters
Setting up Horner polynomials requires many coefficients being explicitly written, even for polynomials of low degree.
For this reason it is recommended to store the polynomial definitions in an init file for easier writing and reuse.
Required
Below is a list of required parameters that can be set for the Horner polynomial transformation. As stated above,
the transformation takes to forms, either using real or complex polynomials. These are divided into separate sections
below. Parameters from the two sections are mutually exclusive, that is parameters describing real and complex
polynomials can’t be mixed.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+deg=<value>
Degree of polynomial
+fwd_origin=<northing,easting>
Coordinate of origin for the forward mapping
+inv_origin=<northing,easting>
Coordinate of origin for the inverse mapping
Real polynomials
The following parameters has to be set if the transformation consists of polynomials in real space. Each parameter takes
a comma-separated list of coefficients. The number of coefficients is governed by the degree, 𝑑, of the polynomial:
(𝑑 + 1)(𝑑 + 2)
𝑁=
2
+fwd_u=<u_11,u_12,...,u_ij,..,u_mn>
Coefficients for the forward transformation i.e. latitude to northing as described in (7.7).
+fwd_v=<v_11,v_12,...,v_ij,..,v_mn>
Coefficients for the forward transformation i.e. longitude to easting as described in (7.7).
+inv_u=<u_11,u_12,...,u_ij,..,u_mn>
Coefficients for the inverse transformation i.e. latitude to northing as described in (7.7).
+inv_v=<v_11,v_12,...,v_ij,..,v_mn>
Coefficients for the inverse transformation i.e. longitude to easting as described in (7.7).
Complex polynomials
The following parameters has to be set if the transformation consists of polynomials in complex space. Each param-
eter takes a comma-separated list of coefficients. The number of coefficients is governed by the degree, 𝑑, of the
polynomial:
𝑁 = 2𝑑 + 2
+fwd_c=<c_1,c_2,...,c_N>
Coefficients for the complex forward transformation as described in (7.10).
+inv_c=<c_1,c_2,...,c_N>
Coefficients for the complex inverse transformation as described in (7.10).
Optional
+range=<value>
Radius of the region of validity.
+uneg
Express latitude as southing. Only applies for complex polynomials.
+vneg
Express longitude as westing. Only applies for complex polynomials.
1. Wikipedia
Alias molodensky
Domain 3D
Input type Geodetic coordinates (horizontal), meters (vertical)
output type Geodetic coordinates (horizontal), meters (vertical)
The Molodensky transform can be used to perform a datum shift from coordinate (𝜑1 , 𝜆1 , ℎ1 ) to (𝜑2 , 𝜆2 , ℎ2 ) where
the two coordinates are referenced to different ellipsoids. This is based on three assumptions:
1. The cartesian axes, 𝑋, 𝑌, 𝑍, of the two ellipsoids are parallel.
2. The offset, 𝛿𝑋, 𝛿𝑌, 𝛿𝑍, between the two ellipsoid are known.
3. The characteristics of the two ellipsoids, expressed as the difference in semimajor axis (𝛿𝑎) and flattening (𝛿𝑓 ),
are known.
The Molodensky transform is mostly used for transforming between old systems dating back to the time before com-
puters. The advantage of the Molodensky transform is that it is fairly simple to compute by hand. The ease of
computation come at the cost of limited accuracy.
A derivation of the mathematical formulas for the Molodensky transform can be found in [Deakin2004].
7.3.7.1 Examples
7.3.7.2 Parameters
Required
+da=<value>
Difference in semimajor axis of the defining ellipsoids.
+df=<value>
Difference in flattening of the defining ellipsoids.
+dx=<value>
Offset of the X-axes of the defining ellipsoids.
+dy=<value>
Offset of the Y-axes of the defining ellipsoids.
+dz=<value>
Offset of the Z-axes of the defining ellipsoids.
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
Optional
+abridged
Use the abridged version of the Molodensky transform.
Note: It should not be confused with the Molodensky transform transform which operates directly in the geodetic
coordinates. Molodensky-Badekas can rather be seen as a variation of Helmert transform
Alias molobadekas
Domain 3D
Input type Cartesian coordinates
Output type Cartesian coordinates
The Molodensky-Badekas transformation is a variation of the Helmert transform where the rotational terms are not
directly applied to the ECEF coordinates, but on cartesian coordinates relative to a reference point (usually close to
Earth surface, and to the area of use of the transformation). When px = py = pz = 0, this is equivalent to a 7-parameter
Helmert transformation.
7.3.8.1 Example
proj=molobadekas convention=coordinate_frame
x=-270.933 y=115.599 z=-360.226 rx=-5.266 ry=-1.238 rz=2.381
s=-5.109 px=2464351.59 py=-5783466.61 pz=974809.81
7.3.8.2 Parameters
Note: All parameters (except convention) are optional but at least one should be used, otherwise the operation will
return the coordinates unchanged.
+convention=coordinate_frame/position_vector
Indicates the convention to express the rotational terms when a 3D-Helmert / 7-parameter more transform is
involved.
The two conventions are equally popular and a frequent source of confusion. The coordinate frame convention
is also described as an clockwise rotation of the coordinate frame. It corresponds to EPSG method code 1034
(in the geocentric domain) or 9636 (in the geographic domain) The position vector convention is also described
as an anticlockwise (counter-clockwise) rotation of the coordinate frame. It corresponds to as EPSG method
code 1061 (in the geocentric domain) or 1063 (in the geographic domain).
The result obtained with parameters specified in a given convention can be obtained in the other convention by
negating the rotational parameters (rx, ry, rz)
+x=<value>
Translation of the x-axis given in meters.
+y=<value>
Translation of the y-axis given in meters.
+z=<value>
Translation of the z-axis given in meters.
+s=<value>
Scale factor given in ppm.
+rx=<value>
X-axis rotation given arc seconds.
+ry=<value>
Y-axis rotation given in arc seconds.
+rz=<value>
Z-axis rotation given in arc seconds.
+px=<value>
Coordinate along the x-axis of the reference point given in meters.
+py=<value>
Coordinate along the y-axis of the reference point given in meters.
+pz=<value>
Coordinate along the z-axis of the reference point given in meters.
In the Position Vector convention, we define 𝑅𝑥 = 𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑥), 𝑅𝑧 = 𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑦) and 𝑅𝑧 = 𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑧)
In the Coordinate Frame convention, 𝑅𝑥 = −𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑥), 𝑅𝑧 = −𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑦) and 𝑅𝑧 = −𝑟𝑎𝑑𝑖𝑎𝑛𝑠 (𝑟𝑧)
⎡ ⎤𝑜𝑢𝑡𝑝𝑢𝑡 ⎡ ⎤ ⎡ ⎤ ⎡ 𝑖𝑛𝑝𝑢𝑡 ⎤
𝑋 𝑇𝑥 + 𝑃𝑥 1 −𝑅𝑧 𝑅𝑦 𝑋 − 𝑃𝑥
= ⎣𝑇𝑦 + 𝑃𝑦 ⎦ + 1 + 𝑠 × 10−6 ⎣ 𝑅𝑧 −𝑅𝑥 ⎦ ⎣ 𝑌 𝑖𝑛𝑝𝑢𝑡 − 𝑃𝑦 ⎦
(︀ )︀
⎣𝑌 ⎦ 1 (7.11)
𝑍 𝑇𝑧 + 𝑃𝑧 −𝑅𝑦 𝑅𝑥 1 𝑍 𝑖𝑛𝑝𝑢𝑡 − 𝑃𝑧
Alias hgridshift
Domain 2D, 3D and 4D
Input type Geodetic coordinates (horizontal), meters (vertical), decimalyear (temporal)
Output type Geodetic coordinates (horizontal), meters (vertical), decimalyear (temporal)
The horizontal grid shift is done by offsetting the planar input coordinates by a specific amount determined by the
loaded grids. The simplest use case of the horizontal grid shift is applying a single grid:
+proj=hgridshift +grids=nzgr2kgrid0005.gsb
More than one grid can be loaded at the same time, for instance in case the dataset needs to be transformed spans
several countries. In this example grids of the continental US, Alaska and Canada is loaded at the same time:
+proj=hgridshift +grids=@conus,@alaska,@ntv2_0.gsb,@ntv_can.dat
The @ in the above example states that the grid is optional, in case the grid is not found in the PROJ search path. The
list of grids is prioritized so that grids in the start of the list takes precedence over the grids in the back of the list.
PROJ supports CTable2, NTv1 and NTv2 files for horizontal grid corrections. Details about all three formats can be
found in the GDAL documentation and/or driver source code. GDAL reads and writes all three formats. Using GDAL
for construction of new grids is recommended.
Note: The timestamp of the resulting coordinate is still 2005.0. The observation time is always kept unchanged as it
would otherwise be impossible to do the inverse transformation.
Temporal gridshifting is especially powerful in transformation pipelines where several gridshifts can be chained to-
gether, effectively acting as a series of step functions that can be applied to a coordinate that is propagated through
time. In the following example we establish a pipeline that allows transformation of coordinates from any given epoch
up until the current date, applying only those gridshifts that have central epochs between the observation epoch and
the final epoch:
+proj=pipeline +t_final=now
+step +proj=hgridshift +grids=earthquake_1.gsb +t_epoch=2010.421
+step +proj=hgridshift +grids=earthquake_2.gsb +t_epoch=2013.853
+step +proj=hgridshift +grids=earthquake_3.gsb +t_epoch=2017.713
Note: The special epoch now is used when specifying the final epoch with +t_final. This results in coordinates
being transformed to the current date. Additionally, +t_final is used as a global pipeline parameter, which means
that it is applied to all the steps in the pipeline.
In the above transformation, a coordinate with observation epoch 2009.32 would be subject to all three gridshift steps
in the pipeline. A coordinate with observation epoch 2014.12 would only by offset by the last step in the pipeline.
7.3.9.2 Parameters
Required
+grids=<list>
Comma-separated list of grids to load. If a grid is prefixed by an @ the grid is considered optional and PROJ
will the not complain if the grid is not available.
Grids are expected to be in CTable2, NTv1 or NTv2 format.
Optional
+t_epoch=<time>
Central epoch of the transformation.
New in version 5.1.0.
+t_final=<time>
Final epoch that the coordinate will be propagated to after transformation. The special epoch now can be used
instead of writing a specific period in time. When now is used, it is replaced internally with the epoch of the
transformation. This means that the resulting coordinate will be slightly different if carried out again at a later
date.
New in version 5.1.0.
Alias vgridshift
Domain 3D and 4D
Input type Geodetic coordinates (horizontal), meters (vertical), decimalyear (temporal)
Output type Geodetic coordinates (horizontal), meters (vertical), decimalyear (temporal)
The vertical grid shift is done by offsetting the vertical input coordinates by a specific amount determined by the
loaded grids. The simplest use case of the horizontal grid shift is applying a single grid. Here we change the vertical
reference from the ellipsoid to the global geoid model, EGM96:
+proj=vgridshift +grids=egm96_15.gtx
More than one grid can be loaded at the same time, for instance in the case where a better geoid model than the global
is available for a certain area. Here the gridshift is set up so that the local DVR90 geoid model takes precedence over
the global model:
+proj=vgridshift [email protected],egm96_15.gtx
The @ in the above example states that the grid is optional, in case the grid is not found in the PROJ search path. The
list of grids is prioritized so that grids in the start of the list takes precedence over the grids in the back of the list.
PROJ supports the GTX file format for vertical grid corrections. Details about all the format can be found in the GDAL
documentation. GDAL both reads and writes the format. Using GDAL for construction of new grids is recommended.
Note: The timestamp of the resulting coordinate is still 2005.0. The observation time is always kept unchanged as it
would otherwise be impossible to do the inverse transformation.
Temporal gridshifting is especially powerful in transformation pipelines where several gridshifts can be chained to-
gether, effectively acting as a series of step functions that can be applied to a coordinate that is propagated through
time. In the following example we establish a pipeline that allows transformation of coordinates from any given epoch
up until the current date, applying only those gridshifts that have central epochs between the observation epoch and
the final epoch:
+proj=pipeline +t_final=now
+step +proj=vgridshift +grids=earthquake_1.gtx +t_epoch=2010.421
+step +proj=vgridshift +grids=earthquake_2.gtx +t_epoch=2013.853
+step +proj=vgridshift +grids=earthquake_3.gtx +t_epoch=2017.713
Note: The special epoch now is used when specifying the final epoch with +t_final. This results in coordinates
being transformed to the current date. Additionally, +t_final is used as a global pipeline parameter, which means
that it is applied to all the steps in the pipeline.
In the above transformation, a coordinate with observation epoch 2009.32 would be subject to all three gridshift steps
in the pipeline. A coordinate with observation epoch 2014.12 would only by offset by the last step in the pipeline.
7.3.10.2 Parameters
Required
+grids=<list>
Comma-separated list of grids to load. If a grid is prefixed by an @ the grid is considered optional and PROJ
will the not complain if the grid is not available.
Grids are expected to be in GTX format.
Optional
+t_epoch=<time>
Central epoch of the transformation.
New in version 5.1.0.
+t_final=<time>
Final epoch that the coordinate will be propagated to after transformation. The special epoch now can be used
instead of writing a specific period in time. When now is used, it is replaced internally with the epoch of the
transformation. This means that the resulting coordinate will be slightly different if carried out again at a later
date.
New in version 5.1.0.
+multiplier=<value>
Specify the multiplier to apply to the grid value in the forward transformation direction, such that:
The multiplier can be used to control whether the gridvalue should be added or sustracted, and if unit conversion
must be done (the multiplied gridvalue must be expressed in metre).
Note that the default is -1.0 for historical reasons.
New in version 5.2.0.
Alias xyzgridshift
Domain 3D
Input type Cartesian coordinates
Output type Cartesian coordinates
Perform a geocentric translation by bilinear interpolation of dx, dy, dz translation values from a grid. The grid is
referenced against either the 2D geographic CRS corresponding to the input (or sometimes output) CRS.
This method is described (in French) in [NTF_88] and as EPSG operation method code 9655 in [IOGP2018]
(§2.4.4.1.1 France geocentric interpolation).
The translation in the grids are added to the input coordinates in the forward direction, and subtracted in the reverse
direction. By default (if grid_ref=input_crs), in the forward direction, the input coordinates are converted to
their geographic equivalent to directly read and interpolate from the grid. In the reverse direction, an iterative method
is used to be able to find the grid locations to read. If grid_ref=output_crs is used, then the reverse strategy is
applied: iterative method in the forward direction, and direct read in the reverse direction.
7.3.11.1 Example
+proj=pipeline
+step +proj=push +v_3
+step +proj=cart +ellps=clrk80ign
+step +proj=xyzgridshift +grids=gr3df97a.tif +grid_ref=output_crs +ellps=GRS80
+step +proj=cart +ellps=GRS80 +inv
+step +proj=pop +v_3
Parameters
The ellipsoid parameters should be the ones consistent with grid_ref. They are used to perform a geocentric to
geographic conversion to find the translation parameters.
Required
+ellps=<value>
See proj -le for a list of available ellipsoids.
Defaults to “GRS80”.
+grids=<list>
Comma-separated list of grids to load. If a grid is prefixed by an @ the grid is considered optional and PROJ
will the not complain if the grid is not available.
Grids are expected to be in GeoTIFF format. If no metadata is provided, the first, second and third samples are
assumed to be the geocentric translation along X, Y and Z axis respectively, in metres.
Optional
+grid_ref=input_crs/output_crs
Specify in which CRS the grid is referenced to. The default value is input_crs. That is the grid is referenced in
the geographic CRS corresponding to the input geocentric CRS.
If output_crs is specified, the grid is referenced in the geographic CRS corresponding to the output geocentric
CRS. This is for example the case for the French gr3df97a.tif grid converting from NTF to RGF93, but refer-
enced against RGF93. Thus in the forward direction (NTF->RGF93), an iterative method is used to find the
appropriate shift.
+multiplier=<value>
Specify the multiplier to apply to the grid values. Defaults to 1.0
Alias pipeline
Domain 2D, 3D and 4D
Input type Any
Output type Any
Note: See the section on Geodetic transformation for a more thorough introduction to the concept of transformation
pipelines in PROJ.
With the pipeline operation it is possible to perform several operations after each other on the same input data. This
feature makes it possible to create transformations that are made up of more than one operation, e.g. performing a
datum shift and then applying a suitable map projection. Theoretically any transformation between two coordinate
reference systems is possible to perform using the pipeline operation, provided that the necessary coordinate operations
in each step is available in PROJ.
A pipeline is made up of a number of steps, with each step being a coordinate operation in itself. By connecting
these individual steps sequentially we end up with a concatenated coordinate operation. An example of this is a
transformation from geodetic coordinates on the GRS80 ellipsoid to a projected system where the east-west and north-
east axes has been swapped:
Here the first step is applying the Mercator projection and the second step is applying the Axis swap conversion. Note
that the +ellps=GRS80 is specified before the first occurrence of +step. This means that the GRS80 ellipsoid is used
in both steps, since any parameter stated before the first occurrence of +step is treated as a global parameter and is
transferred to each individual steps.
+proj=pipeline
+proj=pipeline
+step +proj=pipeline +step +proj=merc +step +proj=axisswap +order=2,1
+step +proj=unitconvert +xy_in=m +xy_out=us-ft
+proj=pipeline
+step +init=predefined_pipelines:projectandswap
+step +proj=unitconvert +xy_in=m +xy_out=us-ft
does not.
3. Pipelines without a forward path can’t be constructed.
Will result in an error since Urmaev V does not have an inverse operation defined.
4. Parameters added before the first `+step` are global and will be applied to all steps.
In the following the GRS80 ellipsoid will be applied to all steps.
+proj=pipeline +ellps=GRS80
+step +proj=cart
+step +proj=helmert +x=10 +y=3 +z=1
+step +proj=cart +inv
+step +proj=merc
+proj=pipeline
+step +proj=merc # Mercator outputs projected coordinates
+step +proj=robin # The Robinson projection expects angular input
7.4.2 Parameters
7.4.2.1 Required
+step
Separate each step in a pipeline.
7.4.2.2 Optional
+inv
Invert a step in a pipeline.
+omit_fwd
New in version 6.3.0.
Skip a step of the pipeline when it is followed in the forward path.
The following example shows a combined use of push and pop operators, with omit_fwd and omit_inv
options, to implement a vertical adjustment that must be done in a interpolation CRS that is different from the
horizontal CRS used in input and output. +omit_fwd in the forward path avoid a useless inverse horizontal
transformation and relies on the pop operator to restore initial horizontal coordinates. +omit_inv serves the
similar purpose when the pipeline is executed in the reverse direction
+proj=pipeline
+step +proj=unitconvert +xy_in=deg +xy_out=rad
+step +proj=push +v_1 +v_2
+step +proj=hgridshift +grids=nvhpgn.gsb +omit_inv
+step +proj=vgridshift +grids=g1999u05.gtx +multiplier=1
+step +inv +proj=hgridshift +grids=nvhpgn.gsb +omit_fwd
+step +proj=pop +v_1 +v_2
+step +proj=unitconvert +xy_in=rad +xy_out=deg
+omit_inv
New in version 6.3.0.
Skip a step of the pipeline when it is followed in the reverse path.
7.5.1 Introduction
When using projinfo -s {crs_def} -t {crs_def}, cs2cs {crs_def} {crs_def} or the underly-
ing proj_create_crs_to_crs() or proj_create_operations() functions, PROJ applies an algorithm
to compute one or several candidate coordinate operations, that can be expressed as a PROJ pipeline to transform
between the source and the target CRS. This document is about the description of this algorithm that finds the actual
operations to apply to be able later to perform transform coordinates. So this is mostly about metadata management
around coordinate operation methods, and not about the actual mathematics used to implement those methods. As
a matter of fact with PROJ 6, there are about 60 000 lines of code dealing with “metadata” management (including
conversions between PROJ strings, all CRS WKT variants), to be compared to 30 000 for the purely computation part.
This document is meant as a plain text explanation of the code for developers, but also as a in-depth examination of
what happens under the hood for curious PROJ users. It is important to keep in mind that it is not meant to be the
ultimate source of truth of how coordinate operations should be computed. There are clearly implementation choices
and compromises that can be questionned.
Let us start with an example to research operations between the NAD27 and NAD83 geographic CRS:
$ projinfo -s NAD27 -t NAD83 --summary --spatial-test intersects --grid-check none
EPSG:1462, NAD27 to NAD83 (5), 1.0 m, Canada - Quebec, at least one grid missing
EPSG:9111, NAD27 to NAD83 (9), 1.5 m, Canada - Saskatchewan, at least one grid missing
unknown id, Ballpark geographic offset from NAD27 to NAD83, unknown accuracy, World,
˓→has ballpark transformation
EPSG:8555, NAD27 to NAD83 (7), 0.15 m, USA - CONUS and GoM, at least one grid missing
EPSG:8549, NAD27 to NAD83 (8), 0.5 m, USA - Alaska, at least one grid missing
The algorithm involves many cases, so we will progress in the explanation from the most simple case to more complex
ones. We document here the working of this algorithm as implemented in PROJ 6.3.0. The results of some examples
might also be quite sensitive to the content of the PROJ database and the PROJ version used.
From a code point of view, the entry point of the algorithm is the C++
osgeo::proj::operation::CoordinateOperation::createOperations() method.
It combines several strategies:
• look up in the PROJ database for available operations
• consider the pair (source CRS, target CRS) to synthetize operations depending on the nature of the source and
target CRS.
With the above example of two geographic CRS, that have an identified identifier, (projinfo internally resolves
NAD27 to EPSG:4267 and NAD83 to EPSG:4269) the algorithm will first search in the coordinate operation related
tables of the proj.db if there are records that list direct transformations between the source and the target CRS. The
transformations typically involve Helmert-style operations or datum shift based on grids (more esoteric operations are
possible).
A request similar to the following will be emitted:
$ sqlite3 proj.db "SELECT auth_name, code, name, method_name, accuracy FROM \
coordinate_operation_view WHERE \
source_crs_auth_name = 'EPSG' AND \
source_crs_code = '4267' AND \
target_crs_auth_name = 'EPSG' AND \
target_crs_code = '4269'"
As we have found direct transformations, we will not attempt any more complicated research. One can note in the
above result set that a ESRI:108003 operation was found, but as the source and target CRS are in the EPSG registry,
and there are operations between those CRS in the EPSG registry itself, transformations from other authorities will be
ignored (except if they are in the PROJ authority, which can be used as an override).
As those results all involve operations that does not have a perfect accuracy and that does not cover the area of use of
the 2 CRSs, a ‘Ballpark geographic offset from NAD27 to NAD83’ operation is synthetized by PROJ (see Ballpark
transformation)
11. consider as more relevant an operation that involves less transformation steps
12. and for completeness, if two operations are comparable given all the above criteria, consider as more relevant
the one which has the shorter name, and if they have the same length, consider as more relevant the one whose
name comes first in lexicographic order (obviously completely arbitrary, but a sorting algorithm must be able to
compare all entries)
In a number of situations, the source and/or target CRS do not have an identifier (WKT without identifier, PROJ string,
..) The first step is to try to find in the proj.db a CRS of the same nature of the CRS to identify and whose name
exactly matches the one provided to the createOperations() method. If there is exactly one match and that the
CRS are “computationnaly” equivalent, then use the code of the CRS for further computations.
If this search did not succeed, or if the previous case with known CRS identifiers did not result in matches in the
database, the search will be based on the datums. That is, a list of geographic CRS whose datum matches the datum of
the source and target CRS is searched for in the database (by querying the geodetic_crs database table). If the datum
has a known identifier, we will use it, otherwise we will look for an equivalent datum in the database based on the
datum name.
Let’s consider the case where the datum of the source CRS is EPSG:6171 “Reseau Geodesique Francais 1993” and
the datum of the target CRS is EPSG:6258 “European Terrestrial Reference System 1989”. For EPSG:6171, there are
10 matching (non-deprecated) geodetic CRSs:
• EPSG:4171, RGF93, geographic 2D
• EPSG:4964, RGF93, geocentric
• EPSG:4965, RGF93, geographic 3D
• EPSG:7042, RGF93 (lon-lat), geographic 3D
• EPSG:7084, RGF93 (lon-lat), geographic 2D
• IGNF:RGF93, RGF93 cartesiennes geocentriques, geocentric
• IGNF:RGF93GDD, RGF93 geographiques (dd),geographic 2D
• IGNF:RGF93GEODD, RGF93 geographiques (dd), geographic 3D
• IGNF:RGF93G, RGF93 geographiques (dms), geographic 2D
• IGNF:RGF93GEO, RGF93 geographiques (dms), geographic 3D
The first three entries from the EPSG dataset are typical: for each datum, one can define a geographic 2D CRS (latitude,
longitude), a geographic 3D crs (latitude, longitude, ellipsoidal height) and a geocentric one. For that particular
case, the EPSG dataset has also included two extra definitions corresponding to a longitude, latitude, [ellipsoidal
height] coordinate system, as found in the official French IGNF registry. This IGNF registry has also definitions for a
geographic 2D CRS (with an extra subtelty with an entry using decimal degree as unit and another one degree-minute-
second), geographic 3D and geocentric.
For EPSG:6258, there are 7 matching (non-deprecated) geodetic CRSs:
• EPSG:4258, ETRS89, geographic 2D
• EPSG:4936, ETRS89, geocentric
• EPSG:4937, ETRS89, geographic 3D
• IGNF:ETRS89, ETRS89 cartesiennes geocentriques, geocentric
• IGNF:ETRS89G, ETRS89 geographiques (dms), geographic 2D
unknown id, axis order change (geographic3D horizontal) + RGF93 to ETRS89 (1) +
˓→Conversion from ETRS89 (geog2D) to ETRS89 (geocentric), 0 m, France
PROJ string:
+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=cart
˓→+ellps=GRS80
WKT2:2019 string:
CONCATENATEDOPERATION["axis order change (geographic3D horizontal) + RGF93 to ETRS89
˓→(1) + Conversion from ETRS89 (geog2D) to ETRS89 (geocentric)",
SOURCECRS[
GEOGCRS["RGF93 (lon-lat)",
[...]
ID["EPSG",7042]]],
TARGETCRS[
GEODCRS["ETRS89",
[...]
ID["EPSG",4936]]],
STEP[
CONVERSION["axis order change (geographic3D horizontal)",
METHOD["Axis Order Reversal (Geographic3D horizontal)",
ID["EPSG",9844]],
ID["EPSG",15499]]],
STEP[
COORDINATEOPERATION["RGF93 to ETRS89 (1)",
[...]
METHOD["Geocentric translations (geog2D domain)",
ID["EPSG",9603]],
PARAMETER["X-axis translation",0,
LENGTHUNIT["metre",1],
(continues on next page)
STEP[
CONVERSION["Conversion from ETRS89 (geog2D) to ETRS89 (geocentric)",
METHOD["Geographic/geocentric conversions",
ID["EPSG",9602]]]],
USAGE[
SCOPE["unknown"],
AREA["France"],
BBOX[41.15,-9.86,51.56,10.38]]]
Still considering transformations between geodetic/geographic CRS, but let’s consider that the lookup in the database
for a transformation between the source and target CRS (possibly going through the “equivalent” CRS based on the
same datum as detailed in the previous section) leads to an empty set.
Of course, as most operations are invertible, one first tries to do a lookup switching the source and target CRS, and
inverting the resulting operation(s):
unknown id, Ballpark geographic offset from NAD83 to NAD27, unknown accuracy, World,
˓→has ballpark transformation
INVERSE(EPSG):8555, Inverse of NAD27 to NAD83 (7), 0.15 m, USA - CONUS and GoM, at
˓→least one grid missing
INVERSE(EPSG):8549, Inverse of NAD27 to NAD83 (8), 0.5 m, USA - Alaska, at least one
˓→grid missing
That was an easy case. Now let’s consider the transformation between the Australian CRS AGD84 and GDA2020.
There is no direct transformation from AGD84 to GDA2020, or in the reverse direction, even when considering alter-
native geodetic CRS based on the underlying datums. PROJ will then do a cross-join in the coordinate_operation_view
table to find the tuples (op1, op2) of coordinate operations such that:
• SOURCE_CRS = op1.source_crs AND op1.target_crs = op2.source_crs AND op2.target_crs = TARGET_CRS
or
• SOURCE_CRS = op1.source_crs AND op1.target_crs = op2.target_crs AND op2.source_crs = TARGET_CRS
or
• SOURCE_CRS = op1.target_crs AND op1.source_crs = op2.source_crs AND op2.target_crs = TARGET_CRS
or
• SOURCE_CRS = op1.target_crs AND op1.source_crs = op2.target_crs AND op2.source_crs = TARGET_CRS
Depending on which case is selected, op1 and op2 should be reversed, before being concatenated.
This logic is implement by the findsOpsInRegistryWithIntermediate() method.
Assuming that the proj-datumgrid-oceania package is installed, we get the following results for the AGD84 to
GDA2020 coordinate operations lookup:
unknown id, AGD84 to GDA94 (5) + GDA94 to GDA2020 (1), 0.11 m, Australia - AGD84
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 \
+step +proj=unitconvert +xy_in=deg +xy_out=rad \
+step +proj=hgridshift +grids=National_84_02_07_01.gsb \
+step +proj=push +v_3 \
+step +proj=cart +ellps=GRS80 \
+step +proj=helmert +x=0.06155 +y=-0.01087 +z=-0.04019 \
+rx=-0.0394924 +ry=-0.0327221 +rz=-0.0328979 \
+s=-0.009994 +convention=coordinate_frame \
+step +inv +proj=cart +ellps=GRS80 \
+step +proj=pop +v_3 \
+step +proj=unitconvert +xy_in=rad +xy_out=deg \
+step +proj=axisswap +order=2,1
-------------------------------------
Operation n°2:
unknown id, AGD84 to GDA94 (2) + GDA94 to GDA2020 (1), 1.01 m, Australia - AGD84
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 \
+step +proj=unitconvert +xy_in=deg +xy_out=rad \
+step +proj=push +v_3 \
+step +proj=cart +ellps=aust_SA \
+step +proj=helmert +x=-117.763 +y=-51.51 +z=139.061 \
+rx=-0.292 +ry=-0.443 +rz=-0.277 +s=-0.191 \
+convention=coordinate_frame \
+step +proj=helmert +x=0.06155 +y=-0.01087 +z=-0.04019 \
+rx=-0.0394924 +ry=-0.0327221 +rz=-0.0328979 \
+s=-0.009994 +convention=coordinate_frame \
+step +inv +proj=cart +ellps=GRS80 \
+step +proj=pop +v_3 \
(continues on next page)
-------------------------------------
Operation n°3:
unknown id, AGD84 to GDA94 (5) + GDA94 to GDA2020 (2), 0.15 m, unknown domain of
˓→validity
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 \
+step +proj=unitconvert +xy_in=deg +xy_out=rad \
+step +proj=hgridshift +grids=National_84_02_07_01.gsb \
+step +proj=hgridshift +grids=GDA94_GDA2020_conformal_and_distortion.
˓→gsb \
-------------------------------------
Operation n°4:
unknown id, AGD84 to GDA94 (5) + GDA94 to GDA2020 (3), 0.15 m, unknown domain of
˓→validity
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 \
+step +proj=unitconvert +xy_in=deg +xy_out=rad \
+step +proj=hgridshift +grids=National_84_02_07_01.gsb \
+step +proj=hgridshift +grids=GDA94_GDA2020_conformal.gsb \
+step +proj=unitconvert +xy_in=rad +xy_out=deg \
+step +proj=axisswap +order=2,1
One can see that the selected intermediate CRS that has been used is GDA94. This is a completely novel behavior
of PROJ 6 as opposed to the logic of PROJ.4 where datum transformations implied using EPSG:4326 / WGS 84 has
the mandatory datum hub. PROJ 6 no longer hardcodes it as the mandatory datum hub, and relies on the database
to find the appropriate hub(s). Actually, WGS 84 has been considered during the above lookup, because there are
transformations between AGD84 and WGS 84 and WGS 84 and GDA2020. However those have been discarded in
a step which we did not mention previously: just after the initial filtering of results and their sorting, there is a final
filtering that is done. In the list of sorted results, given two operations A and B that have the same area of use, if B has
an accuracy lower than A, and A does not use grids, or all the needed grids are available, then B is discarded.
If one forces the datum hub to be considered to be EPSG:4326, ones gets:
unknown id, AGD84 to WGS 84 (7) + Inverse of GDA2020 to WGS 84 (2), 4 m, Australia -
˓→AGD84
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 \
+step +proj=unitconvert +xy_in=deg +xy_out=rad \
+step +proj=push +v_3 \
(continues on next page)
-------------------------------------
Operation n°2:
unknown id, AGD84 to WGS 84 (9) + Inverse of GDA2020 to WGS 84 (2), 4 m, Australia -
˓→AGD84
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 \
+step +proj=unitconvert +xy_in=deg +xy_out=rad \
+step +proj=hgridshift +grids=National_84_02_07_01.gsb \
+step +proj=unitconvert +xy_in=rad +xy_out=deg \
+step +proj=axisswap +order=2,1
Those operations are less accurate, since WGS 84 is assumed to be equivalent to GDA2020 with an accuracy of 4
metre. This is an instance demonstrating that using WGS 84 as a hub systematically can be sub-optimal.
There are still situations where the attempt to find a hub CRS does not work, because there is no such hub. This can
occur for example when transforming from GDA94 to the latest realization at time of writing of WGS 84, WGS 84
(G1762). There are transformations between WGS 84 (G1762). Using the above described techniques, we would
only find one non-ballpark operation taking the route: 1. Conversion from GDA94 (geog2D) to GDA94 (geocentric):
synthetized by PROJ 2. Inverse of ITRF2008 to GDA94 (1): from EPSG 3. Inverse of WGS 84 (G1762) to ITRF2008
(1): from EPSG 4. Conversion from WGS 84 (G1762) (geocentric) to WGS 84 (G1762): synthetized by PROJ
This is not bad, but the global validity area of use is “Australia - onshore and EEZ”, whereas GDA94 has a larger
area of use. There is another road that can be taken by going through GDA2020 instead of ITRF2008. The GDA94
to GDA2020 transformations operate on the respective geographic CRS, whereas GDA2020 to WGS 84 (G1762)
operate on the geocentric CRS. Consequently, GDA2020 cannot be identifier as a hub by a “simple” self-join SQL
request on the coordinate operation table. This requires to do the join based on the datum referenced by the source
and target CRS of each operation rather than the source and target CRS themselves. When there is a match, PROJ
inserts the required conversions between geographic and geocentric CRS to have a consistent concatenated operation,
like the following: 1. GDA94 to GDA2020 (1): from EPSG 2. Conversion from GDA2020 (geog2D) to GDA2020
(geocentric): synthetized by PROJ 3. GDA2020 to WGS 84 (G1762) (1): frmo EPSG 4. Conversion from WGS 84
(G1762) (geocentric) to WGS 84 (G1762) (geog2D): synthetized by PROJ
This actually extends to any Derived CRS, whose Projected CRS is a well-known particular case. Such transformations
are done in 2 steps:
1. Use the inverse conversion of the derived CRS to its base CRS, typically an inverse map projection.
2. Find transformations from this base CRS to the target CRS. If the base CRS is the target CRS, this step can be
skipped.
unknown id, Inverse of UTM zone 31N + Inverse of RGF93 to WGS 84 (1), 1 m, France
PROJ string:
+proj=pipeline +step +inv +proj=utm +zone=31 +ellps=WGS84 +step +proj=unitconvert +xy_
˓→in=rad +xy_out=deg +step +proj=axisswap +order=2,1
Such transformation is normally not meant as being used as standalone by PROJ users, but as an internal computation
step of a Compound CRS to a target CRS.
In cases where we are lucky, the PROJ database will have a transformation registered between those:
PROJ string:
+proj=vgridshift +grids=g2018u0.gtx +multiplier=1
But in cases where there is no match, the createOperationsVertToGeog method will be used to synthetize
a ballpark vertical transformation, just taking care of unit changes, and axis reversal in case the vertical CRS was a
depth rather than a height. Of course the results of such an operation are questionable, hence the ballpark qualifier and
a unknown accuracy advertized for such an operation.
Overall logic is similar to the above case. There might be direct operations in the PROJ database, involving grid
transformations or simple offsets. The fallback case is to synthetize a ballpark transformation.
This is implemented by the createOperationsVertToVert method
PROJ string:
+proj=pipeline +step +proj=axisswap +order=1,2,-3 +step +proj=unitconvert +z_in=us-ft
˓→+z_out=m +step +proj=vgridshift +grids=vertcone.gtx +multiplier=0.001
-------------------------------------
Operation n°2:
unknown id, Inverse of NGVD29 height (ftUS) to NGVD29 depth (ftUS) + NGVD29 height
˓→(ftUS) to NGVD29 height (m) + NGVD29 height (m) to NAVD88 height (2), 0.02 m, USA -
PROJ string:
+proj=pipeline +step +proj=axisswap +order=1,2,-3 +step +proj=unitconvert +z_in=us-ft
˓→+z_out=m +step +proj=vgridshift +grids=vertconc.gtx +multiplier=0.001
-------------------------------------
Operation n°3:
unknown id, Inverse of NGVD29 height (ftUS) to NGVD29 depth (ftUS) + NGVD29 height
˓→(ftUS) to NGVD29 height (m) + NGVD29 height (m) to NAVD88 height (1), 0.02 m, USA -
PROJ string:
+proj=pipeline +step +proj=axisswap +order=1,2,-3 +step +proj=unitconvert +z_in=us-ft
˓→+z_out=m +step +proj=vgridshift +grids=vertconw.gtx +multiplier=0.001
A typical example of a Compound CRS is a CRS made of a geographic or projected CRS as the horizontal component,
and a vertical CRS. E.g. “NAD83 + NAVD88 height”
When the horizontal component of the compound source CRS is a projected CRS, we first look for the operation from
this source CRS to another compound CRS made of the geographic CRS base of the projected CRS, like “NAD83
/ California zone 1 (ftUS) + NAVD88 height” to “NAD83 + NAVD88 height”, which ultimately goes to one of the
above described case. Then we can consider the transformation from a compound CRS made of a geographic CRS to
another geographic CRS.
It first starts by the vertical transformations from the vertical CRS of the source compound CRS to the target geographic
CRS, using the strategy detailed in Vertical CRS to a Geographic CRS
What we did not mention is that when there is not a transformation registered between the vertical CRS and the
target geographic CRS, PROJ attempts to find transformations between that vertical CRS and any other geographic
CRS. This is clearly an approximation. If the research of the vertical CRS to the target geographic CRS resulted in
operations that use grids that are not available, as another approximation, we research operations from the vertical
CRS to the source geographic CRS for the vertical component.
Once we got those more or less accurate vertical transformations, we must consider the horizontal transformation(s).
The algorithm iterates over all found vertical transformations and look for their target geographic CRS. This will be
used as the interpolation CRS for horizontal transformations. PROJ will then look for available transformations from
the source geographic CRS to the interpolation CRS and from the interpolation CRS to the target geographic CRS.
There is then a 3-level loop to create the final set of operations chaining together:
• the horizontal transformation from the source geographic CRS to the interpolation CRS
• the vertical transformation from the source vertical CRS to the interpolation CRS
• the horizontal transformation from the interpolation CRS to the target geographic CRS.
This is implemented by the createOperationsCompoundToGeog method
Example:
$ projinfo -s "NAD83(NSRS2007) + NAVD88 height" -t "WGS 84 (G1762)" --spatial-test
˓→intersects --summary
˓→WGS 84 (G1762), unknown accuracy, USA - CONUS - onshore, has ballpark transformation
˓→to WGS 84 (G1762), unknown accuracy, USA - CONUS - onshore, has ballpark
˓→transformation
˓→84 (G1762) to ITRF2008 (1) + Conversion from WGS 84 (G1762) (geocentric) to WGS 84
˓→transformation
˓→ellipsoid height to vertical height correction), unknown accuracy, USA - CONUS and
There is some similarity with the previous paragraph. We first research the vertical transformations between the two
vertical CRS.
1. If there is such a transformation, be it direct, or if both vertical CRS relate to a common intermediate CRS. If it
has a registered interpolation geographic CRS, then it is used. Otherwise we fallback to the geographic CRS of
the source CRS.
Finally, a 3-level loop to create the final set of operations chaining together:
• the horizontal transformation from the source CRS to the interpolation CRS
• the vertical transformation
• the horizontal transformation from the interpolation CRS to the target CRS.
Example:
$ projinfo -s "NAD27 + NGVD29 height (ftUS)" -t "NAD83 + NAVD88 height" --
˓→spatial-test intersects --summary
unknown id, NGVD29 height (ftUS) to NAVD88 height (2) + NAD27 to NAD83
˓→(1), 0.17 m, USA - CONUS 89°W-107°W - onshore
unknown id, NGVD29 height (ftUS) to NAVD88 height (1) + NAD27 to NAD83
˓→(1), 0.17 m, USA - CONUS west of 107°W - onshore
unknown id, NGVD29 height (ftUS) to NAVD88 height (3) + NAD27 to NAD83
˓→(3), 1.02 m, unknown domain of validity
unknown id, NGVD29 height (ftUS) to NAVD88 height (2) + NAD27 to NAD83
˓→(3), 1.02 m, unknown domain of validity
unknown id, NGVD29 height (ftUS) to NAVD88 height (1) + NAD27 to NAD83
˓→(3), 1.02 m, unknown domain of validity
unknown id, NGVD29 height (ftUS) to NAVD88 height (3) + NAD27 to NAD83
˓→(5), 1.02 m, unknown domain of validity, at least one grid(continues
missing on next page)
unknown id, NGVD29 height (ftUS) to NAVD88 height (2) + NAD27 to NAD83
˓→(9), 1.52 m, unknown domain of validity, at least one grid missing
unknown id, NGVD29 height (ftUS) to NAVD88 height (1) + NAD27 to NAD83
˓→(9), 1.52 m, unknown domain of validity, at least one grid missing
˓→grid missing
˓→grid missing
˓→Ireland - onshore
˓→to WGS 84 (4) + OSGB 1936 to ETRS89 (2) + Null geographic offset from
˓→to WGS 84 (2) + OSGB 1936 to ETRS89 (2) + Null geographic offset from
˓→84 (2) + TM75 to ETRS89 (3) + Null geographic offset from ETRS89
˓→84 (2) + TM75 to ETRS89 (3) + Null geographic offset from ETRS89
˓→to WGS 84 (4) + OSGB 1936 to ETRS89 (2) + Null geographic offset from
The BoundCRS concept is an hybrid concept where a CRS is linked to a transformation from it to a hub CRS, typically
WGS 84. This is a long-time practice in PROJ.4 strings with the +towgs84, +nadgrids and +geoidgrids
keywords, or the TOWGS84[] node of WKT 1. When encountering those attributes when parsing a CRS string, PROJ
will create a BoundCRS object capturing this transformation. A BoundCRS object can also be provided with a WKT2
string, and in that case with a hub CRS being potentially different from WGS 84.
Let’s consider the case of a transformation between a BoundCRS (“+proj=tmerc +lat_0=49 +lon_0=-2
+k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-
20.489 +units=m” which used to be the PROJ.4 definition of “OSGB 1936 / British National Grid”) and a target
Geographic CRS, ETRS89.
We apply the following steps:
• transform from the base of the source CRS (that is the CRS wrapped by BoundCRS, here a ProjectedCRS) to
the geographic CRS of this base CRS
• apply the transformation of the BoundCRS to go from the geographic CRS of this base CRS to the hub CRS of
the BoundCRS, in that instance WGS 84.
• apply a transformation from the hub CRS to the target CRS.
This is implemented by the createOperationsBoundToGeog method
Example:
PROJ string:
+proj=pipeline +step +inv +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000
˓→+y_0=-100000 +ellps=airy +step +proj=push +v_3 +step +proj=cart +ellps=airy +step
There are other situations with BoundCRS, involving vertical transformations, or transforming to other objects than a
geographic CRS, but the curious reader will have to inspect the code for the actual gory details.
EIGHT
RESOURCE FILES
A number of files containing preconfigured transformations and default parameters for certain projections are bundled
with the PROJ distribution. Init files contain preconfigured proj-strings for various coordinate reference systems and
the defaults file contains default values for parameters of select projections.
In addition to the bundled init-files the PROJ project also distributes a number of packages containing transformation
grids and additional init-files not included in the main PROJ package.
PROJ will attempt to locate its resource files - database, transformation grids or init-files - from several directories.
The following paths are checked in order:
• For resource files that have an explicit relative or absolute path, the directory specified in the filename.
• Path resolved by the callback function set with the proj_context_set_file_finder(). If it is set, the
next tests will not be run.
• Path(s) set with the proj_context_set_search_paths(). If set, the next tests will not be run.
• New in version 7.0.
The PROJ user writable directory, which is :
– on Windows, ${LOCALAPPDATA}/proj
– on MacOSX, ${HOME}/Library/Application Support/proj
– on other platforms (Linux), ${XDG_DATA_HOME}/proj if XDG_DATA_HOME is defined. Else
${HOME}/.local/share/proj
• Path(s) set with by the environment variable PROJ_LIB. On Linux/MacOSX/Unix, use : to separate paths. On
Windows, ;
• New in version 7.0.
The ../share/proj/ and its contents are found automatically at run-time if the installation respects the build struc-
ture. That is, the binaries and proj.dll/libproj.so are installed under ../bin/ or ../lib/, and resource files are in
../share/proj/.
• A path built into PROJ as its resource installation directory (whose value is $(pkgdatadir) for builds using the
Makefile build system or ${CMAKE_INSTALL_PREFIX}/${DATADIR} for CMake builds). Note, however,
that since this is a hard-wired path setting, it only works if the whole PROJ installation is not moved somewhere
else.
• The current directory
337
PROJ coordinate transformation software library, Release 7.1.1
When networking capabilities are enabled, either by API with the proj_context_set_enable_network()
function or when the PROJ_NETWORK environment variable is set to ON, PROJ will attempt to use remote grids stored
on CDN (Content Delivery Network) storage.
8.2 proj.db
A proj installation includes a SQLite database of transformation information that must be accessible for the library to
work properly. The library will print an error if the database can’t be found.
8.3 proj.ini
[general]
; Lines starting by ; are commented lines.
;
cache_enabled = on
cache_size_MB = 300
cache_ttl_sec = 86400
; * evenden_snyder is the fastest, but less accurate far from central meridian
; * poder_engsager is slower, but more accurate far from central meridian
; * default will auto-select between the two above depending on the coordinate
; to transform and will use evenden_snyder if the error in doing so is below
; 0.1 mm (for an ellipsoid of the size of Earth)
tmerc_default_algo = poder_engsager
Grid files are important for shifting and transforming between datums.
PROJ supports CTable2, NTv1 and NTv2 files for horizontal grid corrections and the GTX file format for vertical
corrections. Details about the formats can be found in the GDAL documentation. GDAL reads and writes all formats.
Using GDAL for construction of new grids is recommended.
8.5.1 proj-data
The proj-data package is a collection of all the resource files that are freely available for use with PROJ. The
package is maintained on GitHub and the contents of the package are show-cased on the PROJ CDN. The contents
of the package can be installed using the projsync package or by downloading the zip archive of the package and
unpacking in the PROJ_LIB directory.
8.5.2 proj-datumgrid
Note: The packages described below can be used with PROJ 7 and later but are primarily meant to be used with PROJ
6 and earlier versions. The proj-datumgrid series of packages are not maintained anymore and are only kept available
for legacy purposes.
For a functioning builds of PROJ prior to version 7, installation of the proj-datumgrid is needed. If you have installed
PROJ from a package system chances are that this will already be done for you. The proj-datumgrid package provides
transformation grids that are essential for many of the predefined transformations in PROJ. Which grids are included
in the package can be seen on the proj-datumgrid repository as well as descriptions of those grids. This is the main
grid package and the only one that is required. It includes various older grids that is mostly needed for legacy reasons.
Without this package, the test suite fails miserably.
In addition to the default proj-datumgrid package regional packages are also distributed. These include grids and
init-files that are valid within the given region. The packages are divided into geographical regions in order to keep
the needed disk space by PROJ at a minimum. Some users may have a use for resource files covering several regions
in which case they can download more than one.
At the moment three regional resource file packages are distributed:
• Europe
• Oceania
• North America
If someone supplies grids relevant for Africa, South-America, Asia or Antarctica we will create new regional packages.
Click the links to jump to the relevant README files for each package. Details on the content of the packages
maintained there.
Tip: To download the various datumgrid packages head to the download section.
The world package includes grids that have global extent, e.g. the global geoid model EGM08.
All packages above come in different versions, e.g proj-datumgrid-1.8 or proj-datumgrid-europe-1.4. The -
latest packages are symbolic links to the latest version of a given packages. That means that the link https:
//download.osgeo.org/proj/proj-datumgrid-north-america-latest.zip is equivalent to https://download.osgeo.org/proj/
proj-datumgrid-north-america-1.2.zip (as of the time of writing this).
Below is a list of grid resources for various countries which are not included in the grid distributions mentioned above.
The following is a list of grids distributed under a free and open license.
8.6.1.1 Hungary
Hungarian grid ETRS89 - HD72/EOV (epsg:23700), both horizontal and elevation grids
Not all grid shift files have licensing that allows them to be freely distributed, but can be obtained by users through
free and legal methods.
8.6.2.1 Austria
Overview of Austrian grids and other resources related to the local geodetic reference.
8.6.2.2 Brazil
Brazilian grids for datums Corrego Alegre 1961, Corrego Alegre 1970-72, SAD69 and SAD69(96)
8.6.2.3 Netherlands
8.6.2.4 Portugal
Portuguese grids for ED50, Lisbon 1890, Lisbon 1937 and Datum 73
8.6.2.6 Spain
8.6.3 HTDP
This section describes the use of the crs2crs2grid.py script and the HTDP (Horizontal Time Dependent Positioning)
grid shift modelling program from NGS/NOAA to produce PROJ compatible grid shift files for fine grade conversions
between various NAD83 epochs and WGS84. Traditionally PROJ has treated NAD83 and WGS84 as equivalent and
failed to distinguish between different epochs or realizations of those datums. At the scales of much mapping this is
adequate but as interest grows in high resolution imagery and other high resolution mapping this is inadequate. Also,
as the North American crust drifts over time the displacement between NAD83 and WGS84 grows (more than one
foot over the last two decades).
The HTDP modelling program is in written FORTRAN. The source and documentation can be found on the HTDP
page at http://www.ngs.noaa.gov/TOOLS/Htdp/Htdp.shtml
On linux systems it will be necessary to install gfortran or some FORTRAN compiler. For ubuntu something like the
following should work.
To compile the program do something like the following to produce the binary “htdp” from the source code.
8.6.3.3 Usage
crs2crs2grid.py
<src_crs_id> <src_crs_date> <dst_crs_id> <dst_crs_year>
[-griddef <ul_lon> <ul_lat> <ll_lon> <ll_lat> <lon_count> <lat_count>]
[-htdp <path_to_exe>] [-wrkdir <dirpath>] [-kwf]
-o <output_grid_name>
-griddef: by default the following values for roughly the continental USA
at a six minute step size are used:
-127 50 -66 25 251 611
-kwf: keep working files in the working directory for review.
The goal of crs2crs2grid.py is to produce a grid shift file for a designated region. The region is defined using the
-griddef switch. When missing a continental US region is used. The script creates a set of sample points for the grid
definition, runs the “htdp” program against it and then parses the resulting points and computes a point by point shift
to encode into the final grid shift file. By default it is assumed the htdp program will be in the executable path. If not,
please provide the path to the executable using the -htdp switch.
The htdp program supports transformations between many CRSes and for each (or most?) of them you need to provide
a date at which the CRS is fixed. The full set of CRS Ids available in the HTDP program are:
4...WGS_72 16...ITRF92
5...WGS_84(transit) = NAD_83(2011) 17...ITRF93
6...WGS_84(G730) = ITRF92 18...ITRF94 = ITRF96
7...WGS_84(G873) = ITRF96 19...ITRF96
8...WGS_84(G1150) = ITRF2000 20...ITRF97
9...PNEOS_90 = ITRF90 21...IGS97 = ITRF97
10...NEOS_90 = ITRF90 22...ITRF2000
11...SIO/MIT_92 = ITRF91 23...IGS00 = ITRF2000
12...ITRF88 24...IGb00 = ITRF2000
13...ITRF89 25...ITRF2005
14...ITRF90 26...IGS05 = ITRF2005
15...ITRF91 27...ITRF2008
28...IGS08 = ITRF2008
The typical use case is mapping from NAD83 on a particular date to WGS84 on some date. In this case the source
CRS Id “29” (NAD_83(CORS96)) and the destination CRS Id is “8 (WGS_84(G1150)). It is also necessary to select
the source and destination date (epoch). For example:
The output is a CTable2 format grid shift file suitable for use with PROJ (4.8.0 or newer). It might be utilized something
like:
Init files are used for preconfiguring proj-strings for often used transformations, such as those found in the EPSG
database. Most init files contain transformations from a given coordinate reference system to WGS84. This makes
it easy to transform between any two coordinate reference systems with cs2cs. Init files can however contain any
proj-string and don’t necessarily have to follow the cs2cs paradigm where WGS84 is used as a pivot datum. The ITRF
init file is a good example of that.
A number of init files come pre-bundled with PROJ but it is also possible to add your own custom init files. PROJ
looks for the init files in the directory listed in the PROJ_LIB environment variable.
The format of init files is an identifier in angled brackets and a proj-string:
The above example is the first entry from the epsg init file. So, this is the coordinate reference system with ID 3819
in the EPSG database. Comments can be inserted by prefixing them with a “#”. With version 4.10.0 a new special
metadata entry is now accepted in init files. It can be parsed with a function from the public API. The metadata entry
in the epsg init file looks like this at the time of writing:
Pre-configured proj-strings from init files are used in the following way:
It is possible to override parameters when using +init. Just add the parameter to the proj-string alongside the +init
parameter. For instance by overriding the ellipsoid as in the following example
+init=epsg:25832 +ellps=intl
where the Hayford ellipsoid is used instead of the predefined GRS80 ellipsoid. It is also possible to add additional
parameters not specified in the init file, for instance by adding an observation epoch when transforming from ITRF2000
to ITRF2005:
+init=ITRF2000:ITRF2005 +t_obs=2010.5
Below is a list of the init files that are packaged with PROJ.
Name Description
GL27 Great Lakes Grids
ITRF2000 Full set of transformation parameters between ITRF2000 and other ITRF’s
ITRF2008 Full set of transformation parameters between ITRF2008 and other ITRF’s
ITRF2014 Full set of transformation parameters between ITRF2014 and other ITRF’s
nad27 State plane coordinate systems, North American Datum 1927
nad83 State plane coordinate systems, North American Datum 1983
NINE
GEODESIC CALCULATIONS
9.1 Introduction
Consider an ellipsoid of revolution with equatorial radius 𝑎, polar semi-axis 𝑏, and flattening 𝑓 = (𝑎 − 𝑏)/𝑎. Points
on the surface of the ellipsoid are characterized by their latitude 𝜑 and longitude 𝜆. (Note that latitude here means the
geographical latitude, the angle between the normal to the ellipsoid and the equatorial plane).
The shortest path between two points on the ellipsoid at (𝜑1 , 𝜆1 ) and (𝜑2 , 𝜆2 ) is called the geodesic. Its length is 𝑠12
and the geodesic from point 1 to point 2 has forward azimuths 𝛼1 and 𝛼2 at the two end points. In this figure, we have
𝜆12 = 𝜆2 − 𝜆1 .
A geodesic can be extended indefinitely by requiring that any sufficiently small segment is a shortest path; geodesics
are also the straightest curves on the surface.
345
PROJ coordinate transformation software library, Release 7.1.1
The shortest distance found by solving the inverse problem is (obviously) uniquely defined. However, in a few special
cases there are multiple azimuths which yield the same shortest distance. Here is a catalog of those cases:
• 𝜑1 = −𝜑2 (with neither point at a pole). If 𝛼1 = 𝛼2 , the geodesic is unique. Otherwise there are two geodesics
and the second one is obtained by setting [𝛼1 , 𝛼2 ] ← [𝛼2 , 𝛼1 ], [𝑀12 , 𝑀21 ] ← [𝑀21 , 𝑀12 ], 𝑆12 ← −𝑆12 . (This
occurs when the longitude difference is near ±180∘ for oblate ellipsoids.)
• 𝜆2 = 𝜆1 ± 180∘ (with neither point at a pole). If 𝛼1 = 0∘ or ±180∘ , the geodesic is unique. Otherwise there
are two geodesics and the second one is obtained by setting [𝛼1 , 𝛼2 ] ← [−𝛼1 , −𝛼2 ], 𝑆12 ← −𝑆12 . (This occurs
when 𝜑2 is near −𝜑1 for prolate ellipsoids.)
• Points 1 and 2 at opposite poles. There are infinitely many geodesics which can be generated by setting
[𝛼1 , 𝛼2 ] ← [𝛼1 , 𝛼2 ] + [𝛿, −𝛿], for arbitrary 𝛿. (For spheres, this prescription applies when points 1 and 2
are antipodal.)
• 𝑠12 = 0 (coincident points). There are infinitely many geodesics which can be generated by setting [𝛼1 , 𝛼2 ] ←
[𝛼1 , 𝛼2 ] + [𝛿, 𝛿], for arbitrary 𝛿.
9.5 Background
The algorithms implemented by this package are given in [Karney2013] (addenda) and are based on [Bessel1825] and
[Helmert1880]; the algorithm for areas is based on [Danielsen1989]. These improve on the work of [Vincenty1975]
in the following respects:
• The results are accurate to round-off for terrestrial ellipsoids (the error in the distance is less than 15 nanometers,
compared to 0.1 mm for Vincenty).
• The solution of the inverse problem is always found. (Vincenty’s method fails to converge for nearly antipodal
points.)
• The routines calculate differential and integral properties of a geodesic. This allows, for example, the area of a
geodesic polygon to be computed.
Additional background material is provided in GeographicLib’s geodesic bibliography, Wikipedia’s article “Geodesics
on an ellipsoid”, and [Karney2011] (errata).
TEN
DEVELOPMENT
These pages are primarily focused towards developers either contributing to the PROJ project or using the library in
their own software.
This is a short introduction to the PROJ API. In the following section we create a simple program that transforms a
geodetic coordinate to UTM and back again. The program is explained a few lines at a time. The complete program
can be seen at the end of the section.
See the following sections for more in-depth descriptions of different parts of the PROJ API or consult the API
reference for specifics.
Before the PROJ API can be used it is necessary to include the proj.h header file. Here stdio.h is also included
so we can print some text to the screen:
#include <stdio.h>
#include <proj.h>
Let’s declare a few variables that’ll be used later in the program. Each variable will be discussed below. See the
reference for more info on data types.
PJ_CONTEXT *C;
PJ *P;
PJ* P_for_GIS;
PJ_COORD a, b;
For use in multi-threaded programs the PJ_CONTEXT threading-context is used. In this particular example it is not
needed, but for the sake of completeness it created here. The section on threads discusses this in detail.
C = proj_context_create();
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
(continues on next page)
349
PROJ coordinate transformation software library, Release 7.1.1
). The use of PROJ strings to describe a CRS is considered as legacy (one of the main weakness of PROJ strings
is their inability to describe a geodetic datum, other than the few ones hardcoded in the +datum parameter). Here
we transform from geographic coordinates to UTM zone 32N. It is recommended to create one threading-context per
thread used by the program. This ensures that all PJ objects created in the same context will be sharing resources
such as error-numbers and loaded grids. In case the creation of the PJ object fails an error message is displayed and
the program returns. See Error handling for further details.
P = proj_create_crs_to_crs (C,
"EPSG:4326",
"+proj=utm +zone=32 +datum=WGS84", /* or EPSG:32632 */
NULL);
if (0==P) {
fprintf(stderr, "Oops\n");
return 1;
}
proj_create_crs_to_crs() creates a transformation object, which accepts coordinates expressed in the units
and axis order of the definition of the source CRS, and return transformed coordinates in the units and axis order of the
definition of the target CRS. For almost most geographic CRS, the units will be in most cases degrees (in rare cases,
such as EPSG:4807 / NTF (Paris), this can be grads). For geographic CRS defined by the EPSG authority, the order
of coordinates is latitude first, longitude second. When using a PROJ string, on contrary the order will be longitude
first, latitude second. For projected CRS, the units may vary (metre, us-foot, etc..). For projected CRS defined by the
EPSG authority, and with EAST / NORTH directions, the order might be easting first, northing second, or the reverse.
When using a PROJ string, the order will be easting first, northing second, except if the +axis parameter modifies it.
If for the needs of your software, you want a uniform axis order (and thus do not care about axis order mandated
by the authority defining the CRS), the proj_normalize_for_visualization() function can be used to
modify the PJ* object returned by proj_create_crs_to_crs() so that it accepts as input and returns as output
coordinates using the traditional GIS order, that is longitude, latitude (followed by elevation, time) for geographic CRS
and easting, northing for most projected CRS.
PROJ uses its own data structures for handling coordinates. Here we use a PJ_COORD which is easily assigned with
the function proj_coord(). When using +proj=longlat, the order of coordinates is longitude, latitude, and values
are expressed in degrees. If you used instead a EPSG geographic CRS, like EPSG:4326 (WGS84), it would be latitude,
longitude.
The coordinate defined above is transformed with proj_trans(). For this a PJ object, a transformation direction
(either forward or inverse) and the coordinate is needed. The transformed coordinate is returned in b. Here the forward
(PJ_FWD) transformation from geographic to UTM is made.
The inverse transformation (UTM to geographic) is done similar to above, this time using PJ_INV as the direction.
Before ending the program the allocated memory needs to be released again:
proj_destroy (P);
proj_context_destroy (C); /* may be omitted in the single threaded case */
1 #include <stdio.h>
2 #include <proj.h>
3
14 P = proj_create_crs_to_crs (C,
15 "EPSG:4326",
16 "+proj=utm +zone=32 +datum=WGS84", /* or EPSG:32632 */
17 NULL);
18
19 if (0==P) {
20 fprintf(stderr, "Oops\n");
21 return 1;
22 }
23
24 /* This will ensure that the order of coordinates for the input CRS */
25 /* will be longitude, latitude, whereas EPSG:4326 mandates latitude, */
26 /* longitude */
27 P_for_GIS = proj_normalize_for_visualization(C, P);
28 if( 0 == P_for_GIS ) {
29 fprintf(stderr, "Oops\n");
30 return 1;
31 }
(continues on next page)
46 /* Clean up */
47 proj_destroy (P);
48 proj_context_destroy (C); /* may be omitted in the single threaded case */
49 return 0;
50 }
10.2 Transformations
10.4 Threads
• the global pj_errno variable is shared between threads and makes it essentially impossible to handle errors safely.
Being addressed with the introduction of the projCtx execution context.
• the datum shift using grid files uses globally shared lists of loaded grid information. Access to this has been
made safe in 4.7.0 with the introduction of a PROJ mutex used to protect access to these memory structures (see
pj_mutex.c).
10.4.2 projCtx
Primarily in order to avoid having pj_errno as a global variable, a “thread context” structure has been introduced into a
variation of the PROJ API for the 4.8.0 release. The pj_init() and pj_init_plus() functions now have context variations
called pj_init_ctx() and pj_init_plus_ctx() which take a projections context.
The projections context can be created with pj_ctx_alloc(), and there is a global default context used when one is not
provided by the application. There is a pj_ctx_ set of functions to create, manipulate, query, and destroy contexts. The
contexts are also used now to handle setting debugging mode, and to hold an error reporting function for textual error
and debug messages. The API looks like:
projCtx pj_get_default_ctx(void);
projCtx pj_get_ctx( projPJ );
void pj_set_ctx( projPJ, projCtx );
projCtx pj_ctx_alloc(void);
void pj_ctx_free( projCtx );
int pj_ctx_get_errno( projCtx );
void pj_ctx_set_errno( projCtx, int );
void pj_ctx_set_debug( projCtx, int );
void pj_ctx_set_logger( projCtx, void (*)(void *, int, const char *) );
void pj_ctx_set_app_data( projCtx, void * );
void *pj_ctx_get_app_data( projCtx );
Multithreaded applications are now expected to create a projCtx per thread using pj_ctx_alloc(). The context’s error
handlers, and app data may be modified if desired, but at the very least each context has an internal error value accessed
with pj_ctx_get_errno() as opposed to looking at pj_errno.
Note that pj_errno continues to exist, and it is set by pj_ctx_set_errno() (as well as setting the context specific er-
ror number), but pj_errno still suffers from the global shared problem between threads and should not be used by
multithreaded applications.
Note that pj_init_ctx(), and pj_init_plus_ctx() will assign the projCtx to the created projPJ object. Functions like
pj_transform(), pj_fwd() and pj_inv() will use the context of the projPJ for error reporting.
10.4.3 src/multistresstest.c
A small multi-threaded test program has been written (src/multistresstest.c) for testing multithreaded use of PROJ. It
performs a series of reprojections to setup a table expected results, and then it does them many times in several threads
to confirm that the results are consistent. At this time this program is not part of the builds but it can be built on linux
like:
10.5 Reference
This section describes the numerous data types in use in PROJ.4. As a rule of thumb PROJ.4 data types are prefixed
with PJ_, or in one particular case, is simply called PJ. A few notable exceptions can be traced back to the very early
days of PROJ.4 when the PJ_ prefix was not consistently used.
type PJ
Object containing everything related to a given projection or transformation. As a user of the PROJ.4 library
you are only exposed to pointers to this object and the contents is hidden behind the public API. PJ objects are
created with proj_create() and destroyed with proj_destroy().
type PJ_DIRECTION
Enumeration that is used to convey in which direction a given transformation should be performed. Used in
transformation function call as described in the section on transformation functions.
Forward transformations are defined with the :c:
enumerator PJ_FWD
Perform transformation in the forward direction.
enumerator PJ_IDENT
Identity. Do nothing.
enumerator PJ_INV
Perform transformation in the inverse direction.
type PJ_CONTEXT
Context objects enable safe multi-threaded usage of PROJ.4. Each PJ object is connected to a context
(if not specified, the default context is used). All operations within a context should be performed in the
same thread. PJ_CONTEXT objects are created with proj_context_create() and destroyed with
proj_context_destroy().
type PJ_AREA
New in version 6.0.0.
Opaque object describing an area in which a transformation is performed.
It is used with proj_create_crs_to_crs() to select the best transformation between the two input co-
ordinate reference systems.
double PJ_LP.lam
Longitude. Lambda.
double PJ_LP.phi
Latitude. Phi.
type PJ_XY
2-dimensional cartesian coordinate.
double PJ_XY.x
Easting.
double PJ_XY.y
Northing.
type PJ_UV
2-dimensional generic coordinate. Usually used when contents can be either a PJ_XY or PJ_LP.
double PJ_UV .u
Longitude or easting, depending on use.
double PJ_UV .v
Latitude or northing, depending on use.
The following data types are the 3-dimensional equivalents to the data types above.
type PJ_LPZ
3-dimensional version of PJ_LP. Holds longitude, latitude and a vertical component.
double PJ_LPZ.lam
Longitude. Lambda.
double PJ_LPZ.phi
Latitude. Phi.
double PJ_LPZ.z
Vertical component.
type PJ_XYZ
Cartesian coordinate in 3 dimensions. Extension of PJ_XY.
double PJ_XYZ.x
Easting or the X component of a 3D cartesian system.
double PJ_XYZ.y
Northing or the Y component of a 3D cartesian system.
double PJ_XYZ.z
Vertical component or the Z component of a 3D cartesian system.
type PJ_UVW
3-dimensional extension of PJ_UV .
double PJ_UVW .u
Longitude or easting, depending on use.
double PJ_UVW .v
Latitude or northing, depending on use.
double PJ_UVW .w
Vertical component.
The following data types are extensions of the triplets above into the time domain.
type PJ_LPZT
Spatiotemporal version of PJ_LPZ.
typedef struct {
double lam;
double phi;
double z;
double t;
} PJ_LPZT;
double PJ_LPZT.lam
Longitude.
double PJ_LPZT.phi
Latitude
double PJ_LPZT.z
Vertical component.
double PJ_LPZT.t
Time component.
type PJ_XYZT
Generic spatiotemporal coordinate. Useful for e.g. cartesian coordinates with an attached time-stamp.
typedef struct {
double x;
double y;
double z;
double t;
} PJ_XYZT;
double PJ_XYZT.x
Easting or the X component of a 3D cartesian system.
double PJ_XYZT.y
Northing or the Y component of a 3D cartesian system.
double PJ_XYZT.z
Vertical or the Z component of a 3D cartesian system.
double PJ_XYZT.t
Time component.
type PJ_UVWT
Spatiotemporal version of PJ_UVW .
double PJ_UVWT.e
First horizontal component.
double PJ_UVWT.n
Second horizontal component.
double PJ_UVWT.w
Vertical component.
double PJ_UVWT.t
Temporal component.
type PJ_OPK
Rotations, for instance three euler angles.
double PJ_OPK.o
First rotation angle, omega.
double PJ_OPK.p
Second rotation angle, phi.
double PJ_OPK.k
Third rotation angle, kappa.
type PJ_ENU
East, north and up components.
double PJ_ENU .e
East component.
double PJ_ENU .n
North component.
double PJ_ENU .u
Up component.
type PJ_GEOD
Geodesic length, forward and reverse azimuths.
double PJ_GEOD.s
Geodesic length.
double PJ_GEOD.a1
Forward azimuth.
double PJ_GEOD.a2
Reverse azimuth.
type PJ_COORD
General purpose coordinate union type, applicable in two, three and four dimensions. This is the default coor-
dinate datatype used in PROJ.
typedef union {
double v[4];
PJ_XYZT xyzt;
PJ_UVWT uvwt;
PJ_LPZT lpzt;
PJ_GEOD geod;
PJ_OPK opk;
PJ_ENU enu;
PJ_XYZ xyz;
PJ_UVW uvw;
PJ_LPZ lpz;
PJ_XY xy;
PJ_UV uv;
PJ_LP lp;
} PJ_COORD ;
double v[4]
Generic four-dimensional vector.
PJ_XYZT PJ_COORD.xyzt
Spatiotemporal cartesian coordinate.
PJ_UVWT PJ_COORD.uvwt
Spatiotemporal generic coordinate.
PJ_LPZT PJ_COORD.lpzt
Longitude, latitude, vertical and time components.
PJ_GEOD PJ_COORD.geod
Geodesic length, forward and reverse azimuths.
PJ_OPK PJ_COORD.opk
Rotations, for instance three euler angles.
PJ_ENU PJ_COORD.enu
East, north and up components.
PJ_XYZ PJ_COORD.xyz
3-dimensional cartesian coordinate.
PJ_UVW PJ_COORD.uvw
3-dimensional generic coordinate.
PJ_LPZ PJ_COORD.lpz
Longitude, latitude and vertical component.
PJ_XY PJ_COORD.xy
2-dimensional cartesian coordinate.
PJ_UV PJ_COORD.uv
2-dimensional generic coordinate.
PJ_LP PJ_COORD.lp
Longitude and latitude.
type PJ_FACTORS
Various cartographic properties, such as scale factors, angular distortion and meridian convergence. Calculated
with proj_factors().
typedef struct {
double meridional_scale;
double parallel_scale;
double areal_scale;
double angular_distortion;
double meridian_parallel_angle;
double meridian_convergence;
double tissot_semimajor;
double tissot_semiminor;
double dx_dlam;
double dx_dphi;
double dy_dlam;
double dy_dphi;
} PJ_FACTORS;
double PJ_FACTORS.meridional_scale
Meridional scale at coordinate (𝜆, 𝜑).
double PJ_FACTORS.parallel_scale
Parallel scale at coordinate (𝜆, 𝜑).
double PJ_FACTORS.areal_scale
Areal scale factor at coordinate (𝜆, 𝜑).
double PJ_FACTORS.angular_distortion
Angular distortion at coordinate (𝜆, 𝜑).
double PJ_FACTORS.meridian_parallel_angle
Meridian/parallel angle, 𝜃′ , at coordinate (𝜆, 𝜑).
double PJ_FACTORS.meridian_convergence
Meridian convergence at coordinate (𝜆, 𝜑). Sometimes also described as grid declination.
double PJ_FACTORS.tissot_semimajor
Maximum scale factor.
double PJ_FACTORS.tissot_semiminor
Minimum scale factor.
double PJ_FACTORS.dx_dlam
𝜕𝑥
Partial derivative 𝜕𝜆 of coordinate (𝜆, 𝜑).
double PJ_FACTORS.dy_dlam
𝜕𝑦
Partial derivative 𝜕𝜆 of coordinate (𝜆, 𝜑).
double PJ_FACTORS.dx_dphi
𝜕𝑥
Partial derivative 𝜕𝜑 of coordinate (𝜆, 𝜑).
double PJ_FACTORS.dy_dphi
𝜕𝑦
Partial derivative 𝜕𝜑 of coordinate (𝜆, 𝜑).
type PJ_OPERATIONS
Description a PROJ.4 operation
struct PJ_OPERATIONS {
const char *id; /* operation keyword */
PJ *(*proj)(PJ *); /* operation entry point */
char * const *descr; /* description text */
};
struct PJ_ELLPS {
const char *id;
const char *major;
const char *ell;
const char *name;
};
struct PJ_UNITS {
const char *id; /* units keyword */
const char *to_meter; /* multiply by value to get meters */
const char *name; /* comments */
double factor; /* to_meter factor in actual numbers */
};
double factor
Conversion factor that converts the unit to meters.
type PJ_PRIME_MERIDIANS
Prime meridians defined in PROJ.
struct PJ_PRIME_MERIDIANS {
const char *id;
const char *defn;
};
type PJ_INFO
Struct holding information about the current instance of PROJ. Struct is populated by proj_info().
typedef struct {
int major;
int minor;
int patch;
const char *release;
const char *version;
const char *searchpath;
} PJ_INFO;
typedef struct {
const char *id;
(continues on next page)
typedef struct {
char gridname[32];
char filename[260];
char format[8];
LP lowerleft;
LP upperright;
int n_lon, n_lat;
double cs_lon, cs_lat;
} PJ_GRID_INFO;
char PJ_GRID_INFO.gridname[32]
Name of grid, e.g. “BETA2007.gsb”.
char PJ_GRID_INFO
Full path of grid file, e.g. “C:\OSGeo4W64\share\proj\BETA2007.gsb”
char PJ_GRID_INFO.format[8]
File format of grid file, e.g. “ntv2”
LP PJ_GRID_INFO.lowerleft
Geodetic coordinate of lower left corner of grid.
LP PJ_GRID_INFO.upperright
Geodetic coordinate of upper right corner of grid.
int PJ_GRID_INFO.n_lon
Number of grid cells in the longitudinal direction.
int PJ_GRID_INFO.n_lat
Number of grid cells in the latitudianl direction.
double PJ_GRID_INFO.cs_lon
Cell size in the longitudinal direction. In radians.
double PJ_GRID_INFO.cs_lat
Cell size in the latitudinal direction. In radians.
type PJ_INIT_INFO
Struct holding information about a specific init file in the search path of PROJ. Populated with the function
proj_init_info().
typedef struct {
char name[32];
char filename[260];
char version[32];
char origin[32];
char lastupdate[16];
} PJ_INIT_INFO;
char PJ_INIT_INFO.name[32]
Name of init file, e.g. “epsg”.
char PJ_INIT_INFO.filename[260]
Full path of init file, e.g. “C:\OSGeo4W64\share\proj\epsg”
char PJ_INIT_INFO.version[32]
Version number of init-file, e.g. “9.0.0”
char PJ_INIT_INFO.origin[32]
Originating entity of the init file, e.g. “EPSG”
char PJ_INIT_INFO.lastupdate
Date of last update of the init-file.
10.5.1.10 Logging
type PJ_LOG_LEVEL
Enum of logging levels in PROJ. Used to set the logging level in PROJ. Usually using proj_log_level().
enumerator PJ_LOG_NONE
Don’t log anything.
enumerator PJ_LOG_ERROR
Log only errors.
enumerator PJ_LOG_DEBUG
Log errors and additional debug information.
enumerator PJ_LOG_TRACE
Highest logging level. Log everything including very detailed debug information.
enumerator PJ_LOG_TELL
Special logging level that when used in proj_log_level() will return the current logging level set in
PROJ.
New in version 5.1.0.
type PJ_LOG_FUNC
Function prototype for the logging function used by PROJ. Defined as
where the first argument (void pointer) references a data structure used by the calling application, the second
argument (int type) is used to set the logging level and the third argument (const char pointer) is the string that
will be logged by the function.
New in version 5.1.0.
Public Members
int version
Version of this structure. Should be set to 1 currently.
PROJ_FILE_HANDLE *(*open_cbk)(PJ_CONTEXT *ctx, const char *filename,
PROJ_OPEN_ACCESS access, void *user_data)
Open file. Return NULL if error
size_t (*read_cbk)(PJ_CONTEXT *ctx, PROJ_FILE_HANDLE*, void *buffer, size_t sizeBytes, void
*user_data)
Read sizeBytes into buffer from current position and return number of bytes read
size_t (*write_cbk)(PJ_CONTEXT *ctx, PROJ_FILE_HANDLE*, const void *buffer, size_t size-
Bytes, void *user_data)
Write sizeBytes into buffer from current position and return number of bytes written
int (*seek_cbk)(PJ_CONTEXT *ctx, PROJ_FILE_HANDLE*, long long offset, int whence, void
*user_data)
Seek to offset using whence=SEEK_SET/SEEK_CUR/SEEK_END. Return TRUE in case of success
unsigned long long (*tell_cbk)(PJ_CONTEXT *ctx, PROJ_FILE_HANDLE*, void *user_data)
Return current file position
void (*close_cbk)(PJ_CONTEXT *ctx, PROJ_FILE_HANDLE*, void *user_data)
Close file
int (*exists_cbk)(PJ_CONTEXT *ctx, const char *filename, void *user_data)
Return TRUE if a file exists
int (*mkdir_cbk)(PJ_CONTEXT *ctx, const char *filename, void *user_data)
Return TRUE if directory exists or could be created
int (*unlink_cbk)(PJ_CONTEXT *ctx, const char *filename, void *user_data)
Return TRUE if file could be removed
int (*rename_cbk)(PJ_CONTEXT *ctx, const char *oldPath, const char *newPath, void
*user_data)
Return TRUE if file could be renamed
typedef struct PROJ_FILE_HANDLE PROJ_FILE_HANDLE
Opaque structure for PROJ for a file handle. Implementations might cast it to their structure/class of choice.
enum PROJ_OPEN_ACCESS
Open access / mode
Values:
enumerator PROJ_OPEN_ACCESS_READ_ONLY
Read-only access. Equivalent to “rb”
enumerator PROJ_OPEN_ACCESS_READ_UPDATE
Read-update access. File should be created if not existing. Equivalent to “r+b”
enumerator PROJ_OPEN_ACCESS_CREATE
Create access. File should be truncated to 0-byte if already existing. Equivalent to “w+b”
error_string_max_size should be the maximum size that can be written into the out_error_string buffer (includ-
ing terminating nul character).
enum PJ_GUESSED_WKT_DIALECT
Guessed WKT “dialect”.
Values:
enumerator PJ_GUESSED_WKT2_2019
WKT2_2019
enumerator PJ_GUESSED_WKT2_2018 = PJ_GUESSED_WKT2_2019
Deprecated alias for PJ_GUESSED_WKT2_2019
enumerator PJ_GUESSED_WKT2_2015
WKT2_2015
enumerator PJ_GUESSED_WKT1_GDAL
WKT1
enumerator PJ_GUESSED_WKT1_ESRI
ESRI variant of WKT1
enumerator PJ_GUESSED_NOT_WKT
Not WKT / unrecognized
enum PJ_CATEGORY
Object category.
Values:
enumerator PJ_CATEGORY_ELLIPSOID
enumerator PJ_CATEGORY_PRIME_MERIDIAN
enumerator PJ_CATEGORY_DATUM
enumerator PJ_CATEGORY_CRS
enumerator PJ_CATEGORY_COORDINATE_OPERATION
enum PJ_TYPE
Object type.
Values:
enumerator PJ_TYPE_UNKNOWN
enumerator PJ_TYPE_ELLIPSOID
enumerator PJ_TYPE_PRIME_MERIDIAN
enumerator PJ_TYPE_GEODETIC_REFERENCE_FRAME
enumerator PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME
enumerator PJ_TYPE_VERTICAL_REFERENCE_FRAME
enumerator PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME
enumerator PJ_TYPE_DATUM_ENSEMBLE
enumerator PJ_TYPE_CRS
Abstract type, not returned by proj_get_type()
enumerator PJ_TYPE_GEODETIC_CRS
enumerator PJ_TYPE_GEOCENTRIC_CRS
enumerator PJ_TYPE_GEOGRAPHIC_CRS
proj_get_type() will never return that type, but PJ_TYPE_GEOGRAPHIC_2D_CRS or
PJ_TYPE_GEOGRAPHIC_3D_CRS.
enumerator PJ_TYPE_GEOGRAPHIC_2D_CRS
enumerator PJ_TYPE_GEOGRAPHIC_3D_CRS
enumerator PJ_TYPE_VERTICAL_CRS
enumerator PJ_TYPE_PROJECTED_CRS
enumerator PJ_TYPE_COMPOUND_CRS
enumerator PJ_TYPE_TEMPORAL_CRS
enumerator PJ_TYPE_ENGINEERING_CRS
enumerator PJ_TYPE_BOUND_CRS
enumerator PJ_TYPE_OTHER_CRS
enumerator PJ_TYPE_CONVERSION
enumerator PJ_TYPE_TRANSFORMATION
enumerator PJ_TYPE_CONCATENATED_OPERATION
enumerator PJ_TYPE_OTHER_COORDINATE_OPERATION
enum PJ_COMPARISON_CRITERION
Comparison criterion.
Values:
enumerator PJ_COMP_STRICT
All properties are identical.
enumerator PJ_COMP_EQUIVALENT
The objects are equivalent for the purpose of coordinate operations. They can differ by the name of their
objects, identifiers, other metadata. Parameters may be expressed in different units, provided that the value
is (with some tolerance) the same once expressed in a common unit.
enumerator PJ_COMP_EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS
Same as EQUIVALENT, relaxed with an exception that the axis order of the base CRS of a Derived-
CRS/ProjectedCRS or the axis order of a GeographicCRS is ignored. Only to be used with Derived-
CRS/ProjectedCRS/GeographicCRS
enum PJ_WKT_TYPE
WKT version.
Values:
enumerator PJ_WKT2_2015
cf osgeo::proj::io::WKTFormatter::Convention::WKT2
enumerator PJ_WKT2_2015_SIMPLIFIED
cf osgeo::proj::io::WKTFormatter::Convention::WKT2_SIMPLIFIED
enumerator PJ_WKT2_2019
cf osgeo::proj::io::WKTFormatter::Convention::WKT2_2019
enumerator PJ_WKT2_2018 = PJ_WKT2_2019
Deprecated alias for PJ_WKT2_2019
enumerator PJ_WKT2_2019_SIMPLIFIED
cf osgeo::proj::io::WKTFormatter::Convention::WKT2_2019_SIMPLIFIED
enumerator PJ_WKT2_2018_SIMPLIFIED = PJ_WKT2_2019_SIMPLIFIED
Deprecated alias for PJ_WKT2_2019
enumerator PJ_WKT1_GDAL
cf osgeo::proj::io::WKTFormatter::Convention::WKT1_GDAL
enumerator PJ_WKT1_ESRI
cf osgeo::proj::io::WKTFormatter::Convention::WKT1_ESRI
enum PROJ_CRS_EXTENT_USE
Specify how source and target CRS extent should be used to restrict candidate operations (only taken into
account if no explicit area of interest is specified.
Values:
enumerator PJ_CRS_EXTENT_NONE
Ignore CRS extent
enumerator PJ_CRS_EXTENT_BOTH
Test coordinate operation extent against both CRS extent.
enumerator PJ_CRS_EXTENT_INTERSECTION
Test coordinate operation extent against the intersection of both CRS extent.
enumerator PJ_CRS_EXTENT_SMALLEST
Test coordinate operation against the smallest of both CRS extent.
enum PROJ_GRID_AVAILABILITY_USE
Describe how grid availability is used.
Values:
enumerator PROJ_GRID_AVAILABILITY_USED_FOR_SORTING
Grid availability is only used for sorting results. Operations where some grids are missing will be sorted
last.
enumerator PROJ_GRID_AVAILABILITY_DISCARD_OPERATION_IF_MISSING_GRID
Completely discard an operation if a required grid is missing.
enumerator PROJ_GRID_AVAILABILITY_IGNORED
Ignore grid availability at all. Results will be presented as if all grids were available.
enumerator PROJ_GRID_AVAILABILITY_KNOWN_AVAILABLE
Results will be presented as if grids known to PROJ (that is registered in the grid_alternatives table of its
database) were available. Used typically when networking is enabled.
enum PJ_PROJ_STRING_TYPE
PROJ string version.
Values:
enumerator PJ_PROJ_5
cf osgeo::proj::io::PROJStringFormatter::Convention::PROJ_5
enumerator PJ_PROJ_4
cf osgeo::proj::io::PROJStringFormatter::Convention::PROJ_4
enum PROJ_SPATIAL_CRITERION
Spatial criterion to restrict candidate operations.
Values:
enumerator PROJ_SPATIAL_CRITERION_STRICT_CONTAINMENT
The area of validity of transforms should strictly contain the are of interest.
enumerator PROJ_SPATIAL_CRITERION_PARTIAL_INTERSECTION
The area of validity of transforms should at least intersect the area of interest.
enum PROJ_INTERMEDIATE_CRS_USE
Describe if and how intermediate CRS should be used
Values:
enumerator PROJ_INTERMEDIATE_CRS_USE_ALWAYS
Always search for intermediate CRS.
enumerator PROJ_INTERMEDIATE_CRS_USE_IF_NO_DIRECT_TRANSFORMATION
Only attempt looking for intermediate CRS if there is no direct transformation available.
enumerator PROJ_INTERMEDIATE_CRS_USE_NEVER
enum PJ_COORDINATE_SYSTEM_TYPE
Type of coordinate system.
Values:
enumerator PJ_CS_TYPE_UNKNOWN
enumerator PJ_CS_TYPE_CARTESIAN
enumerator PJ_CS_TYPE_ELLIPSOIDAL
enumerator PJ_CS_TYPE_VERTICAL
enumerator PJ_CS_TYPE_SPHERICAL
enumerator PJ_CS_TYPE_ORDINAL
enumerator PJ_CS_TYPE_PARAMETRIC
enumerator PJ_CS_TYPE_DATETIMETEMPORAL
enumerator PJ_CS_TYPE_TEMPORALCOUNT
enumerator PJ_CS_TYPE_TEMPORALMEASURE
typedef char **PROJ_STRING_LIST
Type representing a NULL terminated list of NULL-terminate strings.
struct PROJ_CRS_INFO
#include <proj.h> Structure given overall description of a CRS.
This structure may grow over time, and should not be directly allocated by client code.
Public Members
char *auth_name
Authority name.
char *code
Object code.
char *name
Object name.
PJ_TYPE type
Object type.
int deprecated
Whether the object is deprecated
int bbox_valid
Whereas the west_lon_degree, south_lat_degree, east_lon_degree and north_lat_degree fields are valid.
double west_lon_degree
Western-most longitude of the area of use, in degrees.
double south_lat_degree
Southern-most latitude of the area of use, in degrees.
double east_lon_degree
Eastern-most longitude of the area of use, in degrees.
double north_lat_degree
Northern-most latitude of the area of use, in degrees.
char *area_name
Name of the area of use.
char *projection_method_name
Name of the projection method for a projected CRS. Might be NULL even for projected CRS in some
cases.
struct PROJ_CRS_LIST_PARAMETERS
#include <proj.h> Structure describing optional parameters for proj_get_crs_list();.
This structure may grow over time, and should not be directly allocated by client code.
Public Members
double west_lon_degree
Western-most longitude of the area of use, in degrees.
double south_lat_degree
Southern-most latitude of the area of use, in degrees.
double east_lon_degree
Eastern-most longitude of the area of use, in degrees.
double north_lat_degree
Northern-most latitude of the area of use, in degrees.
int allow_deprecated
Whether deprecated objects are allowed. Default to FALSE.
struct PROJ_UNIT_INFO
#include <proj.h> Structure given description of a unit.
This structure may grow over time, and should not be directly allocated by client code.
Since 7.1
Public Members
char *auth_name
Authority name.
char *code
Object code.
char *name
Object name. For example “metre”, “US survey foot”, etc.
char *category
Category of the unit: one of “linear”, “linear_per_time”, “angular”, “angular_per_time”, “scale”,
“scale_per_time” or “time”
double conv_factor
Conversion factor to apply to transform from that unit to the corresponding SI unit (metre for “linear”,
radian for “angular”, etc.). It might be 0 in some cases to indicate no known conversion factor.
char *proj_short_name
PROJ short name, like “m”, “ft”, “us-ft”, etc. . . Might be NULL
int deprecated
Whether the object is deprecated
10.5.2 Functions
PJ_CONTEXT *proj_context_create(void)
Create a new threading-context.
Returns a new context
void proj_context_destroy(PJ_CONTEXT *ctx)
Deallocate a threading-context.
Parameters
The objects returned by the functions defined in this section have minimal interaction with the the functions of the C
API for ISO-19111 functionality, and vice versa. See its introduction paragraph for more details.
PJ *proj_create(PJ_CONTEXT *ctx, const char *definition)
Create a transformation object, or a CRS object, from:
• 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 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 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.2/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)
Example call:
If a proj-string contains a +type=crs option, then it is interpreted as a CRS definition. In particular geographic
CRS are assumed to have axis in the longitude, latitude order and with degree angular unit. The use of proj-
string to describe a CRS is discouraged. It is a legacy means of conveying CRS descriptions: use of object codes
(EPSG:XXXX typically) or WKT description is recommended for better expressivity.
If a proj-string does not contain +type=crs, then it is interpreted as a coordination operation / transformation.
If creation of the transformation object fails, the function returns 0 and the PROJ error number is updated. The
error number can be read with proj_errno() or proj_context_errno().
The returned PJ-pointer should be deallocated with proj_destroy().
Parameters
• ctx (PJ_CONTEXT *) – Threading context.
• definition (const char*) – Proj-string of the desired transformation.
PJ *proj_create_argv(PJ_CONTEXT *ctx, int argc, char **argv)
Create a transformation object, or a CRS object, with argc/argv-style initialization. For this application each
parameter in the defining proj-string is an entry in argv.
Example call:
If there is a type=crs argument, then the arguments are interpreted as a CRS definition. In particular geographic
CRS are assumed to have axis in the longitude, latitude order and with degree angular unit.
If there is no type=crs argument, then it is interpreted as a coordination operation / transformation.
If creation of the transformation object fails, the function returns 0 and the PROJ error number is updated. The
error number can be read with proj_errno() or proj_context_errno().
The returned PJ-pointer should be deallocated with proj_destroy().
Parameters
• ctx (PJ_CONTEXT *) – Threading context.
• argc (int) – Count of arguments in argv
• argv (char **) – Array of strings with proj-string parameters, e.g. +proj=merc
Returns PJ *
PJ *proj_create_crs_to_crs(PJ_CONTEXT *ctx, const char *source_crs, const char *target_crs,
PJ_AREA *area)
Create a transformation object that is a pipeline between two known coordinate reference systems.
source_crs and target_crs can be :
• a “AUTHORITY:CODE”, like EPSG:25832. When using that syntax for a source CRS, the created
pipeline will expect that the values passed to proj_trans() respect the axis order and axis unit of
the official definition ( so for example, for EPSG:4326, with latitude first and longitude next, in degrees).
Similarly, when using that syntax for a target CRS, output values will be emitted according to the official
definition of this CRS.
• a PROJ string, like “+proj=longlat +datum=WGS84”. When using that syntax, the axis order and unit for
geographic CRS will be longitude, latitude, and the unit degrees.
• the name of a CRS as found in the PROJ database, e.g “WGS84”, “NAD27”, etc.
• more generally any string accepted by proj_create() representing a CRS
An “area of use” can be specified in area. When it is supplied, the more accurate transformation between two
given systems can be chosen.
When no area of use is specific and several coordinate operations are possible depending on the area of use,
this function will internally store those candidate coordinate operations in the return PJ object. Each subsequent
coordinate transformation done with proj_trans() will then select the appropriate coordinate operation by
comparing the input coordinates with the area of use of the candidate coordinate operations.
Example call:
If creation of the transformation object fails, the function returns 0 and the PROJ error number is updated. The
error number can be read with proj_errno() or proj_context_errno().
The returned PJ-pointer should be deallocated with proj_destroy().
Parameters
• ctx (PJ_CONTEXT *) – Threading context.
• source_crs (const char*) – Source CRS.
• target_crs (const char*) – Destination SRS.
• area (PJ_AREA *) – Descriptor of the desired area for the transformation.
Returns PJ *
PJ *proj_create_crs_to_crs_from_pj(PJ_CONTEXT *ctx, PJ *source_crs, PJ *target_crs,
PJ_AREA *area, const char *const *options)
New in version 6.2.0.
Create a transformation object that is a pipeline between two known coordinate reference systems.
This is the same as proj_create_crs_to_crs() except that the source and target CRS are passed as PJ*
objects which must of the CRS variety.
Parameters
• options – should be set to NULL currently.
PJ *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ *obj)
Returns a PJ* object whose axis order is the one expected for visualization purposes.
Doxygen_Suppress
The input object must be either:
• a coordinate operation, that has been created with proj_create_crs_to_crs(). If the axis order of its source
or target CRS is northing,easting, then an axis swap operation will be inserted.
• or a CRS. The axis order of geographic CRS will be longitude, latitude [,height], and the one of projected
CRS will be easting, northing [, height]
Return a new PJ* object to free with proj_destroy() in case of success, or nullptr in case of error
Parameters
• ctx: PROJ context, or NULL for default context
• obj: Object of type CRS, or CoordinateOperation created with proj_create_crs_to_crs() (must not be
NULL)
PJ *proj_destroy(PJ *P)
Deallocate a PJ transformation object.
Parameters
• P (const PJ *) – Transformation object
Returns PJ *
In the case of an area of use crossing the antimeridian (longitude +/- 180 degrees), west_lon_degree will be
greater than east_lon_degree.
Parameters
• area – Pointer to an object returned by proj_area_create().
• west_lon_degree – West longitude, in degrees. In [-180,180] range.
• south_lat_degree – South latitude, in degrees. In [-90,90] range.
• east_lon_degree – East longitude, in degrees. In [-180,180] range.
• north_lat_degree – North latitude, in degrees. In [-90,90] range.
void proj_area_destroy(PJ_AREA *area)
Deallocate a PJ_AREA object.
:param PJ_AREA* area
Note: Even though he coordinate components are named x, y, z and t, axis ordering of the to and from CRS
is respected. Transformations exhibit the same behavior as if they were gathered in a PJ_COORD struct.
The strides, sx, sy, sz, st, represent the step length, in bytes, between consecutive elements of the corre-
sponding array. This makes it possible for proj_trans_generic() to handle transformation of a large
class of application specific data structures, without necessarily understanding the data structure format, as in:
typedef struct {
double x, y;
int quality_level;
char surveyor_name[134];
} XYQS;
XYQS survey[345];
(continues on next page)
...
proj_trans_generic (
P, PJ_INV,
&(survey[0].x), stride, 345, /* We have 345 eastings */
&(survey[0].y), stride, 345, /* ...and 345 northings. */
&height, sizeof(double), 1, /* The height is the constant 23.45 m */
0, 0, 0 /* and the time is the constant 0.00 s */
);
This is similar to the inner workings of the deprecated pj_transform() function, but the stride functionality
has been generalized to work for any size of basic unit, not just a fixed number of doubles.
In most cases, the stride will be identical for x, y, z, and t, since they will typically be either individual ar-
rays (stride = sizeof(double)), or strided views into an array of application specific data structures
(stride = sizeof (...)).
But in order to support cases where x, y, z, and t come from heterogeneous sources, individual strides, sx,
sy, sz, st, are used.
Note: Since proj_trans_generic() does its work in place, this means that even the supposedly constants
(i.e. length 1 arrays) will return from the call in altered state. Hence, remember to reinitialize between repeated
calls.
Parameters
• P (PJ *) – Transformation object
• direction (PJ_DIRECTION) – Transformation direction.
• x (double *) – Array of x-coordinates
• sx (size_t) – Step length, in bytes, between consecutive elements of the corresponding array
• nx (size_t) – Number of elements in the corresponding array
• y (double *) – Array of y-coordinates
• sy (size_t) – Step length, in bytes, between consecutive elements of the corresponding array
• ny (size_t) – Number of elements in the corresponding array
• z (double *) – Array of z-coordinates
• sz (size_t) – Step length, in bytes, between consecutive elements of the corresponding array
• nz (size_t) – Number of elements in the corresponding array
• t (double *) – Array of t-coordinates
• st (size_t) – Step length, in bytes, between consecutive elements of the corresponding array
• nt (size_t) – Number of elements in the corresponding array
Returns Number of transformations successfully completed
Parameters
• P (PJ *) – Transformation object
• direction (PJ_DIRECTION) – Transformation direction.
• n (size_t) – Number of coordinates in coord
Returns size_t 0 if all observations are transformed without error, otherwise returns error number
do_something_with_P (P);
Parameters
10.5.2.6 Logging
PJ_INFO proj_info(void)
Get information about the current instance of the PROJ library.
Returns PJ_INFO
PJ_PROJ_INFO proj_pj_info(const PJ *P)
Get information about a specific transformation object, P.
Parameters
• P (const PJ *) – Transformation object
Returns PJ_PROJ_INFO
PJ_GRID_INFO proj_grid_info(const char *gridname)
Get information about a specific grid.
Parameters
• gridname (const char*) – Gridname in the PROJ searchpath
Returns PJ_GRID_INFO
PJ_INIT_INFO proj_init_info(const char *initname)
Get information about a specific init file.
Parameters
• initname (const char*) – Init file in the PROJ searchpath
Returns PJ_INIT_INFO
10.5.2.8 Lists
PJ_OPERATIONS *ops;
for (ops = proj_list_operations(); ops->id; ++ops)
printf("%s\n", ops->id);
10.5.2.9 Distances
10.5.2.10 Various
or
PJ_COORD c;
// Assign using the PJ_XYZT struct in the union
c.xyzt.x = 10.0;
c.xyzt.y = 20.0;
c.xyzt.z = 30.0;
c.xyzt.t = 40.0;
Since PJ_COORD is a union of structs, the above assignment can also be expressed in terms of the other types
in the union, e.g. PJ_UVWT or PJ_LPZT.
Parameters
• x (double) – 1st component in a PJ_COORD
• y (double) – 2nd component in a PJ_COORD
• z (double) – 3rd component in a PJ_COORD
• t (double) – 4th component in a PJ_COORD
Returns PJ_COORD
double proj_roundtrip(PJ *P, PJ_DIRECTION direction, int n, PJ_COORD *coord)
Measure internal consistency of a given transformation. The function performs n round trip transformations
starting in either the forward or reverse direction. Returns the euclidean distance of the starting point coo
and the resulting coordinate after n iterations back and forth.
Parameters
• P (PJ *) – Transformation object
• direction (PJ_DIRECTION) – Starting direction of transformation
• n (int) – Number of roundtrip transformations
• coord (PJ_COORD *) – Input coordinate
Returns double Distance between original coordinate and the resulting coordinate after n transfor-
mation iterations.
PJ_FACTORS proj_factors(PJ *P, PJ_COORD lp)
Calculate various cartographic properties, such as scale factors, angular distortion and meridian convergence.
Depending on the underlying projection values will be calculated either numerically (default) or analytically.
The function also calculates the partial derivatives of the given coordinate.
Parameters
• P (PJ *) – Transformation object
• lp (PJ_COORD) – Geodetic coordinate
Returns PJ_FACTORS
Note Those callbacks will not be used for SQLite3 database access. If custom I/O is desired for that, then
proj_context_set_sqlite3_vfs_name() should be used.
Return TRUE in case of success.
Since 7.0
Parameters
• ctx: PROJ context, or NULL
• fileapi: Pointer to file API structure (content will be copied).
• user_data: Arbitrary pointer provided by the user, and passed to the above callbacks. May be
NULL.
Since 7.0
Parameters
Return TRUE if network access is possible. That is either libcurl is available, or an alternate interface has been
set.
Since 7.0
Parameters
• ctx: PROJ context, or NULL
• enable: TRUE if network access is allowed.
Since 7.0
Parameters
• ctx: PROJ context, or NULL
• url: Endpoint URL. Must NOT be NULL.
Return Endpoint URL. The returned pointer would be invalidated by a later call to
proj_context_set_url_endpoint()
Since 7.1
Parameters
• ctx: PROJ context, or NULL
Since 7.0
Parameters
• ctx: PROJ context, or NULL
• enabled: TRUE if the cache is enabled.
Since 7.0
Parameters
• ctx: PROJ context, or NULL
• fullname: Full name to the cache (encoded in UTF-8). If set to NULL, caching will be disabled.
Since 7.0
Parameters
• ctx: PROJ context, or NULL
• max_size_MB: Maximum size, in mega-bytes (1024*1024 bytes), or negative value to set unlimited
size.
Since 7.0
Parameters
• ctx: PROJ context, or NULL
• ttl_seconds: Delay in seconds. Use negative value for no expiration.
Since 7.0
Parameters
• ctx: PROJ context, or NULL
10.5.2.13 Cleanup
void proj_cleanup()
New in version 6.2.0.
This function frees global resources (grids, cache of +init files). It should be called typically before process
termination, and after having freed PJ and PJ_CONTEXT objects.
The default value is FALSE, that is the database remains open until the context is destroyed.
Since 6.2
Parameters
• ctx: PROJ context, or NULL for default context
• autoclose: Boolean parameter
Parameters
• ctx: PROJ context, or NULL for default context
• wkt: String (must not be NULL)
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• wkt: WKT string (must not be NULL)
• options: null-terminated list of options, or NULL. Currently supported options are:
– STRICT=YES/NO. Defaults to NO. When set to YES, strict validation will be enabled.
• out_warnings: Pointer to a PROJ_STRING_LIST object, or NULL. If provided, *out_warnings
will contain a list of warnings, typically for non recognized projection method or parameters. It must
be freed with proj_string_list_destroy().
• out_grammar_errors: Pointer to a PROJ_STRING_LIST object, or NULL. If provided,
*out_grammar_errors will contain a list of errors regarding the WKT grammar. It must be freed
with proj_string_list_destroy().
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: Context, or NULL for default context.
• auth_name: Authority name (must not be NULL)
• code: Object code (must not be NULL)
• category: Object category
• usePROJAlternativeGridNames: Whether PROJ alternative grid names should be substituted
to the official grid names. Only used on transformations
• options: should be set to NULL for now
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• obj: Object to clone. Must not be NULL.
Return a result set that must be unreferenced with proj_list_destroy(), or NULL in case of error.
Parameters
• ctx: Context, or NULL for default context.
• auth_name: Authority name, used to restrict the search. Or NULL for all authorities.
• searchedName: Searched name. Must be at least 2 character long.
• types: List of object types into which to search. If NULL, all object types will be searched.
• typesCount: Number of elements in types, or 0 if types is NULL
• approximateMatch: Whether approximate name identification is allowed.
• limitResultCount: Maximum number of results to return. Or 0 for unlimited.
• options: should be set to NULL for now
Return a result set that must be unreferenced with proj_list_destroy(), or NULL in case of error.
Parameters
• ctx: Context, or NULL for default context.
• obj: Object (of type CRS for now) for which non-deprecated objects must be searched. Must not be
NULL
Parameters
• obj: Object (must not be NULL)
• other: Other object (must not be NULL)
• criterion: Comparison criterion
Parameters
• obj: Object (must not be NULL)
Return TRUE in case of success, FALSE in case of error or if the area of use is unknown.
Parameters
• ctx: PROJ context, or NULL for default context
• obj: Object (must not be NULL)
• out_west_lon_degree: Pointer to a double to receive the west longitude (in degrees). Or NULL.
If the returned value is -1000, the bounding box is unknown.
• out_south_lat_degree: Pointer to a double to receive the south latitude (in degrees). Or
NULL. If the returned value is -1000, the bounding box is unknown.
• out_east_lon_degree: Pointer to a double to receive the east longitude (in degrees). Or NULL.
If the returned value is -1000, the bounding box is unknown.
• out_north_lat_degree: Pointer to a double to receive the north latitude (in degrees). Or
NULL. If the returned value is -1000, the bounding box is unknown.
• out_area_name: Pointer to a string to receive the name of the area of use. Or NULL.
*p_area_name is valid while obj is valid itself.
const char *proj_as_wkt(PJ_CONTEXT *ctx, const PJ *obj, PJ_WKT_TYPE type, const char
*const *options)
Get a WKT representation of an object.
The returned string is valid while the input obj parameter is valid, and until a next call to proj_as_wkt() with the
same input object.
This function calls osgeo::proj::io::IWKTExportable::exportToWKT().
This function may return NULL if the object is not compatible with an export to the requested type.
const char *proj_as_projjson(PJ_CONTEXT *ctx, const PJ *obj, const char *const *options)
Get a PROJJSON string representation of an object.
The returned string is valid while the input obj parameter is valid, and until a next call to proj_as_proj_string()
with the same input object.
This function calls osgeo::proj::io::IJSONExportable::exportToJSON().
This function may return NULL if the object is not compatible with an export to the requested type.
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error, or missing source
CRS.
Parameters
• ctx: PROJ context, or NULL for default context
• obj: Object of type BoundCRS or CoordinateOperation (must not be NULL)
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error, or missing target CRS.
Parameters
• ctx: PROJ context, or NULL for default context
• obj: Object of type BoundCRS or CoordinateOperation (must not be NULL)
• 100% means that the name of the reference entry perfectly matches the CRS name, and
both are equivalent. In which case a single result is returned. Note: in the case of a Ge-
ographicCRS whose axis order is implicit in the input definition (for example ESRI WKT),
then axis order is ignored for the purpose of identification. That is the CRS built from GE-
OGCS[“GCS_WGS_1984”,DATUM[“D_WGS_1984”,SPHEROID[“WGS_1984”,6378137.0,298.257223563]],
PRIMEM[“Greenwich”,0.0],UNIT[“Degree”,0.0174532925199433]] will be iden-
tified to EPSG:4326, but will not pass a isEquivalentTo(EPSG_4326,
util::IComparable::Criterion::EQUIVALENT) test, but rather isEquivalentTo(EPSG_4326,
util::IComparable::Criterion::EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS)
• 90% means that CRS are equivalent, but the names are not exactly the same.
• 70% means that CRS are equivalent, but the names are not equivalent.
• 25% means that the CRS are not equivalent, but there is some similarity in the names.
Other confidence values may be returned by some specialized implementations.
This is implemented for GeodeticCRS, ProjectedCRS, VerticalCRS and CompoundCRS.
Return a NULL terminated list of NUL-terminated strings that must be freed with proj_string_list_destroy(),
or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
Return a NULL terminated list of NUL-terminated strings that must be freed with proj_string_list_destroy(),
or NULL in case of error.
See proj_get_crs_info_list_from_database()
Parameters
• ctx: PROJ context, or NULL for default context.
• auth_name: Authority name (must not be NULL)
• type: Object type.
• allow_deprecated: whether we should return deprecated objects as well.
PROJ_CRS_LIST_PARAMETERS *proj_get_crs_list_parameters_create(void)
Instantiate a default set of parameters to be used by proj_get_crs_list().
Parameters
• ctx: PROJ context, or NULL for default context
• auth_name: Authority name, used to restrict the search. Or NULL for all authorities.
• category: Filter by category, if this parameter is not NULL. Category is one of “linear”, “lin-
ear_per_time”, “angular”, “angular_per_time”, “scale”, “scale_per_time” or “time”
• allow_deprecated: whether we should return deprecated objects as well.
• out_result_count: Output parameter pointing to an integer to receive the size of the result list.
Might be NULL
Since 7.1
PJ_OPERATION_FACTORY_CONTEXT *proj_create_operation_factory_context(PJ_CONTEXT
*ctx,
const
char *au-
thority)
Instantiate a context for building coordinate operations between two CRS.
The returned object must be unreferenced with proj_operation_factory_context_destroy() after use.
If authority is NULL or the empty string, then coordinate operations from any authority will be searched, with
the restrictions set in the authority_to_authority_preference database table. If authority is set to “any”, then
coordinate operations from any authority will be searched If authority is a non-empty string different of “any”,
then coordinate operations will be searched only in that authority namespace.
void proj_operation_factory_context_destroy(PJ_OPERATION_FACTORY_CONTEXT
*ctx)
Drops a reference on an object.
This method should be called one and exactly one for each function returning a
PJ_OPERATION_FACTORY_CONTEXT*
Parameters
• ctx: Object, or NULL.
Parameters
Parameters
• ctx: PROJ context, or NULL for default context
• factory_ctx: Operation factory context. must not be NULL
• west_lon_degree: West longitude (in degrees).
• south_lat_degree: South latitude (in degrees).
• east_lon_degree: East longitude (in degrees).
• north_lat_degree: North latitude (in degrees).
Parameters
• ctx: PROJ context, or NULL for default context
• factory_ctx: Operation factory context. must not be NULL
• use: How source and target CRS extent should be used.
Parameters
• ctx: PROJ context, or NULL for default context
Parameters
• ctx: PROJ context, or NULL for default context
• factory_ctx: Operation factory context. must not be NULL
• use: how grid availability is used.
void proj_operation_factory_context_set_use_proj_alternative_grid_names(PJ_CONTEXT
*ctx,
PJ_OPERATION_FACTORY_
*fac-
tory_ctx,
int
use-
PRO-
J-
Names)
Set whether PROJ alternative grid names should be substituted to the official authority names.
The default is true.
Parameters
• ctx: PROJ context, or NULL for default context
• factory_ctx: Operation factory context. must not be NULL
• usePROJNames: whether PROJ alternative grid names should be used
void proj_operation_factory_context_set_allow_use_intermediate_crs(PJ_CONTEXT
*ctx,
PJ_OPERATION_FACTORY_CONT
*factory_ctx,
PROJ_INTERMEDIATE_CRS_USE
use)
Set whether an intermediate pivot CRS can be used for researching coordinate operations between a source and
target CRS.
Concretely if in the database there is an operation from A to C (or C to A), and another one from C to B (or B
to C), but no direct operation between A and B, setting this parameter to true, allow chaining both operations.
The current implementation is limited to researching one intermediate step.
By default, with the IF_NO_DIRECT_TRANSFORMATION stratgey, all potential C candidates will be used if
there is no direct transformation.
Parameters
void proj_operation_factory_context_set_allowed_intermediate_crs(PJ_CONTEXT
*ctx,
PJ_OPERATION_FACTORY_CONTEX
*factory_ctx,
const char
*const
*list_of_auth_name_codes)
Restrict the potential pivot CRSs that can be used when trying to build a coordinate operation between two CRS
that have no direct operation.
Parameters
• ctx: PROJ context, or NULL for default context
• factory_ctx: Operation factory context. must not be NULL
• list_of_auth_name_codes: an array of strings NLL terminated, with the format {
“auth_name1”, “code1”, “auth_name2”, “code2”, . . . NULL }
Parameters
• ctx: PROJ context, or NULL for default context
• factory_ctx: Operation factory context. must not be NULL
• discard: superseded crs or not
void proj_operation_factory_context_set_allow_ballpark_transformations(PJ_CONTEXT
*ctx,
PJ_OPERATION_FACTORY_C
*fac-
tory_ctx,
int al-
low)
Set whether ballpark transformations are allowed.
Since 7.1
Parameters
• ctx: PROJ context, or NULL for default context
• factory_ctx: Operation factory context. must not be NULL
• allow: set to TRUE to allow ballpark transformations.
Return a result set that must be unreferenced with proj_list_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• source_crs: source CRS. Must not be NULL.
• target_crs: source CRS. Must not be NULL.
• operationContext: Search context. Must not be NULL.
Parameters
• result: Object of type PJ_OBJ_LIST (must not be NULL)
Return a new object that must be unreferenced with proj_destroy(), or nullptr in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• result: Object of type PJ_OBJ_LIST (must not be NULL)
• index: Index
Parameters
• result: Object, or NULL.
This operation may use resources that are not locally available, depending on the search criteria used by
proj_create_operations().
This could be done by using proj_create_operations() with a punctual bounding box, but this function is faster
when one needs to evaluate on many points with the same (source_crs, target_crs) tuple.
Return the index in operations that would be used to transform coord. Or -1 in case of error, or no match.
Since 7.1
Parameters
• ctx: PROJ context, or NULL for default context
• operations: List of operations returned by proj_create_operations()
• direction: Direction into which to transform the point.
• coord: Coordinate to transform
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• crs: Object of type CRS (must not be NULL)
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• crs: Object of type CRS (must not be NULL)
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• crs: Object of type CRS (must not be NULL)
• index: Index of the CRS component (typically 0 = horizontal, 1 = vertical)
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error (or if there is no datum)
Parameters
• ctx: PROJ context, or NULL for default context
• crs: Object of type SingleCRS (must not be NULL)
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• crs: Object of type SingleCRS (must not be NULL)
int proj_cs_get_axis_info(PJ_CONTEXT *ctx, const PJ *cs, int index, const char **out_name,
const char **out_abbrev, const char **out_direction, double
*out_unit_conv_factor, const char **out_unit_name, const char
**out_unit_auth_name, const char **out_unit_code)
Returns information on an axis.
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• obj: Object of type CRS or GeodeticReferenceFrame (must not be NULL)
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
Return Object of type SingleOperation that must be unreferenced with proj_destroy(), or NULL in case of
error.
Parameters
• ctx: PROJ context, or NULL for default context
• crs: Object of type DerivedCRS or BoundCRSs (must not be NULL)
Parameters
• ctx: PROJ context, or NULL for default context
• coordoperation: Object of type SingleOperation or derived classes (must not be NULL)
Parameters
• ctx: PROJ context, or NULL for default context
• coordoperation: Object of type CoordinateOperation or derived classes (must not be NULL)
• out_package_name: Pointer to a string value to store the package name where the grid might be
found. or NULL
• out_url: Pointer to a string value to store the grid URL or the package URL where the grid might
be found. or NULL
• out_direct_download: Pointer to a int (boolean) value to store whether *out_url can be down-
loaded directly. or NULL
• out_open_license: Pointer to a int (boolean) value to store whether the grid is released with an
open license. or NULL
• out_available: Pointer to a int (boolean) value to store whether the grid is available at runtime.
or NULL
Return TRUE in case of success, or FALSE if coordoperation is not compatible with a WKT1 TOWGS84
representation.
Parameters
• ctx: PROJ context, or NULL for default context
• coordoperation: Object of type Transformation, that can be represented as a WKT1 TOWGS84
node (must not be NULL)
• out_values: Pointer to an array of value_count double values.
• value_count: Size of out_values array. The suggested size is 7 to get translation, rotation and
scale difference parameters. Rotation and scale difference terms might be zero if the transformation
only includes translation parameters. In that case, value_count could be set to 3.
• emit_error_if_incompatible: Boolean to inicate if an error must be logged if coordopera-
tion is not compatible with a WKT1 TOWGS84 representation.
Return a new PJ* object to free with proj_destroy() in case of success, or nullptr in case of error
Since 6.3
Parameters
• ctx: PROJ context, or NULL for default context
• obj: Object of type CoordinateOperation (must not be NULL)
Return Object that must be unreferenced with proj_destroy(), or NULL in case of error.
Parameters
• ctx: PROJ context, or NULL for default context
• concatoperation: Concatenated operation (must not be NULL)
• i_step: Index of the step to extract. Between 0 and proj_concatoperation_get_step_count()-1
namespace general_api_design
General API design.
The design of the class hierarchy is strongly derived from ISO_19111_2019.
Classes for which the constructors are not directly accessible have their instances constructed with create()
methods. The returned object is a non-null shared pointer. Such objects are immutable, and thread-safe.
TODO
namespace general_properties
General properties.
All classes deriving from IdentifiedObject have general properties that can be defined at creation time. Those
properties are:
namespace standards
Applicable standards.
namespace ISO_19111
ISO:19111 / OGC Topic 2 standard.
Topic 2 - Spatial referencing by coordinates.
This is an Abstract Specification describes the data elements, relationships and associated metadata required for
spatial referencing by coordinates. It describes Coordinate Reference Systems (CRS), coordinate systems (CS)
and coordinate transformation or coordinate conversion between two different coordinate reference systems.
namespace ISO_19111_2019
ISO 19111:2019.
This is the revision mostly used for PROJ C++ modelling.
OGC 18-005r4, 2019-02-08, ISO 19111:2019
namespace ISO_19111_2007
ISO 19111:2007.
The precedent version of the specification was: OGC 08-015r2, 2010-04-27, ISO 19111:2007
namespace WKT2
WKT2 standard.
Well-known text representation of coordinate reference systems.
Well-known Text (WKT) offers a compact machine- and human-readable representation of the critical elements
of coordinate reference system (CRS) definitions, and coordinate operations. This is an implementation of
ISO_19111
PROJ implements the two following revisions of the standard:
namespace WKT2_2019
WKT2:2019.
OGC 18-010r7, 2019-06-24, WKT2-2019
namespace WKT2_2015
WKT2:2015.
OGC 12-063r5, 2015-05-01, ISO 19162:2015(E), WKT2-2015
namespace WKT1
WKT1 specification.
Older specifications of well-known text representation of coordinate reference systems are also supported by
PROJ, mostly for compatibility with legacy systems, or older versions of GDAL.
GDAL v2.3 and earlier mostly implements:
OGC 01-009, 2001-01-12, OpenGIS Coordinate Transformation Service Implementation Specification
The GDAL documentation, OGC WKT Coordinate System Issues discusses issues, and GDAL implementation
choices.
An older specification of WKT1 is/was used by some software packages:
OGC 99-049, 1999-05-05, OpenGIS Simple Features Specification For SQL v1.1
namespace ISO_19115
ISO 19115 (Metadata)
Defines the schema required for describing geographic information and services. It provides information about
the identification, the extent, the quality, the spatial and temporal schema, spatial reference, and distribution of
digital geographic data.
PROJ implements a simplified subset of ISO 19115.
namespace GeoAPI
GeoAPI.
A set of Java and Python language programming interfaces for geospatial applications.
GeoAPI main page
GeoAPI Javadoc
OGC GeoAPI Implementation Specification
namespace osgeo::proj::common
Common classes.
osgeo.proj.common namespace
Typedefs
Public Functions
Public Functions
Public Functions
Public Functions
int getEPSGCode()
Return the EPSG code.
Return code, or 0 if not found
Public Functions
Public Functions
Public Functions
Public Functions
Public Functions
Public Types
enum Type
Type of unit of measure.
Values:
enumerator UNKNOWN
Unknown unit of measure
enumerator NONE
No unit of measure
enumerator ANGULAR
Angular unit of measure
enumerator LINEAR
Linear unit of measure
enumerator SCALE
Scale unit of measure
enumerator TIME
Time unit of measure
enumerator PARAMETRIC
Parametric unit of measure
Public Functions
namespace osgeo::proj::util
A set of base types from ISO 19103, GeoAPI and other PROJ specific classes.
osgeo.proj.util namespace.
Typedefs
Public Functions
ArrayOfBaseObjectNNPtr create()
Instantiate a ArrayOfBaseObject.
Return a new ArrayOfBaseObject.
class BaseObject
#include <util.hpp> Class that can be derived from, to emulate Java’s Object behavior.
Subclassed by osgeo::proj::common::IdentifiedObject, osgeo::proj::common::Measure,
osgeo::proj::common::ObjectDomain, osgeo::proj::common::UnitOfMeasure, os-
geo::proj::metadata::Citation, osgeo::proj::metadata::Extent, osgeo::proj::metadata::GeographicExtent,
osgeo::proj::metadata::Identifier, osgeo::proj::metadata::PositionalAccuracy, os-
geo::proj::metadata::TemporalExtent, osgeo::proj::metadata::VerticalExtent, os-
geo::proj::operation::GeneralParameterValue, osgeo::proj::operation::ParameterValue, os-
geo::proj::util::ArrayOfBaseObject, osgeo::proj::util::BoxedValue, osgeo::proj::util::GenericName
struct BaseObjectNNPtr : public util::nn<BaseObjectPtr>
#include <util.hpp> Non-null shared pointer of BaseObject.
class BoxedValue : public osgeo::proj::util::BaseObject
#include <util.hpp> Encapsulate standard datatypes in an object.
Public Functions
Public Functions
Public Functions
Subclassed by osgeo::proj::util::LocalName
Public Functions
Public Types
enum Criterion
Comparison criterion.
Values:
enumerator STRICT
All properties are identical.
enumerator EQUIVALENT
The objects are equivalent for the purpose of coordinate operations. They can differ by the name
of their objects, identifiers, other metadata. Parameters may be expressed in different units, pro-
vided that the value is (with some tolerance) the same once expressed in a common unit.
enumerator EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS
Same as EQUIVALENT, relaxed with an exception that the axis order of the base CRS of a
DerivedCRS/ProjectedCRS or the axis order of a GeographicCRS is ignored. Only to be used
with DerivedCRS/ProjectedCRS/GeographicCRS
Public Functions
Public Functions
• scope: scope.
• name: string of the local name.
GenericNameNNPtr createGenericName(const NameSpacePtr &scope, const
std::vector<std::string> &parsedNames)
Instantiate a GenericName.
Return a new GenericName.
Parameters
• scope: scope.
• parsedNames: the components of the name.
class NameSpace
#include <util.hpp> A domain in which names given by strings are defined.
Public Functions
Public Functions
Public Functions
namespace osgeo::proj::metadata
Common classes from ISO_19115 standard.
osgeo.proj.metadata namespace
Typedefs
Public Functions
Public Functions
Public Functions
double westBoundLongitude()
Returns the western-most coordinate of the limit of the dataset extent.
The unit is degrees.
If eastBoundLongitude < westBoundLongitude(), then the bounding box crosses the anti-meridian.
double southBoundLatitude()
Returns the southern-most coordinate of the limit of the dataset extent.
The unit is degrees.
double eastBoundLongitude()
Returns the eastern-most coordinate of the limit of the dataset extent.
The unit is degrees.
If eastBoundLongitude < westBoundLongitude(), then the bounding box crosses the anti-meridian.
double northBoundLatitude()
Returns the northern-most coordinate of the limit of the dataset extent.
The unit is degrees.
bool contains(const GeographicExtentNNPtr &other) const override
Returns whether this extent contains the other one.
bool intersects(const GeographicExtentNNPtr &other) const override
Returns whether this extent intersects the other one.
GeographicExtentPtr intersection(const GeographicExtentNNPtr &other) const
override
Returns the intersection of this extent with another one.
Subclassed by osgeo::proj::metadata::GeographicBoundingBox
Public Functions
Remark Implements Identifier as described in ISO_19111_2019 but which originates from ISO_19115
Public Functions
Remark Simplified version of PositionalAccuracy from GeoAPI, which originates from ISO_19115
Public Functions
Public Functions
Public Functions
double minimumValue()
Returns the minimum of the vertical extent.
double maximumValue()
Returns the maximum of the vertical extent.
common::UnitOfMeasureNNPtr &unit()
Returns the unit of the vertical extent.
bool contains(const VerticalExtentNNPtr &other) const
Returns whether this extent contains the other one.
bool intersects(const VerticalExtentNNPtr &other) const
Returns whether this extent intersects the other one.
10.5.3.5 cs namespace
namespace osgeo::proj::cs
Coordinate systems and their axis.
osgeo.proj.cs namespace
Typedefs
Public Functions
Public Functions
Public Functions
namespace osgeo::proj::datum
Datum (the relationship of a coordinate system to the body).
osgeo.proj.datum namespace
Typedefs
Public Functions
where the relationship between geoid and ellipsoid is defined, together with a direction from that
point.
• For a vertical reference frame the anchor may be the zero level at one or more defined locations
or a conventionally defined surface.
• For an engineering datum, the anchor may be an identified physical point with the orientation
defined relative to the object.
Return the anchor definition, or empty.
const util::optional<common::DateTime> &publicationDate() const
Return the date on which the datum definition was published.
Note Departure from ISO_19111_2019 : we return a DateTime instead of a Citation::Date.
Return the publication date, or empty.
const common::IdentifiedObjectPtr &conventionalRS() const
Return the conventional reference system.
This is the name, identifier, alias and remarks for the terrestrial reference system or vertical reference
system realized by this reference frame, for example “ITRS” for ITRF88 through ITRF2008 and
ITRF2014, or “EVRS” for EVRF2000 and EVRF2007.
Return the conventional reference system, or nullptr.
class DatumEnsemble : public osgeo::proj::common::IdentifiedObject, public osgeo::proj::io::IJSONExportable
#include <datum.hpp> A collection of two or more geodetic or vertical reference frames (or if not geodetic
or vertical reference frame, a collection of two or more datums) which for all but the highest accuracy
requirements may be considered to be insignificantly different from each other.
Every frame within the datum ensemble must be a realizations of the same Terrestrial Reference System
or Vertical Reference System.
Public Functions
Public Functions
Public Functions
Public Functions
Note The origin can be fixed with respect to the Earth (such as a defined point at a construction site), or
be a defined point on a moving vehicle (such as on a ship or satellite), or a defined point of an image.
Remark Implements EngineeringDatum from ISO_19111_2019
Subclassed by osgeo::proj::datum::DynamicGeodeticReferenceFrame
Public Functions
Note The default value for prime meridian name is “Greenwich”. When the default applies, the value for
the longitude shall be 0 (degrees).
Remark Implements PrimeMeridian from ISO_19111_2019
Public Functions
Public Functions
Subclassed by osgeo::proj::datum::DynamicVerticalReferenceFrame
Public Functions
namespace osgeo::proj::crs
CRS (coordinate reference system = coordinate system with a datum).
osgeo.proj.crs namespace
Typedefs
Note Contrary to other CRS classes of this package, there is no ISO_19111_2019 modelling of a Bound-
CRS.
Remark Implements BoundCRS from WKT2
Public Functions
Note Two coordinate reference systems are independent of each other if coordinate values in one cannot
be converted or transformed into coordinate values in the other.
Note As a departure to ISO_19111_2019, we allow to build a CompoundCRS from CRS objects, whereas
ISO19111:2019 restricts the components to SingleCRS.
Remark Implements CompoundCRS from ISO_19111_2019
Public Functions
Public Functions
The method returns a list of matching reference CRS, and the percentage (0-100) of confidence in the
match. The list is sorted by decreasing confidence.
• 100% means that the name of the reference entry perfectly matches the CRS name, and
both are equivalent. In which case a single result is returned. Note: in the case of a Geo-
graphicCRS whose axis order is implicit in the input definition (for example ESRI WKT),
then axis order is ignored for the purpose of identification. That is the CRS built from GE-
OGCS[“GCS_WGS_1984”,DATUM[“D_WGS_1984”,SPHEROID[“WGS_1984”,6378137.0,298.257223563]],
PRIMEM[“Greenwich”,0.0],UNIT[“Degree”,0.0174532925199433]] will be
identified to EPSG:4326, but will not pass a isEquivalentTo(EPSG_4326,
util::IComparable::Criterion::EQUIVALENT) test, but rather isEquivalentTo(EPSG_4326,
util::IComparable::Criterion::EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS)
• 90% means that CRS are equivalent, but the names are not exactly the same.
• 70% means that CRS are equivalent), but the names do not match at all.
• 25% means that the CRS are not equivalent, but there is some similarity in the names.
Other confidence values may be returned by some specialized implementations.
This is implemented for GeodeticCRS, ProjectedCRS, VerticalCRS and CompoundCRS.
Return a list of matching reference CRS, and the percentage (0-100) of confidence in the match.
Parameters
• authorityFactory: Authority factory (or null, but degraded functionality)
std::list<CRSNNPtr> getNonDeprecated(const io::DatabaseContextNNPtr &dbContext)
const
Return CRSs that are non-deprecated substitutes for the current CRS.
CRSNNPtr promoteTo3D(const std::string &newName, const io::DatabaseContextPtr &db-
Context) const
Return a variant of this CRS “promoted” to a 3D one, if not already the case.
The new axis will be ellipsoidal height, oriented upwards, and with metre units.
Return a new CRS promoted to 3D, or the current one if already 3D or not applicable.
Since 6.3
Parameters
• newName: Name of the new CRS. If empty, nameStr() will be used.
• dbContext: Database context to look for potentially already registered 3D CRS. May be
nullptr.
CRSNNPtr demoteTo2D(const std::string &newName, const io::DatabaseContextPtr &db-
Context) const
Return a variant of this CRS “demoted” to a 2D one, if not already the case.
Return a new CRS demoted to 2D, or the current one if already 2D or not applicable.
Since 6.3
Parameters
• newName: Name of the new CRS. If empty, nameStr() will be used.
• dbContext: Database context to look for potentially already registered 2D CRS. May be
nullptr.
class DerivedCRS : public virtual osgeo::proj::crs::SingleCRS
#include <crs.hpp> Abstract class modelling a single coordinate reference system that is defined through
the application of a specified coordinate conversion to the definition of a previously established single
coordinate reference system referred to as the base CRS.
A derived coordinate reference system inherits its datum (or datum ensemble) from its base CRS. The
coordinate conversion between the base and derived coordinate reference system is implemented using the
parameters and formula(s) specified in the definition of the coordinate conversion.
Public Functions
Public Types
Public Functions
Public Functions
Public Functions
Public Functions
Public Functions
Public Functions
Public Functions
bool isGeocentric()
Return whether the CRS is a geocentric one.
A geocentric CRS is a geodetic CRS that has a Cartesian coordinate system with three axis, whose
direction is respectively cs::AxisDirection::GEOCENTRIC_X, cs::AxisDirection::GEOCENTRIC_Y
and cs::AxisDirection::GEOCENTRIC_Z.
Return true if the CRS is a geocentric CRS.
std::list<std::pair<GeodeticCRSNNPtr, int>> identify(const io::AuthorityFactoryPtr &author-
ityFactory) const
Identify the CRS with reference CRSs.
The candidate CRSs are either hard-coded, or looked in the database when authorityFactory is not
null.
Note that the implementation uses a set of heuristics to have a good compromise of successful identi-
fications over execution time. It might miss legitimate matches in some circumstances.
The method returns a list of matching reference CRS, and the percentage (0-100) of confidence in the
match:
• 100% means that the name of the reference entry perfectly matches the CRS name, and
both are equivalent. In which case a single result is returned. Note: in the case of a Geo-
graphicCRS whose axis order is implicit in the input definition (for example ESRI WKT),
then axis order is ignored for the purpose of identification. That is the CRS built from GE-
OGCS[“GCS_WGS_1984”,DATUM[“D_WGS_1984”,SPHEROID[“WGS_1984”,6378137.0,298.257223563]],
PRIMEM[“Greenwich”,0.0],UNIT[“Degree”,0.0174532925199433]] will be
identified to EPSG:4326, but will not pass a isEquivalentTo(EPSG_4326,
util::IComparable::Criterion::EQUIVALENT) test, but rather isEquivalentTo(EPSG_4326,
util::IComparable::Criterion::EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS)
• 90% means that CRS are equivalent, but the names are not exactly the same.
• 70% means that CRS are equivalent (equivalent datum and coordinate system), but the names are
not equivalent.
• 60% means that ellipsoid, prime meridian and coordinate systems are equivalent, but the CRS and
datum names do not match.
• 25% means that the CRS are not equivalent, but there is some similarity in the names.
Return a list of matching reference CRS, and the percentage (0-100) of confidence in the match.
Parameters
• authorityFactory: Authority factory (or null, but degraded functionality)
Subclassed by osgeo::proj::crs::DerivedGeographicCRS
Public Functions
Public Functions
coordinate reference system as its base CRS, thereby inheriting a geodetic reference frame, and is converted
using a map projection.
It has a Cartesian coordinate system, usually two-dimensional but may be three-dimensional; in the 3D
case the base geographic CRSs ellipsoidal height is passed through unchanged and forms the vertical axis
of the projected CRS’s Cartesian coordinate system.
Public Functions
• dbContext: Database context to look for potentially already registered 2D CRS. May be
nullptr.
Public Functions
Public Functions
Note Ellipsoidal heights cannot be captured in a vertical coordinate reference system. They exist only as
an inseparable part of a 3D coordinate tuple defined in a geographic 3D coordinate reference system.
Remark Implements VerticalCRS from ISO_19111_2019
Subclassed by osgeo::proj::crs::DerivedVerticalCRS
Public Functions
namespace osgeo::proj::operation
Coordinate operations (relationship between any two coordinate reference systems).
osgeo.proj.operation namespace
This covers Conversion, Transformation, PointMotionOperation or ConcatenatedOperation.
Typedefs
Functions
Public Functions
Public Functions
ConversionNNPtr createGaussSchreiberTransverseMercator(const
util::PropertyMap
&properties, const
common::Angle &cen-
terLat, const com-
mon::Angle &cen-
terLong, const
common::Scale
&scale, const
common::Length
&falseEasting, const
common::Length
&falseNorthing)
Instantiate a conversion based on the Gauss Schreiber Transverse Mercator projection method.
This method is also known as Gauss-Laborde Reunion.
There is no equivalent in EPSG.
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• centerLat: See Latitude of natural origin/Center Latitude
• centerLong: See Longitude of natural origin/Central Meridian
• scale: See Scale Factor
• falseEasting: See False Easting
• falseNorthing: See False Northing
ConversionNNPtr createTransverseMercatorSouthOriented(const
util::PropertyMap
&properties, const
common::Angle &cen-
terLat, const com-
mon::Angle ¢er-
Long, const com-
mon::Scale &scale,
const common::Length
&falseEasting, const
common::Length
&falseNorthing)
Instantiate a conversion based on the Transverse Mercator South Orientated projection method.
This method is defined as EPSG:9808
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• centerLat: See Latitude of natural origin/Center Latitude
• centerLong: See Longitude of natural origin/Central Meridian
• scale: See Scale Factor
• falseEasting: See False Easting
• falseNorthing: See False Northing
ConversionNNPtr createLambertConicConformal_2SP_Belgium(const
util::PropertyMap
&properties, const
common::Angle
&latitudeFalse-
Origin, const
common::Angle
&longitudeFalse-
Origin, const
common::Angle
&latitudeFirst-
Parallel, const
common::Angle
&latitudeSecond-
Parallel, const
common::Length
&eastingFalse-
Origin, const
common::Length
&northingFalseOri-
gin)
Instantiate a conversion based on the Lambert Conic Conformal (2SP Belgium) projection method.
This method is defined as EPSG:9803
Warning The formulas used currently in PROJ are, incorrectly, the ones of the regular LCC_2SP
method.
Note the order of arguments is conformant with the corresponding EPSG mode and different than
OGRSpatialReference::setLCCB() of GDAL <= 2.3
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• latitudeFalseOrigin: See Latitude of false origin
• longitudeFalseOrigin: See Longitude of false origin
• latitudeFirstParallel: See Latitude of 1st standard parallel
• latitudeSecondParallel: See Latitude of 2nd standard parallel
• eastingFalseOrigin: See Easting of false origin
• northingFalseOrigin: See Northing of false origin
ConversionNNPtr createAzimuthalEquidistant(const util::PropertyMap &properties,
const common::Angle &latitudeNatO-
rigin, const common::Angle &longi-
tudeNatOrigin, const common::Length
&falseEasting, const common::Length
&falseNorthing)
Instantiate a conversion based on the Modified Azimuthal Equidistant projection method.
This method is defined as EPSG:9832
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• latitudeNatOrigin: See Latitude of natural origin/Center Latitude
• longitudeNatOrigin: See Longitude of natural origin/Central Meridian
• falseEasting: See False Easting
forced to 0.
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• latitudeFirstParallel: See Latitude of 1st standard parallel.
• longitudeNatOrigin: See Longitude of natural origin/Central Meridian
• falseEasting: See False Easting
• falseNorthing: See False Northing
ConversionNNPtr createEquidistantCylindricalSpherical(const
util::PropertyMap
&properties, const
common::Angle &lat-
itudeFirstParallel,
const common::Angle
&longitudeNatOrigin,
const common::Length
&falseEasting, const
common::Length
&falseNorthing)
Instantiate a conversion based on the Equidistant Cylindrical (Spherical) projection method.
This is also known as the Equirectangular method, and in the particular case where the latitude of first
parallel is 0.
This method is defined as EPSG:1029
Note This is the equivalent OGRSpatialReference::SetEquirectangular2( 0.0, latitudeFirstParallel,
falseEasting, falseNorthing ) of GDAL <= 2.3, where the lat_0 / center_latitude parameter is
forced to 0.
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• latitudeFirstParallel: See Latitude of 1st standard parallel.
• longitudeNatOrigin: See Longitude of natural origin/Central Meridian
• falseEasting: See False Easting
• falseNorthing: See False Northing
ConversionNNPtr createGall(const util::PropertyMap &properties, const common::Angle
¢erLong, const common::Length &falseEasting, const
common::Length &falseNorthing)
Instantiate a conversion based on the Gall (Stereographic) projection method.
There is no equivalent in EPSG.
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• centerLong: See Longitude of natural origin/Central Meridian
• falseEasting: See False Easting
• falseNorthing: See False Northing
section of the initial line and the aposphere (the equator on one of the intermediate surfaces inherent
in the method), that is at the natural origin of the coordinate system).
This method is defined as EPSG:9812
Note In the case where azimuthInitialLine = angleFromRectifiedToSkrewGrid = 90deg, this maps to
the Swiss Oblique Mercator formulas.
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• latitudeProjectionCentre: See Latitute of projection centre
• longitudeProjectionCentre: See Longitude of projection centre
• azimuthInitialLine: See Azimuth of initial line
• angleFromRectifiedToSkrewGrid: See Angle from Rectified to Skew Grid
• scale: See Scale factor on initial line
• falseEasting: See False Easting
• falseNorthing: See False Northing
ConversionNNPtr createHotineObliqueMercatorVariantB(const util::PropertyMap
&properties, const
common::Angle &latitude-
ProjectionCentre, const
common::Angle &lon-
gitudeProjectionCentre,
const common::Angle
&azimuthInitialLine,
const common::Angle
&angleFromRectified-
ToSkrewGrid, const
common::Scale &scale,
const common::Length
&eastingProjectionCentre,
const common::Length
&northingProjectionCen-
tre)
Instantiate a conversion based on the Hotine Oblique Mercator (Variant B) projection method.
This is the variant without the no_uoff parameter, which corresponds to GDAL >=2.3 Ho-
tine_Oblique_Mercator_Azimuth_Center projection. In this variant, the false grid coordinates are
defined at the projection centre.
This method is defined as EPSG:9815
Note In the case where azimuthInitialLine = angleFromRectifiedToSkrewGrid = 90deg, this maps to
the Swiss Oblique Mercator formulas.
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• latitudeProjectionCentre: See Latitute of projection centre
• longitudeProjectionCentre: See Longitude of projection centre
• azimuthInitialLine: See Azimuth of initial line
• angleFromRectifiedToSkrewGrid: See Angle from Rectified to Skew Grid
• scale: See Scale factor on initial line
• eastingProjectionCentre: See Easting at projection centre
• northingProjectionCentre: See Northing at projection centre
ConversionNNPtr createHotineObliqueMercatorTwoPointNaturalOrigin(const
util::PropertyMap
&prop-
erties,
const
com-
mon::Angle
&lati-
tudePro-
jection-
Centre,
const
com-
mon::Angle
&lat-
itude-
Point1,
const
com-
mon::Angle
&lon-
gitude-
Point1,
const
com-
mon::Angle
&lat-
itude-
Point2,
const
com-
mon::Angle
&lon-
gitude-
Point2,
const
com-
mon::Scale
&scale,
const
com-
mon::Length
&east-
ingPro-
jection-
Centre,
const
com-
mon::Length
&nor-
thing-
Projec-
tionCen-
tre)
Instantiate a conversion based on the Hotine Oblique Mercator Two Point Natural Origin projection
method.
There is no equivalent in EPSG.
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• latitudeProjectionCentre: See Latitute of projection centre
• latitudePoint1: Latitude of point 1.
• longitudePoint1: Latitude of point 1.
• latitudePoint2: Latitude of point 2.
• longitudePoint2: Longitude of point 2.
• scale: See Scale factor on initial line
• eastingProjectionCentre: See Easting at projection centre
• northingProjectionCentre: See Northing at projection centre
ConversionNNPtr createLabordeObliqueMercator(const util::PropertyMap &prop-
erties, const common::Angle
&latitudeProjectionCentre, const
common::Angle &longitudeProjec-
tionCentre, const common::Angle
&azimuthInitialLine, const com-
mon::Scale &scale, const com-
mon::Length &falseEasting, const
common::Length &falseNorthing)
Instantiate a conversion based on the Laborde Oblique Mercator projection method.
This method is defined as EPSG:9813
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• latitudeProjectionCentre: See Latitute of projection centre
• longitudeProjectionCentre: See Longitude of projection centre
• azimuthInitialLine: See Azimuth of initial line
• scale: See Scale factor on initial line
• falseEasting: See False Easting
• falseNorthing: See False Northing
ConversionNNPtr createInternationalMapWorldPolyconic(const util::PropertyMap
&properties, const com-
mon::Angle ¢erLong,
const common::Angle
&latitudeFirstParallel,
const common::Angle
&latitudeSecondParallel,
const common::Length
&falseEasting, const
common::Length
&falseNorthing)
Instantiate a conversion based on the International Map of the World Polyconic projection method.
There is no equivalent in EPSG.
Note the order of arguments is conformant with the corresponding EPSG mode and different than
Instantiate a conversion based on the Popular Visualisation Pseudo Mercator projection method.
Also known as WebMercator. Mostly/only used for Projected CRS EPSG:3857 (WGS 84 / Pseudo-
Mercator)
This method is defined as EPSG:1024
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• centerLat: See Latitude of natural origin/Center Latitude . Usually 0
• centerLong: See Longitude of natural origin/Central Meridian . Usually 0
• falseEasting: See False Easting . Usually 0
• falseNorthing: See False Northing . Usually 0
ConversionNNPtr createMollweide(const util::PropertyMap &properties, const com-
mon::Angle ¢erLong, const common::Length
&falseEasting, const common::Length &falseNorthing)
Instantiate a conversion based on the Mollweide projection method.
There is no equivalent in EPSG.
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• centerLong: See Longitude of natural origin/Central Meridian
• falseEasting: See False Easting
• falseNorthing: See False Northing
ConversionNNPtr createNewZealandMappingGrid(const util::PropertyMap &properties,
const common::Angle ¢erLat,
const common::Angle ¢erLong,
const common::Length &falseEasting,
const common::Length &falseNor-
thing)
Instantiate a conversion based on the New Zealand Map Grid projection method.
This method is defined as EPSG:9811
Return a new Conversion.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• centerLat: See Latitude of natural origin/Center Latitude
• centerLong: See Longitude of natural origin/Central Meridian
• falseEasting: See False Easting
• falseNorthing: See False Northing
ConversionNNPtr createObliqueStereographic(const util::PropertyMap &properties,
const common::Angle ¢erLat,
const common::Angle ¢erLong,
const common::Scale &scale, const
common::Length &falseEasting, const
common::Length &falseNorthing)
Instantiate a conversion based on the Oblique Stereographic (Alternative) projection method.
This method is defined as EPSG:9809
Public Functions
Public Types
enum SourceTargetCRSExtentUse
Specify how source and target CRS extent should be used to restrict candidate operations (only taken
into account if no explicit area of interest is specified.
Values:
enumerator NONE
Ignore CRS extent
enumerator BOTH
Test coordinate operation extent against both CRS extent.
enumerator INTERSECTION
Test coordinate operation extent against the intersection of both CRS extent.
enumerator SMALLEST
Test coordinate operation against the smallest of both CRS extent.
enum SpatialCriterion
Spatial criterion to restrict candidate operations.
Values:
enumerator STRICT_CONTAINMENT
The area of validity of transforms should strictly contain the are of interest.
enumerator PARTIAL_INTERSECTION
The area of validity of transforms should at least intersect the area of interest.
enum GridAvailabilityUse
Describe how grid availability is used.
Values:
enumerator USE_FOR_SORTING
Grid availability is only used for sorting results. Operations where some grids are missing will be
sorted last.
enumerator DISCARD_OPERATION_IF_MISSING_GRID
Completely discard an operation if a required grid is missing.
enumerator IGNORE_GRID_AVAILABILITY
Ignore grid availability at all. Results will be presented as if all grids were available.
enumerator KNOWN_AVAILABLE
Results will be presented as if grids known to PROJ (that is registered in the grid_alternatives
table of its database) were available. Used typically when networking is enabled.
enum IntermediateCRSUse
Describe if and how intermediate CRS should be used
Values:
enumerator ALWAYS
Always search for intermediate CRS.
enumerator IF_NO_DIRECT_TRANSFORMATION
Only attempt looking for intermediate CRS if there is no direct transformation available.
enumerator NEVER
Public Functions
Concretely if in the database there is an operation from A to C (or C to A), and another one
from C to B (or B to C), but no direct operation between A and B, setting this parameter to AL-
WAYS/IF_NO_DIRECT_TRANSFORMATION, allow chaining both operations.
The default is IF_NO_DIRECT_TRANSFORMATION.
void setIntermediateCRS(const std::vector<std::pair<std::string, std::string>> &intermedi-
ateCRSAuthCodes)
Restrict the potential pivot CRSs that can be used when trying to build a coordinate operation between
two CRS that have no direct operation.
Parameters
• intermediateCRSAuthCodes: a vector of (auth_name, code) that can be used as poten-
tial pivot RS
const std::vector<std::pair<std::string, std::string>> &getIntermediateCRS() const
Return the potential pivot CRSs that can be used when trying to build a coordinate operation between
two CRS that have no direct operation.
Public Functions
CoordinateOperationFactoryNNPtr create()
Instantiate a CoordinateOperationFactory.
class GeneralOperationParameter : public osgeo::proj::common::IdentifiedObject
#include <coordinateoperation.hpp> Abstract class modelling a parameter value (OperationParameter)
or group of parameters.
Subclassed by osgeo::proj::operation::OperationParameter
class GeneralParameterValue : public osgeo::proj::util::BaseObject, public osgeo::proj::io::IWKTExportable, pu
#include <coordinateoperation.hpp> Abstract class modelling a parameter value (OperationParameter-
Value) or group of parameter values.
Subclassed by osgeo::proj::operation::OperationParameterValue
struct GridDescription
#include <coordinateoperation.hpp> Grid description.
Public Members
std::string shortName
Grid short filename
std::string fullName
Grid full path name (if found)
std::string packageName
Package name (or empty)
std::string url
Grid URL (if packageName is empty), or package URL (or empty)
bool directDownload
Whether url can be fetched directly.
bool openLicense
Whether the grid is released with an open license.
bool available
Whether GRID is available.
class InvalidOperation : public osgeo::proj::util::Exception
#include <coordinateoperation.hpp> Exception that can be thrown when an invalid operation is attempted
to be constructed.
class OperationMethod : public osgeo::proj::common::IdentifiedObject, public osgeo::proj::io::IJSONExportable
#include <coordinateoperation.hpp> The method (algorithm or procedure) used to perform the coordinate
operation.
For a projection method, this contains the name of the projection method and the name of the projection
parameters.
Public Functions
int getEPSGCode()
Return the EPSG code, either directly, or through the name.
Return code, or 0 if not found
Public Functions
int getEPSGCode()
Return the EPSG code, either directly, or through the name.
Return code, or 0 if not found
Public Functions
Public Types
enum Type
Type of the value.
Values:
enumerator MEASURE
Measure (i.e. value with a unit)
enumerator STRING
String
enumerator INTEGER
Integer
enumerator BOOLEAN
Boolean
enumerator FILENAME
Filename
Public Functions
Public Functions
Public Functions
TransformationNNPtr createTimeDependentCoordinateFrameRotation(const
util::PropertyMap
&proper-
ties, const
crs::CRSNNPtr
&source-
CRSIn,
const
crs::CRSNNPtr
&tar-
getCRSIn,
double
transla-
tionXMetre,
double trans-
lationYMetre,
double trans-
lationZMetre,
double rota-
tionXArcSec-
ond, double
rotation-
YArcSecond,
double rota-
tionZArcSec-
ond, double
scaleDiffer-
encePPM,
double
rateTransla-
tionX, double
rateTransla-
tionY, double
rateTransla-
tionZ, double
rateRota-
tionX, double
rateRota-
tionY, double
rateRota-
tionZ, double
rateScaleD-
ifference,
double
referenceEp-
ochYear,
const
std::vector<metadata::PositionalAccu
&accura-
cies)
Instantiate a transformation with Time Dependent Position coordinate frame rotation transformation
method.
This is similar to createTimeDependentPositionVector(), except that the sign of the rotation terms is
inverted.
• flattingDifference: The difference between the flattening values of the ellipsoids used
in the target and source CRS.
• accuracies: Vector of positional accuracy (might be empty).
Exceptions
• InvalidOperation:
TransformationNNPtr createGravityRelatedHeightToGeographic3D(const
util::PropertyMap
&proper-
ties, const
crs::CRSNNPtr
&source-
CRSIn, const
crs::CRSNNPtr
&targetCRSIn,
const
crs::CRSPtr
&interpolation-
CRSIn, const
std::string &file-
name, const
std::vector<metadata::PositionalAccura
&accuracies)
Instantiate a transformation from GravityRelatedHeight to Geographic3D.
Return new Transformation.
Parameters
• properties: See general_properties of the Transformation. At minimum the name should
be defined.
• sourceCRSIn: Source CRS.
• targetCRSIn: Target CRS.
• interpolationCRSIn: Interpolation CRS. (might be null)
• filename: GRID filename.
• accuracies: Vector of positional accuracy (might be empty).
TransformationNNPtr createVERTCON(const util::PropertyMap &properties, const
crs::CRSNNPtr &sourceCRSIn, const crs::CRSNNPtr
&targetCRSIn, const std::string &filename, const
std::vector<metadata::PositionalAccuracyNNPtr> &ac-
curacies)
Instantiate a transformation with method VERTCON.
Return new Transformation.
Parameters
• properties: See general_properties of the Transformation. At minimum the name should
be defined.
• sourceCRSIn: Source CRS.
• targetCRSIn: Target CRS.
• filename: GRID filename.
• accuracies: Vector of positional accuracy (might be empty).
TransformationNNPtr createLongitudeRotation(const util::PropertyMap &properties,
const crs::CRSNNPtr &sourceCRSIn,
const crs::CRSNNPtr &targetCRSIn,
const common::Angle &offset)
Instantiate a transformation with method Longitude rotation.
This method is defined as EPSG:9601
TransformationNNPtr createGeographic2DWithHeightOffsets(const
util::PropertyMap
&properties, const
crs::CRSNNPtr
&sourceCRSIn, const
crs::CRSNNPtr &tar-
getCRSIn, const com-
mon::Angle &offsetLat,
const common::Angle
&offsetLon, const
common::Length
&offsetHeight, const
std::vector<metadata::PositionalAccuracyNNPt
&accuracies)
Instantiate a transformation with method Geographic 2D with height offsets.
This method is defined as EPSG:9618
• Return new Transformation.
Parameters
– properties: See general_properties of the Transformation. At minimum the name
should be defined.
– sourceCRSIn: Source CRS.
– targetCRSIn: Target CRS.
– offsetLat: Latitude offset to add.
– offsetLon: Longitude offset to add.
– offsetHeight: Geoid undulation to add.
– accuracies: Vector of positional accuracy (might be empty).
TransformationNNPtr createVerticalOffset(const util::PropertyMap &proper-
ties, const crs::CRSNNPtr &source-
CRSIn, const crs::CRSNNPtr
&targetCRSIn, const com-
mon::Length &offsetHeight, const
std::vector<metadata::PositionalAccuracyNNPtr>
&accuracies)
Instantiate a transformation with method Vertical Offset.
This method is defined as EPSG:9616
• Return new Transformation.
Parameters
– properties: See general_properties of the Transformation. At minimum the name
should be defined.
– sourceCRSIn: Source CRS.
– targetCRSIn: Target CRS.
– offsetHeight: Geoid undulation to add.
– accuracies: Vector of positional accuracy (might be empty).
TransformationNNPtr createChangeVerticalUnit(const util::PropertyMap &properties,
const crs::CRSNNPtr &sourceCRSIn,
const crs::CRSNNPtr &targetCRSIn,
const common::Scale &factor, const
std::vector<metadata::PositionalAccuracyNNPtr>
&accuracies)
Instantiate a transformation based on the Change of Vertical Unit method.
This method is defined as EPSG:1069
Return a new Transformation.
Parameters
• properties: See general_properties of the conversion. If the name is not provided, it is
automatically set.
• sourceCRSIn: Source CRS.
• targetCRSIn: Target CRS.
• factor: Conversion factor
• accuracies: Vector of positional accuracy (might be empty).
10.5.3.9 io namespace
namespace osgeo::proj::io
I/O classes.
osgeo.proj.io namespace.
Typedefs
Functions
Parameters
• text: One of the above mentioned text format
• dbContext: Database context, or nullptr (in which case database lookups will not work)
• usePROJ4InitRules: When set to true, init=epsg:XXXX syntax will be allowed and will
be interpreted according to PROJ.4 and PROJ.5 rules, that is geodeticCRS will have longitude,
latitude order and will expect/output coordinates in radians. ProjectedCRS will have easting,
northing axis order (except the ones with Transverse Mercator South Orientated projection). In
that mode, the epsg:XXXX syntax will be also interprated the same way.
Exceptions
• ParsingException:
Parameters
• text: One of the above mentioned text format
• ctx: PROJ context
Exceptions
• ParsingException:
class AuthorityFactory
#include <io.hpp> Builds object from an authority database.
A AuthorityFactory should be used only by one thread at a time.
Public Types
enum ObjectType
Object type.
Values:
enumerator PRIME_MERIDIAN
Object of type datum::PrimeMeridian
enumerator ELLIPSOID
Object of type datum::Ellipsoid
enumerator DATUM
Object of type datum::Datum (and derived classes)
enumerator GEODETIC_REFERENCE_FRAME
Object of type datum::GeodeticReferenceFrame (and derived classes)
enumerator VERTICAL_REFERENCE_FRAME
Object of type datum::VerticalReferenceFrame (and derived classes)
enumerator CRS
Object of type crs::CRS (and derived classes)
enumerator GEODETIC_CRS
Object of type crs::GeodeticCRS (and derived classes)
enumerator GEOCENTRIC_CRS
GEODETIC_CRS of type geocentric
enumerator GEOGRAPHIC_CRS
Object of type crs::GeographicCRS (and derived classes)
enumerator GEOGRAPHIC_2D_CRS
GEOGRAPHIC_CRS of type Geographic 2D
enumerator GEOGRAPHIC_3D_CRS
GEOGRAPHIC_CRS of type Geographic 3D
enumerator PROJECTED_CRS
Object of type crs::ProjectedCRS (and derived classes)
enumerator VERTICAL_CRS
Object of type crs::VerticalCRS (and derived classes)
enumerator COMPOUND_CRS
Object of type crs::CompoundCRS (and derived classes)
enumerator COORDINATE_OPERATION
Object of type operation::CoordinateOperation (and derived classes)
enumerator CONVERSION
Object of type operation::Conversion (and derived classes)
enumerator TRANSFORMATION
Object of type operation::Transformation (and derived classes)
enumerator CONCATENATED_OPERATION
Object of type operation::ConcatenatedOperation (and derived classes)
Public Functions
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
metadata::ExtentNNPtr createExtent(const std::string &code) const
Returns a metadata::Extent from the specified code.
Return object.
Parameters
• code: Object code allocated by authority.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
datum::PrimeMeridianNNPtr createPrimeMeridian(const std::string &code) const
Returns a datum::PrimeMeridian from the specified code.
Return object.
Parameters
• code: Object code allocated by authority.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
std::string identifyBodyFromSemiMajorAxis(double a, double tolerance) const
Identify a celestial body from an approximate radius.
Return celestial body name if one single match found.
Parameters
• semi_major_axis: Approximate semi-major axis.
• tolerance: Relative error allowed.
Exceptions
• FactoryException:
datum::EllipsoidNNPtr createEllipsoid(const std::string &code) const
Returns a datum::Ellipsoid from the specified code.
Return object.
Parameters
• code: Object code allocated by authority.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
datum::DatumNNPtr createDatum(const std::string &code) const
Returns a datum::Datum from the specified code.
Return object.
Parameters
• code: Object code allocated by authority.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
datum::GeodeticReferenceFrameNNPtr createGeodeticDatum(const std::string &code)
const
Returns a datum::GeodeticReferenceFrame from the specified code.
Return object.
Parameters
Parameters
• code: Object code allocated by authority.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
crs::ProjectedCRSNNPtr createProjectedCRS(const std::string &code) const
Returns a crs::ProjectedCRS from the specified code.
Return object.
Parameters
• code: Object code allocated by authority.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
crs::CompoundCRSNNPtr createCompoundCRS(const std::string &code) const
Returns a crs::CompoundCRS from the specified code.
Return object.
Parameters
• code: Object code allocated by authority.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
crs::CRSNNPtr createCoordinateReferenceSystem(const std::string &code) const
Returns a crs::CRS from the specified code.
Return object.
Parameters
• code: Object code allocated by authority.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
operation::CoordinateOperationNNPtr createCoordinateOperation(const std::string
&code, bool usePRO-
JAlternativeGrid-
Names) const
Returns a operation::CoordinateOperation from the specified code.
Return object.
Parameters
• code: Object code allocated by authority.
• usePROJAlternativeGridNames: Whether PROJ alternative grid names should be sub-
stituted to the official grid names.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
std::vector<operation::CoordinateOperationNNPtr> createFromCoordinateReferenceSystemCodes(const
std::string
&source-
CRSCode
const
std::string
&tar-
getCRSC
const
Returns a list operation::CoordinateOperation between two CRS.
The list is ordered with preferred operations first. No attempt is made at inferring operations that are
not explicitly in the database.
Deprecated operations are rejected.
Return list of coordinate operations
Parameters
• sourceCRSCode: Source CRS code allocated by authority.
• targetCRSCode: Source CRS code allocated by authority.
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
const std::string &getAuthority()
Returns the authority name associated to this factory.
Return name.
std::set<std::string> getAuthorityCodes(const ObjectType &type, bool allowDeprecated =
true) const
Returns the set of authority codes of the given object type.
Return the set of authority codes for spatial reference objects of the given type
Parameters
• type: Object type.
• allowDeprecated: whether we should return deprecated objects as well.
Exceptions
• FactoryException:
std::string getDescriptionText(const std::string &code) const
Gets a description of the object corresponding to a code.
Note In case of several objects of different types with the same code, one of them will be arbitrarily
selected. But if a CRS object is found, it will be selected.
Return description.
Parameters
• code: Object code allocated by authority. (e.g. “4326”)
Exceptions
• NoSuchAuthorityCodeException:
• FactoryException:
std::list<CRSInfo> getCRSInfoList() const
Return a list of information on CRS objects.
This is functionnaly equivalent of listing the codes from an authority, instantiating a CRS object for
each of them and getting the information from this CRS object, but this implementation has much less
overhead.
Exceptions
• FactoryException:
std::list<UnitInfo> getUnitList() const
Return the list of units.
Since 7.1
Exceptions
• FactoryException:
const DatabaseContextNNPtr &databaseContext() const
Returns the database context.
std::vector<operation::CoordinateOperationNNPtr> createFromCoordinateReferenceSystemCodes(const
std::string
&source-
CR-
SAuth-
Name,
const
std::string
&source-
CRSCode
const
std::string
&tar-
getCR-
SAuth-
Name,
const
std::string
&tar-
getCRSC
bool
use-
PRO-
JAl-
ter-
na-
tive-
G-
rid-
Names,
bool
dis-
cardIfMis
ing-
Grid,
bool
con-
sid-
er-
Known-
Grid-
sAsAvail-
able,
bool
dis-
card-
Su-
per-
seded,
bool
tryRe-
verse-
Order
=
false,
bool
10.5. Reference 537 re-
por-
tOn-
ly-
PROJ coordinate transformation software library, Release 7.1.1
std::vector<operation::CoordinateOperationNNPtr> createFromCRSCodesWithIntermediates(const
std::string
&source-
CR-
SAuth-
Name,
const
std::string
&source-
CRSCode,
const
std::string
&tar-
getCR-
SAuth-
Name,
const
std::string
&tar-
getCRSCode,
bool
use-
PRO-
JAl-
ter-
na-
tive-
G-
rid-
Names,
bool
dis-
cardIfMiss-
ing-
Grid,
bool
con-
sid-
er-
Known-
Grid-
sAsAvail-
able,
bool
dis-
card-
Su-
per-
seded,
const
std::vector<std::p
std::string>>
&in-
ter-
me-
di-
10.5. Reference 539 ate-
CR-
SAuth-
Codes,
PROJ coordinate transformation software library, Release 7.1.1
Exceptions
• FactoryException:
std::list<common::IdentifiedObjectNNPtr> createObjectsFromName(const std::string
&name, const
std::vector<ObjectType>
&allowedObjectTypes =
std::vector<ObjectType>(),
bool approximateMatch
= true, size_t lim-
itResultCount = 0)
const
Return a list of objects, identified by their name.
Return list of matched objects.
Parameters
• searchedName: Searched name. Must be at least 2 character long.
• allowedObjectTypes: List of object types into which to search. If empty, all object types
will be searched.
• approximateMatch: Whether approximate name identification is allowed.
• limitResultCount: Maximum number of results to return. Or 0 for unlimited.
Exceptions
• FactoryException:
std::list<std::pair<std::string, std::string>> listAreaOfUseFromName(const std::string
&name, bool approxi-
mateMatch) const
Return a list of area of use from their name.
Return list of (auth_name, code) of matched objects.
Parameters
• name: Searched name.
• approximateMatch: Whether approximate name identification is allowed.
Exceptions
• FactoryException:
Public Members
std::string authName
Authority name
std::string code
Code
std::string name
Name
ObjectType type
Type
bool deprecated
Whether the object is deprecated
bool bbox_valid
Whereas the west_lon_degree, south_lat_degree, east_lon_degree and north_lat_degree fields are
valid.
double west_lon_degree
Western-most longitude of the area of use, in degrees.
double south_lat_degree
Southern-most latitude of the area of use, in degrees.
double east_lon_degree
Eastern-most longitude of the area of use, in degrees.
double north_lat_degree
Northern-most latitude of the area of use, in degrees.
std::string areaName
Name of the area of use.
std::string projectionMethodName
Name of the projection method for a projected CRS. Might be empty even for projected CRS in
some cases.
struct UnitInfo
#include <io.hpp> Unit information
Public Members
std::string authName
Authority name
std::string code
Code
std::string name
Name
std::string category
Category: one of “linear”, “linear_per_time”, “angular”, “angular_per_time”, “scale”,
“scale_per_time” or “time”
double convFactor
Conversion factor to the SI unit. It might be 0 in some cases to indicate no known conversion
factor.
std::string projShortName
PROJ short name (may be empty)
bool deprecated
Whether the object is deprecated
class DatabaseContext
#include <io.hpp> Database context.
A database context should be used only by one thread at a time.
Public Functions
Public Functions
Public Functions
Public Functions
Public Functions
Public Functions
Public Types
enum Convention
PROJ variant.
Values:
enumerator PROJ_5
PROJ v5 (or later versions) string.
enumerator PROJ_4
PROJ v4 string as output by GDAL exportToProj4()
Public Functions
Public Functions
Public Types
enum Convention_
WKT variant.
Values:
enumerator WKT2
Full WKT2 string, conforming to ISO 19162:2015(E) / OGC 12-063r5 (_WKT2_2015) with all
possible nodes and new keyword names.
enumerator _WKT2_2015 = WKT2
enumerator WKT2_SIMPLIFIED
Same as WKT2 with the following exceptions:
• UNIT keyword used.
• ID node only on top element.
• No ORDER element in AXIS element.
• PRIMEM node omitted if it is Greenwich.
• ELLIPSOID.UNIT node omitted if it is UnitOfMeasure::METRE.
• PARAMETER.UNIT / PRIMEM.UNIT omitted if same as AXIS.
• AXIS.UNIT omitted and replaced by a common GEODCRS.UNIT if they are all the same on
all axis.
enumerator _WKT2_2015_SIMPLIFIED = WKT2_SIMPLIFIED
enumerator _WKT2_2019
Full WKT2 string, conforming to ISO 19162:2019 / OGC 18-010, with (_WKT2_2019) all possi-
ble nodes and new keyword names. Non-normative list of differences:
• _WKT2_2019 uses GEOGCRS / BASEGEOGCRS keywords for GeographicCRS.
enumerator _WKT2_2018 = _WKT2_2019
Deprecated alias for _WKT2_2019
enumerator _WKT2_2019_SIMPLIFIED
_WKT2_2019 with the simplification rule of WKT2_SIMPLIFIED
enumerator _WKT2_2018_SIMPLIFIED = _WKT2_2019_SIMPLIFIED
Deprecated alias for _WKT2_2019_SIMPLIFIED
enumerator _WKT1_GDAL
WKT1 as traditionally output by GDAL, deriving from OGC 01-009. A notable departure from
_WKT1_GDAL with respect to OGC 01-009 is that in _WKT1_GDAL, the unit of the PRIMEM
value is always degrees.
enumerator _WKT1_ESRI
WKT1 as traditionally output by ESRI software, deriving from OGC 99-049.
enum OutputAxisRule
Rule for output AXIS nodes
Values:
enumerator YES
Always include AXIS nodes
enumerator NO
Never include AXIS nodes
enumerator _WKT1_GDAL_EPSG_STYLE
Includes them only on PROJCS node if it uses Easting/Northing ordering. Typically used for
_WKT1_GDAL
Public Functions
Parameters
• other: source formatter.
class WKTNode
#include <io.hpp> Node in the tree-splitted WKT representation.
Public Functions
Public Types
enum WKTGuessedDialect
Guessed WKT “dialect”
Values:
enumerator WKT2_2019
WKT2_2019
enumerator WKT2_2018 = WKT2_2019
Deprecated alias for WKT2_2019
enumerator WKT2_2015
WKT2_2015
enumerator WKT1_GDAL
WKT1
enumerator WKT1_ESRI
ESRI variant of WKT1
enumerator NOT_WKT
Not WKT / unrecognized
Public Functions
Contents
• Deprecated API
– Introduction
– Example
– API Functions
* pj_transform
* pj_init_plus
* pj_free
* pj_is_latlong
* pj_is_geocent
* pj_get_def
* pj_latlong_from_proj
* pj_set_finder
* pj_set_searchpath
* pj_deallocate_grids
* pj_strerrno
* pj_get_errno_ref
* pj_get_release
10.5.4.1 Introduction
Procedure pj_init() selects and initializes a cartographic projection with its argument control parameters. argc is
the number of elements in the array of control strings argv that each contain individual cartographic control keyword
assignments (+ proj arguments). The list must contain at least the proj=projection and Earth’s radius or elliptical
parameters. If the initialization of the projection is successful a valid address is returned otherwise a NULL value.
The pj_init_plus() function operates similarly to pj_init() but takes a single string containing the definition,
with each parameter prefixed with a plus sign. For example +proj=utm +zone=11 +ellps=WGS84.
Once initialization is performed either forward or inverse projections can be performed with the returned value of
pj_init() used as the argument proj. The argument structure projUV values u and v contain respective longitude
and latitude or x and y. Latitude and longitude are in radians. If a projection operation fails, both elements of projUV
are set to HUGE_VAL (defined in math.h).
Note: all projections have a forward mode, but some do not have an inverse projection. If the projection does not have
an inverse the projPJ structure element inv will be NULL.
The pj_transform function may be used to transform points between the two provided coordinate systems. In
addition to converting between cartographic projection coordinates and geographic coordinates, this function also
takes care of datum shifts if possible between the source and destination coordinate system. Unlike pj_fwd()
and pj_inv() it is also allowable for the coordinate system definitions (projPJ *) to be geographic coordinate
systems (defined as +proj=latlong). The x, y and z arrays contain the input values of the points, and are replaced
with the output values. The function returns zero on success, or the error number (also in pj_errno) on failure.
Memory associated with the projection may be freed with pj_free().
10.5.4.2 Example
The following program reads latitude and longitude values in decimal degrees, performs Mercator projection with a
Clarke 1866 ellipsoid and a 33° latitude of true scale and prints the projected cartesian values in meters:
#include <proj_api.h>
For this program, an input of -16 20.25 would give a result of -1495284.21 1920596.79.
pj_transform
Transform the x/y/z points from the source coordinate system to the destination coordinate system.
srcdefn: source (input) coordinate system.
dstdefn: destination (output) coordinate system.
point_count: the number of points to be processed (the size of the x/y/z arrays).
point_offset: the step size from value to value (measured in doubles) within the x/y/z arrays - normally 1 for a
packed array. May be used to operate on xyz interleaved point arrays.
x/y/z: The array of X, Y and Z coordinate values passed as input, and modified in place for output. The Z may
optionally be NULL.
return: The return is zero on success, or a PROJ.4 error code.
The pj_transform() function transforms the passed in list of points from the source coordinate system to the
destination coordinate system. Note that geographic locations need to be passed in radians, not decimal degrees, and
will be returned similarly. The z array may be passed as NULL if Z values are not available.
If there is an overall failure, an error code will be returned from the function. If individual points fail to transform -
for instance due to being over the horizon - then those x/y/z values will be set to HUGE_VAL on return. Input values
that are HUGE_VAL will not be transformed.
pj_init_plus
This function converts a string representation of a coordinate system definition into a projPJ object suitable for use
with other API functions. On failure the function will return NULL and set pj_errno. The definition should be of
the general form +proj=tmerc +lon_0 +datum=WGS84. Refer to PROJ.4 documentation and the Geodetic
transformation notes for additional detail.
Coordinate system objects allocated with pj_init_plus() should be deallocated with pj_free().
pj_free
pj_is_latlong
pj_is_geocent
pj_get_def
Returns the PROJ.4 initialization string suitable for use with pj_init_plus() that would produce this coordinate
system, but with the definition expanded as much as possible (for instance +init= and +datum= definitions).
pj_latlong_from_proj
Returns a new coordinate system definition which is the geographic coordinate (lat/long) system underlying pj_in.
pj_set_finder
Install a custom function for finding init and grid shift files.
pj_set_searchpath
Set a list of directories to search for init and grid shift files.
pj_deallocate_grids
Frees all resources associated with loaded and cached datum shift grids.
pj_strerrno
Returns the error text associated with the passed in error code.
pj_get_errno_ref
pj_get_release
Obsolete Functions
XY pj_fwd( LP lp, PJ *P );
LP pj_inv( XY xy, PJ *P );
projPJ pj_init(int argc, char **argv);
The recommended way to use the PROJ library in a CMake project is to link to the imported library target
${PROJ_LIBRARIES} provided by the CMake configuration which comes with the library. Typical usage is:
find_package(PROJ)
target_link_libraries(MyApp ${PROJ_LIBRARIES})
By adding the imported library target ${PROJ_LIBRARIES} to the target link libraries, CMake will also pass the
include directories to the compiler. This requires that you use CMake version 2.8.11 or later. If you are using an older
version of CMake, then add
include_directories(${PROJ_INCLUDE_DIRS})
The CMake command find_package will look for the configuration in a number of places. The lookup can be
adjusted for all packages by setting the cache variable or environment variable CMAKE_PREFIX_PATH. In particular,
CMake will consult (and set) the cache variable PROJ_DIR.
The old CMake name for the PROJ project was “PROJ4” and the switch to the name “PROJ” was made with version
7.0. So if you expect your package to work with pre-7.0 versions of PROJ, you will need to use
find_package(PROJ4)
target_link_libraries(MyApp ${PROJ4_LIBRARIES})
include_directories(${PROJ4_INCLUDE_DIRS})
This will also find version 7.0. This use of the PROJ4 name will be phased out at some point.
10.7.1 Python
10.7.2 Ruby
10.7.3 Rust
10.7.4 Go (Golang)
10.7.5 Julia
10.7.6 TCL
10.7.7 MySQL
10.7.8 Excel
10.7.10 Fortran
This is a transition guide for developers wanting to migrate their code to use PROJ version 6.
The difference between the old and new API is shown here with a few examples. Below we implement the same
program with the two different API’s. The program reads input longitude and latitude from the command line and
convert them to projected coordinates with the Mercator projection.
We start by writing the program for PROJ 4:
#include <proj_api.h>
pj_free(pj_longlat);
pj_free(pj_merc);
return 0;
}
#include <proj.h>
{
/* For that particular use case, this is not needed. */
/* proj_normalize_for_visualization() ensures that the coordinate */
(continues on next page)
proj_destroy(P);
return 0;
}
Access to the proj_api.h is still possible but requires to define the ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
macro.
The emulation of the now deprecated +init=epsg:XXXX syntax in PROJ 6 is not fully compatible with previous
versions.
In particular, when used with the pj_transform() function, no datum shift term (towgs84, nadgrids,
geoidgrids) will be added during the expansion of the +init=epsg:XXXX string to +proj=YYYY .....
If you still uses pj_transform() and want datum shift to be applied, then you need to provide a fully expanded
string with appropriate towgs84, nadgrids or geoidgrids terms to pj_init().
To use the +init=epsg:XXXX syntax with proj_create() and then proj_create_crs_to_crs(),
proj_context_use_proj4_init_rules(ctx, TRUE) or the PROJ_USE_PROJ4_INIT_RULES=YES
environment variable must have been previously set. In that context, datum shift will be researched. However they
might be different than with PROJ 4 or PROJ 5, since a “late-binding” approach will be used (that is trying to find as
much as possible the most direct transformation between the source and target datum), whereas PROJ 4 or PROJ 5
used an “early-binding” approach consisting in always going to EPSG:4326 / WGS 84.
This is a transition guide for developers wanting to migrate their code to use PROJ version 5.
10.9.1 Background
Before we go on, a bit of background is needed. The new API takes a different view of the world than the old because
it is needed in order to obtain high accuracy transformations. The old API is constructed in such a way that any
transformation between two coordinate reference systems must pass through the ill-defined WGS84 reference frame,
using it as a hub. The new API does away with this limitation to transformations in PROJ. It is still possible to do that
type of transformations but in many cases there will be a better alternative.
The world view represented by the old API is always sufficient if all you care about is meter level accuracy - and in
many cases it will provide much higher accuracy than that. But the view that “WGS84 is the true foundation of the
world, and everything else can be transformed natively to and from WGS84” is inherently flawed.
First and foremost because any time WGS84 is mentioned, you should ask yourself “Which of the six WGS84 real-
izations are we talking about here?”.
Second, because for many (especially legacy) systems, it may not be straightforward to transform to WGS84 (or
actually ITRF-something, ETRS-something or NAD-something which appear to be the practical meaning of the term
WGS84 in everyday PROJ related work), while centimeter-level accurate transformations may exist between pairs of
older systems.
The concept of a hub reference frame (“datum”) is not inherently bad, but in many cases you need to handle and select
that datum with more care than the old API allows. The primary aim of the new API is to allow just that. And to
do that, you must realize that the world is inherently 4 dimensional. You may in many cases assume one or more
of the coordinates to be constant, but basically, to obtain geodetic accuracy transformations, you need to work in 4
dimensions.
Now, having described the background for introducing the new API, let’s try to show how to use it. First note that
in order to go from system A to system B, the old API starts by doing an inverse transformation from system A to
WGS84, then does a forward transformation from WGS84 to system B.
With cs2cs being the command line interface to the old API, and cct being the same for the new, this example of
doing the same thing in both world views will should give an idea of the differences:
$ echo 300000 6100000 | cs2cs +proj=utm +zone=33 +ellps=GRS80 +to +proj=utm +zone=32
˓→+ellps=GRS80
Lookout for the +inv in the first +step, indicating an inverse transform.
The difference between the old and new API is shown here with a few examples. Below we implement the same
program with the two different API’s. The program reads input longitude and latitude from the command line and
convert them to projected coordinates with the Mercator projection.
We start by writing the program for PROJ v. 4:
#include <proj_api.h>
pj_free(pj_longlat);
pj_free(pj_merc);
return 0;
}
#include <proj.h>
proj_destroy(P);
}
Looking at the two different programs, there’s a few immediate differences that catches the eye. First off, the included
header file describing the API has changed from proj_api.h to simply proj.h. All functions in proj.h belongs
to the proj_ namespace.
With the new API also comes new datatypes. E.g. the transformation object projPJ which has been changed to a
pointer of type PJ. This is done to highlight the actual nature of the object, instead of hiding it away behind a typedef.
New data types for handling coordinates have also been introduced. In the above example we use the PJ_COORD,
which is a union of various types. The benefit of this is that it is possible to use the various structs in the union to
communicate what state the data is in at different points in the program. For instance as in the above example where
the coordinate is read from STDIN as a geodetic coordinate, communicated to the reader of the code by using the
c.lp struct. After it has been projected we print it to STDOUT by accessing the individual elements in c.xy to
illustrate that the coordinate is now in projected space. Data types are prefixed with PJ_.
The final, and perhaps biggest, change is that the fundamental concept of transformations in PROJ are now handled
in a single transformation object (PJ) and not by stating the source and destination systems as previously. It is
of course still possible to do just that, but the transformation object now captures the whole transformation from
source to destination in one. In the example with the old API the source system is described as +proj=latlon
+ellps=clrk66 and the destination system is described as +proj=merc +ellps=clrk66 +lat_ts=33.
Since the Mercator projection accepts geodetic coordinates as its input, the description of the source in this case is
superfluous. We use that to our advantage in the new API and simply state the destination. This is simple at a glance,
but is actually a big conceptual change. We are now focused on the path between two systems instead of what the
source and destination systems are.
The source code for PROJ is maintained in a git repository on GitHub. Additionally, a collection of PROJ-compatible
transformation grids are maintained in a separate git repository.
Attention: The projects.h header and the functions related to it is considered deprecated from version 5.0.0
and onwards. The header has been removed PROJ in version 6.0.0 released February 1st 2019.
Attention: The nmake build system on Windows is on longer supported in version 6.0.0 on onwards. Use CMake
instead.
Attention: The proj_api.h header and the functions related to it is considered deprecated from version 5.0.0
and onwards. The header will be removed from PROJ in version 7.0.0 scheduled for release March 1st 2020.
Attention: With the introduction of PROJ 5, behavioural changes has been made to existing functionality. Consult
Known differences between versions for the details.
ELEVEN
SPECIFICATIONS
PROJ implements a number of extensions to standards, that are described below for the sake of broader interoperability.
11.1 PROJJSON
PROJJSON is a JSON encoding of WKT2:2019 / ISO-19162:2019, which itself implements the model of OGC Topic
2: Referencing by coordinates. Apart from the difference of encodings, the semantics is intended to be exactly the
same as WKT2:2019.
PROJJSON is available as input and output of PROJ since PROJ 6.2.
The current version is 0.2.
11.1.1 Schema
11.1.2 History
11.1.3 Content
* GeographicCRS
* GeodeticCRS
* ProjectedCRS
* CompoundCRS
* BoundCRS
– More esoteric ones:
* VerticalCRS
565
PROJ coordinate transformation software library, Release 7.1.1
* EngineeringCRS
* TemporalCRS
* ParametricCRS
* DerivedGeographicCRS
* DerivedGeodeticCRS
* DerivedProjectedCRS
* DerivedVerticalCRS
* DerivedEngineeringCRS
* DerivedTemporalCRS
* DerivedParametricCRS
• Coordinate operations:
– Transformation
– Conversion
– ConcatenatedOperation
• Others:
– PrimeMeridian
– Ellipsoid
– Datum
– DatumEnsemble
11.1.4 Examples
11.1.4.1 GeographicCRS
will output:
{
"$schema": "https://proj.org/schemas/v0.1/projjson.schema.json",
"type": "GeographicCRS",
"name": "WGS 84",
"datum": {
"type": "GeodeticReferenceFrame",
"name": "World Geodetic System 1984",
"ellipsoid": {
"name": "WGS 84",
"semi_major_axis": 6378137,
"inverse_flattening": 298.257223563
}
},
"coordinate_system": {
"subtype": "ellipsoidal",
(continues on next page)
11.1.4.2 ProjectedCRS
will output:
{
"$schema": "https://proj.org/schemas/v0.1/projjson.schema.json",
"type": "ProjectedCRS",
"name": "WGS 84 / UTM zone 31N",
"base_crs": {
"name": "WGS 84",
"datum": {
"type": "GeodeticReferenceFrame",
"name": "World Geodetic System 1984",
"ellipsoid": {
"name": "WGS 84",
"semi_major_axis": 6378137,
"inverse_flattening": 298.257223563
}
},
"coordinate_system": {
"subtype": "ellipsoidal",
"axis": [
{
(continues on next page)
11.2.1 Introduction
The Geodetic TIFF grid format has been introduced per PROJ RFC 4: Remote access to grids and GeoTIFF grids.
It is a profile of the TIFF and GeoTIFF formats that addresses the specific requirements of geodetic grids: horizontal
shifts, vertical shifts, velocity grids, etc. . . It also follows the Cloud Optimized GeoTIFF principles.
Such grids are available on a CDN of GeoTIFF grids.
The general principles that guide the following requirements and recommendations are such that files will be properly
recognized by PROJ, and also by GDAL which is an easy way to inspect such grid files:
• TIFF 6.0 based (could possibly be BigTIFF without code changes, if we ever need some day to handle grids
larger than 4GB)
• GeoTIFF 1.1 for the georeferencing. GeoTIFF 1.1 is a recent standard, compared to the original GeoTIFF 1.0
version, but its backward compatibility is excellent, so that should not cause much trouble to readers that are not
official GeoTIFF 1.1 compliant.
• Files hosted on the CDN will use a Geographic 2D CRS for the GeoTIFF GeoKeys. That CRS is intended to be
the interpolation CRS as defined in OGC Abstract Specification Topic 2, that is the CRS to which grid values
are referred to.
Given that they will nominally be related to the EPSG dataset, the GeodeticCRSGeoKey will be used to store
the EPSG code of the CRS. If the CRS cannot be reliably encoded through that key or other geokeys, the
interpolation_crs_wkt metadata item detailed afterwards should be used.
This CRS will be generally the source CRS (for geographic to geographic horizontal shift grids, or geographic
to vertical shift grids), but for vertical to vertical CRS adjustment, this will be the geographic CRS to which the
grid is referenced. In some very rare cases of geographic to vertical shift grids, the interpolation CRS might
be a geographic CRS that is not the same as the source CRS (into which ellipsoidal height are expressed). The
only instance we have in mind is for the EPSG:7001 “ETRS89 to NAP height (1)” transformation using the
naptrans2008 VDatum-grid which is referenced to Amersfoort EPSG:4289 instead of ETRS89. . .
On the reading side, PROJ will ignore that information: the CRS is already stored in the source_crs or interpo-
lation_crs column of the grid_transformation table.
For geographic to vertical shift files (geoid models), the GeoTIFF 1.1 convention will be used to store the value
of the VerticalGeoKey So a geoid model that apply to WGS 84 EPSG:4979 will have GeodeticCRSGeoKey =
4326 and VerticalGeoKey = 4979.
• Files hosted on the CDN will use the GeoTIFF defined ModelTiepointTag and ModelPixelScaleTag TIFF tags
to store the coordinates of the upper-left pixel and the resolution of the pixels. On the reading side, they will be
required and ModelTransformationTag will be ignored.
Note: Regarding anti-meridian handling, a variety of possibilities exist. We do not attempt to standardize this
and filesh hosted on the CDN will use a georeferencing close to the original data producer. For example, NOAA
vertical grids that apply to Conterminous USA might even have a top-left longitude beyond 180 (for consistency
with Alaska grids, whose origin is < 180) Anti-meridian handling in PROJ has probably issues. This RFC does
not attempt to address them in particular, as they are believed to be orthogonal to the topics it covers, and being
mostly implementation issues.
• Files hosted on the CDN will use the GTRasterTypeGeoKey = PixelIsPoint convention. This is the convention
used by most existing grid formats currently. Note that GDAL typically use a PixelIsArea convention (but can
handle both conventions), so the georeferencing it displays when opening a .gsb or .gtx file appears to have a
half-pixel shift regarding to the coordinates stored in the original grid file. On the reading side, PROJ will accept
both conventions (for equivalent georeferencing, the value of the origin in a PixelIsArea convention is shifted
by a half-pixel towards the upper-left direction). Unspecified behavior if this GeoKey is absent.
• Files hosted on the CDN will be tiled, presumably with 256x256 tiles (small grids that are smaller than 256x256
will use a single strip). On the reading side, PROJ will accept TIFF files with any strip or tile organization. Tiling
is expressed by specifying the TileWidth, TileHeight, TileOffsets and TileByteCounts tags. Strip organization
is expressed by specifying the RowsPerStrip, StripByteCounts and StripOffsets tags.
• Files hosted on the CDN will use Compression = DEFLATE or LZW (to be determined, possibly with Predictor
= 2 or 3) On the reading side, PROJ will accept TIFF files with any compression method (appropriate for the
data types and PhotometricInterpretation considered) supported by the libtiff build used by PROJ. Of course
uncompressed files will be supported.
• Files hosted on the CDN will use little-endian byte ordering. On the reading side, libtiff will transparently
handle both little-endian and big-endian ordering.
• Files hosted on the CDN will use PlanarConfiguration=Separate. The tools described in a later section will order
blocks so that blocks needed for a given location are close to each other. On the reading side, PROJ will handle
also PlanarConfiguration=Contig.
• Files hosted on the CDN will generally use Float32 (BitsPerSample=32 and SampleFormat=IEEEFP) Files may
be created using Signed Int 16 ( BitsPerSample =16 and SampleFormat = INT), Unsigned Int 16 (BitsPerSam-
ple=16 and SampleFormat=UINT), Signed Int 32 or Unsigned Int 32 generally with an associate scale/offset.
On the reading side, only those three data types will be supported as well.
• Files hosted on the CDN will have a PhotometricInterpretation = MinIsBlack. It will be assumed, and ignored
on the reading side.
• Files hosted on the CDN will nominally have:
– SamplesPerPixel = 2 for horizontal shift grid, with the first sample being the longitude offset
and the second sample being the latitude offset.
– SamplesPerPixel = 1 for vertical shift grids.
– SamplesPerPixel = 3 for deformation models combining horizontal and vertical adjustments.
And even for the current identified needs of horizontal or vertical shifts, more samples may be present
(to indicate for example uncertainties), but will be ignored by PROJ.
The ExtraSamples tag should be set to a value of SamplesPerPixel - 1 (given the rules that apply for
PhotometricInterpretation = MinIsBlack)
• The ImageDescription tag may be used to convey extra information about the name, provenance, version and
last updated date of the grid. Will be set when possible fo files hosted on the CDN. Ignored by PROJ.
• The Copyright tag may be used to convey extra information about the copyright and license of the grid. Will be
set when possible fo files hosted on the CDN. Ignored by PROJ.
• The DateTime tag may be used to convey the date at which the file has been created or converted. In case of
a file conversion, for example from NTv2, this will be the date at which the conversion has been performed.
The ImageDescription tag however will contain the latest of the CREATED or UPDATED fields from the
NTv2 file. Will be set when possible fo files hosted on the CDN. Ignored by PROJ.
• Files hosted on the CDN will use the GDAL_NODATA tag to encode the value of the nodata / missing value,
when it applies to the grid.
If offset and/or scaling is used, the nodata value corresponds to the raw value, before applying offset and scaling.
The value found in this tag, if present, will be honoured (to the extent to which current PROJ code makes use of
nodata). For floating point data, writers are strongly discouraged to use non-finite values (+/- infinity, NaN) of
nodata to maximimize interoperability. The GDAL_NODATA value applies to all samples of a given TIFF IFD.
• Files hosted on the CDN will use the GDAL_METADATA tag to encode extra metadata not supported by
baseline or extended TIFF.
– The root XML node should be GDALMetadata
– Zero, one or several child XML nodes Item may be present.
– A Item should have a name attribute, and a child text node with its value. role and sample attributes
may be present for attributes that have a special semantics (recognized by GDAL). The value of sample
should be a integer value between 0 and number_of_samples - 1.
– Scale and offset to convert integer raw values to floating point values may be expressed with XML Item el-
ements whose name attribute is respectively SCALE and OFFSET, and their role attribute is respectively
scale and offset. The decoded value will be: {offset} + {scale} * raw_value_from_geotiff_file
For a offset value of 1 and scaling of 2, the following payload should be stored:
<GDALMetadata>
<Item name="OFFSET" sample="0" role="offset">1</Item>
<Item name="SCALE" sample="0" role="scale">2</Item>
</GDALMetadata>
– The type of the grid must be specified with a Item whose name is set to TYPE.
Values recognized by PROJ currently are:
* HORIZONTAL_OFFSET: implies the presence of at least two samples. The first sample must contain
the latitude offset and the second sample must contain the longitude offset. Corresponds to PROJ
Horizontal grid shift method.
* GEOCENTRIC_TRANSLATION: implies the presence of at least 3 samples. The first 3 samples must
be respectively the geocentric adjustments along the X, Y and Z axis. Must be used when the source
and target CRS are geocentric CRS. The interpolation CRS must be a geographic CRS. Corresponds
to PROJ Geocentric grid shift method.
* VELOCITY: implies the presence of at least 3 samples. The first 3 samples must be respectively the
velocities along the E(ast), N(orth), U(p) axis in the local topocentric coordinate system. Corresponds
to PROJ Kinematic datum shifting utilizing a deformation model method.
<Item name="TYPE">HORIZONTAL_OFFSET</Item>
– The description of each sample must be specified with a Item whose name attribute is set to
DESCRIPTION and role attribute to description.
Values recognized by PROJ for this Item are currently:
– The unit of the values stored in the grid must be specified for each sample through an Item of
name UNITTYPE and role unittype Valid values should be the name of entries from the EPSG
unitofmeasure table. To maximize interoperability, writers are strongly encouraged to limit them-
selves to the following values:
For linear units:
* metre (default value assumed if absent for vertical shift grid files, and value used for files stored on
PROJ CDN)
* US survey foot
For angular units:
* degree
* arc-second (default value assumed if absent for longitude and latitude offset samples of horizontal
shift grid files, and value used for files stored on PROJ CDN)
For velocity units:
– For TYPE=DEFORMATION_MODEL, the type of the displacement must be specified with a Item whose
name is set to DISPLACEMENT_TYPE.
The accepted values are: HORIZONTAL, VERTICAL, 3D or NONE
– For TYPE=DEFORMATION_MODEL, the type of the uncertainty must be specified with a Item whose
name is set to UNCERTAINTY_TYPE.
The accepted values are: HORIZONTAL, VERTICAL, 3D or NONE
– The target_crs_epsg_code metadata item should be present. For a horizontal shift grid, this is the
EPSG code of the target geographic CRS. For a vertical shift grid, this is the EPSG code of a the target
vertical CRS. If the target CRS has no associated EPSG code, target_crs_wkt must be used. Ignored
by PROJ currently.
– The target_crs_wkt metadata item must be present if the target_crs_epsg_code cannot be
used. Its value should be a valid WKT string according to WKT:2015 or WKT:2019 Ignored by PROJ
currently.
– The source_crs_epsg_code metadata item must be present if the source and interpolation CRS
are not the same (typical use case is vertical CRS to vertical CRS transformation), because the GeoKeys
encode the interpolation CRS and not the source CRS. If the source CRS has no associated EPSG code,
source_crs_wkt must be used. Ignored by PROJ currently.
– The source_crs_wkt metadata item must be present if the source_crs_epsg_code cannot be
used. Its value should be a valid WKT string according to WKT:2015 or WKT:2019. Ignored by PROJ
currently.
– The interpolation_crs_wkt metadata item may be present if the GeoKeys cannot be used to ex-
press reliably the interpolation CRS. Its value should be a valid WKT string according to WKT:2015 or
WKT:2019. Ignored by PROJ currently.
11.2.3 Example
$ tiffinfo ntf_r93.tif
</GDALMetadata>
$ listgeo ntf_r93.tif
Geotiff_Information:
Version: 1
Key_Revision: 1.1
Tagged_Information:
ModelTiepointTag (2,3):
0 0 0
-5.5 52 0
ModelPixelScaleTag (1,3):
0.1 0.1 0
End_Of_Tags.
Keyed_Information:
GTModelTypeGeoKey (Short,1): ModelTypeGeographic
GTRasterTypeGeoKey (Short,1): RasterPixelIsPoint
GeodeticCRSGeoKey (Short,1): Code-4275 (NTF)
End_Of_Keys.
End_Of_Geotiff.
GCS: 4275/NTF
Datum: 6275/Nouvelle Triangulation Francaise
Ellipsoid: 7011/Clarke 1880 (IGN) (6378249.20,6356515.00)
Prime Meridian: 8901/Greenwich (0.000000/ 0d 0' 0.00"E)
Projection Linear Units: User-Defined (1.000000m)
Corner Coordinates:
Upper Left ( 5d30' 0.00"W, 52d 0' 0.00"N)
Lower Left ( 5d30' 0.00"W, 40d54' 0.00"N)
Upper Right ( 10d 6' 0.00"E, 52d 0' 0.00"N)
Lower Right ( 10d 6' 0.00"E, 40d54' 0.00"N)
Center ( 2d18' 0.00"E, 46d27' 0.00"N)
$ gdalinfo ntf_r93.tif
Driver: GTiff/GeoTIFF
Files: ntf_r93.tif
Size is 156, 111
Coordinate System is:
GEOGCRS["NTF",
DATUM["Nouvelle Triangulation Francaise",
ELLIPSOID["Clarke 1880 (IGN)",6378249.2,293.466021293627,
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,
(continues on next page)
TYPE=HORIZONTAL_OFFSET
Image Structure Metadata:
COMPRESSION=DEFLATE
INTERLEAVE=BAND
Corner Coordinates:
Upper Left ( -5.5500000, 52.0500000) ( 5d33' 0.00"W, 52d 3' 0.00"N)
Lower Left ( -5.5500000, 40.9500000) ( 5d33' 0.00"W, 40d57' 0.00"N)
Upper Right ( 10.0500000, 52.0500000) ( 10d 3' 0.00"E, 52d 3' 0.00"N)
Lower Right ( 10.0500000, 40.9500000) ( 10d 3' 0.00"E, 40d57' 0.00"N)
Center ( 2.2500000, 46.5000000) ( 2d15' 0.00"E, 46d30' 0.00"N)
Band 1 Block=156x111 Type=Float32, ColorInterp=Gray
Description = latitude_offset
Unit Type: arc-second
Band 2 Block=156x111 Type=Float32, ColorInterp=Undefined
Description = longitude_offset
Unit Type: arc-second
Metadata:
positive_value=east
Band 3 Block=156x111 Type=Float32, ColorInterp=Undefined
Description = latitude_offset_accuracy
Unit Type: arc-second
Band 4 Block=156x111 Type=Float32, ColorInterp=Undefined
Description = longitude_offset_accuracy
Unit Type: arc-second
Formats like NTv2 can contain multiple subgrids. This can be transposed to TIFF by using several IFD chained
together with the last 4 bytes (or 8 bytes for BigTIFF) of an IFD pointing to the offset of the next one.
The first IFD should have a full description according to the General description. Subsequent IFD might have a more
compact description, omitting for example, CRS information if it is identical to the main IFD (which should be the
case for the currently envisionned use cases), or Copyright / ImageDescription metadata items.
Each IFD will have its NewSubfileType tag set to 0.
If a low-resolution grid is available, it should be put before subgrids of higher-resolution in the chain of IFD linking.
On reading, PROJ will use the value from the highest-resoluted grid that contains the point of interest.
For efficient reading from the network, files hosted on the CDN will use a layout similar to the one described in the
low level paragraph of the Cloud Optimized GeoTIFF GDAL driver page
The layout for a file converted from NTv2 will for example be:
Note: TIFF has another mechanism to link IFDs, the SubIFD tag. This potentially enables to define a hierarchy
of IFDs (similar to HDF5 groups). There is no support for that in most TIFF-using software, notably GDAL, and
no compelling need to have a nested hierarchy, so “flat” organization with the standard IFD chaining mechanism is
adopted.
TWELVE
COMMUNITY
The PROJ community is what makes the software stand out from its competitors. PROJ is used and developed by group
of very enthusiastic, knowledgeable and friendly people. Whether you are a first time user of PROJ or a long-time
contributor the community is always very welcoming.
Users and developers of the library are using the mailing list to discuss all things related to PROJ. The mailing list is
the primary forum for asking for help with use of PROJ. The mailing list is also used for announcements, discussions
about the development of the library and from time to time interesting discussions on geodesy appear as well. You are
more than welcome to join in on the discussions!
The PROJ mailing list can be found at https://lists.osgeo.org/mailman/listinfo/proj
12.1.2 GitHub
GitHub is the development platform we use for collaborating on the PROJ code. We use GitHub to keep track of the
changes in the code and to index bug reports and feature requests. We are happy to take contributions in any form,
either as code, bug reports, documentation or feature requests. See Contributing for more info on how you can help
improve PROJ.
The PROJ GitHub page can be found at https://github.com/OSGeo/PROJ
Note: The issue tracker on GitHub is only meant to keep track of bugs, feature request and other things related to the
development of PROJ. Please ask your questions about the use of PROJ on the mailing list instead.
12.1.3 Gitter
Gitter is the instant messaging alternative to the mailing list. PROJ has a room under the OSGeo organization. Most of
the core developers stop by from time to time for an informal chat. You are more than welcome to join the discussion.
The Gitter room can be found at https://gitter.im/OSGeo/proj.4
581
PROJ coordinate transformation software library, Release 7.1.1
12.2 Contributing
PROJ has a wide and varied user base. Some are highly skilled geodesists with a deep knowledge of map projections
and reference systems, some are GIS software developers and others are GIS users. All users, regardless of the
profession or skill level, has the ability to contribute to PROJ. Here’s a few suggestion on how:
• Help PROJ-users that is less experienced than yourself.
• Write a bug report
• Request a new feature
• Write documentation for your favorite map projection
• Fix a bug
• Implement a new feature
In the following sections you can find some guidelines on how to contribute. As PROJ is managed on GitHub most
contributions require that you have a GitHub account. Familiarity with issues and the GitHub Flow is an advantage.
The main forum for support for PROJ is the mailing list. You can subscribe to the mailing list here and read the archive
here.
If you have questions about the usage of PROJ the mailing list is also the place to go. Please do not use the GitHub
issue tracker as a support forum. Your question is much more likely to be answered on the mailing list, as many more
people follow that than the issue tracker.
Bug reports are handled in the issue tracker on PROJ’s home on GitHub. Writing a good bug report is not easy. But
fixing a poorly documented bug is not easy either, so please put in the effort it takes to create a thorough bug report.
A good bug report includes at least:
• A title that quickly explains the problem
• A description of the problem and how it can be reproduced
• Version of PROJ being used
• Version numbers of any other relevant software being used, e.g. operating system
• A description of what already has been done to solve the problem
The more information that is given up front, the more likely it is that a developer will find interest in solving the
problem. You will probably get follow-up questions after submitting a bug report. Please answer them in a timely
manner if you have an interest in getting the issue solved.
Finally, please only submit bug reports that are actually related to PROJ. If the issue materializes in software that uses
PROJ it is likely a problem with that particular software. Make sure that it actually is a PROJ problem before you
submit an issue. If you can reproduce the problem only by using tools from PROJ it is definitely a problem with PROJ.
Got an idea for a new feature in PROJ? Submit a thorough description of the new feature in the issue tracker. Please
include any technical documents that can help the developer make the new feature a reality. An example of this could
be a publicly available academic paper that describes a new projection. Also, including a numerical test case will make
it much easier to verify that an implementation of your requested feature actually works as you expect.
Note that not all feature requests are accepted.
PROJ is in dire need of better documentation. Any contributions of documentation are greatly appreciated. The PROJ
documentation is available on proj.org. The website is generated with Sphinx. Contributions to the documentation
should be made as Pull Requests on GitHub.
If you intend to document one of PROJ’s supported projections please use the Mercator projection as a template.
12.2.5.1 Legalese
Committers are the front line gatekeepers to keep the code base clear of improperly contributed code. It is important
to the PROJ users, developers and the OSGeo foundation to avoid contributing any code to the project without it being
clearly licensed under the project license.
Generally speaking the key issues are that those providing code to be included in the repository understand that the
code will be released under the MIT/X license, and that the person providing the code has the right to contribute the
code. For the committer themselves understanding about the license is hopefully clear. For other contributors, the
committer should verify the understanding unless the committer is very comfortable that the contributor understands
the license (for instance frequent contributors).
If the contribution was developed on behalf of an employer (on work time, as part of a work project, etc) then it is
important that an appropriate representative of the employer understand that the code will be contributed under the
MIT/X license. The arrangement should be cleared with an authorized supervisor/manager, etc.
The code should be developed by the contributor, or the code should be from a source which can be rightfully con-
tributed such as from the public domain, or from an open source project under a compatible license.
All unusual situations need to be discussed and/or documented.
Committers should adhere to the following guidelines, and may be personally legally liable for improperly contributing
code to the source repository:
• Make sure the contributor (and possibly employer) is aware of the contribution terms.
• Code coming from a source other than the contributor (such as adapted from another project) should be clearly
marked as to the original source, copyright holders, license terms and so forth. This information can be in the file
headers, but should also be added to the project licensing file if not exactly matching normal project licensing
(COPYING).
• Existing copyright headers and license text should never be stripped from a file. If a copyright holder wishes
to give up copyright they must do so in writing to the foundation before copyright messages are removed. If
license terms are changed it has to be by agreement (written in email is ok) of the copyright holders.
• Code with licenses requiring credit, or disclosure to users should be added to COPYING.
• When substantial contributions are added to a file (such as substantial patches) the author/contributor should be
added to the list of copyright holders for the file.
• If there is uncertainty about whether a change is proper to contribute to the code base, please seek more infor-
mation from the project steering committee, or the foundation legal counsel.
12.2.7 Acknowledgements
The code contribution section of this CONTRIBUTING file is inspired by PDAL’s and the legalese section is modified
from GDAL committer guidelines
Code contributions can be either bug fixes or new features. The process is the same for both, so they will be discussed
together in this section.
• Create a topic branch from where you want to base your work.
• You usually should base your topic branch off of the master branch.
• To quickly create a topic branch: git checkout -b my-topic-branch
• Make commits of logical units.
• Check for unnecessary whitespace with git diff --check before committing.
• Make sure your commit messages are in the proper format.
• Make sure you have added the necessary tests for your changes.
• Make sure that all tests pass
Fixes #123.
• PROJ developers will look at your patch and take an appropriate action.
Programming language
PROJ was originally developed in ANSI C. Today PROJ is mostly developed in C++11, with a few parts of the code
base still being C. Most of the older parts of the code base is effectively C with a few modifications so that it compiles
better as C++.
Coding style
The parts of the code base that has started its life as C++ is formatted with clang-format using the sript scripts/
reformat_cpp.sh. This is mostly contained to the code in src/iso19111/ but a few other .cpp-files are covered as
well.
For the rest of the code base, which has its origin in C, we don’t enforce any particular coding style, but please try to
keep it as simple as possible. If improving existing code, please try to conform with the style of the locally surrounding
code.
Whitespace
Throughout the PROJ code base you will see differing whitespace use. The general rule is to keep whitespace in
whatever form it is in the file you are currently editing. If the file has a mix of tabs and space please convert the tabs
to space in a separate commit before making any other changes. This makes it a lot easier to see the changes in diffs
when evaluating the changed code. New files should use spaces as whitespace.
12.3.2 Tools
The script in scripts/reformat_cpp.sh will reformat C++ code in accordance to the project preference.
If you are writing a new .cpp-file it should be added to the list in the reformatting script.
You can run locally scripts/cppcheck.sh that is a wrapper script around the cppcheck utility. This tool is used
as part of the quality control of the code.
cppcheck can have false positives. In general, it is preferable to rework the code a bit to make it more ‘obvious’ and
avoid those false positives. When not possible, you can add a comment in the code like
/* cppcheck-suppress duplicateBreak */
in the preceding line. Replace duplicateBreak with the actual name of the violated rule emitted by cppcheck.
CSA is run by the travis/csa build configuration. You may also run it locally.
Preliminary step: install clang. For example:
wget http://releases.llvm.org/6.0.0/clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-16.04.
˓→tar.xz
./clang+llvm-6/bin/scan-build ./configure
If CSA finds errors, they will be emitted during the build. And in which case, at the end of the build process, scan-
build will emit a warning message indicating errors have been found and how to display the error report. This is with
someling like
./clang+llvm-6/bin/scan-view /tmp/scan-build-2018-03-15-121416-17476-1
Run scripts/fix_typos.sh
Managing C includes is a pain. IWYU makes updating headers a bit easier. IWYU scans the code for functions
that are called and makes sure that the headers for all those functions are present and in sorted order. However, you
cannot blindly apply IWYU to PROJ. It does not understand ifdefs, other platforms, or the order requirements of PROJ
internal headers. So the way to use it is to run it on a copy of the source and merge in only the changes that make
sense. Additions of standard headers should always be safe to merge. The rest require careful evaluation. See the
IWYU documentation for motivation and details.
IWYU docs
The PROJ project has adopted the Contributor Covenant Code of Conduct. Everyone who participates in the PROJ
community is expected to follow the code of conduct as written below.
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make
participation in our project and our community a harassment-free experience for everyone, regardless of age, body size,
disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic
status, nationality, personal appearance, race, religion, or sexual identity and orientation.
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appro-
priate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,
issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any
contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
12.4.4 Scope
This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the
project or its community in public spaces. Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting as an appointed representative at an
online or offline event. Representation of a project may be further defined and clarified by project maintainers.
12.4.5 Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team
at [email protected]. All complaints will be reviewed and investigated and will result in a response that is
deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with
regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent
repercussions as determined by other members of the project’s leadership.
12.4.6 Attribution
This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.
contributor-covenant.org/version/1/4/code-of-conduct.html
For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq
A PROJ RFC describes a major change in the technological underpinnings of PROJ, major additions to functionality,
or changes in the direction of the project.
12.5.1.1 Summary
This document describes how the PROJ Project Steering Committee (PSC) determines membership, and makes deci-
sions on all aspects of the PROJ project - both technical and non-technical.
Examples of PSC management responsibilities:
• setting the overall development road map
• developing technical standards and policies (e.g. coding standards, file naming conventions, etc. . . )
• ensuring regular releases (major and maintenance) of PROJ software
• reviewing RFC for technical enhancements to the software
• project infrastructure (e.g. GitHub, continuous integration hosting options, etc. . . )
• formalization of affiliation with external entities such as OSGeo
• setting project priorities, especially with respect to project sponsorship
• creation and oversight of specialized sub-committees (e.g. project infrastructure, training)
In brief the project team votes on proposals on the proj mailing list. Proposals are available for review for at least two
days, and a single veto is sufficient delay progress though ultimately a majority of members can pass a proposal.
(up-to-date as of 2018-06)
• Kristian Evers @kbevers (DK) Chair
• Howard Butler @hobu (USA)
• Charles Karney @cffk (USA)
• Thomas Knudsen @busstoptaktik (DK)
• Even Rouault @rouault (FR)
• Kurt Schwehr @schwehr (USA)
• Frank Warmerdam @warmerdam (USA) Emeritus
• Proposals are written up and submitted on the proj mailing list for discussion and voting, by any interested party,
not just committee members.
• Proposals need to be available for review for at least two business days before a final decision can be made.
• Respondents may vote “+1” to indicate support for the proposal and a willingness to support implementation.
• Respondents may vote “-1” to veto a proposal, but must provide clear reasoning and alternate approaches to
resolving the problem within the two days.
• A vote of -0 indicates mild disagreement, but has no effect. A 0 indicates no opinion. A +0 indicate mild
support, but has no effect.
• Anyone may comment on proposals on the list, but only members of the Project Steering Committee’s votes
will be counted.
• A proposal will be accepted if it receives +2 (including the author) and no vetoes (-1).
• If a proposal is vetoed, and it cannot be revised to satisfy all parties, then it can be resubmitted for an override
vote in which a majority of all eligible voters indicating +1 is sufficient to pass it. Note that this is a majority of
all committee members, not just those who actively vote.
• Upon completion of discussion and voting the author should announce whether they are proceeding (proposal
accepted) or are withdrawing their proposal (vetoed).
• The Chair gets a vote.
• The Chair is responsible for keeping track of who is a member of the Project Steering Committee (perhaps as
part of a PSC file in CVS).
• Addition and removal of members from the committee, as well as selection of a Chair should be handled as a
proposal to the committee.
• The Chair adjudicates in cases of disputes about voting.
RFC Origin
PROJ RFC and Project Steering Committee is derived from similar governance bodies in both the GDAL and
MapServer software projects.
12.5.1.5 Observations
The PSC is made up of individuals consisting of technical contributors (e.g. developers) and prominent members of
the PROJ user community. There is no set number of members for the PSC although the initial desire is to set the
membership at 6.
Adding Members
Any member of the proj mailing list may nominate someone for committee membership at any time. Only existing
PSC committee members may vote on new members. Nominees must receive a majority vote from existing members
to be added to the PSC.
Stepping Down
If for any reason a PSC member is not able to fully participate then they certainly are free to step down. If a member
is not active (e.g. no voting, no IRC or email participation) for a period of two months then the committee reserves
the right to seek nominations to fill that position. Should that person become active again (hey, it happens) then they
would certainly be welcome, but would require a nomination.
Guiding Development
Members should take an active role guiding the development of new features they feel passionate about. Once a change
request has been accepted and given a green light to proceed does not mean the members are free of their obligation.
PSC members voting “+1” for a change request are expected to stay engaged and ensure the change is implemented
and documented in a way that is most beneficial to users. Note that this applies not only to change requests that affect
code, but also those that affect the web site, technical infrastructure, policies and standards.
PSC members are expected to be active on the proj mailing list, subject to Open Source mailing list etiquette. Non-
developer members of the PSC are not expected to respond to coding level questions on the developer mailing list,
however they are expected to provide their thoughts and opinions on user level requirements and compatibility issues
when RFC discussions take place.
12.5.1.8 Updates
June 2018
RFC 1 was ratified by the following members
12.5.2.1 Summary
This RFC is the result of a first phase of the GDAL Coordinate System Barn Raising efforts. In its current state, this
work mostly consists of:
• a C++ implementation of the ISO-19111:2018 / OGC Topic 2 “Referencing by coordinates” classes to represent
Datums, Coordinate systems, CRSs (Coordinate Reference Systems) and Coordinate Operations.
• methods to convert between this C++ modeling and WKT1, WKT2 and PROJ string representations of those
objects
• management and query of a SQLite3 database of CRS and Coordinate Operation definition
• a C API binding part of those capabilities
12.5.2.3 Details
The C++ implementation of the (upcoming) ISO-19111:2018 / OGC Topic 2 “Referencing by coordinates” classes
follows this abstract modeling as much as possible, using package names as C++ namespaces, abstract classes and
method names. A new BoundCRS class has been added to cover the modeling of the WKT2 BoundCRS construct,
that is a generalization of the WKT1 TOWGS84 concept. It is strongly recommended to have the ISO-19111 standard
open to have an introduction for the concepts when looking at the code. A few classes have also been inspired by the
GeoAPI
The classes are organized into several namespaces:
• osgeo::proj::util A set of base types from ISO 19103, GeoAPI and other PROJ “technical” specific classes
Template optional<T>, classes BaseObject, IComparable, BoxedValue, ArrayOfBaseObject, Proper-
tyMap, LocalName, NameSpace, GenericName, NameFactory, CodeList, Exception, InvalidValueType-
Exception, UnsupportedOperationException
• osgeo::proj::metadata: Common classes from ISO 19115 (Metadata) standard
Classes Citation, GeographicExtent, GeographicBoundingBox, TemporalExtent, VerticalExtent, Extent,
Identifier, PositionalAccuracy,
• osgeo::proj::common: Common classes: UnitOfMeasure, Measure, Scale, Angle, Length, DateTime, DateEp-
och, IdentifiedObject, ObjectDomain, ObjectUsage
The code to parse WKT and PROJ strings and build ISO-19111 objects is contained in io.cpp
The code to format WKT and PROJ strings from ISO-19111 objects is mostly contained in the related exportToWKT()
and exportToPROJString() methods overridden in the applicable classes. io.cpp contains the general mechanics to
build such strings.
Regarding WKT strings, three variants are handled in import and export:
• WKT2_2018: variant corresponding to the upcoming ISO-19162:2018 standard
• WKT2_2015: variant corresponding to the current ISO-19162:2015 standard
• WKT1_GDAL: variant corresponding to the way GDAL understands the OGC 01-099 and OGC 99-049 stan-
dards
Regarding PROJ strings, two variants are handled in import and export:
• PROJ5: variant used by PROJ >= 5, possibly using pipeline constructs, and avoiding +towgs84 / +nadgrids
legacy constructs. This variant honours axis order and input/output units. That is the pipeline for the conversion
of EPSG:4326 to EPSG:32631 will assume that the input coordinates are in latitude, longitude order, with
degrees.
• PROJ4: variant used by PROJ 4.x
The raw query of the proj.db database and the upper level construction of ISO-19111 objects from the database contents
is done in factory.cpp
Methods generally take and return xxxNNPtr objects, that is non-null shared pointers (pointers with internal reference
counting). The advantage of this approach is that the user has not to care about the life-cycle of the instances (and
this makes the code leak-free by design). The only point of attention is to make sure no reference cycles are made.
This is the case for all classes, except the CoordinateOperation class that point to CRS for sourceCRS and targetCRS
members, whereas DerivedCRS point to a Conversion instance (which derives from CoordinateOperation). This issue
was detected in the ISO-19111 standard. The solution adopted here is to use std::weak_ptr in the CoordinateOperation
class to avoid the cycle. This design artifact is transparent to users.
Another important design point is that all ISO19111 objects are immutable after creation, that is they only have get-
ters that do not modify their states. Consequently they could possibly use in a thread-safe way. There are however
classes like PROJStringFormatter, WKTFormatter, DatabaseContext, AuthorityFactory and CoordinateOperationCon-
text whose instances are mutable and thus can not be used by multiple threads at once.
Example how to build the EPSG:4326 / WGS84 Geographic2D definition from scratch:
Algorithmic focus
The createOperations() algorithm also does a kind of “CRS routing”. A typical example is if wanting to transform
between CRS A and CRS B, but no direct transformation is referenced in proj.db between those. But if there are
transformations between A <–> C and B <–> C, then it is possible to build a concatenated operation A –> C –> B.
The typical example is when C is WGS84, but the implementation is generic and just finds a common pivot from the
database. An example of finding a non-WGS84 pivot is when searching a transformation between EPSG:4326 and
EPSG:6668 (JGD2011 - Japanese Geodetic Datum 2011), which has no direct transformation registered in the EPSG
database . However there are transformations between those two CRS and JGD2000 (and also Tokyo datum, but that
one involves less accurate transformations)
unknown id, Inverse of JGD2000 to WGS 84 (1) + JGD2000 to JGD2011 (2), 2 m, Japan
˓→excluding northern main province
unknown id, Inverse of Tokyo to WGS 84 (108) + Tokyo to JGD2011 (2), 9.2 m, Japan
˓→onshore excluding northern main province
unknown id, Inverse of Tokyo to WGS 84 (108) + Tokyo to JGD2000 (2) + JGD2000 to
˓→JGD2011 (1), 9.4 m, Japan - northern Honshu
unknown id, Inverse of Tokyo to WGS 84 (2) + Tokyo to JGD2011 (2), 13.2 m, Japan -
˓→onshore mainland and adjacent islands
unknown id, Inverse of Tokyo to WGS 84 (2) + Tokyo to JGD2000 (2) + JGD2000 to
˓→JGD2011 (1), 13.4 m, Japan - northern Honshu
unknown id, Inverse of Tokyo to WGS 84 (1) + Tokyo to JGD2011 (2), 29.2 m, Asia -
˓→Japan and South Korea
The current state of the work can be found in the iso19111 branch of rouault/proj.4 repository , and is also available
as a GitHub pull request at https://github.com/OSGeo/proj.4/pull/1040
Here is a not-so-usable comparison with a fixed snapshot of master branch
12.5.2.5 Database
Content
The database contains CRS and coordinate operation definitions from the EPSG database (IOGP’s EPSG Geodetic
Parameter Dataset) v9.5.3, IGNF registry (French National Geographic Institute), ESRI database, as well as a few
customizations.
The first stage consists in constructing .sql scripts mostly with CREATE TABLE and INSERT statements to create
the database structure and populate it. There is one .sql file for each database table, populated with the content of the
EPSG database, automatically generated with the build_db.py script, which processes the PostgreSQL dumps issued
by IOGP. A number of other scripts are dedicated to manual editing, for example grid_alternatives.sql file that binds
official grid names to PROJ grid names
The second stage is done automatically by the make process. It pipes the .sql script, in the right order, to the sqlite3
binary to generate a first version of the proj.db SQLite3 database.
The third stage consists in creating additional .sql files from the content of other registries. For that process, we need
to bind some definitions of those registries to those of the EPSG database, to be able to link to existing objects and
detect some boring duplicates. The ignf.sql file has been generated using the build_db_create_ignf.py script from the
current data/IGNF file that contains CRS definitions (and implicit transformations to WGS84) as PROJ.4 strings. The
esri.sql file has been generated using the build_db_from_esri.py script, from the .csv files in https://github.com/Esri/
projection-engine-db-doc/tree/master/csv
Finalize proj.db
The last stage runs make again to incorporate the new .sql files generated in the previous stage (so the process of
building the database involves a kind of bootstrapping. . . )
The make process just runs the second stage mentioned above from the .sql files. The resulting proj.db is currently 5.3
MB large.
Structure
The database is structured into the following tables and views. They generally match a ISO-19111 concept, and is
generally close to the general structure of the EPSG database. Regarding identification of objects, where the EPSG
database only contains a ‘code’ numeric column, the PROJ database identifies objects with a (auth_name, code) tuple
of string values, allowing several registries to be combined together.
• Technical:
– authority_list: view enumerating the authorities present in the database. Currently: EPSG, IGNF,
PROJ
– metadata: a few key/value pairs, for example to indicate the version of the registries imported in the
database
– object_view: synthetic view listing objects (ellipsoids, datums, CRS, coordinate operations. . . ) code
and name, and the table name where they are further described
– alias_names: list possible alias for the name field of object table
12.5.2.6 Utilities
A new projinfo utility has been added. It enables the user to enter a CRS or coordinate operation by a AUTHOR-
ITY:CODE, PROJ string or WKT string, and see it translated in the different flavors of PROJ and WKT strings. It also
enables to build coordinate operations between two CRSs.
Usage
Except 'all' and 'default', other format can be preceded by '-' to disable them
Examples
$ projinfo EPSG:4326
PROJ string:
+proj=pipeline +step +proj=longlat +ellps=WGS84 +step +proj=unitconvert +xy_in=rad
˓→+xy_out=deg +step +proj=axisswap +order=2,1
WKT2_2015 string:
GEODCRS["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]],
AREA["World"],
BBOX[-90,-180,90,180],
ID["EPSG",4326]]
PROJ string:
Error when exporting to PROJ string: BoundCRS cannot be exported as a PROJ.5 string,
˓→but its baseCRS might
PROJ.4 string:
+proj=utm +zone=7 +south +ellps=intl +towgs84=165.732,216.72,180.505,-0.6434,-0.4512,-
˓→0.0791,7.4204
WKT2_2018 string:
BOUNDCRS[
SOURCECRS[
PROJCRS["IGN 1972 Nuku Hiva - UTM fuseau 7 Sud",
BASEGEOGCRS["unknown",
DATUM["unknown",
ELLIPSOID["International 1909 (Hayford)",6378388,297,
LENGTHUNIT["metre",1,
ID["EPSG",9001]]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8901]]],
CONVERSION["unknown",
METHOD["Transverse Mercator",
ID["EPSG",9807]],
PARAMETER["Latitude of natural origin",0,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8801]],
PARAMETER["Longitude of natural origin",-141,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8802]],
PARAMETER["Scale factor at natural origin",0.9996,
SCALEUNIT["unity",1],
ID["EPSG",8805]],
PARAMETER["False easting",500000,
LENGTHUNIT["metre",1],
ID["EPSG",8806]],
PARAMETER["False northing",10000000,
LENGTHUNIT["metre",1],
ID["EPSG",8807]]],
CS[Cartesian,2],
AXIS["(E)",east,
ORDER[1],
LENGTHUNIT["metre",1,
ID["EPSG",9001]]],
AXIS["(N)",north,
ORDER[2],
LENGTHUNIT["metre",1,
ID["EPSG",9001]]]]],
TARGETCRS[
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
(continues on next page)
WKT1_GDAL:
PROJCS["IGN 1972 Nuku Hiva - UTM fuseau 7 Sud",
GEOGCS["unknown",
DATUM["unknown",
SPHEROID["International 1909 (Hayford)",6378388,297],
TOWGS84[165.732,216.72,180.505,-0.6434,-0.4512,-0.0791,7.4204]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AXIS["Longitude",EAST],
AXIS["Latitude",NORTH]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",-141],
PARAMETER["scale_factor",0.9996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",10000000],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
AXIS["Easting",EAST],
AXIS["Northing",NORTH]]
Between “Poland zone I” (based on Pulkovo 42 datum) and “UTM WGS84 zone 34N”
Summary view:
Display of pipelines:
PROJ string:
+proj=pipeline +step +proj=axisswap +order=2,1 +step +inv +proj=sterea +lat_0=50.625
˓→+lon_0=21.0833333333333 +k=0.9998 +x_0=4637000 +y_0=5647000 +ellps=krass +step
New files (excluding makefile.am, CMakeLists.txt and other build infrastructure artifacts):
• include/proj/: Public installed C++ headers
– common.hpp: declarations of osgeo::proj::common namespace.
– coordinateoperation.hpp: declarations of osgeo::proj::operation namespace.
– coordinatesystem.hpp: declarations of osgeo::proj::cs namespace.
– crs.hpp: declarations of osgeo::proj::crs namespace.
– datum.hpp: declarations of osgeo::proj::datum namespace.
– io.hpp: declarations of osgeo::proj::io namespace.
– metadata.hpp: declarations of osgeo::proj::metadata namespace.
– util.hpp: declarations of osgeo::proj::util namespace.
– nn.hpp: Code from https://github.com/dropbox/nn to manage Non-nullable pointers for
C++
• include/proj/internal: Private non-installed C++ headers
– coordinateoperation_internal.hpp: classes InverseCoordinateOperation, InverseConver-
sion, InverseTransformation, PROJBasedOperation, and functions to get conversion map-
pings between WKT and PROJ syntax
– coordinateoperation_constants.hpp: Select subset of conversion/transformation EPSG
names and codes for the purpose of translating them to PROJ strings
– coordinatesystem_internal.hpp: classes AxisDirectionWKT1, AxisName and AxisAbbre-
viation
– internal.hpp: a few helper functions, mostly to do string-based operations
12.5.2.8 C API
12.5.2.9 Documentation
All public C++ classes and methods and C functions are documented with Doxygen.
Current snapshot of Class list
Spaghetti inheritance diagram
A basic integration of the Doxygen XML output into the general PROJ documentation (using reStructuredText format)
has been done with the the Sphinx extension Breathe, producing:
• One section with the C++ API
• One section with the C API
12.5.2.10 Testing
Nearly all exported methods are tested by a unit test. Global line coverage of the new files is 92%. Those tests
represent 16k lines of codes.
The new code leverages on a number of C++11 features (auto keyword, constexpr, initializer list, std::shared_ptr,
lambda functions, etc.), which means that a C++11-compliant compiler must be used to generate PROJ:
• gcc >= 4.8
• clang >= 3.3
• Visual Studio >= 2015.
Compilers tested by the Travis-CI and AppVeyor continuous integration environments:
• GCC 4.8
• mingw-w64-x86-64 4.8
• clang 5.0
• Apple LLVM version 9.1.0 (clang-902.0.39.2)
• MSVC 2015 32 and 64 bit
• MSVC 2017 32 and 64 bit
The libsqlite3 >= 3.7 development package must also be available. And the sqlite3 binary must be available to build
the proj.db files from the .sql files.
At this stage, no backward compatibility issue is foreseen, as no existing functional C code has been modified to use
the new capabilities
The work described in this RFC will be pursued in a number of directions. Non-exhaustively:
• Support for ESRI WKT1 dialect (PROJ currently ingest the ProjectedCRS in esri.sql in that dialect, but there
is no mapping between it and EPSG operation and parameter names, so conversion to PROJ strings does not
always work.
• closer integration with the existing code base. In particular, the +init=dict:code syntax should now go first to the
database (then the epsg and IGNF files can be removed). Similarly proj_create_crs_to_crs() could use the new
capabilities to find an appropriate coordinate transformation.
• and whatever else changes are needed to address GDAL and libgeotiff needs
The RFC has been adopted with support from PSC members Kurt Schwehr, Kristian Evers, Howard Butler and Even
Rouault.
12.5.3.1 Summary
This document defines a set of guidelines for dependency management in PROJ. With PROJ being a core component
in many downstream software packages clearly stating which dependencies the library has is of great value. This doc-
ument concern both programming language standards as well as minimum required versions of library dependencies
and build tools.
It is proposed to adopt a rolling update scheme that ensures that PROJ is sufficiently accessible, even on older systems,
as well as keeping up with the technological evolution. The scheme is divided in two parts, one concerning versions
of used programming languages within PROJ and the other concerning software packages that PROJ depend on.
With adoption of this RFC, versions used for
1. programming languages will always be at least two revisions behind the most recent standard
2. software packages will always be at least two years old (patch releases are exempt)
A change in programming language standard can only be introduced with a new major version release of PROJ.
Changes for software package dependencies can be introduced with minor version releases of PROJ. Changing the
version requirements for a dependency needs to be approved by the PSC.
Following the above rule set will ensure that all but the most conservative users of PROJ will be able to build and use
the most recent version of the library.
In the sections below details concerning programming languages and software dependencies are outlined. The RFC is
concluded with a bootstrapping section that details the state of dependencies after the accept of the RFC.
12.5.3.2 Background
PROJ has traditionally been written in C89. Until recently, no formal requirements of e.g. build systems has been
defined and formally accepted by the project. :ref:RFC2 <rfc2>` formally introduces dependencies on C++11 and
SQLite 3.7.
In this RFC a rolling update of version or standard requirements is described. The reasoning behind a rolling update
scheme is that it has become increasingly evident that C89 is becoming outdated and creating a less than optimal
development environment for contributors. It has been noted that the most commonly used compilers all now support
more recent versions of C, so the strict usage of C89 is no longer as critical as it used to be.
Similarly, rolling updates to other tools and libraries that PROJ depend on will ensure that the code base can be kept
modern and in line with the rest of the open source software ecosphere.
Following RFC2 PROJ is written in both C and C++. At the time of writing the core library is C based and the code
described in RFC2 is written in C++. While the core library is mostly written in C it is compiled as C++. Minor
sections of PROJ, like the geodesic algorithms are still compiled as C since there is no apparent benefit of compiling
with a C++ compiler. This may change in the future.
Both the C and C++ standards are updated with regular intervals. After an update of a standard it takes time for com-
piler manufacturers to implement the standards fully, which makes adaption of new standards potentially troublesome
if done too soon. On the other hand, waiting too long to adopt new standards will eventually make the code base feel
old and new contributors are more likely to stay away because they don’t want to work using tools of the past. With
a rolling update scheme both concerns can be managed by always staying behind the most recent standard, but not so
far away that potential contributors are scared away. Keeping a policy of always lagging behind be two iterations of
the standard is thought to be the best comprise between the two concerns.
C comes in four ISO standardised varieties: C89, C99, C11, C18. In this document we refer to their informal names
for ease of reading. C++ exists in five varieties: C++98, C++03, C++11, C++14, C++17. Before adoption of this
RFC PROJ uses C89 and C++11. For C, that means that the used standard is three iterations behind the most recent
standard. C++ is two iterations behind. Following the rules in this RFC the required C standard used in PROJ is at
allowed to be two iterations behind the most recent standard. That means that a change to C99 is possible, as long as
the PROJ PSC aknowledges such a change.
When a new standard for either C or C++ is released PROJ should consider changing its requirement to the next
standard in the line. For C++ that means a change in standard roughly every three years, for C the periods between
standard updates is expected to be longer. Adaptation of new programming language standards should be coordinated
with a major version release of PROJ.
At the time of writing PROJ is dependent on very few external packages. In fact only one runtime dependency is
present: SQLite. Building PROJ also requires one of two external dependencies for configuration: Autotools or
CMake.
As with programming language standards it is preferable that software dependencies are a bit behind the most recent
development. For this reason it is required that the minimum version supported in PROJ dependencies is at least two
years old, preferably more. It is not a requirement that the minimum version of dependencies is always kept strictly two
years behind current development, but it is allowed in case future development of PROJ warrants an update. Changes
in minimum version requirements are allowed to happen with minor version releases of PROJ.
At the time of writing the minimum version required for SQLite it 3.7 which was released in 2010. CMake currently
is required to be at least at version 2.8.3 which was also released in 2010.
12.5.3.5 Bootstrapping
This RFC comes with a set of guidelines for handling dependencies for PROJ in the future. Up until now dependencies
hasn’t been handled consistently, with some dependencies not being approved formally by the projects governing body.
Therefore minimum versions of PROJ dependencies is proposed so that at the acception of this RFC PROJ will have
the following external requirements:
• C99 (was C89)
• C++11 (already approved in RFC2)
• SQLite 3.7 (already approved in RFC2)
• CMake 3.5 (was 2.8.3)
The RFC was adopted on 2018-01-19 with +1’s from the following PSC members
• Kristian Evers
• Even Rouault
• Thomas Knudsen
• Howard Butler
12.5.4.1 Motivation
PROJ 6 brings undeniable advances in the management of coordinate transformations between datums by relying and
applying information available in the PROJ database. PROJ’s rapid evolution from a cartographic projections library
with a little bit of geodetic capability to a full geodetic transformation and description environment has highlighted the
importance of the support data. Users desire the convenience of software doing the right thing with the least amount
of fuss, and survey organizations wish to deliver their models across as wide a software footprint as possible. To get
results with the highest precision, a grid file that defines a model that provides dimension shifts is often needed. The
proj-datumgrid project centralizes grids available under an open data license and bundles them in different archives
split along major geographical regions of the world .
It is assumed that a PROJ user has downloaded and installed grid files that are referred to in the PROJ database.
These files can be quite large in aggregate, and packaging support by major distribution channels is somewhat uneven
due to their size, sometimes ambiguous licensing story, and difficult-to-track versioning and lineage. It is not always
clear to the user, especially to those who may not be so familiar with geodetic operations, that the highest precision
transformation may not always being applied if grid data is not available. Users want both convenience and correctness,
and management of the shift files can be challenging to those who may not be aware of their importance to the process.
The computing environment in which PROJ operates is also changing. Because the shift data can be so large (currently
more than 700 MB of uncompressed data, and growing), deployment of high accuracy operations can be limited due
to deployment size constraints (serverless operations, for example). Changing to a delivery format that supports
incremental access over a network along with convenient access and compression will ease the resource burden the
shift files present while allowing the project to deliver transformation capability with the highest known precision
provided by the survey organizations.
Adjustment grids also tend to be provided in many different formats depending on the organization and country that
produced them. In PROJ, we have over time “standardized” on using horizontal shift grids as NTv2 and vertical shift
grids using GTX. Both have poor general support as dedicated formats, limited metadata capabilities, and neither are
not necessarily “cloud optimized” for incremental access across a network.
curl will be an optional build dependency of PROJ, added in autoconf and cmake build systems. It can be disabled
at build time, but this must be an explicit setting of configure/cmake as the resulting builds have less functionality.
When curl is enabled at build time, download of grids themselves will not be enabled by default at runtime. It will
require explicit consent of the user, either through the API (proj_context_set_enable_network()) through
the PROJ_NETWORK=ON environment variable, or the network = on setting of proj.ini.
Regarding the minimum version of libcurl required, given GDAL experience that can build with rather ancient libcurl
for similar functionality, we can aim for libcurl >= 7.29.0 (as being available in RHEL 7).
An alternate pluggable network interface can also be set by the user in case suppot for libcurl was not built in, or if for
the desired context of use, the user wishes to provide the network implementation (a typical use case could be QGIS
that would use its QT-based networking facilities to solve issues with SSL, proxy, authentication, etc.)
A text configuration file, installed in ${installation_prefix}/share/proj/proj.ini (or ${PROJ_LIB}/proj.ini) will
contain the URL of the CDN that will be used. The user may also override this setting with the
proj_context_set_url_endpoint() or through the PROJ_NETWORK_ENDPOINT environment variable.
The rationale for putting proj.ini in that location is that it is a well-known place by PROJ users, with the existing
PROJ_LIB mechanics for systems like Windows where hardcoded paths at runtime aren’t generally usable.
C API
To make network access efficient, PROJ will internally have a in-memory cache of file ranges to only issue network
requests by chunks of 16 KB or multiple of them, to limit the number of HTTP GET requests and minimize latency
caused by network access. This is very similar to the behavior of the GDAL /vsicurl/ I/O layer. The plan is to mostly
copy GDAL’s vsicurl implementation inside PROJ, with needed adjustmeents and proper namespacing of it.
A retry strategy (typically a delay with an exponential back-off and some random jitter) will be added to account for
intermittent network or server-side failure.
URL building
The PROJ database has a grid_transformation grid whose column grid_name (and possibly grid2_name)
contain the name of the grid as indicated by the authority having registered the transformation (typically EPSG). As
those grid names are not generally directly usable by PROJ, the PROJ database has also a grid_alternatives
table that link original grid names to the ones used by PROJ. When network access will be available and needed
due to lack of a local grid, the full URL will be the endpoint from the configuration or set by the user, the base-
name of the PROJ usable filename, and the “tif” suffix. So if the CDN is at http://example.com and the name from
grid_alternatives is egm96_15.gtx, then the URL will be http://example.com/egm96_15.tif
Grid loading
The following files will be affected, in one way or another, by the above describes changes: nad_cvt.cpp, nad_intr.cpp,
nad_init.cpp, grid_info.cpp, grid_list.cpp, apply_gridshift.cpp, apply_vgridshift.cpp.
In particular the current logic that consists to ingest all the values of a grid/subgrid in the ct->cvs array will be
completely modified, to enable access to grid values at a specified (x,y) location.
Once network access is available, all grids known to the PROJ database (grid_transformation + grid_alternatives table)
will be assumed to be available, when computing the potential pipelines between two CRS.
Concretely, this will be equivalent to calling proj_operation_factory_context_set_grid_availability_use()
with the use argument set to a new enumeration value
As many workflows will tend to use the same grids over and over, a local on-disk caching of remote grids will be
added. The cache will be a single SQLite3 database, in a user-writable directory shared by all applications using
PROJ.
Its total size will be configurable, with a default maximum size of 100 MB in proj.ini. The cache will also keep the
timestamp of the last time it checked various global properties of the file (its size, Last-Modified and ETag headers).
A time-to-live parameter, with a default of 1 day in proj.ini, will be used to determine whether the CDN should be hit
to verify if the information in the cache is still up-to-date.
/** Override, for the considered context, the path and file of the local
* cache of grid chunks.
*
* @param ctx PROJ context, or NULL
* @param fullname Full name to the cache (encoded in UTF-8). If set to NULL,
* caching will be disabled.
*/
void proj_grid_cache_set_filename(PJ_CONTEXT* ctx, const char* fullname);
/** Override, for the considered context, the maximum size of the local
* cache of grid chunks.
*
* @param ctx PROJ context, or NULL
* @param max_size_MB Maximum size, in mega-bytes (1024*1024 bytes), or
* negative value to set unlimited size.
*/
void proj_grid_cache_set_max_size(PJ_CONTEXT* ctx, int max_size_MB);
/** Override, for the considered context, the time-to-live delay for
* re-checking if the cached properties of files are still up-to-date.
*
* @param ctx PROJ context, or NULL
* @param ttl_seconds Delay in seconds. Use negative value for no expiration.
*/
void proj_grid_cache_set_ttl(PJ_CONTEXT* ctx, int ttl_seconds);
-- Head and tail pointers of the linked_chunks. The head pointer is for
-- the most-recently used chunk.
-- There should be just one row in this table.
CREATE TABLE linked_chunks_head_tail(
head INTEGER,
tail INTEGER,
CONSTRAINT lht_head FOREIGN KEY (head) REFERENCES linked_chunks(id),
CONSTRAINT lht_tail FOREIGN KEY (tail) REFERENCES linked_chunks(id)
);
INSERT INTO linked_chunks_head_tail VALUES (NULL, NULL);
The chunks table will store 16 KB chunks (or less for terminating chunks). The linked_chunks and
linked_chunks_head_tail table swill act as a doubly linked list of chunks, with the least recently used ones at the
end of the list, which will be evicted when the cache saturates.
The directory used to locate this database will be ${XDG_DATA_HOME}/proj (per https://specifications.freedesktop.
org/basedir-spec/basedir-spec-latest.html) where ${XDG_DATA_HOME} defaults to ${HOME}/.local/share on Unix
builds and ${LOCALAPPDATA} on Windows builds. Exact details to be sorted out, but https://github.com/
ActiveState/appdirs/blob/a54ea98feed0a7593475b94de3a359e9e1fe8fdb/appdirs.py#L45-L97 can be a good refer-
ence.
As this database might be accesse by several threads or processes at the same time, the code accessing to it will care-
fully honour SQLite3 errors regarding to locks, to do appropriate retries if another thread/process is currently locking
the database. Accesses requiring a modification of the database will start with a BEGIN IMMEDIATE transaction so
as to acquire a write lock.
Note: This database should be hosted on a local disk, not a network one. Otherwise SQLite3 locking issues are to be
expected.
CDN provider
The grids hosted on the CDN will be exactly the ones collected, currently and in the future, by the proj-datumgrid
initiative. In particular, new grids are accepted as long as they are released under a license that is compatible with the
Open Source Definition and the source of the grid is clearly stated and verifiable. Suitable licenses include:
• Public domain
• X/MIT
• BSD 2/3/4 clause
• CC0
• CC-BY (v3.0 or later)
• CC-BY-SA (v3.0 or later)
For new grids to be transparently used by the proj_create_crs_to_crs() mechanics, they must be registered in the PROJ
database (proj.db) in the grid_transformation and grid_alternatives table. The nominal path to have a
new record in the grid_transformation is to have a transformation being registered in the EPSG dataset (if there is no
existing one), which will be subsequently imported into the PROJ database.
The policy regarding this should be similar to the one applied to proj-datumgrid, which even if not formalized, is
around the following lines:
• Geodetic agencies release regularly new version of grids. Typically for the USA, NOAA has released
GEOID99, GEOID03, GEOID06, GEOID09, GEOID12A, GEOID12B, GEOID18 for the NAVD88 to
NAD83/NAD83(2011) vertical adjustments. Each of these grids is considered by EPSG and PROJ has a sepa-
rate object, with distinct filenames. The release of a new version does not cause the old grid to be automatically
removed. That said, due to advertized accuracies and supersession rules of the EPSG dataset, the most recent
grid will generally be used for a CRS -> CRS transformation if the user uses proj_create_crs_to_crs() (with
the exception that if a VERT_CRS WKT includes a GEOID_MODEL known to PROJ, an old version of the
grid will be used). If the user specifies a whole pipeline with an explicit grid name, it will be of course strictly
honoured. As time goes, the size of the datasets managed by proj-datumgrid will be increasing, we will have
to explore on we managed that for the distributed .zip / .tar.gz archives. This should not be a concern for CDN
hosted content.
• In case software-related conversion errors from the original grid format to the one used by PROJ (be it GTX,
NTv2 or GeoTIFF) would happen, the previous erroneous version of the dataset would be replaced by the
corrected one. In that situation, this might have an effect with the local on-disk caching of remote grids. We
will have to see with the CDN providers used if we can use for example the ETag HTTP header on the client
to detect a change, so that old cached content is not erroneously reused (if not possible, we’ll have to use some
text file listing the grid names and their current md5sum)
Several formats exist depending on the ad-hoc needs and ideas of the original data producer. It would be appropriate
to converge on a common format able to address the different use cases.
• Not tiled. Tiling is a nice to have property for cloud-friendly access to large files.
• No support for compression
• The NTv2 structures is roughly: header of main grid, data of main grid, header of subgrid 1, data of subgrid 1,
header of subgrid 2, data of subgrid 2, etc.Due to the headers being scattered through the file, it is not possibly
to retrieve with a single HTTP GET request all header information.
• GTX format has no provision to store metadata besides the minimum georeferencing of the grid. NTv2 is a bit
richer, but no extensible metadata possible.
We have been made recently aware of other initiatives from the industry to come with a common format to store
geodetic adjustment data. Some discussions have happen recently within the OGC CRS Working group. Past efforts
include the Esri’s proposed Geodetic data Grid eXchange Format, GGXF, briefly mentioned at page 86 of https:
//iag.dgfi.tum.de/fileadmin/IAG-docs/Travaux2015/01_Travaux_Template_Comm_1_tvd.pdf and page 66 of ftp://ftp.
iaspei.org/pub/meetings/2010-2019/2015-Prague/IAG-Geodesy.pdf The current trend of those works would be to use
a netCDF / HDF5 container.
So, for the sake of completeness, we list hereafter a few potential candidate formats and their pros and cons.
TIFF/GeoTIFF
Strong points:
• TIFF is a well-known and widespread format.
• The GeoTIFF encoding is a widely industry supported scheme to encode georeferencing. It is now a OGC
standard
• There are independent initiatives to share grids as GeoTIFF, like that one
• TIFF can contain multiple images (IFD: Image File Directory) chained together. This is the mechanism used for
multiple-page scanned TIFF files, or in the geospatial field to store multi-resolution/pyramid rasters. So it can
be used with sub-grids as in the NTv2 format.
• Extensive experience with the TIFF format, and its appropriateness for network access, in particular through the
Cloud Optimized GeoTIFF initiative whose layout can make use of sub-grids efficient from a network access
perspective, because grid headers can be put at the beginning of the file, and so being retrieved in a single HTTP
GET request.
• TIFF can be tiled.
• TIFF can be compressed. Commonly found compression formats arre DEFLATE, LZW, combined with differ-
ential integer or floating point predictors
• A TIFF image can contain a configurable number of channels/bands/samples. In the rest of the document, we
will use the sample terminology for this concept.
• TIFF sample organization can be configured: either the values of different samples are packed together (Planar-
Configuration = Contig), or put in separate tiles/strips (PlanarConfiguration = Separate)
• libtiff is a dependency commonly found in binary distributions of the “ecosystem” to which PROJ belongs too
• libtiff benefits from many years of efforts to increase its security, for example being integrated to the oss-fuzz
initiative. Given the potential fetching of grids, using security tested components is an important concern.
• Browser-side: there are “ports” of libtiff/libgeotiff in the browser such as https://geotiffjs.github.io/ which could
potentially make a port of PROJ easier.
Weak points:
• we cannot use libgeotiff, since it depends itself on PROJ (to resolve CRS or components of CRS from their
EPSG codes). That said, for PROJ intended use, we only need to decode the ModelTiepointTag and ModelPix-
elScaleTag TIFF tags, so this can be done “at hand”
• the metadata capabilities of TIFF baseline are limited. The TIFF format comes with a predefined set of metadata
items whose keys have numeric values. That said, GDAL has used for the last 20 years or so a dedicated tag,
GDAL_METADATA of code 42112 that holds a XML-formatted string being able to store arbitrary key-pair
values.
netCDF v3
Strong points:
• The binary format description as given in OGC 10-092r3 is relatively simple, but it would still probably be
necessary to use libnetcdf-c to access it
• Metadata can be stored easily in netCDF attributes
Weak points:
• No compression in netCDF v3
• No tiling in netCDF v3
• Multi-samples variables are located in different sections of the files (correspond to TIFF PlanarConfiguration =
Separate)
• No natural way of having hiearchical / multigrids. They must be encoded as separate variables
• georeferencing in netCDF is somewhat less standardized than TIFF/GeoTIFF. The generally used model is
the conventions for CF (Climate and Forecast) metadata but there is nothing really handy in them for simple
georeferencing with the coordinate of the upper-left pixel and the resolution. The practice is to write explicit lon
and lat variables with all values taken by the grid. GDAL has for many years supported a simpler syntax, using
a GeoTransform attribute.
• From the format description, its layout could be relatively cloud friendly, except that libnetcdf has no API to
plug an alternate I/O layer.
• Most binary distributions of netCDF nowadays are based on libnetcdf v4, which implies the HDF5 dependency.
• From a few issues we identified a few years ago regarding crashes on corrupted datasets, we contacted libnetcdf
upstream, but they did not seem to be interested in addressing those security issues.
netCDF v4 / HDF5
GeoPackage
As PROJ has already a SQLite3 dependency, GeoPackage could be examined as a potential solution.
Strong points:
• SQLite3 dependency
• OGC standard
• Multi-grid capabilities
• Tiling
• Compression
• Metadata capabilities
Weak points:
• GeoPackage mostly address the RGB(A) Byte use case, or via the tile gridded data extension, single-sample
non-Byte data. No native support for multi-sample non-Byte data: each sample should be put in a separate
raster table.
• Experience shows that SQLite3 layout (at least the layout adopted when using the standard libsqlite3) is not
cloud friendly. Indices may be scattered in different places of the file.
Conclusions
The 2 major contenders regarding our goals and constraints are GeoTIFF and HDF5. Given past positive experience
and its long history, GeoTIFF remains our preferred choice.
Format description
The format description is available in a dedicated Geodetic TIFF grids (GTG) document.
Tooling
A script will be deveoped to accept a list of individual grids to combine together into a single file.
A ntv2_to_gtiff.py convenience script will be created to convert NTv2 grids, including their subgrids, to the above
described GeoTIFF layout.
A validation Python script will be created to check that a file meets the above described requirements and recommen-
dations.
Build requirements
The minimum libtiff version will be 4.0 (RHEL 7 ships with libtiff 4.0.3). To be able to read grids stored on the
CDN, libtiff will need to build against zlib to have DEFLATE and LZW support, which is met by all known binary
distributions of libtiff.
The libtiff dependency can be disabled at build time, but this must be an explicit setting of configure/cmake as the
resulting builds have less functionality.
While digging through existing code, I more or less discovered that the PROJ code base has the concept of a
grid catalog. This is a feature apparently triggered by using the +catalog=somefilename.csv in a PROJ string,
where the CSV file list grid names, their extent, priority and date. It seems to be an alternative to using +nad-
grids with multiple grids, with the extra ability to interpolate shift values between several grids if a +date pa-
rameter is provided and the grid catalog mentions a date for each grids. It was added in June 2012 per commit
fcb186942ec8532655ff6cf4cc990e5da669a3bc
This feature is likely unknown to most users as there is no known documentation for it (neither in current documenta-
tion, nor in historic one). It is not either tested by PROJ tests, so its working status is unknown. It would likely make
implementation of this RFC easier if this was removed. This would result in completely dropping the gridcatalog.cpp
and gc_reader.cpp files, their call sites and the catalog_name and datum_date parameter from the PJ structure.
In case similar functionality would be be needed, it might be later reintroduced as an extra mode of Horizontal grid
shift, or using a dedicated transformation method, similarly to the Kinematic datum shifting utilizing a deformation
model one, and possibly combining the several grids to interpolate among in the same file, with a date metadata item.
None anticipated, except the removal of the (presumably little used) grid catalog functionality.
The foundations set in the definition of the GeoTIFF grid format should hopefully be reused to extend them to support
deformation models (was initially discussed per https://github.com/OSGeo/PROJ/issues/1001).
Definition of such an extension is out of scope of this RFC.
12.5.4.8 Documentation
12.5.4.9 Testing
Number of GeoTIFF formulations (tiled vs untiled, PlanarConfiguration Separate vs Contig, data types, scale+offset
vs not, etc.) will be tested.
For testing of network capabilities, a mix of real hits to the CDN and use of the alternate pluggable network interface
to test edge cases will be used.
The RFC was adopted on 2020-01-10 with +1’s from the following PSC members
• Kristian Evers
• Even Rouault
• Thomas Knudsen
• Howard Butler
• Kurt Schwehr
12.5.5 PROJ RFC 5: Adopt GeoTIFF-based grids for grids delivered with PROJ
12.5.5.1 Motivation
This RFC is a continuation of PROJ RFC 4: Remote access to grids and GeoTIFF grids. With RFC4, PROJ
can, upon request of the user, download grids from a CDN in a progressive way. There is also API, such as
proj_download_file() to be able to download a GeoTIFF grid in the user writable directory. The con-
tent of the CDN at https://cdn.proj.org is https://github.com/OSGeo/PROJ-data , which has the same content as
https://github.com/OSGeo/proj-datumgrid converted in GeoTIFF files. In the current state, we could have a some-
what inconsistency between users relying on the proj-datumgrid, proj-datumgrid-[world,northamerica,oceania,europe]
packages of mostly NTv2 and GTX files, and what is shipped through the CDN. Maintaining two repositories is also
a maintaince burden in the long term.
It is thus desirable to have a single source of truth, and we propose it to be based on the GeoTIFF grids.
• https://github.com/OSGeo/PROJ-data/ will be used, starting with PROJ 7.0, to create “static” grid packages.
• For now, a single package of, mostly GeoTIFF grids (a few text files for PROJ init style files, as well as a few
edge cases for deformation models where grids have not been converted), will be delivered. Its size at the time
of writing is 486 MB (compared to 1.5 GB of uncompressed NTv2 + GTX content, compressed to ~ 700 MB
currently)
• The content of this archive will be flat, i.e. no subdirectories
• Each file will be named according to the following pattern ${agency_name}_${filename}[.ext]. For
example fr_ign_ntf_r93.tif This convention should allow packagers, if the need arise, to be able to split the
monolothic package in smaller ones, based on criterion related to the country.
The agency name is the one you can see from the directory names at https:
//github.com/OSGeo/PROJ-data/. ${agency_name} itself is structure like
${two_letter_country_code_of_agency_nationality}_${some_abbreviation} (with
the exception of eur_nkg, for the Nordic Geodetic Commission which isn’t affiliated to a single country but to
some european countries, and follows the general scheme)
• https://github.com/OSGeo/proj-datumgrid and related packages will only be maintained during the re-
maining lifetime of PROJ 6.x. After that, the repository will no longer receive any update and will
be put in archiving state (see https://help.github.com/en/github/creating-cloning-and-archiving-repositories/
about-archiving-repositories)
• PROJ database grid_alternatives table will be updated to point to the new TIFF filenames. It will also
maintain the old names as used by current proj-datumgrid packages to be able to provide backward compatibility
when a PROJ string refers to a grid by its previous name.
• Upon adoption of this RFC, new grids referenced by PROJ database will only point to GeoTIFF grid names.
• Related to the above point, if a PROJ string refers to a grid name, let’s say foo.gsb. This grid will first
be looked for in all the relevant locations under this name. If no match is found, then a lookup in the
grid_alternatives table will be done to retrieve the potential new name (GeoTIFF file), and if there’s
such match, a new look-up in the file system will be done with the name of this GeoTIFF file.
• The package_name column of grid_alternatives will no longer be filled. And url will be filled with the
direct URL to the grid in the CDN, for example: https://cdn.proj.org/fr_ign_ntf_r93.tif
• The Python scripts to convert grids (NTv2, GTX) to GeoTIFF currently available at https://github.com/rouault/
sample_proj_gtiff_grids/ will be moved to a grid_tools/ subdirectories of https://github.com/OSGeo/PROJ-data/
Documentation for those utilities will be added to PROJ documentation.
• Obviously, all the above assumes PROJ builds to have libtiff enabled. Non-libtiff builds are not considered as
nominal PROJ builds (if a PROJ master build is attempted and libtiff is not detected, it fails. The user has to
explicitly ask to disable TIFF support), and users deciding to go through that route will have to deal with the
consequences (that is that grid-based transformations generated by PROJ will likely be non working)
This change is considered to be mostly backward compatible. There might be impacts for software using
proj_coordoperation_get_grid_used() and assuming that the url returned is one of the proj-datumgrid-
xxx files at https://download.osgeo.org. As mentioned in https://lists.osgeo.org/pipermail/proj/2020-January/009274.
html , this assumption was not completely bullet-proof either. There will be impacts on software checking the value
of PROJ pipeline strings resulting proj_create_crs_to_crs(). The new grid names will now be returned (the
most impacted software will likely be PROJ’s own test suite)
Although discouraged, people not using the new proj-datumgrid-geotiff-XXX.zip archives, should still be able to use
the old archives made of NTv2/GTX files, at least as long as the PROJ database does not only point to a GeoTIFF grid.
So this might be a short-term partly working solution, but at time goes, it will become increasingly non-working. The
nominal combination will be PROJ 7.0 + proj-datumgrid-geotiff-1.0.zip
12.5.5.4 Testing
PROJ test suite will have to be adapted for the new TIFF based filenames.
Mechanism to auto-promote existing NTv2/GTX names to TIFF ones will be exercised.
The RFC was adopted on 2020-01-28 with +1’s from the following PSC members
• Kristian Evers
• Even Rouault
• Thomas Knudsen
• Howard Butler
• Kurt Schwehr
12.6 Conference
FOSS4G 2020 is the leading annual conference for free and open source geospatial software. It will include presen-
tations related to PROJ, and some of the PROJ development community will be attending. It is the event for those
interested in PROJ, other FOSS geospatial technologies and the community around them. The conference will be held
in Calgary, Canada, August 24th - August 29th, 2020.
THIRTEEN
FAQ
The command line applications that come with PROJ only support text input and output (apart from proj which
accepts a simple binary data stream as well). proj, cs2cs and cct expects text files with one coordinate per line
with each coordinate dimension in a separate column.
Note: If your data is stored in a common geodata file format chances are that you can use GDAL as a frontend to
PROJ and transform your data with the ogr2ogr application.
Probably. PROJ supports transformations between most coordinate reference systems registered in the EPSG registry,
as well as a number of other coordinate reference systems. The best way to find out is to test it with the projinfo
application. Here’s an example checking if there’s a transformation between ETRS89/UTM32N (EPSG:25832) and
ETRS89/DKTM1 (EPSG:4093):
PROJ string:
+proj=pipeline +step +inv +proj=utm +zone=32 +ellps=GRS80
+step +proj=tmerc +lat_0=0 +lon_0=9 +k=0.99998 +x_0=200000 +y_0=-5000000 +ellps=GRS80
See the projinfo documentation for more info on how to use it.
625
PROJ coordinate transformation software library, Release 7.1.1
Generally PROJ will accept coordinate reference system descriptions in the form of WKT, WKT2 and PROJ strings.
If you are able to describe your desired CRS in either of those formats there’s a good chance that PROJ will be able to
make sense of it.
If it is important to you that a given CRS is added to the EPSG registry, you should contact your local geodetic
authority and ask them to submit the CRS for inclusion in the registry.
Please report bugs that you find to the issue tracker on GitHub. Here’s how.
If you know how to program you can also try to fix it yourself. You are welcome to ask for guidance on one of the
communication channels used by the project.
Any contributions from the PROJ community is welcome. See Contributing for more details.
These are called geodesic calculations. There is a page about it here: Geodesic calculations.
13.7 What is the best format for describing coordinate reference sys-
tems?
A coordinate reference system (CRS) can in PROJ be described in several ways: As PROJ strings, Well-Known Text
(WKT) and as spatial reference ID’s (such as EPSG codes). Generally, WKT or SRID’s are preferred over PROJ
strings as they can contain more information about a given CRS. Conversions between WKT and PROJ strings will in
most cases cause a loss of information, potentially leading to erroneous transformations.
For compatibility reasons PROJ supports several WKT dialects (see projinfo -o). If possible WKT2 should be
used.
PROJ respects the axis ordering as it was defined by the authority in charge of a given coordinate reference system.
This is in accordance to the ISO19111 standard [ISO19111]. Unfortunately most GIS software on the market doesn’t
follow this standard. Before version 6, PROJ did not respect the standard either. This causes some problems while the
rest of the industry conforms to the standard. PROJ intends to spearhead this effort, hopefully setting a good example
for the rest of the geospatial industry.
Customarily in GIS the first component in a coordinate tuple has been aligned with the east/west direction and the
second component with the north/south direction. For many coordinate reference systems this is also what is defined
by the authority. There are however exceptions, especially when dealing with coordinate systems that don’t align with
the cardinal directions of a compass. For example it is not obvious which coordinate component aligns to which axis
in a skewed coordinate system with a 45 degrees angle against the north direction. Similarly, a geocentric cartesian
coordinate system usually has the z-component aligned with the rotational axis of the earth and hence the axis points
towards north. Both cases are incompatible with the convention of always having the x-component be the east/west
axis, the y-component the north/south axis and the z-component the up/down axis.
In most cases coordinate reference systems with geodetic coordinates expect the input ordered as latitude/longitude
(typically with the EPSG dataset), however, internally PROJ expects an longitude/latitude ordering for all projections.
This is generally hidden for users but in a few cases it is exposed at the surface level of PROJ, most prominently in the
proj utility which expects longitude/latitude ordering of input date (unless proj -r is used).
In case of doubt about the axis order of a specific CRS projinfo is able to provide an answer. Simply look up the
CRS and examine the axis specification of the Well-Known Text output:
projinfo EPSG:4326
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]]
The file proj.db must be readable for the library to properly function. Like other resource files, it is located using a set
of search paths. In most cases, the following paths are checked in order:
• A path provided by the environment variable PROJ_LIB.
• A path built into PROJ as its resource installation directory (typically ../share/proj relative to the PROJ library).
• The current directory.
Note that if you’re using conda, activating an environment sets PROJ_LIB to a resource directory located in that
environment.
The first incarnation of PROJ saw the light of day in 1983. Back then it was simply known as PROJ. Eventually a new
version was released, known as PROJ.2 in order to distinguish between the two versions. Later on both PROJ.3 and
PROJ.4 was released. By the time PROJ.4 was released the software had matured enough that a new major version
release wasn’t an immediate necesity. PROJ.4 was around for more than 25 years before it again became time for
an update. This left the project in a bit of a conundrum regarding the name. For the majority of the life-time of the
product it was known as PROJ.4, but with the release of version 5 the name was no longer aligned with the version
number. As a consequence, it was decided to decouple the name from the version number and once again simply call
the software PROJ.
Use of name PROJ.4 is now strictly reserved for describing legacy behavior of the software, e.g. “PROJ.4 strings” as
seen in projinfo output.
FOURTEEN
GLOSSARY
Ballpark transformation For a transformation between two geographic CRS, a ballpark transformation is a coordi-
nate operation that only takes into account potential difference of axis orders (long-lat vs lat-long), units (degree
vs grads) and prime meridian (Greewich vs Paris/Rome/other historic prime meridians). It does not attempt any
datum shift, hence the “ballpark” qualifier in its name. Its accuracy is unknown, and could lead in some cases
to errors of a few hundreds of metres.
For a transformation between two vertical CRS or a vertical CRS and a geographic CRS, a ballpark transforma-
tion only takes into account potential different in units (e.g. metres vs feet). Its accuracy is unknown, and could
lead in some cases to errors of a few tens of metres.
𝑥 = 𝑓 (𝜆, 𝜑)
𝑦 = 𝑔(𝜑)
where the parallels of latitude are straight lines, like cylindrical projections, but the meridians are curved toward
the center as they depart from the equator. This is an effort to minimize the distortion of the polar regions
inherent in the cylindrical projections.
Pseudocylindrical projections are almost exclusively used for small scale global displays and, except for the
Sinusoidal projection, only derived for a spherical Earth. Because of the basic definition none of the pseudo-
cylindrical projections are conformal but many are equal area.
To further reduce distortion, pseudocylindrical are often presented in interrupted form that are made by join-
ing several regions with appropriate central meridians and false easting and clipping boundaries. Interrupted
Homolosine constructions are suited for showing respective global land and oceanic regions, for example. To
reduce the lateral size of the map, some uses remove an irregular, North-South strip of the mid-Atlantic region
so that the western tip of Africa is plotted north of the eastern tip of South America.
629
PROJ coordinate transformation software library, Release 7.1.1
[Altamimi2002] Altamimi, Z., Sillard, P., and Boucher, C. ITRF2000: a new release of the International Terrestrial
Reference Frame for earth science applications. Journal of Geophysical Research: Solid Earth, 2002.
doi:10.1029/2001JB000561.
[Bessel1825] Bessel, F. W. The calculation of longitude and latitude from geodesic measurements. Astronomische
Nachrichten, 4(86):241–254, 1825. arXiv:0908.1824.
[CalabrettaGreisen2002] Calabretta, M. R. and Greisen, E. W. Representations of celestial coordinates in FITS. As-
tronomy & Astrophysics, 395(3):1077–1122, 2002. doi:10.1051/0004-6361:20021327.
[ChanONeil1975] Chan, F. K. and O’Neill, E. M. Feasibility study of a quadrilateralized spherical cube earth data
base. Tech. Rep. EPRF 2-75 (CSC), Computer Sciences Corporation, System Sciences Division, Silver
Spring, Md, 1975. URL: https://archive.org/details/ADA010232.
[Danielsen1989] Danielsen, J. The area under the geodesic. Survey Review, 30(232):61–66, 1989.
doi:10.1179/sre.1989.30.232.61.
[Deakin2004] Deakin, R. E. The standard and abridged Molodensky coordinate transformation formulae. Technical
Report, Department of Mathematical and Geospatial Sciences, RMIT University, Melborne, Australia,
2004. URL: http://www.mygeodesy.id.au/documents/Molodensky%20V2.pdf.
[EberHewitt1979] Eber, L. E. and Hewitt, R. P. Conversion algorithms for the CalCOFI station grid. California
Cooperative Oceanic Fisheries Investigations Reports, 20:135–137, 1979. URL: http://www.calcofi.org/
publications/calcofireports/v20/Vol_20_Eber___Hewitt.pdf.
[Evenden1995] Evenden, G. I. Cartographic Projection Procedures for the UNIX Environment — A User’s Manual.
1995. URL: https://pubs.usgs.gov/of/1990/of90-284/ofr90-284.pdf.
[Evenden2005] Evenden, G. I. libproj4: A Comprehensive Library of Cartographic Projection Functions (Prelimi-
nary Draft). 2005. URL: https://github.com/OSGeo/PROJ/blob/master/docs/old/libproj.pdf.
[EversKnudsen2017] Evers, K. and Knudsen, T. Transformation pipelines for PROJ.4. In FIG Working Week 2017
Proceedings. Helsinki, Finland, 2017. URL: http://www.fig.net/resources/proceedings/fig_proceedings/
fig2017/papers/iss6b/ISS6B_evers_knudsen_9156.pdf.
[Helmert1880] Helmert, F. R. Mathematical and Physical Theories of Higher Geodesy. Volume 1. Teubner, Leipzig,
1880. doi:10.5281/zenodo.32050.
[Hensley2002] Hensley, S., Chapin, E., Freedman, A., and Michel, T. Improved processing of AIRSAR data based on
the GeoSAR processor. In AIRSAR Earth Science and Application Workshop. Pasadena, California, 2002.
Jet Propulsion Laboratory. URL: https://airsar.jpl.nasa.gov/documents/workshop2002/papers/T3.pdf.
[Hakli2016] Häkli, P., Lidberg, M., Jivall, L., Nørbech, T., Tangen, O., Weber, M., Pihlak, P., Aleksejenko, I., and
Paršeliunas, E. The NKG2008 GPS campaign – final transformation results and a new common Nordic
reference frame. Journal of Geodetic Science, 6(1):1–33, 2016. doi:10.1515/jogs-2016-0001.
631
PROJ coordinate transformation software library, Release 7.1.1
[NTF_88] IGN. Grille de parametres de transformation de coordonnees - GR3DF97A - notice d’utilisation. Technical
Report, Service de Geodesie et Nivellement, Institut Geographique National, 1997. URL: https://geodesie.
ign.fr/contenu/fichiers/documentation/algorithmes/notice/NTG_88.pdf.
[IOGP2018] IOGP. Geomatics guidance note 7, part 2: coordinate conversions & transformations including formulas.
IOGP Publication 373-7-2, International Association For Oil And Gas Producers, 2018. URL: https://www.
iogp.org/bookstore/product/coordinate-conversions-and-transformation-including-formulas/.
[ISO19111] ISO. Geographic information – Referencing by coordinates. Standard, International Organization for
Standardization, Geneva, CH, January 2019. URL: http://docs.opengeospatial.org/as/18-005r4/18-005r4.
html.
[Jenny2015] Jenny, B., Šavrič, B., and Patterson, T. A compromise aspect-adaptive cylin-
drical projection for world maps. International Journal of Geographical Informa-
tion Science, 29(6):935–952, 2015. URL: http://www.cartography.oregonstate.edu/pdf/
2015_Jenny_etal_ACompromiseAspect-adaptiveCylindricalProjectionForWorldMaps.pdf,
doi:10.1080/13658816.2014.997734.
[Karney2011] Karney, C. F. F. Geodesics on an ellipsoid of revolution. ArXiv e-prints, 2011. arXiv:1102.1215.
[Karney2013] Karney, C. F. F. Algorithms for geodesics. Journal of Geodesy, 87(1):43–55, 2013.
doi:10.1007/s00190-012-0578-z.
[Komsta2016] Komsta, Ł. ATPOL geobotanical grid revisited – a proposal of coordinate conversion algorithms. An-
nales UMCS Sectio E Agricultura, 71(1):31–37, 2016.
[LambersKolb2012] Lambers, M. and Kolb, A. Ellipsoidal cube maps for accurate rendering of planetary-scale terrain
data. In Bregler, C., Sander, P., and Wimmer, M., editors, Pacific Graphics Short Papers. The Eurographics
Association, 2012. doi:10.2312/PE/PG/PG2012short/005-010.
[ONeilLaubscher1976] O’Neill, E. M. and Laubscher, R. E. Extended studies of a quadrilateralized spherical cube
earth data base. Tech. Rep. EPRF 3-76 (CSC), Computer Sciences Corporation, System Sciences Division,
Silver Spring, Md, 1976. URL: https://archive.org/details/DTIC_ADA026294.
[Patterson2014] Patterson, T., Šavrič, B., and Jenny, B. Introducing the Patterson cylindrical projection. Cartographic
Perspectives, 2014. doi:10.14714/CP78.1270.
[Poder1998] Poder, K. and Engsager, K. Some conformal mappings and transformations for geodesy and topographic
cartography. National Survey and Cadastre Publications, National Survey and Cadastre, Copenhagen, Den-
mark, 1998.
[Rittri2012] Rittri, M. New omerc approximations of Denmark System 34. e-mail, 2012. URL: https://lists.osgeo.org/
pipermail/proj/2012-June/005926.html.
[Ruffhead2016] Ruffhead, A. C. Introduction to multiple regression equations in datum transformations and their
reversibility. Survey Review, 50(358):82–90, 2016. doi:10.1080/00396265.2016.1244143.
[Snyder1987] Snyder, J. P. Map projections — A working manual. Professional Paper 1395, U.S. Geological Survey,
1987. doi:10.3133/pp1395.
[Snyder1988] Snyder, J. P. New equal-area map projections for noncircular regions. The American Cartographer,
15(4):341–356, 1988. doi:10.1559/152304088783886784.
[Snyder1992] Snyder, J. P. An equal-area map projection for polyhedral globes. Cartographica, 29(1):10–21, 1992.
doi:10.3138/27H7-8K88-4882-1752.
[Snyder1993] Snyder, J. P. Flattening the Earth. University of Chicago Press, 1993.
[Steers1970] Steers, J. A. An introduction to the study of map projections. University of London Press, 15th edition,
1970.
[Tobler2018] Tobler, W. A new companion for Mercator. Cartography and Geographic Information Science,
45(3):284–285, 2018. doi:10.1080/15230406.2017.1308837.
632 Bibliography
PROJ coordinate transformation software library, Release 7.1.1
[Verey2017] Verey, M. Theoretical analysis and practical consequences of adopting a model ATPOL grid as a conical
projection defining the conversion of plane coordinates to the WGS 84 ellipsoid. Fragmenta Floristica et
Geobotanica Polonica, 24(2):469–488, 2017. URL: http://bomax.botany.pl/pubs-new/#article-4279.
[Vincenty1975] Vincenty, T. Direct and inverse solutions of geodesics on the ellipsoid with application of nested
equations. Survey Review, 23(176):88–93, 1975. doi:10.1179/sre.1975.23.176.88.
[WeberMoore2013] Weber, E. D. and Moore, T. J. Corrected conversion algorithms for the CalCOFI station grid and
their implementation in several computer languages. California Cooperative Oceanic Fisheries Investiga-
tions Reports, 54:1–10, 2013. URL: http://calcofi.org/publications/calcofireports/v54/Vol_54_Weber.pdf.
[Zajac1978] Zajaç, A. Atlas of distribution of vascular plants in Poland (ATPOL). Taxon, 27(5/6):481–484, 1978.
doi:10.2307/1219899.
[Savric2015] Šavrič, B., Patterson, T., and Jenny, B. The Natural Earth II world map projection. International
Journal of Cartography, 1(2):123–133, 2015. URL: https://www.researchgate.net/publication/290447301_
The_Natural_Earth_II_world_map_projection, doi:10.1080/23729333.2015.1093312.
[Savric2018] Šavrič, B., Patterson, T., and Jenny, B. The Equal Earth map projection. International Journal of Ge-
ographical Information Science, 33(3):454–465, 2018. URL: https://www.researchgate.net/publication/
326879978_The_Equal_Earth_map_projection, doi:10.1080/13658816.2018.1504949.
Bibliography 633
PROJ coordinate transformation software library, Release 7.1.1
634 Bibliography
INDEX
Symbols +dlat=<value>
+M=<value> command line option, 303
command line option, 144 +dlon=<value>
+R=<value> command line option, 303
command line option, 73, 75, 78, 79, 81, 83, +drx=<value>
86, 88–90, 92–94, 96, 99, 100, 103, 105, 108, command line option, 305
110–114, 116–118, 120, 121, 124, 126, 128, +dry=<value>
129, 131, 135–137, 139, 140, 142, 144, 145, command line option, 305
148, 151–153, 155–157, 159, 162, 164, 166, +drz=<value>
168, 170, 171, 174–180, 182, 187, 189, 191, command line option, 305
193, 195–199, 201, 204, 206, 208, 211, 213, +ds=<value>
216, 218–228, 233, 234, 236–239, 241, 243– command line option, 305
245, 247, 249, 251, 255, 257, 260, 262, 263, +dt=<value>
266, 269, 271, 273, 275–279, 283, 284, 286 command line option, 301
+W=<value> +dx=<value>
command line option, 144, 162 command line option, 305, 312
+abridged +dy=<value>
command line option, 312 command line option, 305, 312
+algo=auto/evenden_snyder/poder_engsager +dz=<value>
command line option, 251, 265 command line option, 305, 312
+alpha=<value> +ellps=<value>
command line option, 205, 210, 263 command line option, 79, 81, 86, 94, 96, 99,
+aperture=<value> 105, 120, 121, 124, 131, 135, 141, 142, 148,
command line option, 154 150, 162, 164, 168, 170, 171, 173, 175, 182,
+approx 184, 189, 218, 231, 234, 236, 238, 239, 241,
command line option, 251, 265 243, 251, 260, 263, 266, 281, 289, 290, 309,
+azi=<value> 312, 318
command line option, 154, 159, 260 +exact
+convention=coordinate_frame/position_vectorcommand line option, 305
command line option, 304, 313 +fwd_c=<c_1,c_2,...,c_N>
+czech command line option, 310
command line option, 157 +fwd_origin=<northing,easting>
+da=<value> command line option, 310
command line option, 312 +fwd_u=<u_11,u_12,...,u_ij,..,u_mn>
+datum=<value> command line option, 310
command line option, 290 +fwd_v=<v_11,v_12,...,v_ij,..,v_mn>
+deg=<value> command line option, 310
command line option, 309 +gamma=<value>
+df=<value> command line option, 210
command line option, 312 +grid_ref=input_crs/output_crs
+dh=<value> command line option, 319
command line option, 303 +grids=<list>
635
PROJ coordinate transformation software library, Release 7.1.1
command line option, 301, 315, 317, 318 command line option, 106, 204, 205, 210,
+guam 257
command line option, 81 +lon_3=<value>
+h=<value> command line option, 106
command line option, 135, 201, 260 +lonc=<value>
+h_0=<value> command line option, 205, 210
command line option, 236 +lsat=<value>
+inv command line option, 174
command line option, 321 +m=<value>
+inv_c=<c_1,c_2,...,c_N> command line option, 206
command line option, 310 +mode=<string>
+inv_origin=<northing,easting> command line option, 154
command line option, 310 +model=<filename>
+inv_u=<u_11,u_12,...,u_ij,..,u_mn> command line option, 299
command line option, 310 +multiplier=<value>
+inv_v=<v_11,v_12,...,v_ij,..,v_mn> command line option, 317, 319
command line option, 310 +n=<value>
+k_0=<value> command line option, 129, 206, 263
command line option, 81, 105, 157, 168, 182, +no_cut
206, 210, 238, 239, 243, 245, 251, 254 command line option, 83
+lat_0=<value> +no_off
command line option, 81, 83, 86, 97, 120, command line option, 210
155, 157, 159, 162, 167, 170, 201, 210, 213, +no_rot
231, 239, 241, 243, 251, 260 command line option, 210
+lat_1=<value> +north_square
command line option, 78, 94, 103, 106, 121, command line option, 150
126, 153, 164, 167, 170, 174, 190, 192, 193, +ns
204, 205, 210, 214, 248, 257, 273, 285 command line option, 92
+lat_2=<value> +o_alpha=<value>
command line option, 78, 106, 121, 126, 153, command line option, 204
167, 190, 192, 193, 204, 205, 210, 214, 248, +o_lat_c=<value>
257, 273 command line option, 204
+lat_3=<value> +o_lat_p=<latitude>
command line option, 106 command line option, 204
+lat_b +o_lon_c=<value>
command line option, 83 command line option, 204
+lat_ts=<value> +o_lon_p=<longitude>
command line option, 81, 105, 120, 182, 234, command line option, 204
239, 276, 284 +o_proj=<projection>
+lon_0=<value> command line option, 203
command line option, 73, 75, 78, 79, 81, 83, +omit_fwd
86, 88, 89, 92–94, 97, 100, 103, 105, 108, 110– command line option, 321
114, 116–118, 120, 121, 124, 126, 128, 129, +omit_inv
131, 135–137, 139, 140, 142, 144, 145, 147, command line option, 321
150–153, 155–157, 159, 162, 164, 166, 167, +order=<list>
170, 174–180, 182, 187, 189, 191, 193, 195– command line option, 288
199, 201, 204, 206, 208, 210, 211, 213, 216, +orient=<string>
218–228, 231, 233, 234, 236–239, 241, 243– command line option, 154
245, 247, 249, 251, 254, 260, 263, 266, 269, +path=<value>
271, 273, 275–279, 281, 283–285 command line option, 174, 189
+lon_1=<value> +phdg_0=<value>
command line option, 106, 204, 205, 210, command line option, 236
257 +plat_0=<value>
+lon_2=<value> command line option, 236
636 Index
PROJ coordinate transformation software library, Release 7.1.1
+plon_0=<value> +t_final=<time>
command line option, 236 command line option, 315, 317
+px=<value> +t_in=<unit>
command line option, 313 command line option, 296
+py=<value> +t_out=<unit>
command line option, 313 command line option, 296
+pz=<value> +theta=<value>
command line option, 313 command line option, 208, 305
+q=<value> +tilt=<value>
command line option, 263 command line option, 260
+range=<value> +toff=<value>
command line option, 310 command line option, 298
+resolution=<value> +towgs84=<list>
command line option, 154 command line option, 291
+rot_xy +transpose
command line option, 147 command line option, 305
+rx=<value> +tscale=<value>
command line option, 305, 313 command line option, 298
+ry=<value> +uneg
command line option, 305, 313 command line option, 310
+rz=<value> +v_1
command line option, 305, 313 command line option, 292, 294
+s11=<value> +v_1=value
command line option, 298 command line option, 295
+s12=<value> +v_2
command line option, 298 command line option, 292, 294
+s13=<value> +v_2=value
command line option, 298 command line option, 295
+s21=<value> +v_3
command line option, 298 command line option, 292, 294
+s22=<value> +v_3=value
command line option, 298 command line option, 295
+s23=<value> +v_4
command line option, 298 command line option, 292, 294
+s31=<value> +v_4=value
command line option, 298 command line option, 295
+s32=<value> +vneg
command line option, 298 command line option, 310
+s33=<value> +x=<value>
command line option, 298 command line option, 305, 313
+s=<value> +x_0=<value>
command line option, 305, 313 command line option, 73, 75, 78, 79, 81, 83,
+south 84, 87–90, 92–94, 97, 100, 103, 105, 108–114,
command line option, 170, 260, 265 116–118, 120, 121, 124, 126–129, 131, 135–
+south_square 137, 139–142, 144, 145, 148, 150–153, 155–
command line option, 150 157, 159, 162, 164, 166, 168, 170, 171, 173–
+step 180, 182, 184, 187, 189, 191, 193, 195–199,
command line option, 321 201, 204, 206, 208, 210, 211, 213, 216, 219–
+sweep=<axis> 228, 232–237, 239, 241, 243–245, 247, 249,
command line option, 135 251, 255, 257, 260, 262, 263, 266, 269, 271,
+t_epoch=<time> 273–279, 281, 283–286
command line option, 315, 317 +xoff=<value>
+t_epoch=<value> command line option, 298
command line option, 301, 305 +xy_grids=<list>
Index 637
PROJ coordinate transformation software library, Release 7.1.1
638 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 639
PROJ coordinate transformation software library, Release 7.1.1
640 Index
PROJ coordinate transformation software library, Release 7.1.1
251, 260, 263, 266, 281, 289, 290, 309, 312, +model=<filename>, 299
318 +multiplier=<value>, 317, 319
+exact, 305 +n=<value>, 129, 206, 263
+fwd_c=<c_1,c_2,...,c_N>, 310 +no_cut, 83
+fwd_origin=<northing,easting>, 310 +no_off, 210
+fwd_u=<u_11,u_12,...,u_ij,..,u_mn>, +no_rot, 210
310 +north_square, 150
+fwd_v=<v_11,v_12,...,v_ij,..,v_mn>, +ns, 92
310 +o_alpha=<value>, 204
+gamma=<value>, 210 +o_lat_c=<value>, 204
+grid_ref=input_crs/output_crs, 319 +o_lat_p=<latitude>, 204
+grids=<list>, 301, 315, 317, 318 +o_lon_c=<value>, 204
+guam, 81 +o_lon_p=<longitude>, 204
+h=<value>, 135, 201, 260 +o_proj=<projection>, 203
+h_0=<value>, 236 +omit_fwd, 321
+inv, 321 +omit_inv, 321
+inv_c=<c_1,c_2,...,c_N>, 310 +order=<list>, 288
+inv_origin=<northing,easting>, 310 +orient=<string>, 154
+inv_u=<u_11,u_12,...,u_ij,..,u_mn>, +path=<value>, 174, 189
310 +phdg_0=<value>, 236
+inv_v=<v_11,v_12,...,v_ij,..,v_mn>, +plat_0=<value>, 236
310 +plon_0=<value>, 236
+k_0=<value>, 81, 105, 157, 168, 182, 206, 210, +px=<value>, 313
238, 239, 243, 245, 251, 254 +py=<value>, 313
+lat_0=<value>, 81, 83, 86, 97, 120, 155, 157, +pz=<value>, 313
159, 162, 167, 170, 201, 210, 213, 231, 239, +q=<value>, 263
241, 243, 251, 260 +range=<value>, 310
+lat_1=<value>, 78, 94, 103, 106, 121, 126, +resolution=<value>, 154
153, 164, 167, 170, 174, 190, 192, 193, 204, +rot_xy, 147
205, 210, 214, 248, 257, 273, 285 +rx=<value>, 305, 313
+lat_2=<value>, 78, 106, 121, 126, 153, 167, +ry=<value>, 305, 313
190, 192, 193, 204, 205, 210, 214, 248, 257, +rz=<value>, 305, 313
273 +s11=<value>, 298
+lat_3=<value>, 106 +s12=<value>, 298
+lat_b, 83 +s13=<value>, 298
+lat_ts=<value>, 81, 105, 120, 182, 234, 239, +s21=<value>, 298
276, 284 +s22=<value>, 298
+lon_0=<value>, 73, 75, 78, 79, 81, 83, 86, 88, +s23=<value>, 298
89, 92–94, 97, 100, 103, 105, 108, 110–114, +s31=<value>, 298
116–118, 120, 121, 124, 126, 128, 129, 131, +s32=<value>, 298
135–137, 139, 140, 142, 144, 145, 147, 150– +s33=<value>, 298
153, 155–157, 159, 162, 164, 166, 167, 170, +s=<value>, 305, 313
174–180, 182, 187, 189, 191, 193, 195–199, +south, 170, 260, 265
201, 204, 206, 208, 210, 211, 213, 216, 218– +south_square, 150
228, 231, 233, 234, 236–239, 241, 243–245, +step, 321
247, 249, 251, 254, 260, 263, 266, 269, 271, +sweep=<axis>, 135
273, 275–279, 281, 283–285 +t_epoch=<time>, 315, 317
+lon_1=<value>, 106, 204, 205, 210, 257 +t_epoch=<value>, 301, 305
+lon_2=<value>, 106, 204, 205, 210, 257 +t_final=<time>, 315, 317
+lon_3=<value>, 106 +t_in=<unit>, 296
+lonc=<value>, 205, 210 +t_out=<unit>, 296
+lsat=<value>, 174 +theta=<value>, 208, 305
+m=<value>, 206 +tilt=<value>, 260
+mode=<string>, 154 +toff=<value>, 298
Index 641
PROJ coordinate transformation software library, Release 7.1.1
642 Index
PROJ coordinate transformation software library, Release 7.1.1
-lP, 52 -a, 55
-l<[=id]>, 52 -f <format>, 55
-le, 52 -le, 55
-lp, 52 -lu, 55
-lu, 52 -p, 55
-r, 53 -t<a>, 55
-s, 53 -w<n>, 55
-t<a>, 52 gie, 57
-v, 53
-w<n>, 53 I
CURL_INCLUDE_DIR ignore <error code>
command line option, 31 command line option, 60
CURL_LIBRARY ISO_19111 (C++ type), 411
command line option, 31 ISO_19111_2007 (C++ type), 411
CXXFLAGS, 31 ISO_19111_2019 (C++ type), 411
ISO_19115 (C++ type), 412
D
direction <direction> O
command line option, 59 operation <+args>
command line option, 58
E OSGEO4W_ROOT, 31
echo <text> osgeo::proj::common (C++ type), 412
command line option, 60 osgeo::proj::common::Angle (C++ class), 413
ENABLE_CURL=ON osgeo::proj::common::Angle::Angle (C++
command line option, 31 function), 413
ENABLE_IPO=OFF osgeo::proj::common::DataEpoch (C++
command line option, 31 class), 413
ENABLE_TIFF=ON osgeo::proj::common::DataEpoch::coordinateEpoch
command line option, 31 (C++ function), 413
environment variable osgeo::proj::common::DateTime (C++ class),
CC, 29 413
CFLAGS, 29, 31 osgeo::proj::common::DateTime::create
CXX, 29 (C++ function), 414
CXXFLAGS, 29, 31 osgeo::proj::common::DateTime::isISO_8601
OSGEO4W_ROOT, 31 (C++ function), 414
PROJ_DEBUG, 44 osgeo::proj::common::DateTime::toString
PROJ_LIB, 13, 15, 28, 30, 43, 44, 53, 63, 66, 337, (C++ function), 414
339, 628 osgeo::proj::common::IdentifiedObject
PROJ_NETWORK, 28, 30, 44, 47, 50, 54, 66, 338 (C++ class), 414
PROJ_NETWORK_ENDPOINT, 44, 47 osgeo::proj::common::IdentifiedObject::alias
XDG_DATA_HOME, 337 (C++ function), 414
EXE_SQLITE3 osgeo::proj::common::IdentifiedObject::ALIAS_KEY
command line option, 31 (C++ member), 415
expect <x y [z [t]]> | <error code> osgeo::proj::common::IdentifiedObject::aliases
command line option, 58 (C++ function), 414
osgeo::proj::common::IdentifiedObject::DEPRECATED_K
G (C++ member), 415
general_api_design (C++ type), 410 osgeo::proj::common::IdentifiedObject::getEPSGCode
general_properties (C++ type), 410 (C++ function), 414
GeoAPI (C++ type), 412 osgeo::proj::common::IdentifiedObject::identifiers
geod command line option (C++ function), 414
-F <format>, 55 osgeo::proj::common::IdentifiedObject::IDENTIFIERS_
-I, 55 (C++ member), 415
-W<n>, 55
Index 643
PROJ coordinate transformation software library, Release 7.1.1
osgeo::proj::common::IdentifiedObject::isDeprecated
osgeo::proj::common::ObjectUsage::domains
(C++ function), 414 (C++ function), 417
osgeo::proj::common::IdentifiedObject::name
osgeo::proj::common::ObjectUsage::OBJECT_DOMAIN_KEY
(C++ function), 414 (C++ member), 417
osgeo::proj::common::IdentifiedObject::NAME_KEY
osgeo::proj::common::ObjectUsage::SCOPE_KEY
(C++ member), 415 (C++ member), 417
osgeo::proj::common::IdentifiedObject::nameStr
osgeo::proj::common::ObjectUsageNNPtr
(C++ function), 414 (C++ type), 413
osgeo::proj::common::IdentifiedObject::remarks
osgeo::proj::common::ObjectUsagePtr
(C++ function), 414 (C++ type), 413
osgeo::proj::common::Scale (C++ class), 417
osgeo::proj::common::IdentifiedObject::REMARKS_KEY
(C++ member), 415 osgeo::proj::common::Scale::Scale (C++
osgeo::proj::common::IdentifiedObjectNNPtr function), 417
(C++ type), 413 osgeo::proj::common::UnitOfMeasure (C++
osgeo::proj::common::IdentifiedObjectPtr class), 418
(C++ type), 413 osgeo::proj::common::UnitOfMeasure::ARC_SECOND
osgeo::proj::common::Length (C++ class), (C++ member), 419
415 osgeo::proj::common::UnitOfMeasure::ARC_SECOND_PER_
osgeo::proj::common::Length::Length (C++ member), 419
(C++ function), 415 osgeo::proj::common::UnitOfMeasure::code
osgeo::proj::common::Measure (C++ class), (C++ function), 418
415 osgeo::proj::common::UnitOfMeasure::codeSpace
osgeo::proj::common::Measure::_isEquivalentTo (C++ function), 418
(C++ function), 416 osgeo::proj::common::UnitOfMeasure::conversionToSI
osgeo::proj::common::Measure::convertToUnit (C++ function), 418
(C++ function), 416 osgeo::proj::common::UnitOfMeasure::DEGREE
(C++ member), 419
osgeo::proj::common::Measure::DEFAULT_MAX_REL_ERROR
(C++ member), 416 osgeo::proj::common::UnitOfMeasure::GRAD
osgeo::proj::common::Measure::getSIValue (C++ member), 419
(C++ function), 416 osgeo::proj::common::UnitOfMeasure::METRE
osgeo::proj::common::Measure::Measure (C++ member), 419
(C++ function), 416 osgeo::proj::common::UnitOfMeasure::METRE_PER_YEAR
osgeo::proj::common::Measure::operator== (C++ member), 419
(C++ function), 416 osgeo::proj::common::UnitOfMeasure::MICRORADIAN
osgeo::proj::common::Measure::unit (C++ (C++ member), 419
function), 416 osgeo::proj::common::UnitOfMeasure::name
osgeo::proj::common::Measure::value (C++ function), 418
(C++ function), 416 osgeo::proj::common::UnitOfMeasure::NONE
osgeo::proj::common::ObjectDomain (C++ (C++ member), 419
class), 416 osgeo::proj::common::UnitOfMeasure::operator!=
osgeo::proj::common::ObjectDomain::create (C++ function), 419
(C++ function), 417 osgeo::proj::common::UnitOfMeasure::operator==
(C++ function), 419
osgeo::proj::common::ObjectDomain::domainOfValidity
(C++ function), 416 osgeo::proj::common::UnitOfMeasure::PARTS_PER_MILLI
osgeo::proj::common::ObjectDomain::scope (C++ member), 419
(C++ function), 416 osgeo::proj::common::UnitOfMeasure::PPM_PER_YEAR
osgeo::proj::common::ObjectDomainNNPtr (C++ member), 419
(C++ type), 413 osgeo::proj::common::UnitOfMeasure::RADIAN
osgeo::proj::common::ObjectDomainPtr (C++ member), 419
(C++ type), 413 osgeo::proj::common::UnitOfMeasure::SCALE_UNITY
osgeo::proj::common::ObjectUsage (C++ (C++ member), 419
class), 417 osgeo::proj::common::UnitOfMeasure::SECOND
(C++ member), 419
osgeo::proj::common::ObjectUsage::DOMAIN_OF_VALIDITY_KEY
(C++ member), 417 osgeo::proj::common::UnitOfMeasure::Type
644 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 645
PROJ coordinate transformation software library, Release 7.1.1
osgeo::proj::crs::DerivedGeodeticCRS osgeo::proj::crs::EngineeringCRS::create
(C++ class), 462 (C++ function), 465
osgeo::proj::crs::DerivedGeodeticCRS::baseCRS
osgeo::proj::crs::EngineeringCRS::datum
(C++ function), 462 (C++ function), 465
osgeo::proj::crs::DerivedGeodeticCRS::create
osgeo::proj::crs::EngineeringCRSNNPtr
(C++ function), 462 (C++ type), 455
osgeo::proj::crs::DerivedGeodeticCRSNNPtr
osgeo::proj::crs::EngineeringCRSPtr
(C++ type), 455 (C++ type), 455
osgeo::proj::crs::DerivedGeodeticCRSPtr osgeo::proj::crs::GeodeticCRS (C++ class),
(C++ type), 455 465
osgeo::proj::crs::DerivedGeographicCRS osgeo::proj::crs::GeodeticCRS::create
(C++ class), 462 (C++ function), 466, 467
osgeo::proj::crs::DerivedGeographicCRS::baseCRS
osgeo::proj::crs::GeodeticCRS::datum
(C++ function), 463 (C++ function), 465
osgeo::proj::crs::DerivedGeographicCRS::create
osgeo::proj::crs::GeodeticCRS::ellipsoid
(C++ function), 463 (C++ function), 465
osgeo::proj::crs::DerivedGeographicCRSNNPtr
osgeo::proj::crs::GeodeticCRS::EPSG_4978
(C++ type), 455 (C++ member), 467
osgeo::proj::crs::DerivedGeographicCRSPtr
osgeo::proj::crs::GeodeticCRS::identify
(C++ type), 455 (C++ function), 466
osgeo::proj::crs::DerivedParametricCRS osgeo::proj::crs::GeodeticCRS::isGeocentric
(C++ class), 463 (C++ function), 466
osgeo::proj::crs::DerivedParametricCRSNNPtr
osgeo::proj::crs::GeodeticCRS::primeMeridian
(C++ type), 456 (C++ function), 465
osgeo::proj::crs::DerivedParametricCRSPtr
osgeo::proj::crs::GeodeticCRS::velocityModel
(C++ type), 456 (C++ function), 465
osgeo::proj::crs::DerivedProjectedCRS osgeo::proj::crs::GeodeticCRSNNPtr (C++
(C++ class), 463 type), 455
osgeo::proj::crs::GeodeticCRSPtr (C++
osgeo::proj::crs::DerivedProjectedCRS::baseCRS
(C++ function), 463 type), 454
osgeo::proj::crs::DerivedProjectedCRS::create
osgeo::proj::crs::GeographicCRS (C++
(C++ function), 464 class), 467
osgeo::proj::crs::DerivedProjectedCRSNNPtr
osgeo::proj::crs::GeographicCRS::coordinateSystem
(C++ type), 455 (C++ function), 468
osgeo::proj::crs::DerivedProjectedCRSPtrosgeo::proj::crs::GeographicCRS::create
(C++ type), 455 (C++ function), 468
osgeo::proj::crs::DerivedTemporalCRS osgeo::proj::crs::GeographicCRS::demoteTo2D
(C++ class), 464 (C++ function), 468
osgeo::proj::crs::DerivedTemporalCRSNNPtr
osgeo::proj::crs::GeographicCRS::EPSG_4267
(C++ type), 456 (C++ member), 469
osgeo::proj::crs::DerivedTemporalCRSPtr osgeo::proj::crs::GeographicCRS::EPSG_4269
(C++ type), 456 (C++ member), 469
osgeo::proj::crs::DerivedVerticalCRS osgeo::proj::crs::GeographicCRS::EPSG_4326
(C++ class), 464 (C++ member), 469
osgeo::proj::crs::DerivedVerticalCRS::baseCRS
osgeo::proj::crs::GeographicCRS::EPSG_4807
(C++ function), 464 (C++ member), 469
osgeo::proj::crs::DerivedVerticalCRS::create
osgeo::proj::crs::GeographicCRS::EPSG_4979
(C++ function), 464 (C++ member), 469
osgeo::proj::crs::DerivedVerticalCRSNNPtr
osgeo::proj::crs::GeographicCRS::OGC_CRS84
(C++ type), 455 (C++ member), 469
osgeo::proj::crs::DerivedVerticalCRSPtr osgeo::proj::crs::GeographicCRSNNPtr
(C++ type), 455 (C++ type), 454
osgeo::proj::crs::EngineeringCRS (C++ osgeo::proj::crs::GeographicCRSPtr (C++
class), 464 type), 454
646 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 647
PROJ coordinate transformation software library, Release 7.1.1
648 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 649
PROJ coordinate transformation software library, Release 7.1.1
650 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 651
PROJ coordinate transformation software library, Release 7.1.1
osgeo::proj::io::AuthorityFactory::getDescriptionText
osgeo::proj::io::AuthorityFactory::UnitInfo::code
(C++ function), 535 (C++ member), 542
osgeo::proj::io::AuthorityFactory::getOfficialNameFromAlias
osgeo::proj::io::AuthorityFactory::UnitInfo::convFa
(C++ function), 540 (C++ member), 542
osgeo::proj::io::AuthorityFactory::getUnitList
osgeo::proj::io::AuthorityFactory::UnitInfo::deprec
(C++ function), 536 (C++ member), 543
osgeo::proj::io::AuthorityFactory::identifyBodyFromSemiMajorAxis
osgeo::proj::io::AuthorityFactory::UnitInfo::name
(C++ function), 532 (C++ member), 542
osgeo::proj::io::AuthorityFactory::listAreaOfUseFromName
osgeo::proj::io::AuthorityFactory::UnitInfo::projSh
(C++ function), 541 (C++ member), 542
osgeo::proj::io::AuthorityFactory::ObjectType
osgeo::proj::io::AuthorityFactoryNNPtr
(C++ enum), 530 (C++ type), 528
osgeo::proj::io::AuthorityFactory::ObjectType::COMPOUND_CRS
osgeo::proj::io::AuthorityFactoryPtr
(C++ enumerator), 531 (C++ type), 528
osgeo::proj::io::AuthorityFactory::ObjectType::CONCATENATED_OPERATION
osgeo::proj::io::cloneWithProps (C++
(C++ enumerator), 531 function), 529
osgeo::proj::io::AuthorityFactory::ObjectType::CONVERSION
osgeo::proj::io::createFromUserInput
(C++ enumerator), 531 (C++ function), 529
osgeo::proj::io::DatabaseContext (C++
osgeo::proj::io::AuthorityFactory::ObjectType::COORDINATE_OPERATION
(C++ enumerator), 531 class), 543
osgeo::proj::io::AuthorityFactory::ObjectType::CRS
osgeo::proj::io::DatabaseContext::create
(C++ enumerator), 530 (C++ function), 543
osgeo::proj::io::AuthorityFactory::ObjectType::DATUM
osgeo::proj::io::DatabaseContext::getAuthorities
(C++ enumerator), 530 (C++ function), 543
osgeo::proj::io::AuthorityFactory::ObjectType::ELLIPSOID
osgeo::proj::io::DatabaseContext::getDatabaseStruct
(C++ enumerator), 530 (C++ function), 543
osgeo::proj::io::AuthorityFactory::ObjectType::GEOCENTRIC_CRS
osgeo::proj::io::DatabaseContext::getMetadata
(C++ enumerator), 531 (C++ function), 543
osgeo::proj::io::AuthorityFactory::ObjectType::GEODETIC_CRS
osgeo::proj::io::DatabaseContext::getPath
(C++ enumerator), 530 (C++ function), 543
osgeo::proj::io::AuthorityFactory::ObjectType::GEODETIC_REFERENCE_FRAME
osgeo::proj::io::DatabaseContextNNPtr
(C++ enumerator), 530 (C++ type), 528
osgeo::proj::io::AuthorityFactory::ObjectType::GEOGRAPHIC_2D_CRS
osgeo::proj::io::DatabaseContextPtr
(C++ enumerator), 531 (C++ type), 528
osgeo::proj::io::FactoryException (C++
osgeo::proj::io::AuthorityFactory::ObjectType::GEOGRAPHIC_3D_CRS
(C++ enumerator), 531 class), 543
osgeo::proj::io::AuthorityFactory::ObjectType::GEOGRAPHIC_CRS
osgeo::proj::io::FormattingException
(C++ enumerator), 531 (C++ class), 543
osgeo::proj::io::IJSONExportable (C++
osgeo::proj::io::AuthorityFactory::ObjectType::PRIME_MERIDIAN
(C++ enumerator), 530 class), 543
osgeo::proj::io::AuthorityFactory::ObjectType::PROJECTED_CRS
osgeo::proj::io::IJSONExportable::exportToJSON
(C++ enumerator), 531 (C++ function), 544
osgeo::proj::io::AuthorityFactory::ObjectType::TRANSFORMATION
osgeo::proj::io::IPROJStringExportable
(C++ enumerator), 531 (C++ class), 544
osgeo::proj::io::AuthorityFactory::ObjectType::VERTICAL_CRS
osgeo::proj::io::IPROJStringExportable::exportToPRO
(C++ enumerator), 531 (C++ function), 544
osgeo::proj::io::AuthorityFactory::ObjectType::VERTICAL_REFERENCE_FRAME
osgeo::proj::io::IPROJStringExportableNNPtr
(C++ enumerator), 530 (C++ type), 528
osgeo::proj::io::AuthorityFactory::UnitInfo
osgeo::proj::io::IPROJStringExportablePtr
(C++ struct), 542 (C++ type), 528
osgeo::proj::io::AuthorityFactory::UnitInfo::authName
osgeo::proj::io::IWKTExportable (C++
(C++ member), 542 class), 544
osgeo::proj::io::AuthorityFactory::UnitInfo::category
osgeo::proj::io::IWKTExportable::exportToWKT
(C++ member), 542 (C++ function), 545
652 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 653
PROJ coordinate transformation software library, Release 7.1.1
654 Index
PROJ coordinate transformation software library, Release 7.1.1
osgeo::proj::metadata::Identifier::authority
osgeo::proj::metadata::TemporalExtent::start
(C++ function), 429 (C++ function), 431
osgeo::proj::metadata::Identifier::AUTHORITY_KEY
osgeo::proj::metadata::TemporalExtent::stop
(C++ member), 430 (C++ function), 431
osgeo::proj::metadata::Identifier::code osgeo::proj::metadata::TemporalExtentNNPtr
(C++ function), 429 (C++ type), 425
osgeo::proj::metadata::Identifier::CODE_KEY
osgeo::proj::metadata::TemporalExtentPtr
(C++ member), 430 (C++ type), 425
osgeo::proj::metadata::Identifier::codeSpace
osgeo::proj::metadata::VerticalExtent
(C++ function), 429 (C++ class), 431
osgeo::proj::metadata::Identifier::CODESPACE_KEY
osgeo::proj::metadata::VerticalExtent::contains
(C++ member), 430 (C++ function), 431
osgeo::proj::metadata::Identifier::create
osgeo::proj::metadata::VerticalExtent::create
(C++ function), 429 (C++ function), 432
osgeo::proj::metadata::Identifier::description
osgeo::proj::metadata::VerticalExtent::intersects
(C++ function), 429 (C++ function), 431
osgeo::proj::metadata::Identifier::DESCRIPTION_KEY
osgeo::proj::metadata::VerticalExtent::maximumValue
(C++ member), 430 (C++ function), 431
osgeo::proj::metadata::Identifier::EPSG osgeo::proj::metadata::VerticalExtent::minimumValue
(C++ member), 430 (C++ function), 431
osgeo::proj::metadata::Identifier::isEquivalentName
osgeo::proj::metadata::VerticalExtent::unit
(C++ function), 429 (C++ function), 431
osgeo::proj::metadata::Identifier::OGC osgeo::proj::metadata::VerticalExtentNNPtr
(C++ member), 430 (C++ type), 425
osgeo::proj::metadata::Identifier::uri osgeo::proj::metadata::VerticalExtentPtr
(C++ function), 429 (C++ type), 425
osgeo::proj::operation (C++ type), 474
osgeo::proj::metadata::Identifier::URI_KEY
(C++ member), 430 osgeo::proj::operation::ConcatenatedOperation
osgeo::proj::metadata::Identifier::version (C++ class), 475
(C++ function), 429 osgeo::proj::operation::ConcatenatedOperation::crea
osgeo::proj::metadata::Identifier::VERSION_KEY (C++ function), 476
(C++ member), 430 osgeo::proj::operation::ConcatenatedOperation::crea
osgeo::proj::metadata::IdentifierNNPtr (C++ function), 476
(C++ type), 425 osgeo::proj::operation::ConcatenatedOperation::grid
osgeo::proj::metadata::IdentifierPtr (C++ function), 476
(C++ type), 425 osgeo::proj::operation::ConcatenatedOperation::inve
osgeo::proj::metadata::PositionalAccuracy (C++ function), 476
(C++ class), 430 osgeo::proj::operation::ConcatenatedOperation::oper
(C++ function), 476
osgeo::proj::metadata::PositionalAccuracy::create
(C++ function), 430 osgeo::proj::operation::ConcatenatedOperationNNPtr
(C++ type), 475
osgeo::proj::metadata::PositionalAccuracy::value
(C++ function), 430 osgeo::proj::operation::ConcatenatedOperationPtr
osgeo::proj::metadata::PositionalAccuracyNNPtr (C++ type), 475
(C++ type), 425 osgeo::proj::operation::Conversion (C++
osgeo::proj::metadata::PositionalAccuracyPtr class), 476
(C++ type), 425 osgeo::proj::operation::Conversion::convertToOtherM
osgeo::proj::metadata::TemporalExtent (C++ function), 477
(C++ class), 430 osgeo::proj::operation::Conversion::create
osgeo::proj::metadata::TemporalExtent::contains(C++ function), 477, 478
(C++ function), 431 osgeo::proj::operation::Conversion::createAlbersEqu
osgeo::proj::metadata::TemporalExtent::create (C++ function), 480
(C++ function), 431 osgeo::proj::operation::Conversion::createAmericanP
(C++ function), 498
osgeo::proj::metadata::TemporalExtent::intersects
(C++ function), 431 osgeo::proj::operation::Conversion::createAxisOrder
Index 655
PROJ coordinate transformation software library, Release 7.1.1
656 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 657
PROJ coordinate transformation software library, Release 7.1.1
658 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 659
PROJ coordinate transformation software library, Release 7.1.1
660 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 661
PROJ coordinate transformation software library, Release 7.1.1
662 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 663
PROJ coordinate transformation software library, Release 7.1.1
664 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 665
PROJ coordinate transformation software library, Release 7.1.1
666 Index
PROJ coordinate transformation software library, Release 7.1.1
Index 667