Compare commits

...
89 Commits
Author SHA1 Message Date
Kristian Evers 0f2922e1bb Update documentation for 9.3.1 release 2023-12-01 20:22:25 +01:00
Kristian Evers d24521611e Update NEWS for 9.3.1 2023-11-26 16:55:53 +01:00
Kristian Evers bd00bf31b5 Update man-pages from Sphinx-docs 2023-11-26 16:22:00 +01:00
Kristian Evers b3dcb78bef Update man-pages from Sphinx-docs 2023-11-26 16:12:34 +01:00
Kristian Evers 64a7e2ec1a Update version numbers for 9.3.1 release 2023-11-26 16:10:51 +01:00
Even Rouault 24922a0146 Merge pull request #3968 from OSGeo/backport-3966-to-9.3
[Backport 9.3] DatabaDatabase: update to EPSG 10.098
2023-11-24 15:59:28 +01:00
Even Rouault 21eaf1e305 Merge pull request #3967 from OSGeo/backport-3965-to-9.3
[Backport 9.3] Database: ESRI: fix wrong definition of Geographic 3D CRS that were imported as 2D
2023-11-24 15:10:50 +01:00
Even Rouault 553c96329f DatabaDatabase: update to EPSG 10.098 2023-11-24 12:57:27 +00:00
Even Rouault 495a84cb21 Database: ESRI: fix wrong definition of Geographic 3D CRS that were imported as 2D 2023-11-24 12:57:02 +00:00
Even Rouault 92762140d7 Merge pull request #3961 from OSGeo/backport-3960-to-9.3
[Backport 9.3] horner: allow arbitrary input type of coordinate
2023-11-23 04:58:20 +01:00
Even Rouault af74bc1954 horner: allow arbitrary input type of coordinate
Avoids workaround of https://lists.osgeo.org/pipermail/proj/2023-November/011167.html
to be able to deal with geographic coordinates
2023-11-22 13:18:32 +00:00
Even Rouault 9ac24b04a6 Merge pull request #3958 from OSGeo/backport-3957-to-9.3
[Backport 9.3] Make sure test of 1f9b636b0a is actually run
2023-11-19 23:24:30 +01:00
Even Rouault 548823527b Make sure test of 1f9b636b0a is actually run 2023-11-19 20:36:47 +00:00
Even Rouault 36bb10c0d4 Merge pull request #3956 from OSGeo/backport-3955-to-9.3
[Backport 9.3] Move static NameSpace::GLOBAL definition in static.cpp to avoid 'static initialization fiasco' (fixes various Coverity warnings)
2023-11-19 21:06:28 +01:00
Even Rouault 72de8f757c Fix importing '+proj=topocentric ... +type=crs' by using a geocentric CRS as the base CRS
Fixes https://lists.osgeo.org/pipermail/proj/2023-October/011153.html
2023-11-19 20:18:03 +01:00
Even Rouault 5106abdd64 Move static NameSpace::GLOBAL definition in static.cpp to avoid 'static initialization fiasco' (fixes various Coverity warnings) 2023-11-19 19:10:33 +00:00
Even Rouault c0a118f46d Merge pull request #3954 from rouault/backport_pr_3952
[Backport 9.3] pj_get_suggested_operation(): tune it to give correct result for RGAF09 to RRAF 1991 / UTM zone 20N + Guadeloupe 1988 height transformation
2023-11-17 13:05:10 +01:00
Even Rouault 93a42eb2d9 pj_get_suggested_operation(): tune it to give correct result for RGAF09 to RRAF 1991 / UTM zone 20N + Guadeloupe 1988 height transformation 2023-11-17 11:13:21 +01:00
Even Rouault d33156974b Merge pull request #3950 from OSGeo/backport-3949-to-9.3
[Backport 9.3] proj_factor: fix when input is a compound CRS of a projected CRS, and…
2023-11-14 19:37:13 +01:00
Even Rouault dc01f9c4ff proj: projection factors: fix when input is a compound CRS of a projected CRS, and a projected CRS whose datum has a non-Greenwich prime meridian 2023-11-13 21:44:17 +00:00
Even Rouault e04c6a6c64 proj_factor: fix when input is a compound CRS of a projected CRS, and a projected CRS whose datum has a non-Greenwich prime meridian 2023-11-13 21:44:17 +00:00
Even Rouault ab34bf583e Merge pull request #3944 from OSGeo/backport-3941-to-9.3
[Backport 9.3] Database: resync ESRI objects with https://github.com/Esri/projectionengine-db-doc at tag v3.2.0
2023-11-11 15:11:18 +01:00
Even Rouault a29c310785 Merge pull request #3943 from OSGeo/backport-3940-to-9.3
[Backport 9.3] createOperations(): fix bad PROJ pipeline when converting between Geog3D with non-metre height to CompoundCRS
2023-11-04 23:11:05 +01:00
Even Rouault aaad5eb851 [Backport 9.3] createOperations(): Fix possible null dereference on invalid WKT input (#3946) 2023-11-04 23:10:54 +01:00
Even Rouault bf9f3470b7 Database: resync ESRI objects with https://github.com/Esri/projection-engine-db-doc at tag v3.2.0 (fixes #3939) 2023-11-03 10:20:42 +00:00
Even Rouault 3b0008a353 createOperations(): fix bad PROJ pipeline when converting between Geog3D with non-metre height to CompoundCRS (fixes #3938) 2023-11-03 09:55:33 +00:00
Even Rouault 0ab04d4c7d Vertical unit conversion: improve output for ft <--> us-ft 2023-11-03 09:55:33 +00:00
Even Rouault f939fb7f29 PROJString exporter: more unitconvert related simplifications 2023-11-03 09:55:33 +00:00
Even Rouault 19b1a160ef Merge pull request #3934 from OSGeo/backport-3929-to-9.3
[Backport 9.3] createOperations(): fix issue with a obscure case involving CompoundCRS of unknown horizontal datum + boundCRS of vertical
2023-10-30 17:21:34 +01:00
Even Rouault 16c00d783f Merge pull request #3933 from OSGeo/backport-3926-to-9.3
[Backport 9.3] WKT1 parser: in non-strict mode, accept missing UNIT[] in GEOGCS, GEOCCS, PROJCS and VERT_CS elements (fixes #3925)
2023-10-30 17:21:23 +01:00
Even Rouault 44b6fc36d7 createOperations(): fix issue with a obscure case involving CompoundCRS of unknown horizontal datum + boundCRS of vertical (fixes #3927) 2023-10-27 19:50:25 +00:00
Even Rouault 618d905ee6 WKT1 parser: in non-strict mode, accept missing UNIT[] in GEOGCS, GEOCCS, PROJCS and VERT_CS elements (fixes #3925) 2023-10-27 19:49:55 +00:00
Even Rouault 224577966b Merge pull request #3931 from OSGeo/backport-3930-to-9.3
[Backport 9.3] Add Pix4D in users.rst - Proprietary licensed software
2023-10-20 16:54:13 +02:00
Javier Jimenez Shaw 35b7aa6073 Add Pix4D in users.rst - Proprietary licensed software 2023-10-20 14:42:08 +00:00
Javier Jimenez Shaw 09419f0895 allow LOCAL_CS with 3 axes 2023-10-19 21:41:30 +02:00
Javier Jimenez Shaw 91b1f4d952 Add GCG2016 German geoid model file in sql (#3920)
* Add GCG2016 German geoid model file in sql

* update PROJ_DATA.VERSION to 1.16
2023-10-14 21:16:38 +02:00
Even Rouault eda031a714 Merge pull request #3919 from OSGeo/backport-3918-to-9.3
[Backport 9.3] GeographicBoundingBox::intersects(): avoid infinite recursion and stack overflow on invalid bounding boxes
2023-10-13 18:40:41 +02:00
Even Rouault a871ac530b GeographicBoundingBox::intersects(): avoid infinite recursion and stack overflow on invalid bounding boxes
Very similar to bugfix of 8409e8e03e
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=60084
2023-10-12 19:33:48 +00:00
Even Rouault aa110d8785 Merge pull request #3917 from OSGeo/backport-3912-to-9.3
[Backport 9.3] Database: update to EPSG 10.096
2023-10-03 15:01:29 +02:00
Even Rouault 584e97a70b Merge pull request #3916 from OSGeo/backport-3911-to-9.3
[Backport 9.3] Test suite: fix to make it pass with ENABLE_TIFF=OFF (fixes #3900)
2023-10-02 10:28:15 +02:00
Even Rouault 2b06a219b9 Merge pull request #3915 from OSGeo/backport-3910-to-9.3
[Backport 9.3] createOperations(): fix GeogCRS 3D with TOWGS84 to geocentric CRS (fixes #3909)
2023-10-02 10:28:02 +02:00
Even Rouault f64db67b02 [Backport 9.3] Doc: give all EPSG potential names for lon_0/lat_0/x_0/y_0 (fixes #3904) (#3914) 2023-10-02 10:27:46 +02:00
Even Rouault c714f1e6e3 Database: update to EPSG 10.096 2023-10-02 08:27:41 +00:00
Even Rouault 435e752fad CI: add testing for -DENABLE_TIFF=OFF 2023-09-30 13:37:47 +00:00
Even Rouault f0b6dcd4f9 Test suite: fix to make it pass with ENABLE_TIFF=OFF (fixes #3900) 2023-09-30 13:37:47 +00:00
Even Rouault 1b2b98a393 createOperations(): fix GeogCRS 3D with TOWGS84 to geocentric CRS (fixes #3909) 2023-09-30 13:37:19 +00:00
積丹尼 Dan Jacobson 7ffc601575 Update faq.rst to mention geod (#3895)
See https://github.com/OSGeo/PROJ/issues/2644
2023-09-30 15:31:51 +02:00
Even Rouault 202de09be0 Merge pull request #3899 from OSGeo/backport-3897-to-9.3
[Backport 9.3] Add Javier as PSC member [skip ci]
2023-09-28 16:40:31 +02:00
Even Rouault 5de9fe397e Merge pull request #3901 from jidanni/patch-22
Update projections.rst
2023-09-24 13:43:49 +02:00
積丹尼 Dan Jacobson 92de07cc7f Update projections.rst
S/he means meters.
2023-09-24 05:26:07 -05:00
Javier Jimenez Shaw 3f97f63a94 Add Javier as PSC member [skip ci] 2023-09-20 10:14:19 +00:00
Kristian Evers 744021af84 Merge pull request #3896 from jidanni/patch-11
Improve grammar in cct.rst
2023-09-20 12:12:24 +02:00
積丹尼 Dan Jacobson 0c97ca4fb6 Update cct.rst
Grammar.
2023-09-20 04:15:50 -05:00
Even Rouault 1b2d6e5118 Merge pull request #3893 from OSGeo/rouault-patch-3
helmert.rst: remove outdated :since: and deprecation
2023-09-17 17:39:17 +02:00
Even Rouault c4d97b407c helmert.rst: remove outdated :since: and deprecation
versions 5.0 and 5.2 are ancient. No need to add to the cognitive load of the reader
2023-09-14 20:50:19 +02:00
Even Rouault f6bcc680f7 Merge pull request #3892 from OSGeo/backport-3888-to-9.3
[Backport 9.3] proj.db opening: allow opening with a URI (typically for memvfs) (fixes #3887)
2023-09-14 10:37:24 +02:00
Even Rouault cac2dd1309 Merge pull request #3891 from OSGeo/backport-3889-to-9.3
[Backport 9.3] setargv.obj is not available on uwp
2023-09-14 10:37:12 +02:00
Even Rouault c7588b02cd proj.db opening: allow opening with a URI (typically for memvfs) (fixes #3887) 2023-09-13 21:29:34 +00:00
Leander Schulten ef0d659014 setargv.obj is not available on uwp 2023-09-13 18:05:51 +00:00
Even Rouault 53e67739ff Merge pull request #3886 from OSGeo/backport-3878-to-9.3
[Backport 9.3] cs2cs: fix handling of input coordinates in grad (fixes #3800)
2023-09-13 19:24:21 +02:00
Even Rouault 992edc5846 Merge pull request #3885 from OSGeo/backport-3877-to-9.3
[Backport 9.3] Doc: projections.rst: document Order of applications of parameters (fixes #3875)
2023-09-13 19:24:10 +02:00
Even Rouault 303df3071f GeographicCRS::_isEquivalentTo(): follow-up fix for #3879 to avoid behaviour breakage in GDAL 2023-09-07 11:13:19 +02:00
Even Rouault 4c1621747c Fix GIGS 5102.2 (fixes #3800) 2023-09-06 22:36:00 +00:00
Even Rouault 274e16027b cs2cs: fix handling of input coordinates in grad (fixes #3800) 2023-09-06 22:36:00 +00:00
Even Rouault 85ec28f5ab Doc: projections.rst: document Order of applications of parameters (fixes #3875) 2023-09-06 22:35:32 +00:00
Even Rouault 4d31e759f6 Doc: add source_file extension (borrowed from GDAL, credits to @dbaston) 2023-09-06 22:35:32 +00:00
Even Rouault 93868c1a08 Merge pull request #3883 from OSGeo/backport-3879-to-9.3
[Backport 9.3] isEquivalentTo(): make a datum name 'unknown' equivalent to another one
2023-09-07 00:33:14 +02:00
Even Rouault fd5caa1879 Merge pull request #3882 from OSGeo/backport-3880-to-9.3
[Backport 9.3] Ellipsoid::_isEquivalentTo(): fix so that an ellipsoid of semi-major …
2023-09-07 00:33:06 +02:00
Even Rouault 9f99f305db Merge pull request #3881 from OSGeo/backport-3876-to-9.3
[Backport 9.3] CoordinateOperationFactory: deal with CompoundToCompound with a horizontal similarity transformation and a ballpark vertical (fixes #3854)
2023-09-07 00:32:59 +02:00
Even Rouault 882376e2c4 isEquivalentTo(): make a datum name 'unknown' equivalent to another one
Fixes https://lists.osgeo.org/pipermail/proj/2023-September/011126.html
2023-09-05 09:21:28 +00:00
Even Rouault 069e46384f Ellipsoid::_isEquivalentTo(): fix so that an ellipsoid of semi-major axis A (and non-zero inv flattening) isn't equivalent to a sphere of radius A...
or to another ellipsoid of same semi-major axis but defined from a semi-minor axis and not inverse flattening

Discovered when debugging corner cases of https://github.com/OSGeo/PROJ/pull/3879 ...
2023-09-05 08:11:39 +00:00
Even Rouault b9051b8b74 proj_crs_to_crs(): tune ordering of operations based on areas, and also for operations with unknown accuracy (fixes #3854) 2023-09-05 08:11:16 +00:00
Even Rouault e3c1e923d0 CoordinateOperationFactory: deal with CompoundToCompound with a horizontal similarity transformation and a ballpark vertical (fixes #3854) 2023-09-05 08:11:16 +00:00
Even Rouault bc8cbd8276 Improve debugging code 2023-09-05 08:11:16 +00:00
積丹尼 Dan Jacobson 707dd9ff80 Always use the cleanest examples.
Move repetitive default into text explanation.

P.S., maybe one day even consider changing the
default +ellps=GRS80 to +ellps=WGS84... but no big deal...
2023-09-03 21:14:20 +02:00
Howard Butlerand積丹尼 Dan Jacobson 7b3b638b6f Doc updates from jidanni (#3858)
* Update nzmg.rst

Here I am taking a guess at which grid this is referring to and thus trying to make it clearer.

* Update transformation.rst

Note: I have only mentioned that the +'s went away.

Apparently the author is using +init files here, and showing only their contents.

However even if the user placed the example snippets seen in the boxes into files in the current directory,
there is no complete working example!

I am saying that earlier in this book, the user was able to run the examples shown.

But now if the user wishes to continue running them, he has to put the +'s back,

or use some special syntax that you haven't shown yet in a complete working example!

* Always use the cleanest examples.

Move repetitive default into text explanation.

P.S., maybe one day even consider changing the
default +ellps=GRS80 to +ellps=WGS84... but no big deal...

* Update docs/source/apps/proj.rst

* Update x_0.rst

These are meters and one cannot just use e.g., +units to change it.

* Remove redundant optional default parameters!

We get the exact same answer without the clutter that doesn't make things any more clearer.

* 50 U.S. isn't grammatical

P.S., perhaps add a reference to where this projection came from.

* Remove parameter that is default anyway

Make example less cluttered.

* Update cart.rst

Simplify via defaults.

* Can remove default parameter.

Shorten string by removing redundancies.

* Update som.rst showing relation of the two lines

Mentioning how the two lines are related.

* Update rhealpix.rst

Got rid of
- default -f setting

Eliminated ellipse emphasis and just used the default.

* Update geoc.rst

Defaults shown clear as day at the bottom of the page already.

* Update topocentric.rst

Wipe off items that aren't the focus of the issue and don't affect outcome here.

* Update unitconvert.rst

Use and explain defaults.
One day this page should mention what the default time etc. units are too.

* Update set.rst

Simplify by removing default parameters.

* Update push.rst

Eliminate default reuse, getting same calculation.

* Update xyzgridshift.rst

Don't repeat defaults.

* Update vertoffset.rst

GRS80 already implied and documented.

* Update hgridshift.rst

Reduce chance of too wide example going off the screen!

* Update geogoffset.rst

Add '+' to match rest of book.

* Update differences.rst

Add actual EOF notation.

* Update helmert.rst

Reduce horizontal scrolling, at least on desktop.

Also one day maybe add '+' before each... or maybe not.

* Update defmodel.rst

Example causes scrolling horizontally, even on desktop.

* Update bertin1953.rst

Remove src.

* Update cass.rst

- Less horizontal scrolling, which was seen even on desktop.
- Zapped default meter parameter.

* Update s2.rst

Clean off testing residue.

Perhaps one day also hyperlink
"Quadrilateralized Spherical Cube"
page.

* Update tmerc.rst

Trimming defaults reduces horizontal scrolling.

* Update y_0.rst

These are meters and one cannot just use e.g., +units to change it.

* Update unitconvert.rst

Mention defaults.
I only listed the ones I know.
The rest I didn't list.

---------

Co-authored-by: 積丹尼 Dan Jacobson <jidanni@jidanni.org>
2023-09-03 21:14:20 +02:00
Even Rouault e5169f9af1 Merge pull request #3874 from OSGeo/backport-3873-to-9.3
[Backport 9.3] ESRI WKT import: normalize GCS_unknown to unknown and D_unknown to unknown (fixes #3871)
2023-09-03 16:03:33 +02:00
Mike Taves c76f17f63c Update CITATION.cff 2023-09-03 20:55:04 +12:00
Even Rouault f3d54fa0be ESRI WKT import: normalize GCS_unknown to unknown and D_unknown to unknown (fixes #3871) 2023-09-02 08:14:05 +00:00
Even Rouault 9b553e227a Merge pull request #3872 from OSGeo/backport-3869-to-9.3
[Backport 9.3] Fix build error with MSVC 2019 in /std:c++20 on NN_NO_CHECK()
2023-09-02 10:06:31 +02:00
Even Rouault e372d23d9b windows.yml: test C++20 compilation 2023-09-01 17:32:46 +00:00
Even Rouault a7bdb77d57 NN_NO_CHECK() macro: fix it to work with MSVC 2019 in /std:c++20 mode
(fixes #3868)

For some weird reason, the previous definition of the macro didn't work
when used from lambdas.
2023-09-01 17:32:46 +00:00
Even Rouault e4a2a492f3 Merge pull request #3870 from OSGeo/backport-3867-to-9.3
[Backport 9.3] ITRF2008: fix wrong sign for 'dry' parameter of EURA and EURA_T
2023-09-01 19:09:23 +02:00
Kristian Evers 5cecc48556 docs: update git branch and date 2023-09-01 14:22:11 +02:00
Even Rouault ea3c7e84eb ITRF2008: fix wrong sign for 'dry' parameter of EURA and EURA_T 2023-09-01 12:01:47 +00:00
Kristian Evers c530dad029 Update website for 9.3.0 release 2023-09-01 12:01:09 +02:00
Even Rouault 08f394ea30 Merge pull request #3866 from OSGeo/backport-3864-to-9.3
[Backport 9.3] JSON export: avoid non-significant decimal digits in version field (fixes #3863)
2023-08-29 17:10:25 +02:00
Even Rouault 847423fe42 JSON import: reduce number of significant decimal digits when parsing id.version field (fixes #3863, reworks previous commit) 2023-08-28 15:23:24 +00:00
Even Rouault 19cda6a061 JSON export: avoid non-significant decimal digits in version field (fixes #3863) 2023-08-28 15:23:24 +00:00
109 changed files with 4584 additions and 2096 deletions
+18 -3
View File
@@ -17,6 +17,21 @@ jobs:
clang_linux:
runs-on: ubuntu-latest
env:
PROJ_CMAKE_BUILD_OPTIONS: ${{ matrix.PROJ_CMAKE_BUILD_OPTIONS }}
strategy:
fail-fast: false
matrix:
include:
- name: Regular
id: regular
PROJ_CMAKE_BUILD_OPTIONS: ""
- name: Without TIFF
id: without_tiff
PROJ_CMAKE_BUILD_OPTIONS: "-DENABLE_TIFF=OFF"
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
@@ -28,8 +43,8 @@ jobs:
with:
path: |
${{ github.workspace }}/ccache.tar.gz
key: ${{ runner.os }}-cache-clang-${{ github.run_id }}
restore-keys: ${{ runner.os }}-cache-clang-
key: ${{ runner.os }}-cache-clang-${{ matrix.id }}-${{ github.run_id }}
restore-keys: ${{ runner.os }}-cache-clang-${{ matrix.id }}-
- name: Run
run: docker run -e CI -e TRAVIS_BUILD_DIR="$PWD" -e WORK_DIR="$PWD" -e TRAVIS_OS_NAME=linux -e BUILD_NAME=linux_clang -v $PWD:$PWD ubuntu:20.04 $PWD/.github/workflows/clang_linux/start.sh
run: docker run -e CI -e TRAVIS_BUILD_DIR="$PWD" -e PROJ_CMAKE_BUILD_OPTIONS="$PROJ_CMAKE_BUILD_OPTIONS" -e WORK_DIR="$PWD" -e TRAVIS_OS_NAME=linux -e BUILD_NAME=linux_clang -v $PWD:$PWD ubuntu:20.04 $PWD/.github/workflows/clang_linux/start.sh
+3 -1
View File
@@ -61,7 +61,9 @@ jobs:
mkdir %PROJ_BUILD%
cd %PROJ_BUILD%
set PROJ_DIR=%GITHUB_WORKSPACE%\proj_dir
cmake -DCMAKE_BUILD_TYPE="${{ env.BUILD_TYPE }}" -DBUILD_SHARED_LIBS="${{ env.BUILD_SHARED_LIBS }}" -DCMAKE_C_FLAGS="/WX" -DCMAKE_CXX_FLAGS="/WX" -DCMAKE_TOOLCHAIN_FILE=c:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_INSTALL_PREFIX="%PROJ_DIR%" -DPROJ_DB_CACHE_DIR=%PROJ_DB_CACHE_DIR% ..
# Not directly linked to BUILD_SHARED_LIBS, but a way to test different C++ standard versions
if "${{ env.BUILD_SHARED_LIBS }}"=="ON" (set EXTRA_CXX_FLAGS="/std:c++20")
cmake -DCMAKE_BUILD_TYPE="${{ env.BUILD_TYPE }}" -DBUILD_SHARED_LIBS="${{ env.BUILD_SHARED_LIBS }}" -DCMAKE_C_FLAGS="/WX" -DCMAKE_CXX_FLAGS="/WX %EXTRA_CXX_FLAGS%" -DCMAKE_TOOLCHAIN_FILE=c:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_INSTALL_PREFIX="%PROJ_DIR%" -DPROJ_DB_CACHE_DIR=%PROJ_DB_CACHE_DIR% ..
ninja -v
ninja install
dir %PROJ_DIR%\bin
+2 -2
View File
@@ -2,8 +2,8 @@ cff-version: 1.2.0
message: Please cite this software using these metadata or in the CITATION file.
type: software
title: PROJ
version: 9.2.0
date-released: 2023-03-01
version: 9.3.0
date-released: 2023-09-01
doi: 10.5281/zenodo.5884394
abstract: PROJ is a generic coordinate transformation software that transforms
geospatial coordinates from one coordinate reference system (CRS) to another.
+1 -1
View File
@@ -115,7 +115,7 @@ message(STATUS "Configuring PROJ:")
#PROJ version information
################################################################################
include(ProjVersion)
proj_version(MAJOR 9 MINOR 3 PATCH 0)
proj_version(MAJOR 9 MINOR 3 PATCH 1)
set(PROJ_SOVERSION 25)
set(PROJ_BUILD_VERSION "${PROJ_SOVERSION}.${PROJ_VERSION}")
+67
View File
@@ -1,3 +1,70 @@
9.3.1 Release Notes
-------------------
Updates
-------
o Update to EPSG 10.098 (#3968)
o Update ESRI objects to v3.2.0 (#3944)
Bug fixes
---------
o ITRF2008: fix wrong sign for 'dry' parameter of EURA and EURA_T (#3870)
o Fix build error with MSVC 2019 in /std:c++20 on NN_NO_CHECK() (#3872)
o ESRI WKT import: normalize GCS_unknown to unknown and D_unknown to unknown (#3874)
o CoordinateOperationFactory: deal with CompoundToCompound with a horizontal similarity
transformation and a ballpark vertical (#3881)
o Ellipsoid::_isEquivalentTo(): fix so that an ellipsoid of semi-major axis A (and
non-zero inv flattening) isn't equivalent to a sphere of radius A (#3882)
o isEquivalentTo(): make a datum name 'unknown' equivalent to another one (#3883)
o cs2cs: fix handling of input coordinates in grad (#3886)
o Make setargv.obj available on Universal Windows Platform (#3891)
o Allow opening proj.db with a URI (#3892)
o createOperations(): fix GeogCRS 3D with TOWGS84 to geocentric CRS (#3915)
o Fix test suite so that it can pass with ENABLE_TIFF=OFF (#3916)
o GeographicBoundingBox::intersects(): avoid infinite recursion and stack overflow
on invalid bounding boxes (#3919)
o Fix importing '+proj=topocentric ... +type=crs' by using a geocentric CRS as
the base CRS (#3924)
o Allow LOCAL_CS with 3 axes (#3928)
o WKT1 parser: in non-strict mode, accept missing UNIT[] in GEOGCS, GEOCCS,
PROJCS and VERT_CS elements (#3933)
o createOperations(): fix issue with a obscure case involving CompoundCRS of
unknown horizontal datum + boundCRS of vertical (#3934)
o createOperations(): fix bad PROJ pipeline when converting between Geog3D
with non-metre height to CompoundCRS (#3943)
o createOperations(): Fix possible null dereference on invalid WKT input (#3946)
o proj_factor: fix when input is a compound CRS of a projected CRS (#3950)
o pj_get_suggested_operation(): tune it to give correct result for RGAF09 to
RRAF 1991 / UTM zone 20N + Guadeloupe 1988 height transformation (#3954)
o Move static NameSpace::GLOBAL definition in static.cpp to avoid
'static initialization fiasco' (#3956)
o horner: allow arbitrary input type of coordinate (#3961)
9.3.0 Release Notes
-------------------
+8 -3
View File
@@ -3,10 +3,15 @@
#
function(proj_test_set_properties TESTNAME)
set_property(TEST ${TESTNAME}
PROPERTY ENVIRONMENT
"PROJ_SKIP_READ_USER_WRITABLE_DIRECTORY=YES"
set(_env "PROJ_SKIP_READ_USER_WRITABLE_DIRECTORY=YES"
"PROJ_DATA=${PROJ_BINARY_DIR}/data/for_tests")
if(TIFF_ENABLED)
set(_env ${_env} "TIFF_ENABLED=YES")
else()
set(_env ${_env} "TIFF_ENABLED=NO")
endif()
set_property(TEST ${TESTNAME}
PROPERTY ENVIRONMENT ${_env})
endfunction()
function(proj_add_test_script_sh SH_NAME BIN_USE)
+2 -2
View File
@@ -42,7 +42,7 @@
<CARB> +proj=helmert +drx=0.000049 +dry=-0.001088 +drz=0.000664 +convention=position_vector
<EURA> +proj=helmert +drx=-0.000083 +dry=0.000534 +drz=0.000750 +convention=position_vector
<EURA> +proj=helmert +drx=-0.000083 +dry=-0.000534 +drz=0.000750 +convention=position_vector
<INDI> +proj=helmert +drx=0.001232 +dry=0.000303 +drz=0.001540 +convention=position_vector
@@ -75,7 +75,7 @@
<CARB_T> +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.000049 +dry=-0.001088 +drz=0.000664 +convention=position_vector
<EURA_T> +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000083 +dry=0.000534 +drz=0.000750 +convention=position_vector
<EURA_T> +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000083 +dry=-0.000534 +drz=0.000750 +convention=position_vector
<INDI_T> +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.001232 +dry=0.000303 +drz=0.001540 +convention=position_vector
+13
View File
@@ -726,6 +726,9 @@ INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1361','Zero Hidrográfi
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1365','NAD83(CSRS)v8','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1365','NAD83(CSRS) 2010','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1366','COV23-IRF','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1367','BBT2000','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1367','Brenner basistunnel','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1367','Galleria di base del Brennero','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21100','Genuk / NEIEZ','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','2140','NAD83(CSRS98) / SCoPQ zone 3','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','2141','NAD83(CSRS98) / SCoPQ zone 4','EPSG');
@@ -7940,3 +7943,13 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22821','NAD83(CSRS) 2010
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22822','NAD83(CSRS) 2010 / UTM zone 22N','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','10471','ETRS89 / COV23 SnakeGrid','EPSG');
INSERT INTO "alias_name" VALUES('compound_crs','EPSG','10472','ETRS89 / COV23 SnakeGrid + Newlyn height','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4162','1011','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4162','Korean 1985 - LatLon','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4926','1008','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4926','KGD2002 - XYZ','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4927','1007','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4927','KGD2002 - LatLonEHt','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4737','1009','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4737','KGD2002 - LatLon','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5193','1010','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5193','KVD1964 - NOHt','EPSG');
+8
View File
@@ -844,6 +844,14 @@ INSERT INTO "compound_crs" VALUES('EPSG','10365','KGD2002 + KVD1964 height',NULL
INSERT INTO "usage" VALUES('EPSG','20149','compound_crs','EPSG','10365','EPSG','3266','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10472','COV23 Grid + ODN height',NULL,'EPSG','10471','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','20315','compound_crs','EPSG','10472','EPSG','4743','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10497','RGF93 v2 / Lambert-93 + NGF-IGN69 height',NULL,'EPSG','9793','EPSG','5720',0);
INSERT INTO "usage" VALUES('EPSG','20475','compound_crs','EPSG','10497','EPSG','1326','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','10498','RGF93 v2 / Lambert-93 + NGF-IGN78 height',NULL,'EPSG','9793','EPSG','5721',0);
INSERT INTO "usage" VALUES('EPSG','20473','compound_crs','EPSG','10498','EPSG','1327','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','10499','RGF93 v2b / Lambert-93 + NGF-IGN69 height',NULL,'EPSG','9794','EPSG','5720',0);
INSERT INTO "usage" VALUES('EPSG','20472','compound_crs','EPSG','10499','EPSG','1326','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','10500','RGF93 v2b / Lambert-93 + NGF-IGN78 height',NULL,'EPSG','9794','EPSG','5721',0);
INSERT INTO "usage" VALUES('EPSG','20476','compound_crs','EPSG','10500','EPSG','1327','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','20001','ETRS89 + SVD2006 height',NULL,'EPSG','4258','EPSG','20000',0);
INSERT INTO "usage" VALUES('EPSG','17956','compound_crs','EPSG','20001','EPSG','4058','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','20003','MWC18 Grid + ODN height',NULL,'EPSG','20002','EPSG','5701',0);
+381 -379
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -465,3 +465,4 @@ INSERT INTO "deprecation" VALUES('compound_crs','EPSG','5834','EPSG','9930','EPS
INSERT INTO "deprecation" VALUES('compound_crs','EPSG','5835','EPSG','9931','EPSG');
INSERT INTO "deprecation" VALUES('compound_crs','EPSG','9924','EPSG','10293','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','8395','EPSG','10285','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','10480','EPSG','10481','EPSG');
+1989 -1283
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -1032,7 +1032,7 @@ INSERT INTO "extent" VALUES('EPSG','2052','World - N hemisphere - 24°W to 18°W
INSERT INTO "extent" VALUES('EPSG','2053','World - S hemisphere - 24°W to 18°W - by country','Between 24°W and 18°W, southern hemisphere between 80°S and equator, onshore and offshore.',-80.0,0.0,-24.0,-18.0,0);
INSERT INTO "extent" VALUES('EPSG','2054','World - N hemisphere - 18°W to 12°W - by country','Between 18°W and 12°W, northern hemisphere between equator and 84°N, onshore and offshore. Gambia. Greenland. Guinea. Guinea-Bissau. Iceland. Ireland - offshore Porcupine Basin. Mauritania. Morocco. Senegal. Sierra Leone. Western Sahara.',0.0,84.0,-18.0,-12.0,0);
INSERT INTO "extent" VALUES('EPSG','2055','World - S hemisphere - 18°W to 12°W - by country','Between 18°W and 12°W, southern hemisphere between 80°S and equator, onshore and offshore.',-80.0,0.0,-18.0,-12.0,0);
INSERT INTO "extent" VALUES('EPSG','2056','World - N hemisphere - 12°W to 6°W - by country','Between 12°W and 6°W, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Côte D''Ivoire (Ivory Coast). Faroe Islands. Guinea. Ireland. Jan Mayen. Mali. Mauritania. Morocco. Portugal. Sierra Leone. Spain. United Kingdom (UK). Western Sahara.',0.0,84.0,-12.0,-6.0,0);
INSERT INTO "extent" VALUES('EPSG','2056','World - N hemisphere - 12°W to 6°W - by country','Between 12°W and 6°W, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Côte D''Ivoire (Ivory Coast). Faroe Islands. Guinea. Ireland. Jan Mayen. Liberia, Mali. Mauritania. Morocco. Portugal. Sierra Leone. Spain. United Kingdom (UK). Western Sahara.',0.0,84.01,-12.01,-6.0,0);
INSERT INTO "extent" VALUES('EPSG','2057','World - S hemisphere - 12°W to 6°W - by country','Between 12°W and 6°W, southern hemisphere between 80°S and equator, onshore and offshore.',-80.0,0.0,-12.0,-6.0,0);
INSERT INTO "extent" VALUES('EPSG','2058','World - N hemisphere - 6°W to 0°W - by country','Between 6°W and 0°W, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Burkina Faso. Côte'' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK).',0.0,84.0,-6.0,0.0,0);
INSERT INTO "extent" VALUES('EPSG','2059','World - S hemisphere - 6°W to 0°W - by country','Between 6°W and 0°W, southern hemisphere between 80°S and equator, onshore and offshore.',-80.0,0.0,-6.0,0.0,0);
@@ -3719,3 +3719,4 @@ INSERT INTO "extent" VALUES('EPSG','4740','Spain - Melilla','Spain - Melilla ons
INSERT INTO "extent" VALUES('EPSG','4741','Spain - Alboran','Spain - Alboran island - onshore.',35.88,36.0,-3.1,-2.96,0);
INSERT INTO "extent" VALUES('EPSG','4742','Netherlands - offshore and nearshore ','Netherlands - offshore North Sea and nearshore.',51.32,55.77,2.53,7.21,0);
INSERT INTO "extent" VALUES('EPSG','4743','UK - Coventry','United Kingdom (UK) - in and around the area of Coventry city centre and the route to Birmingham airport.',52.3,52.5,-1.85,-1.3,0);
INSERT INTO "extent" VALUES('EPSG','4744','Europe - Brenner','Austria and Italy - on or related to the Brenner Base Tunnel rail route from Innsbruck to Fortezza (Franzensfeste).',46.45,47.33,11.04,11.91,0);
+6
View File
@@ -2276,6 +2276,12 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','10414','NAD83(CSRS)v8',NULL,'geographi
INSERT INTO "usage" VALUES('EPSG','20156','geodetic_crs','EPSG','10414','EPSG','1061','EPSG','1183');
INSERT INTO "geodetic_crs" VALUES('EPSG','10468','COV23-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1366',NULL,0);
INSERT INTO "usage" VALUES('EPSG','20311','geodetic_crs','EPSG','10468','EPSG','4743','EPSG','1141');
INSERT INTO "geodetic_crs" VALUES('EPSG','10473','BBT2000',NULL,'geocentric','EPSG','6500','EPSG','1367',NULL,0);
INSERT INTO "usage" VALUES('EPSG','20338','geodetic_crs','EPSG','10473','EPSG','4744','EPSG','1285');
INSERT INTO "geodetic_crs" VALUES('EPSG','10474','BBT2000',NULL,'geographic 3D','EPSG','6423','EPSG','1367',NULL,0);
INSERT INTO "usage" VALUES('EPSG','20339','geodetic_crs','EPSG','10474','EPSG','4744','EPSG','1285');
INSERT INTO "geodetic_crs" VALUES('EPSG','10475','BBT2000',NULL,'geographic 2D','EPSG','6422','EPSG','1367',NULL,0);
INSERT INTO "usage" VALUES('EPSG','20331','geodetic_crs','EPSG','10475','EPSG','4744','EPSG','1183');
INSERT INTO "geodetic_crs" VALUES('EPSG','20033','MWC18-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1324',NULL,0);
INSERT INTO "usage" VALUES('EPSG','18335','geodetic_crs','EPSG','20033','EPSG','4666','EPSG','1141');
INSERT INTO "geodetic_crs" VALUES('EPSG','20039','SIRGAS-Chile 2021',NULL,'geocentric','EPSG','6500','EPSG','1327',NULL,0);
+2
View File
@@ -422,6 +422,8 @@ INSERT INTO "geodetic_datum" VALUES('EPSG','1365','North American Datum of 1983
INSERT INTO "usage" VALUES('EPSG','20140','geodetic_datum','EPSG','1365','EPSG','1061','EPSG','1027');
INSERT INTO "geodetic_datum" VALUES('EPSG','1366','COV23 Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2023-01-01',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','20309','geodetic_datum','EPSG','1366','EPSG','4743','EPSG','1141');
INSERT INTO "geodetic_datum" VALUES('EPSG','1367','Brenner Base Tunnel 2000',NULL,'EPSG','7030','EPSG','8901','2000-01-01',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','20337','geodetic_datum','EPSG','1367','EPSG','4744','EPSG','1285');
INSERT INTO "geodetic_datum" VALUES('EPSG','6001','Not specified (based on Airy 1830 ellipsoid)',NULL,'EPSG','7001','EPSG','8901',NULL,NULL,NULL,NULL,1);
INSERT INTO "usage" VALUES('EPSG','13422','geodetic_datum','EPSG','6001','EPSG','1263','EPSG','1213');
INSERT INTO "geodetic_datum" VALUES('EPSG','6002','Not specified (based on Airy Modified 1849 ellipsoid)',NULL,'EPSG','7002','EPSG','8901',NULL,NULL,NULL,NULL,1);
+4 -1
View File
@@ -87,7 +87,7 @@ VALUES
('PE7783V2.gsb','ca_nrc_PE7783V2.tif','PE7783V2.GSB','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/ca_nrc_PE7783V2.tif',1,1,NULL),
('SK27-98.gsb','ca_nrc_SK27-98.tif','SK27-98.GSB','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/ca_nrc_SK27-98.tif',1,1,NULL),
('SK83-98.gsb','ca_nrc_SK83-98.tif','SK83-98.GSB','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/ca_nrc_SK83-98.tif',1,1,NULL),
('TOR27CSv1.GSB','ca_nrc_TO27CSv1.tif','TO27CSv1.GSB','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/ca_nrc_TO27CSv1.tif',1,1,NULL),
('TO27CSv1.GSB','ca_nrc_TO27CSv1.tif','TO27CSv1.GSB','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/ca_nrc_TO27CSv1.tif',1,1,NULL),
('NAD83v6VG.gvb','ca_nrc_NAD83v6VG.tif',NULL,'GTiff','velocity_grid',0,NULL,'https://cdn.proj.org/ca_nrc_NAD83v6VG.tif',1,1,NULL),
('NAD83v70VG.gvb','ca_nrc_NAD83v70VG.tif',NULL,'GTiff','velocity_grid',0,NULL,'https://cdn.proj.org/ca_nrc_NAD83v70VG.tif',1,1,NULL),
@@ -105,6 +105,9 @@ VALUES
-- de_adv - Arbeitsgemeinschaft der Vermessungsverwaltungender der Länder der Bundesrepublik Deutschland (AdV)
('BETA2007.gsb','de_adv_BETA2007.tif','BETA2007.gsb','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/de_adv_BETA2007.tif',1,1,NULL),
-- de_bkg - Bundesamt für Kartographie und Geodäsie (BKG)
('GCG2016.txt','de_bkg_gcg2016.tif',NULL,'GTiff','geoid_like',0,NULL,'https://cdn.proj.org/de_bkg_gcg2016.tif',1,1,NULL),
-- de_geosn - Staatsbetrieb Geobasisinformation und Vermessung Sachsen GeoSN
('NTv2_SN.gsb','de_geosn_NTv2_SN.tif','NTv2_SN.gsb','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/de_geosn_NTv2_SN.tif',1,1,NULL),
+2 -2
View File
@@ -602,7 +602,7 @@ INSERT INTO "grid_transformation" VALUES('EPSG','9106','ATS77 to NAD83(CSRS)v6 (
INSERT INTO "usage" VALUES('EPSG','10920','grid_transformation','EPSG','9106','EPSG','2313','EPSG','1027');
INSERT INTO "grid_transformation" VALUES('EPSG','9107','NAD27 to NAD83(CSRS)v3 (5)','Derived through NAD83(CSRS)v3 but within accuracy of transformation may be assumed to apply to any version. For Toronto use NAD27 to NAD83(CSRS) (6) (CT code 9108).','EPSG','9615','NTv2','EPSG','4267','EPSG','8240',1.5,'EPSG','8656','Latitude and longitude difference file','ON27CSv1.GSB',NULL,NULL,NULL,NULL,NULL,NULL,'LIO-Can Ont ex Tor',0);
INSERT INTO "usage" VALUES('EPSG','10921','grid_transformation','EPSG','9107','EPSG','4537','EPSG','1027');
INSERT INTO "grid_transformation" VALUES('EPSG','9108','NAD27 to NAD83(CSRS)v3 (6)','Derived through NAD83(CSRS)v3 but within accuracy of transformation may be assumed to apply to any version. For Ontario excluding Toronto use NAD27 to NAD83(CSRS) (5) (CT code 9107). Also found with file name TO27CSv1.GSB','EPSG','9615','NTv2','EPSG','4267','EPSG','8240',1.0,'EPSG','8656','Latitude and longitude difference file','TOR27CSv1.GSB',NULL,NULL,NULL,NULL,NULL,NULL,'LIO-Can Ont Tor',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9108','NAD27 to NAD83(CSRS)v3 (6)','Derived through NAD83(CSRS)v3 but within accuracy of transformation may be assumed to apply to any version. For Ontario excluding Toronto use NAD27 to NAD83(CSRS) (5) (CT code 9107). Previously available from Land Information Ontario as TOR27CSv1.GSB.','EPSG','9615','NTv2','EPSG','4267','EPSG','8240',1.0,'EPSG','8656','Latitude and longitude difference file','TO27CSv1.GSB',NULL,NULL,NULL,NULL,NULL,NULL,'LIO-Can Ont Tor',0);
INSERT INTO "usage" VALUES('EPSG','10922','grid_transformation','EPSG','9108','EPSG','4536','EPSG','1027');
INSERT INTO "grid_transformation" VALUES('EPSG','9109','NAD27(76) to NAD83(CSRS)v3 (1)','Derived through NAD83(CSRS)v3 but within accuracy of transformation may be assumed to apply to any version.','EPSG','9615','NTv2','EPSG','4608','EPSG','8240',1.0,'EPSG','8656','Latitude and longitude difference file','ON76CSv1.GSB',NULL,NULL,NULL,NULL,NULL,NULL,'LIO-Can Ont',0);
INSERT INTO "usage" VALUES('EPSG','10923','grid_transformation','EPSG','9109','EPSG','1367','EPSG','1027');
@@ -1604,7 +1604,7 @@ INSERT INTO "grid_transformation" VALUES('EPSG','15944','NEA74 Noumea to RGNC91-
INSERT INTO "usage" VALUES('EPSG','11955','grid_transformation','EPSG','15944','EPSG','2823','EPSG','1027');
INSERT INTO "grid_transformation" VALUES('EPSG','15947','IGN72 Grande Terre to RGNC91-93 (6)','Emulation using NTv2 method of tfm IGN72 Grande Terre to RGNC91-93 (4) (code 15945).','EPSG','9615','NTv2','EPSG','4662','EPSG','4749',0.1,'EPSG','8656','Latitude and longitude difference file','RGNC1991_IGN72GrandeTerre.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'ESRI-Ncl 0.1m',1);
INSERT INTO "usage" VALUES('EPSG','11958','grid_transformation','EPSG','15947','EPSG','2822','EPSG','1031');
INSERT INTO "grid_transformation" VALUES('EPSG','15948','DHDN to ETRS89 (8)','Developed for ATKIS (Amtliches Topographisch-Kartographisches Informationssystem [Official Topographic and Cartographic Information System]). Provides a uniform transformation across the whole country. May be used as tfm to WGS84 - see tfm code 15949.','EPSG','9615','NTv2','EPSG','4314','EPSG','4258',0.9,'EPSG','8656','Latitude and longitude difference file','BETA2007.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BKG-Deu BeTA2007',0);
INSERT INTO "grid_transformation" VALUES('EPSG','15948','DHDN to ETRS89 (8)','Developed for ATKIS (Amtliches Topographisch-Kartographisches Informationssystem [Official Topographic and Cartographic Information System]). Provides a uniform transformation across the whole country. May be used as tfm to WGS 84 - see tfm code 15949.','EPSG','9615','NTv2','EPSG','4314','EPSG','4258',0.9,'EPSG','8656','Latitude and longitude difference file','BETA2007.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BKG-Deu BeTA2007',0);
INSERT INTO "usage" VALUES('EPSG','11959','grid_transformation','EPSG','15948','EPSG','3339','EPSG','1041');
INSERT INTO "grid_transformation" VALUES('EPSG','15949','DHDN to WGS 84 (4)','These parameter values are taken from DHDN to ETRS89 (8) (code 15948) as ETRS89 may be considered equivalent to WGS 84 within the accuracy of the transformation.','EPSG','9615','NTv2','EPSG','4314','EPSG','4326',1.0,'EPSG','8656','Latitude and longitude difference file','BETA2007.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Deu BeTA2007',0);
INSERT INTO "usage" VALUES('EPSG','11960','grid_transformation','EPSG','15949','EPSG','3339','EPSG','1252');
+18 -26
View File
@@ -370,8 +370,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','1224','SAD69 to WGS 84 (13)'
INSERT INTO "usage" VALUES('EPSG','8145','helmert_transformation','EPSG','1224','EPSG','1251','EPSG','1160');
INSERT INTO "helmert_transformation" VALUES('EPSG','1225','Sapper Hill 1943 to WGS 84 (1)','Derived at 5 stations. Accuracy 1m in each axis.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4292','EPSG','4326',2.0,-355.0,21.0,72.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'DMA-Flk E',0);
INSERT INTO "usage" VALUES('EPSG','8146','helmert_transformation','EPSG','1225','EPSG','2355','EPSG','1160');
INSERT INTO "helmert_transformation" VALUES('EPSG','1226','Schwarzeck to WGS 84 (1)','Derived at 3 stations. Accuracy 20m in each axis.
Beware! Source CRS uses German legal metres, transformation parameter values are in (International) metres. See tfm code 1271 for example.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4293','EPSG','4326',35.0,616.0,97.0,-251.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'DMA-Nam',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','1226','Schwarzeck to WGS 84 (1)','Derived at 3 stations. Accuracy 20m in each axis. Beware! Source CRS uses German legal metres, transformation parameter values are in (International) metres. See tfm code 1271 for example.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4293','EPSG','4326',35.0,616.0,97.0,-251.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'DMA-Nam',0);
INSERT INTO "usage" VALUES('EPSG','8147','helmert_transformation','EPSG','1226','EPSG','1169','EPSG','1160');
INSERT INTO "helmert_transformation" VALUES('EPSG','1227','Tananarive to WGS 84 (1)','Accuracy estimate not available.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4297','EPSG','4326',999.0,-189.0,-242.0,-91.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'DMA-Mdg',0);
INSERT INTO "usage" VALUES('EPSG','8148','helmert_transformation','EPSG','1227','EPSG','1149','EPSG','1160');
@@ -555,8 +554,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','1333','EST92 to WGS 84 (1)',
INSERT INTO "usage" VALUES('EPSG','8254','helmert_transformation','EPSG','1333','EPSG','3246','EPSG','1024');
INSERT INTO "helmert_transformation" VALUES('EPSG','1334','Pulkovo 1942 to WGS 84 (12)','','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4284','EPSG','4326',9.0,21.58719,-97.54127,-60.92546,'EPSG','9001',-1.01378,-0.58117,-0.2348,'EPSG','9104',-4.6121,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'UT-Est',0);
INSERT INTO "usage" VALUES('EPSG','8255','helmert_transformation','EPSG','1334','EPSG','3246','EPSG','1024');
INSERT INTO "helmert_transformation" VALUES('EPSG','1437','RT90 to ETRS89 (1)','Derived at 22 points in 1993. Replaced by RT90 to SWEREF99 (1) (code 1895) from 2001.
This transformation is actually between ETRS89 and RR92. RR92 is a geographic 3D CRS where the horizontal component is RT90.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4124','EPSG','4258',0.5,419.3836,99.3335,591.3451,'EPSG','9001',-0.850389,-1.817277,7.862238,'EPSG','9104',-0.99496,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NLS-Swe',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','1437','RT90 to ETRS89 (1)','Derived at 22 points in 1993. Replaced by RT90 to SWEREF99 (1) (code 1895) from 2001. This transformation is actually between ETRS89 and RR92. RR92 is a geographic 3D CRS where the horizontal component is RT90.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4124','EPSG','4258',0.5,419.3836,99.3335,591.3451,'EPSG','9001',-0.850389,-1.817277,7.862238,'EPSG','9104',-0.99496,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NLS-Swe',0);
INSERT INTO "usage" VALUES('EPSG','8358','helmert_transformation','EPSG','1437','EPSG','1225','EPSG','1035');
INSERT INTO "helmert_transformation" VALUES('EPSG','1438','Fahud to WGS 84 (2)','','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','4232','EPSG','4326',25.0,-333.102,-11.02,230.69,'EPSG','9001',0.0,0.0,0.554,'EPSG','9104',0.219,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'PDO-Omn',0);
INSERT INTO "usage" VALUES('EPSG','8359','helmert_transformation','EPSG','1438','EPSG','4009','EPSG','1136');
@@ -968,8 +966,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','1805','Garoua to WGS 72BE (1
INSERT INTO "usage" VALUES('EPSG','8726','helmert_transformation','EPSG','1805','EPSG','2590','EPSG','1216');
INSERT INTO "helmert_transformation" VALUES('EPSG','1806','Kousseri to WGS 72BE (1)','Derived in 1981 by Decca Survey France for Elf Serepca.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4198','EPSG','4324',5.0,-104.4,-136.6,201.2,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ELF-Cmr',0);
INSERT INTO "usage" VALUES('EPSG','8727','helmert_transformation','EPSG','1806','EPSG','2591','EPSG','1216');
INSERT INTO "helmert_transformation" VALUES('EPSG','1807','Pulkovo 1942 to WGS 84 (13)','Derived via WGS72 values taken from SOCAR Magnavox 1502 manual. Used by AIOC 1995-1997 then replaced by the AIOC97 values (tfm code 1808).
Do not confuse with AIOC95 vertical datum as used in southern Caspian Sea and at Sangachal terminal by AIOC.','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','4284','EPSG','4326',10.0,27.0,-135.0,-84.5,'EPSG','9001',0.0,0.0,0.554,'EPSG','9104',0.2263,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'BP-Aze Aioc95',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','1807','Pulkovo 1942 to WGS 84 (13)','Derived via WGS72 values taken from SOCAR Magnavox 1502 manual. Used by AIOC 1995-1997 then replaced by the AIOC97 values (tfm code 1808). Do not confuse with AIOC95 vertical datum as used in southern Caspian Sea and at Sangachal terminal by AIOC.','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','4284','EPSG','4326',10.0,27.0,-135.0,-84.5,'EPSG','9001',0.0,0.0,0.554,'EPSG','9104',0.2263,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'BP-Aze Aioc95',0);
INSERT INTO "usage" VALUES('EPSG','8728','helmert_transformation','EPSG','1807','EPSG','1038','EPSG','1136');
INSERT INTO "helmert_transformation" VALUES('EPSG','1808','Pulkovo 1942 to WGS 84 (14)','Mean of 3 stations in western Georgia, 4 stations in eastern Georgia and 4 stations in eastern Azerbaijan. Derived for use on AIOC early oil western export pipeline, but adopted for all AIOC work replacing the 1995 AIOC transformation (code 1807).','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','4284','EPSG','4326',5.0,686.1,-123.5,-574.4,'EPSG','9001',8.045,-23.366,10.791,'EPSG','9104',-2.926,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'BP-Aze Aioc97',0);
INSERT INTO "usage" VALUES('EPSG','8729','helmert_transformation','EPSG','1808','EPSG','2593','EPSG','1136');
@@ -1433,8 +1430,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','4830','Amersfoort to ETRS89
INSERT INTO "usage" VALUES('EPSG','9123','helmert_transformation','EPSG','4830','EPSG','1275','EPSG','1035');
INSERT INTO "helmert_transformation" VALUES('EPSG','4831','Amersfoort to ETRS89 (6)','Replaces Amersfoort to ETRS89 (4) (tfm code 15740). Dutch sources also quote an equivalent transformation using the Coordinate Frame 7-parameter method - see tfm code 4830.','EPSG','9636','Molodensky-Badekas (CF geog2D domain)','EPSG','4289','EPSG','4258',0.5,593.0248,25.9984,478.7459,'EPSG','9001',1.9342,-1.6677,9.1019,'EPSG','9109',4.0725,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3903453.1482,368135.3134,5012970.3051,'EPSG','9001','NCG-Nld 2008 MB',0);
INSERT INTO "usage" VALUES('EPSG','9124','helmert_transformation','EPSG','4831','EPSG','1275','EPSG','1035');
INSERT INTO "helmert_transformation" VALUES('EPSG','4832','Mexico ITRF92 to WGS 84 (1)','Approximation at the +/- 1m level assuming that Mexico ITRF92 is equivalent to WGS 84.
','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4483','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Mex',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','4832','Mexico ITRF92 to WGS 84 (1)','Approximation at the +/- 1m level assuming that Mexico ITRF92 is equivalent to WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4483','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Mex',0);
INSERT INTO "usage" VALUES('EPSG','9125','helmert_transformation','EPSG','4832','EPSG','1160','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','4833','Amersfoort to WGS 84 (4)','Parameter values from Amersfoort to ETRS89 (5) (tfm code 4830) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation. Replaces Amersfoort to WGS 84 (3) (code 15934).','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4289','EPSG','4326',1.0,565.4171,50.3319,465.5524,'EPSG','9001',1.9342,-1.6677,9.1019,'EPSG','9109',4.0725,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Nld 2008',0);
INSERT INTO "usage" VALUES('EPSG','9126','helmert_transformation','EPSG','4833','EPSG','1275','EPSG','1252');
@@ -1564,18 +1560,15 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','5350','Campo Inchauspe to PO
INSERT INTO "usage" VALUES('EPSG','9351','helmert_transformation','EPSG','5350','EPSG','3215','EPSG','1045');
INSERT INTO "helmert_transformation" VALUES('EPSG','5351','POSGAR 2007 to WGS 84 (1)','Approximation at the +/- 1m level assuming that POSGAR 2007 is equivalent to WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5340','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-Arg',0);
INSERT INTO "usage" VALUES('EPSG','9352','helmert_transformation','EPSG','5351','EPSG','1033','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','5374','MARGEN to WGS 84 (1)','Approximation at the +/- 1m level assuming that MARGEN is equivalent to WGS 84.
','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5354','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Bol',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','5374','MARGEN to WGS 84 (1)','Approximation at the +/- 1m level assuming that MARGEN is equivalent to WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5354','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Bol',0);
INSERT INTO "usage" VALUES('EPSG','9354','helmert_transformation','EPSG','5374','EPSG','1049','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','5375','SIRGAS-Chile to WGS 84 (1)','','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','9184','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Chl',1);
INSERT INTO "usage" VALUES('EPSG','9355','helmert_transformation','EPSG','5375','EPSG','1066','EPSG','1041');
INSERT INTO "helmert_transformation" VALUES('EPSG','5376','CR05 to WGS 84 (1)','','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5365','EPSG','4326',1.5,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Cri',0);
INSERT INTO "usage" VALUES('EPSG','9356','helmert_transformation','EPSG','5376','EPSG','1074','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','5377','MACARIO SOLIS to WGS 84 (1)','Approximation at the +/- 1m level assuming that MACARIO SOLIS is equivalent to WGS 84.
','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5371','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Pan',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','5377','MACARIO SOLIS to WGS 84 (1)','Approximation at the +/- 1m level assuming that MACARIO SOLIS is equivalent to WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5371','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Pan',0);
INSERT INTO "usage" VALUES('EPSG','9357','helmert_transformation','EPSG','5377','EPSG','1186','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','5378','Peru96 to WGS 84 (1)','Approximation at the +/- 1m level assuming that Peru96 is equivalent to WGS 84.
','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5373','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Per',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','5378','Peru96 to WGS 84 (1)','Approximation at the +/- 1m level assuming that Peru96 is equivalent to WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5373','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Per',0);
INSERT INTO "usage" VALUES('EPSG','9358','helmert_transformation','EPSG','5378','EPSG','1189','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','5384','SIRGAS-ROU98 to WGS 84 (1)','Approximation at the +/- 1m level assuming that SIRGAS-ROU98 is equivalent to WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5381','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Ury',0);
INSERT INTO "usage" VALUES('EPSG','9359','helmert_transformation','EPSG','5384','EPSG','1247','EPSG','1252');
@@ -1747,8 +1740,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','6314','ITRF97 to GDA94 (1)',
INSERT INTO "usage" VALUES('EPSG','9715','helmert_transformation','EPSG','6314','EPSG','1036','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','6315','ITRF2000 to GDA94 (1)','Replaced by Dawson and Woods transformation of 2010, tfm code 6278.','EPSG','1056','Time-dependent Coordinate Frame rotation (geocen)','EPSG','4919','EPSG','4938',0.1,-0.0761,-0.0101,0.0444,'EPSG','9001',0.008765,0.009361,0.009325,'EPSG','9104',0.007935,'EPSG','9202',0.011,-0.0045,-0.0174,'EPSG','1042',0.001034,0.000671,0.001039,'EPSG','1043',-0.000538,'EPSG','1041',2000.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'GA-Aus 2001',0);
INSERT INTO "usage" VALUES('EPSG','9716','helmert_transformation','EPSG','6315','EPSG','1036','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','6373','Mexico ITRF2008 to WGS 84 (1)','Approximation at the +/- 1m level assuming that Mexico ITRF2008 is equivalent to WGS 84.
','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','6365','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Mex',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','6373','Mexico ITRF2008 to WGS 84 (1)','Approximation at the +/- 1m level assuming that Mexico ITRF2008 is equivalent to WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','6365','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Mex',0);
INSERT INTO "usage" VALUES('EPSG','9720','helmert_transformation','EPSG','6373','EPSG','1160','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','6388','Ocotepeque 1935 to NAD27 (1)','','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','5451','EPSG','4267',9.0,205.435,-29.099,292.202,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'DMA-Cri',1);
INSERT INTO "usage" VALUES('EPSG','9728','helmert_transformation','EPSG','6388','EPSG','3876','EPSG','1153');
@@ -1934,8 +1926,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','7676','MGI 1901 to WGS 84 (1
INSERT INTO "usage" VALUES('EPSG','10208','helmert_transformation','EPSG','7676','EPSG','4543','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','7697','Egypt 1907 to WGS 84 (4)','Derived at 30 stations throughout Egypt 1907 network. Accuracy determined at 15 stations 0.7m in each axis. Unified transformation for whole country.','EPSG','9636','Molodensky-Badekas (CF geog2D domain)','EPSG','4229','EPSG','4326',1.2,-127.535,113.495,-12.7,'EPSG','9001',1.603747,-0.153612,-5.364408,'EPSG','9104',5.33745,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4854969.728,2945552.013,2868447.61,'EPSG','9001','SRI-Egy',0);
INSERT INTO "usage" VALUES('EPSG','10214','helmert_transformation','EPSG','7697','EPSG','1086','EPSG','1041');
INSERT INTO "helmert_transformation" VALUES('EPSG','7698','NAD27 to WGS 84 (89)','Derived at stations in the provinces of Colón, Panamá, Coclé, Veraguas,
Herrera, Los Santos y Chiriquí. Standard deviation 0.871m in north and 0.531m in east.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4267','EPSG','4326',1.0,-32.3841359,180.4090461,120.8442577,'EPSG','9001',2.1545854,0.1498782,-0.5742915,'EPSG','9104',8.1049164,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGNTG-Pan',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','7698','NAD27 to WGS 84 (89)','Derived at stations in the provinces of Colón, Panamá, Coclé, Veraguas, Herrera, Los Santos y Chiriquí. Standard deviation 0.871m in north and 0.531m in east.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4267','EPSG','4326',1.0,-32.3841359,180.4090461,120.8442577,'EPSG','9001',2.1545854,0.1498782,-0.5742915,'EPSG','9104',8.1049164,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGNTG-Pan',0);
INSERT INTO "usage" VALUES('EPSG','10215','helmert_transformation','EPSG','7698','EPSG','3290','EPSG','1041');
INSERT INTO "helmert_transformation" VALUES('EPSG','7702','PZ-90 to PZ-90.02 (1)','','EPSG','1066','Time-specific Coordinate Frame rotation (geocen)','EPSG','4922','EPSG','7677',0.17,-1.07,-0.03,0.02,'EPSG','9001',0.0,0.0,-130.0,'EPSG','1031',-0.22,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2002.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'MTD-Rus',0);
INSERT INTO "usage" VALUES('EPSG','10217','helmert_transformation','EPSG','7702','EPSG','1262','EPSG','1027');
@@ -2341,13 +2332,13 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','9082','ITRF2008 to ITRF96 (2
INSERT INTO "usage" VALUES('EPSG','10896','helmert_transformation','EPSG','9082','EPSG','1175','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','9083','ITRF2014 to ITRF96 (2)','Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m. Used as first step in ITRF2014 to NZGD2000 concatenated operations, followed by application of NZGD2000 deformation model.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','7789','EPSG','4917',0.01,6.4,3.99,-14.27,'EPSG','1025',-0.16508,0.26897,0.11984,'EPSG','1031',1.08901,'EPSG','1028',0.79,-0.6,-1.44,'EPSG','1027',-0.01347,0.01514,0.01973,'EPSG','1032',-0.07201,'EPSG','1030',2000.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'LINZ-Nzl 2014',0);
INSERT INTO "usage" VALUES('EPSG','10897','helmert_transformation','EPSG','9083','EPSG','1175','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','9126','NAD83(CSRS)v2 to NAD83(CORS96) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF96 by common transformations (codes 6864 and 8259). 6864 defines CORS96 from 1st January 1997 to 31st December 1999.','EPSG','1065','Time-specific Position Vector transform (geocen)','EPSG','8233','EPSG','6781',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1997.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9126','NAD83(CSRS)v2 to NAD83(CORS96) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF96 by common transformations (codes 6864 and 8259). 6864 defines CORS96 from 1st January 1997 to 31st December 1999.','EPSG','1033','Position Vector transformation (geocentric domain)','EPSG','8233','EPSG','6781',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "usage" VALUES('EPSG','10940','helmert_transformation','EPSG','9126','EPSG','4544','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','9127','NAD83(CSRS)v3 to NAD83(CORS96) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF97 by common transformations (codes 6865 and 8260). 6865 defines CORS96 from 1st January 2000 to 31st December 2001.','EPSG','1065','Time-specific Position Vector transform (geocen)','EPSG','8238','EPSG','6781',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1997.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9127','NAD83(CSRS)v3 to NAD83(CORS96) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF97 by common transformations (codes 6865 and 8260). 6865 defines CORS96 from 1st January 2000 to 31st December 2001.','EPSG','1033','Position Vector transformation (geocentric domain)','EPSG','8238','EPSG','6781',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "usage" VALUES('EPSG','10941','helmert_transformation','EPSG','9127','EPSG','4544','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','9128','NAD83(CSRS)v4 to NAD83(CORS96) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF2000 by common transformations (codes 6866 and 8261). 6866 defines CORS96 from 1st January 2002 to 6th September 2011.','EPSG','1065','Time-specific Position Vector transform (geocen)','EPSG','8242','EPSG','6781',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2002.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9128','NAD83(CSRS)v4 to NAD83(CORS96) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF2000 by common transformations (codes 6866 and 8261). 6866 defines CORS96 from 1st January 2002 to 6th September 2011.','EPSG','1033','Position Vector transformation (geocentric domain)','EPSG','8242','EPSG','6781',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "usage" VALUES('EPSG','10942','helmert_transformation','EPSG','9128','EPSG','4544','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','9129','NAD83(CSRS)v6 to NAD83(2011) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF2008 by common transformations (codes 7807 and 8264).','EPSG','1065','Time-specific Position Vector transform (geocen)','EPSG','8250','EPSG','6317',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','9129','NAD83(CSRS)v6 to NAD83(2011) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF2008 by common transformations (codes 7807 and 8264).','EPSG','1033','Position Vector transformation (geocentric domain)','EPSG','8250','EPSG','6317',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "usage" VALUES('EPSG','10943','helmert_transformation','EPSG','9129','EPSG','4544','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','9142','MGI 1901 to KOSOVAREF01 (1)','Derived at 18 points across the area of Kosovo. May be taken as approximate transformation MGI 1901 to WGS 84 (see code 9143).','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','3906','EPSG','9140',1.0,628.54052,192.2538,498.43507,'EPSG','9001',-13.79189,-0.81467,41.21533,'EPSG','9104',-17.40368,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'KCA-Kos',0);
INSERT INTO "usage" VALUES('EPSG','10951','helmert_transformation','EPSG','9142','EPSG','4542','EPSG','1027');
@@ -2641,10 +2632,12 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','10344','Nord Sahara 1959 to
INSERT INTO "usage" VALUES('EPSG','19854','helmert_transformation','EPSG','10344','EPSG','4382','EPSG','1136');
INSERT INTO "helmert_transformation" VALUES('EPSG','10415','ITRF2020 to NAD83(CSRS)v8 (1)','Concatenation of joint Canada-US tfm NAD83>ITRF96 (see tfm code 8259) with IGS value for ITRF96>ITRF97 and IERS values for ITRF97>ITRF2020 transformations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','9988','EPSG','10412',0.0,1.0039,-1.90961,-0.54117,'EPSG','9001',-26.78138,0.42027,-10.93206,'EPSG','1031',-0.05109,'EPSG','1028',0.00079,-0.0007,-0.00124,'EPSG','1042',-0.06667,0.75744,0.05133,'EPSG','1032',-0.07201,'EPSG','1030',2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'NRC-Can CSRSv8',0);
INSERT INTO "usage" VALUES('EPSG','20192','helmert_transformation','EPSG','10415','EPSG','1061','EPSG','1284');
INSERT INTO "helmert_transformation" VALUES('EPSG','10416','NAD83(CSRS)v7 to NAD83(2011) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF2014 by common transformations (codes 8970 and 8265).','EPSG','1065','Time-specific Position Vector transform (geocen)','EPSG','8253','EPSG','6317',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','10416','NAD83(CSRS)v7 to NAD83(2011) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF2014 by common transformations (codes 8970 and 8265).','EPSG','1033','Position Vector transformation (geocentric domain)','EPSG','8253','EPSG','6317',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "usage" VALUES('EPSG','20197','helmert_transformation','EPSG','10416','EPSG','4544','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','10419','NAD83(CSRS)v8 to NAD83(2011) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF2020 by common transformations (codes 10334 and 10415).','EPSG','1065','Time-specific Position Vector transform (geocen)','EPSG','10412','EPSG','6317',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','10419','NAD83(CSRS)v8 to NAD83(2011) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Source and target CRSs defined from ITRF2020 by common transformations (codes 10334 and 10415).','EPSG','1033','Position Vector transformation (geocentric domain)','EPSG','10412','EPSG','6317',0.0,0.0,0.0,0.0,'EPSG','9001',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ISO-N Am',0);
INSERT INTO "usage" VALUES('EPSG','20195','helmert_transformation','EPSG','10419','EPSG','4544','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','10478','BBT2000 to WGS 84 (1)','','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','10475','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'BBT-Aut-Ita',0);
INSERT INTO "usage" VALUES('EPSG','20343','helmert_transformation','EPSG','10478','EPSG','4744','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','15483','Tokyo to JGD2000 (1)','Derived at Tokyo datum origin. Accuracy on main islands 9m. Also used on remote islands with significantly less accuracy: Io-To 793m, Kitadaito and Minamidaito Jima 642m, Tarama and Minna Shima 560m, Ishigaki and Taketomi Jima 251m, Yonaguni Jima 248m.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4301','EPSG','4612',9.0,-146.414,507.337,680.507,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GSI-Jpn',0);
INSERT INTO "usage" VALUES('EPSG','11494','helmert_transformation','EPSG','15483','EPSG','3957','EPSG','1142');
INSERT INTO "helmert_transformation" VALUES('EPSG','15484','Tokyo to WGS 84 (108)','Parameter values from Tokyo to JGD2000 (1) (code 15483). Assumes JGD2000 and WGS 84 can be considered the same to within the accuracy of the transformation.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4301','EPSG','4326',9.0,-146.414,507.337,680.507,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Jpn',0);
@@ -3057,8 +3050,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','15925','JAD2001 to WGS 84 (1
INSERT INTO "usage" VALUES('EPSG','11936','helmert_transformation','EPSG','15925','EPSG','1128','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','15926','JAD69 to JAD2001 (1)','Accuracy 0.3 to 0.5 metres. May be used as tfm to WGS 84 - see JAD69 to WGS 84 (3) (tfm code 15927).','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4242','EPSG','4758',0.5,-33.722,153.789,94.959,'EPSG','9001',8.581,4.478,-4.54,'EPSG','9104',8.95,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NLA-Jam',0);
INSERT INTO "usage" VALUES('EPSG','11937','helmert_transformation','EPSG','15926','EPSG','3342','EPSG','1034');
INSERT INTO "helmert_transformation" VALUES('EPSG','15927','JAD69 to WGS 84 (3)','Derived at 4 stations, tested at a further 9. Also used as tfm to JAD69 to JAD2001 (see code 15926).
Note: Info source paper contains an error in sign of dS, subsequently confirmed by primary author and NLA of Jamaica, and corrected in this record.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4242','EPSG','4326',1.0,-33.722,153.789,94.959,'EPSG','9001',8.581,4.478,-4.54,'EPSG','9104',8.95,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'UT-Jam 1m',0);
INSERT INTO "helmert_transformation" VALUES('EPSG','15927','JAD69 to WGS 84 (3)','Derived at 4 stations, tested at a further 9. Also used as tfm to JAD69 to JAD2001 (see code 15926). Note: Info source paper contains an error in sign of dS, subsequently confirmed by primary author and NLA of Jamaica, and corrected in this record.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4242','EPSG','4326',1.0,-33.722,153.789,94.959,'EPSG','9001',8.581,4.478,-4.54,'EPSG','9104',8.95,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'UT-Jam 1m',0);
INSERT INTO "usage" VALUES('EPSG','11938','helmert_transformation','EPSG','15927','EPSG','3342','EPSG','1041');
INSERT INTO "helmert_transformation" VALUES('EPSG','15928','BD72 to ETRS89 (2)','May be taken as approximate transformation BD72 to WGS 84 - see code 15929. Scale difference is given by information source as -1.0000012747. Given in this record in ppm to assist application usage.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4313','EPSG','4258',0.2,-106.8686,52.2978,-103.7239,'EPSG','9001',-0.3366,0.457,-1.8422,'EPSG','9104',-1.2747,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Bel 0.2m',0);
INSERT INTO "usage" VALUES('EPSG','11939','helmert_transformation','EPSG','15928','EPSG','1347','EPSG','1032');
+3 -3
View File
@@ -9,8 +9,8 @@
INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MAJOR', 1);
INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MINOR', 2);
INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.094');
INSERT INTO "metadata" VALUES('EPSG.DATE', '2023-08-08');
INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.098');
INSERT INTO "metadata" VALUES('EPSG.DATE', '2023-11-24');
-- The value of ${PROJ_VERSION} is substituted at build time by the actual
-- value.
@@ -18,4 +18,4 @@ INSERT INTO "metadata" VALUES('PROJ.VERSION', '${PROJ_VERSION}');
-- Version of the PROJ-data package with which this database is the most
-- compatible.
INSERT INTO "metadata" VALUES('PROJ_DATA.VERSION', '1.15');
INSERT INTO "metadata" VALUES('PROJ_DATA.VERSION', '1.16');
+7 -1
View File
@@ -7553,6 +7553,12 @@ INSERT INTO "projected_crs" VALUES('EPSG','10465','GDA94 / PHG94',NULL,'EPSG','4
INSERT INTO "usage" VALUES('EPSG','20257','projected_crs','EPSG','10465','EPSG','4466','EPSG','1054');
INSERT INTO "projected_crs" VALUES('EPSG','10471','COV23 Grid',NULL,'EPSG','4400','EPSG','10468','EPSG','10470',NULL,0);
INSERT INTO "usage" VALUES('EPSG','20313','projected_crs','EPSG','10471','EPSG','4743','EPSG','1141');
INSERT INTO "projected_crs" VALUES('EPSG','10477','BBT2000 / BBT-TM',NULL,'EPSG','4400','EPSG','10475','EPSG','10476',NULL,0);
INSERT INTO "usage" VALUES('EPSG','20341','projected_crs','EPSG','10477','EPSG','4744','EPSG','1285');
INSERT INTO "projected_crs" VALUES('EPSG','10480','NAD83 / TWDB GM',NULL,'EPSG','4499','EPSG','4269','EPSG','10479',NULL,1);
INSERT INTO "usage" VALUES('EPSG','20355','projected_crs','EPSG','10480','EPSG','1412','EPSG','1286');
INSERT INTO "projected_crs" VALUES('EPSG','10481','NAD83 / TWDB GM',NULL,'EPSG','4497','EPSG','4269','EPSG','10479',NULL,0);
INSERT INTO "usage" VALUES('EPSG','20356','projected_crs','EPSG','10481','EPSG','1412','EPSG','1286');
INSERT INTO "projected_crs" VALUES('EPSG','11114','MAGNA-SIRGAS 2018 / Colombia Far West zone',NULL,'EPSG','4500','EPSG','20046','EPSG','18065',NULL,0);
INSERT INTO "usage" VALUES('EPSG','18947','projected_crs','EPSG','11114','EPSG','3091','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','11115','MAGNA-SIRGAS 2018 / Colombia West zone',NULL,'EPSG','4500','EPSG','20046','EPSG','18066',NULL,0);
@@ -10729,7 +10735,7 @@ INSERT INTO "usage" VALUES('EPSG','7390','projected_crs','EPSG','32360','EPSG','
INSERT INTO "projected_crs" VALUES('EPSG','32401','WGS 72BE / UTM zone 1N',NULL,'EPSG','4400','EPSG','4324','EPSG','16001',NULL,0);
INSERT INTO "usage" VALUES('EPSG','7391','projected_crs','EPSG','32401','EPSG','1873','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','32402','WGS 72BE / UTM zone 2N',NULL,'EPSG','4400','EPSG','4324','EPSG','16002',NULL,0);
INSERT INTO "usage" VALUES('EPSG','7392','projected_crs','EPSG','32402','EPSG','1876','EPSG','1142');
INSERT INTO "usage" VALUES('EPSG','7392','projected_crs','EPSG','32402','EPSG','1875','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','32403','WGS 72BE / UTM zone 3N',NULL,'EPSG','4400','EPSG','4324','EPSG','16003',NULL,0);
INSERT INTO "usage" VALUES('EPSG','7393','projected_crs','EPSG','32403','EPSG','1877','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','32404','WGS 72BE / UTM zone 4N',NULL,'EPSG','4400','EPSG','4324','EPSG','16004',NULL,0);
+2
View File
@@ -261,3 +261,5 @@ INSERT INTO "scope" VALUES('EPSG','1281','Geodesy. Defines LUREF from 2006 to 20
INSERT INTO "scope" VALUES('EPSG','1282','Geodesy. Defines LUREF from 2014 to 2020.',0);
INSERT INTO "scope" VALUES('EPSG','1283','Geodesy. Defines LUREF from 2020.',0);
INSERT INTO "scope" VALUES('EPSG','1284','Geodesy. Defines NAD83(CSRS)v8.',0);
INSERT INTO "scope" VALUES('EPSG','1285','Engineering survey and mapping for the Brenner base tunnel (BBT) railway project.',0);
INSERT INTO "scope" VALUES('EPSG','1286','Mapping and data analysis for Texas Water Development Board groundwater modeling.',0);
Binary file not shown.
+33
View File
@@ -0,0 +1,33 @@
import os
from docutils import nodes
def source_file(name, rawtext, text, lineno, inliner, options={}, content=[]):
app = inliner.document.settings.env.app
rootdir = app.config.source_file_root
fname = text
if not os.path.exists(os.path.join(rootdir, fname)):
inliner.reporter.warning(
f"Referenced source file {fname} not found", line=lineno
)
ref_node = nodes.reference(
rawtext,
os.path.basename(fname),
refuri=app.config.source_file_url_template.format(fname),
**options,
)
return [ref_node], []
def setup(app):
app.add_config_value("source_file_root", None, "html")
app.add_config_value("source_file_url_template", None, "html")
app.add_role("source_file", source_file)
return {"parallel_read_safe": True, "parallel_write_safe": True}
+1 -3
View File
@@ -49,8 +49,6 @@ file referenced by the {object_reference} must contain a valid
.. versionadded:: 8.0.0
Description
***********
@@ -186,7 +184,7 @@ Should give results comparable to the classic :program:`proj` command
cct -t 0 -z 0 +proj=utm +ellps=GRS80 +zone=32
6. Auxiliary data following the coordinate input is forward to the output
6. Auxiliary data following the coordinate input is forwarded to the output
stream:
.. code-block:: console
+2 -1
View File
@@ -199,13 +199,14 @@ The following script
.. code-block:: console
proj +proj=utm +zone=12 +ellps=GRS80 -r <<EOF
proj +proj=utm +zone=12 -r <<EOF
45d15'33.1" 111.5W
45d15.551666667N -111d30
+45.25919444444 111d30'000w
EOF
will perform UTM zone 12 forward projection.
The default +ellps=GRS80 is used as no +ellps was specified.
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::
+2 -1
View File
@@ -37,7 +37,7 @@ pass a proposal.
List of PSC Members
-------------------
(up-to-date as of 2023-01)
(up-to-date as of 2023-09)
* Kristian Evers `@kbevers <https://github.com/kbevers>`_ (DK) **Chair**
* Howard Butler `@hobu <https://github.com/hobu>`_ (USA)
@@ -46,6 +46,7 @@ List of PSC Members
* Even Rouault `@rouault <https://github.com/rouault>`_ (FR)
* Kurt Schwehr `@schwehr <https://github.com/schwehr>`_ (USA)
* Alan Snow `@snowman2 <https://github.com/snowman2>`_ (USA)
* Javier Jimenez Shaw `@jjimenezshaw <https://github.com/jjimenezshaw>`_ (ES)
* Frank Warmerdam `@warmerdam <https://github.com/warmerdam>`_ (USA) **Emeritus**
Detailed Process
+11 -5
View File
@@ -28,13 +28,13 @@ author = "PROJ contributors"
version = "9.3"
# The full project version, used as the replacement for |release|
release = "9.3.0-dev"
release = "9.3.1"
# PROJ-data version
data_version = "1.14"
data_version = "1.16"
today_date = date.today()
# today_date = date(Y, M, D) # or use a specific date
#today_date = date.today()
today_date = date(2023, 9, 1) # or use a specific date
today_fmt = "%d %b %Y"
copyright = "1983-{}, PROJ contributors".format(today_date.year)
@@ -51,6 +51,7 @@ extensions = [
"redirects",
"replacements",
"program_with_link",
"source_file",
]
# File extensions of source files
@@ -140,7 +141,7 @@ html_context = {
"theme_vcs_pageview_mode": "edit",
"github_user": "OSGeo",
"github_repo": "PROJ",
"github_version": "master",
"github_version": "9.3",
"conf_py_path": "/docs/source/",
}
@@ -261,3 +262,8 @@ texinfo_documents = [
False,
),
]
# -- Source file links ------------------------------------------
source_file_root = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)
source_file_url_template = "https://github.com/OSGeo/PROJ/blob/master/{}"
+10 -3
View File
@@ -26,8 +26,8 @@ Download
Current Release
--------------------------------------------------------------------------------
* **2023-06-01** `proj-9.2.1.tar.gz`_ (`md5`_)
* **2023-06-01** `proj-data-1.14.tar.gz`_
* **2023-12-01** `proj-9.3.1.tar.gz`_ (`md5`_)
* **2023-12-01** `proj-data-1.16.tar.gz`_
.. note::
@@ -40,6 +40,8 @@ Current Release
Past Releases
--------------------------------------------------------------------------------
* **2023-09-01** `proj-9.3.0.tar.gz`_
* **2023-06-01** `proj-9.2.1.tar.gz`_
* **2023-03-01** `proj-9.2.0.tar.gz`_
* **2022-12-01** `proj-9.1.1.tar.gz`_
* **2022-09-01** `proj-9.1.0.tar.gz`_
@@ -73,6 +75,7 @@ Past Releases
* **2015-09-13** `proj-4.9.2.tar.gz`_
* **2015-03-04** `proj-4.9.1.tar.gz`_
* **2023-06-01** `proj-data-1.14.tar.gz`_
* **2023-03-01** `proj-data-1.13.tar.gz`_
* **2022-12-01** `proj-data-1.12.tar.gz`_
* **2022-09-01** `proj-data-1.11.tar.gz`_
@@ -108,7 +111,9 @@ Past Releases
* **2018-03-01** `proj-datumgrid-oceania-1.1.zip`_
* **2018-03-01** `proj-datumgrid-oceania-1.0.zip`_
.. _`md5`: https://download.osgeo.org/proj/proj-9.2.1.tar.gz.md5
.. _`md5`: https://download.osgeo.org/proj/proj-9.3.1.tar.gz.md5
.. _`proj-9.3.1.tar.gz`: https://download.osgeo.org/proj/proj-9.3.1.tar.gz
.. _`proj-9.3.0.tar.gz`: https://download.osgeo.org/proj/proj-9.3.0.tar.gz
.. _`proj-9.2.1.tar.gz`: https://download.osgeo.org/proj/proj-9.2.1.tar.gz
.. _`proj-9.2.0.tar.gz`: https://download.osgeo.org/proj/proj-9.2.0.tar.gz
.. _`proj-9.1.1.tar.gz`: https://download.osgeo.org/proj/proj-9.1.1.tar.gz
@@ -144,6 +149,8 @@ Past Releases
.. _`proj-4.9.2.tar.gz`: https://download.osgeo.org/proj/proj-4.9.2.tar.gz
.. _`proj-4.9.3.tar.gz`: https://download.osgeo.org/proj/proj-4.9.3.tar.gz
.. _`proj-data-1.16.tar.gz`: https://download.osgeo.org/proj/proj-data-1.16.tar.gz
.. _`proj-data-1.15.tar.gz`: https://download.osgeo.org/proj/proj-data-1.15.tar.gz
.. _`proj-data-1.14.tar.gz`: https://download.osgeo.org/proj/proj-data-1.14.tar.gz
.. _`proj-data-1.13.tar.gz`: https://download.osgeo.org/proj/proj-data-1.13.tar.gz
.. _`proj-data-1.12.tar.gz`: https://download.osgeo.org/proj/proj-data-1.12.tar.gz
+3 -1
View File
@@ -135,7 +135,9 @@ 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 :program:`proj` utility which expects
longitude/latitude ordering of input date (unless :option:`proj -r` is used).
longitude/latitude ordering of input data (unless :option:`proj -r` is used).
(And :program:`geod`, which on the contrary expects latitude/longitude, and lacks any
`-r` style workarounds.)
In case of doubt about the axis order of a specific CRS :program:`projinfo` is
able to provide an answer. Simply look up the CRS and examine the axis specification
+109 -2
View File
@@ -3,6 +3,113 @@
News
###############################################################################
9.3.1 Release Notes
++++++++++++++++++++
*December 1st 2023*
Updates
-------
* Update to EPSG 10.098 (`#3968 <https://github.com/OSGeo/PROJ/issues/3968>`_)
* Update ESRI objects to v3.2.0 (`#3944 <https://github.com/OSGeo/PROJ/issues/3944>`_)
Bug fixes
---------
* ITRF2008: fix wrong sign for ``dry`` parameter of EURA and EURA_T (`#3870 <https://github.com/OSGeo/PROJ/issues/3870>`_)
* Fix build error with MSVC 2019 in ``/std:c++20`` on ``NN_NO_CHECK()`` (`#3872 <https://github.com/OSGeo/PROJ/issues/3872>`_)
* ESRI WKT import: normalize GCS_unknown to unknown and D_unknown to unknown (`#3874 <https://github.com/OSGeo/PROJ/issues/3874>`_)
* :cpp:func:`CoordinateOperationFactory`: deal with CompoundToCompound with a horizontal similarity transformation and a ballpark vertical (`#3881 <https://github.com/OSGeo/PROJ/issues/3881>`_)
* :cpp:func:`Ellipsoid::_isEquivalentTo()`: fix so that an ellipsoid of semi-major axis A (and non-zero inv flattening) isn't equivalent to a sphere of radius A (`#3882 <https://github.com/OSGeo/PROJ/issues/3882>`_)
* :cpp:func:`isEquivalentTo()`: make a datum name 'unknown' equivalent to another one (`#3883 <https://github.com/OSGeo/PROJ/issues/3883>`_)
* :program:`cs2cs`: fix handling of input coordinates in grad (`#3886 <https://github.com/OSGeo/PROJ/issues/3886>`_)
* Make ``setargv.obj`` available on Universal Windows Platform (`#3891 <https://github.com/OSGeo/PROJ/issues/3891>`_)
* Allow opening proj.db with a URI (`#3892 <https://github.com/OSGeo/PROJ/issues/3892>`_)
* :cpp:func:`createOperations()`: fix GeogCRS 3D with TOWGS84 to geocentric CRS (`#3915 <https://github.com/OSGeo/PROJ/issues/3915>`_)
* Fix test suite so that it can pass with ``ENABLE_TIFF=OFF`` (`#3916 <https://github.com/OSGeo/PROJ/issues/3916>`_)
* :cpp:func:`GeographicBoundingBox::intersects()`: avoid infinite recursion and stack overflow on invalid bounding boxes (`#3919 <https://github.com/OSGeo/PROJ/issues/3919>`_)
* Fix importing ``'+proj=topocentric ... +type=crs'`` by using a geocentric CRS as the base CRS (`#3924 <https://github.com/OSGeo/PROJ/issues/3924>`_)
* Allow LOCAL_CS with 3 axes (`#3928 <https://github.com/OSGeo/PROJ/issues/3928>`_)
* WKT1 parser: in non-strict mode, accept missing UNIT[] in GEOGCS, GEOCCS, PROJCS and VERT_CS elements (`#3933 <https://github.com/OSGeo/PROJ/issues/3933>`_)
* :cpp:func:`createOperations()`: fix issue with a obscure case involving CompoundCRS of unknown horizontal datum + boundCRS of vertical (`#3934 <https://github.com/OSGeo/PROJ/issues/3934>`_)
* :cpp:func:`createOperations()`: fix bad PROJ pipeline when converting between Geog3D with non-metre height to CompoundCRS (`#3943 <https://github.com/OSGeo/PROJ/issues/3943>`_)
* :cpp:func:`createOperations()`: Fix possible null dereference on invalid WKT input (`#3946 <https://github.com/OSGeo/PROJ/issues/3946>`_)
* :c:func:`proj_factor`: fix when input is a compound CRS of a projected CRS (`#3950 <https://github.com/OSGeo/PROJ/issues/3950>`_)
* :c:func:`pj_get_suggested_operation()`: tune it to give correct result for RGAF09 to RRAF 1991 / UTM zone 20N + Guadeloupe 1988 height transformation (`#3954 <https://github.com/OSGeo/PROJ/issues/3954>`_)
* Move static ``NameSpace::GLOBAL`` definition in ``static.cpp`` to avoid 'static initialization fiasco' (`#3956 <https://github.com/OSGeo/PROJ/issues/3956>`_)
* horner: allow arbitrary input type of coordinate (`#3961 <https://github.com/OSGeo/PROJ/issues/3961>`_)
9.3.0 Release Notes
++++++++++++++++++++
*September 1st 2023*
Updates
-------
* Add C++ API to transform coordinate (`#3705 <https://github.com/OSGeo/PROJ/issues/3705>`_)
* CMake: add ``PROJ_DB_CACHE_DIR`` (`#3711 <https://github.com/OSGeo/PROJ/issues/3711>`_)
* Implement EPSG:1026 Mercator (Spherical) method (`#3741 <https://github.com/OSGeo/PROJ/issues/3741>`_)
* CMake: remove useless cross-compiling related checks (`#3747 <https://github.com/OSGeo/PROJ/issues/3747>`_)
* Add mapping of Equidistant Conic to new EPSG:1119 method (`#3812 <https://github.com/OSGeo/PROJ/issues/3812>`_)
* Implement proposal001 from Planetary DWG from OGC (`#3816 <https://github.com/OSGeo/PROJ/issues/3816>`_)
* Add option in :program:`proj` CLI to use a CRS (`#3825 <https://github.com/OSGeo/PROJ/issues/3825>`_)
* :c:func:`proj_factors()`: make it work with projected CRS with non-metre unit and/or northing/easting axis order (`#3826 <https://github.com/OSGeo/PROJ/issues/3826>`_)
* :envvar:`PROJ_DEBUG`: make ON an alias of 2, and OFF of 1 (`#3835 <https://github.com/OSGeo/PROJ/issues/3835>`_)
* Database: update to EPSG 10.094 (`#3847 <https://github.com/OSGeo/PROJ/issues/3847>`_)
Bug fixes
---------
* :cpp:func:`GeographicBoundingBox::intersection()`: avoid infinite recursion and stack overflow on invalid bounding boxes (`#3748 <https://github.com/OSGeo/PROJ/issues/3748>`_)
* Various fixes related to concatenated operations (`#3820 <https://github.com/OSGeo/PROJ/issues/3820>`_)
* Projected CRS identification: fix crash when the base CRS is a non-geographic geodetic CRS (`#3830 <https://github.com/OSGeo/PROJ/issues/3830>`_)
* Avoid C++ exceptions to be thrown (and caught) when parsing strings like ``+proj=longlat +datum=WGS84 +type=crs`` (`#3834 <https://github.com/OSGeo/PROJ/issues/3834>`_)
* BUG: Handle prefix whitespace when guessing WKT dialiect (`#3841 <https://github.com/OSGeo/PROJ/issues/3841>`_)
* :c:func:`proj_alter_id()`: make it replace an existing ID instead of appending a new one (`#3846 <https://github.com/OSGeo/PROJ/issues/3846>`_)
* bonne: fix inverse map projection computations when lat_1 < 0 (`#3849 <https://github.com/OSGeo/PROJ/issues/3849>`_)
* WKT1 ESRI import/export: fix GCS name for EPSG:8353 S-JTSK_[JTSK03]_Krovak_East_North (`#3851 <https://github.com/OSGeo/PROJ/issues/3851>`_)
9.2.1 Release Notes
++++++++++++++++++++
*June 1st 2023*
@@ -206,7 +313,7 @@ Bug fixes
*December 1st 2022*
Updates
--------
-------
* Database: register ``at_bev_AT_GIS_GRID_2021_09_28`` grid (`#3442 <https://github.com/OSGeo/PROJ/issues/3442>`_)
@@ -1972,7 +2079,7 @@ Updates
* Added "require_grid" option to gie (`#1088 <https://github.com/OSGeo/proj.4/issues/1088>`_)
* Replace :option:`+transpose` option of Helmert transform with :option:`+convention`.
* Replace ``transpose`` option of Helmert transform with :option:`+convention`.
From now on the convention used should be explicitly written. An
error will be returned when using the +transpose option (`#1091 <https://github.com/OSGeo/proj.4/issues/1091>`_)
+2 -2
View File
@@ -27,9 +27,9 @@ longitude=90, latitude=0 and the third axis (Z) points to the North pole.
Usage
################################################################################
Convert geodetic coordinates to GRS80 cartesian coordinates::
Convert geodetic coordinates to cartesian (uses default +ellps=GRS80)::
echo 17.7562015132 45.3935192042 133.12 2017.8 | cct +proj=cart +ellps=GRS80
echo 17.7562015132 45.3935192042 133.12 2017.8 | cct +proj=cart
4272922.1553 1368283.0597 4518261.3501 2017.8000
Parameters
+2 -2
View File
@@ -63,11 +63,11 @@ Usage
Converting from geodetic latitude to geocentric latitude::
+proj=geoc +ellps=GRS80
+proj=geoc
Converting from geocentric latitude to geodetic latitude::
+proj=pipeline +step +proj=geoc +inv +ellps=GRS80
+proj=pipeline +step +proj=geoc +inv
Parameters
################################################################################
+5 -5
View File
@@ -46,10 +46,10 @@ operation but the vertical part is kept exactly as the input was.
$ echo 12 56 12.3 2020 | cct +proj=pipeline \
+step +proj=push +v_3 \
+step +proj=cart +ellps=GRS80 \
+step +proj=cart \
+step +proj=helmert +x=3000 +y=1000 +z=2000 \
+step +proj=cart +ellps=GRS80 +inv \
+step +proj=pop +v_3 \
+step +proj=cart +inv \
+step +proj=pop +v_3
12.0056753463 55.9866540552 12.3000 2000.0000
@@ -58,9 +58,9 @@ 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::
$ echo 12 56 12.3 2020 | cct +proj=pipeline \
+step +proj=cart +ellps=GRS80 \
+step +proj=cart \
+step +proj=helmert +x=3000 +y=1000 +z=2000 \
+step +proj=cart +ellps=GRS80 +inv \
+step +proj=cart +inv
12.0057 55.9867 3427.7404 2000.0000
+1 -1
View File
@@ -47,7 +47,7 @@ the reverse direction.
+step +proj=vgridshift +grids=nlgeo2018.gtx \
+step +proj=push +v_3 \
+step +proj=set +v_3=43 \
+step +proj=cart +ellps=GRS80 \
+step +proj=cart \
+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 \
+step +proj=cart +inv +ellps=bessel \
+step +proj=hgridshift +inv +grids=rdcorr2018.gsb,null \
@@ -57,7 +57,7 @@ Convert geocentric coordinates to topocentric coordinates, with the topocentric
origin specified in geocentric coordinates::
echo 3771793.968 140253.342 5124304.349 2020 | \
cct -d 3 +proj=topocentric +ellps=WGS84 +X_0=3652755.3058 +Y_0=319574.6799 +Z_0=5201547.3536
cct -d 3 +proj=topocentric +X_0=3652755.3058 +Y_0=319574.6799 +Z_0=5201547.3536
-189013.869 -128642.040 -4220.171 2020.0000
@@ -65,8 +65,8 @@ Convert geographic coordinates to topocentric coordinates, with the topocentric
origin specified in geographic coordinates::
echo 2.12955 53.80939444 73 2020 | cct -d 3 +proj=pipeline \
+step +proj=cart +ellps=WGS84 \
+step +proj=topocentric +ellps=WGS84 +lon_0=5 +lat_0=55 +h_0=200
+step +proj=cart \
+step +proj=topocentric +lon_0=5 +lat_0=55 +h_0=200
-189013.869 -128642.040 -4220.171 2020.0000
@@ -26,16 +26,16 @@ 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
+step +proj=unitconvert +xy_in=m +xy_out=us-ft
+proj=pipeline \
+step +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k_0=0.999964286 +x_0=500000.00001016 \
+step +proj=unitconvert +xy_out=us-ft
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
+proj=pipeline \
+step +proj=unitconvert +t_in=gps_week +t_out=decimalyear \
+step +proj=helmert +epoch=2000.0 +t_obs=2017.5 ...
Parameters
@@ -44,16 +44,16 @@ Parameters
.. option:: +xy_in=<unit> or <conversion_factor>
Horizontal input units. See :ref:`distance_units` and :ref:`angular_units`
for a list of available units. `<conversion_factor>` is the conversion factor
for a list of available units. Default: meter. `<conversion_factor>` is the conversion factor
from the input unit to metre for linear units, or to radian for angular
units.
units. Default if not given: meters.
.. option:: +xy_out=<unit> or <conversion_factor>
Horizontal output units. See :ref:`distance_units` and :ref:`angular_units`
for a list of available units. `<conversion_factor>` is the conversion factor
for a list of available units. Deault: meter. `<conversion_factor>` is the conversion factor
from the output unit to metre for linear units, or to radian for angular
units.
units. Default if not given: meters.
.. option:: +z_in=<unit> or <conversion_factor>
+3 -1
View File
@@ -1,6 +1,8 @@
.. option:: +lat_0=<value>
Latitude of projection center.
Latitude of natural origin, latitude of false origin or latitude of
projection centre (naming and meaning depend on the
projection method).
*Defaults to 0.0.*
+3 -1
View File
@@ -1,6 +1,8 @@
.. option:: +lon_0=<value>
Longitude of projection center.
Central meridian/longitude of natural origin, longitude of
origin or longitude of false origin (naming and meaning depend on the
projection method).
*Defaults to 0.0.*
+2 -1
View File
@@ -1,5 +1,6 @@
.. option:: +x_0=<value>
False easting.
False easting, easting at false origin or easting at projection centre (naming
and meaning depend on the projection method). Always in meters.
*Defaults to 0.0.*
+2 -1
View File
@@ -1,5 +1,6 @@
.. option:: +y_0=<value>
False northing, in meters.
False northing, northing at false origin or northing at projection centre (naming
and meaning depend on the projection method). Always in meters.
*Defaults to 0.0.*
@@ -44,7 +44,7 @@ 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
$ echo 122 47 | proj +proj=bertin1953 +R=1
0.72 0.73
Parameters
+8 -2
View File
@@ -40,12 +40,18 @@ The Cassini-Soldner was also used for the detailed mapping of many German states
Example using EPSG 30200 (Trinidad 1903, units in clarke's links)::
$ echo 0.17453293 -1.08210414 | proj +proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46392051999 +y_0=65379.0134283 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.201166195164
$ echo 0.17453293 -1.08210414 | proj +proj=cass \
+lat_0=10.44166666666667 +lon_0=-61.33333333333334 \
+x_0=86501.46392051999 +y_0=65379.0134283 \
+a=6378293.645208759 +b=6356617.987679838 \
+to_meter=0.201166195164
66644.94 82536.22
Example using EPSG 3068 (Soldner Berlin)::
$ echo 13.5 52.4 | proj +proj=cass +lat_0=52.41864827777778 +lon_0=13.62720366666667 +x_0=40000 +y_0=10000 +ellps=bessel +units=m
$ echo 13.5 52.4 | proj +proj=cass \
+lat_0=52.41864827777778 +lon_0=13.62720366666667 \
+x_0=40000 +y_0=10000 +ellps=bessel
31343.05 7932.76
Options
+2 -2
View File
@@ -49,12 +49,12 @@ Unlike the Mercator, the Gall shows the poles as lines running across the top an
Example using Gall Stereographic ::
$ echo 9 51 | proj +proj=gall +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m
$ echo 9 51 | proj +proj=gall
708432.90 5193386.36
Example using Gall Stereographic (Central meridian 90°W) ::
$ echo 9 51 | proj +proj=gall +lon_0=90w +x_0=0 +y_0=0 +ellps=WGS84 +units=m
$ echo 9 51 | proj +proj=gall +lon_0=90w
7792761.91 5193386.36
Parameters
+2 -2
View File
@@ -1,7 +1,7 @@
.. _gs50:
********************************************************************************
Modified Stereographic of 50 U.S.
Modified Stereographic of the 50 U.S. states
********************************************************************************
+---------------------+----------------------------------------------------------+
@@ -24,7 +24,7 @@ Modified Stereographic of 50 U.S.
.. figure:: ./images/gs50.png
:width: 500 px
:align: center
:alt: Modified Stereographic of 50 U.S.
:alt: Modified Stereographic of the 50 U.S. states
proj-string: ``+proj=gs50``
@@ -40,7 +40,7 @@ Usage
To run a forward HEALPix projection on a unit sphere model, use the following command::
proj +proj=healpix +lon_0=0 +a=1 -E <<EOF
proj +proj=healpix +a=1 -E <<EOF
0 0
EOF
# output
+1 -1
View File
@@ -34,7 +34,7 @@ satellites like those of the Landsat program.
:align: center
:alt: Space oblique for LANDSAT
proj-string: ``+proj=lsat +ellps=GRS80 +lat_1=-60 +lat_2=60 +lsat=2 +path=2``
proj-string: ``+proj=lsat +lat_1=-60 +lat_2=60 +lsat=2 +path=2``
Parameters
################################################################################
+2 -2
View File
@@ -1,13 +1,13 @@
.. _nzmg:
********************************************************************************
New Zealand Map Grid
New Zealand Map Grid (EPSG:27200)
********************************************************************************
.. figure:: ./images/nzmg.png
:width: 500 px
:align: center
:alt: New Zealand Map Grid
:alt: New Zealand Map Grid (EPSG:27200)
proj-string: ``+proj=nzmg``
@@ -34,10 +34,10 @@ Environment (SCENZGrid).
Usage
###############################################################################
To run a rHEALPix projection on a WGS84 ellipsoidal model, use the following
To run a rHEALPix projection (on the default GRS80 ellipsoidal model,) use the following
command::
proj +proj=rhealpix -f '%.2f' +ellps=WGS84 +south_square=0 +north_square=2 -E << EOF
proj +proj=rhealpix +north_square=2 -E << EOF
> 55 12
> EOF
55 12 6115727.86 1553840.13
+1 -1
View File
@@ -82,7 +82,7 @@ Usage
The following example uses S2 on the right face::
echo 90 0 | ../bin/proj +proj=s2 +lat_0=0 +lon_0=90 +ellps=WGS84 +UVtoST=linear
echo 90 0 | proj +proj=s2 +lat_0=0 +lon_0=90 +ellps=WGS84 +UVtoST=linear
0.5 0.5
+1 -1
View File
@@ -40,7 +40,7 @@ satellite data to be represented accurately as a rectangular array.
proj-string: ``+proj=som +inc_angle=98.303820000243860022 +ps_rev=0.06866666666666667 +asc_lon=64.412896137498847793``
proj-string: ``+proj=som +inc_angle=1.7157253262878522r +ps_rev=0.06866666666666667 +asc_lon=1.1242171183417042r``
(gives same results as: ``+proj=som +inc_angle=1.7157253262878522r +ps_rev=0.06866666666666667 +asc_lon=1.1242171183417042r``)
Parameters
################################################################################
+2 -2
View File
@@ -64,12 +64,12 @@ The following table gives special cases of the Transverse Mercator projection.
Example using Gauss-Kruger on Germany area (aka EPSG:31467) ::
$ echo 9 51 | proj +proj=tmerc +lat_0=0 +lon_0=9 +k_0=1 +x_0=3500000 +y_0=0 +ellps=bessel +units=m
$ echo 9 51 | proj +proj=tmerc +lon_0=9 +x_0=3500000 +ellps=bessel
3500000.00 5651505.56
Example using Gauss Boaga on Italy area (EPSG:3004) ::
$ echo 15 42 | proj +proj=tmerc +lat_0=0 +lon_0=15 +k_0=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +units=m
$ echo 15 42 | proj +proj=tmerc +lon_0=15 +k_0=0.9996 +x_0=2520000 +ellps=intl
2520000.00 4649858.60
Parameters
@@ -62,4 +62,5 @@ Transforming a point with the LINZ NZGD2000 deformation model:
::
echo 166.7133850980 -44.5105886020 293.3700 2007.689 | cct +proj=defmodel +model=nzgd2000-20180701.json
echo 166.7133850980 -44.5105886020 293.3700 2007.689 |
cct +proj=defmodel +model=nzgd2000-20180701.json
@@ -39,15 +39,15 @@ Examples
Geographic offset from the old Greek geographic 2D CRS to the newer GGRS87 CRS::
proj=geogoffset dlon=0.28 dlat=-5.86
+proj=geogoffset +dlon=0.28 +dlat=-5.86
Conversion from Tokyo + JSLD69 height to WGS 84::
proj=geogoffset dlon=-13.97 dlat=7.94 dh=26.9
+proj=geogoffset +dlon=-13.97 +dlat=7.94 +dh=26.9
Conversion from Baltic 1977 height to Black Sea height::
proj=geogoffset dh=0.4
+proj=geogoffset +dh=0.4
Parameters
@@ -4,8 +4,6 @@
Helmert transform
================================================================================
.. versionadded:: 5.0.0
The Helmert transformation changes coordinates from one reference frame to
another by means of 3-, 4-and 7-parameter shifts, or one of their 6-, 8- and
14-parameter kinematic counterparts.
@@ -50,7 +48,8 @@ Transforming coordinates from NAD72 to NAD83 using the 4 parameter 2D Helmert:
::
proj=helmert convention=coordinate_frame x=-9597.3572 y=.6112 s=0.304794780637 theta=-1.244048
proj=helmert convention=coordinate_frame x=-9597.3572 y=.6112 \
s=0.304794780637 theta=-1.244048
Simplified transformations from ITRF2008/IGS08 to ETRS89 using 7 parameters:
@@ -80,8 +79,6 @@ Parameters
.. option:: +convention=coordinate_frame/position_vector
.. versionadded:: 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``),
@@ -181,15 +178,6 @@ Parameters
See :eq:`rot_exact`
.. option:: +transpose
.. deprecated:: 5.2.0 (removed)
Transpose rotation matrix and follow the **Position Vector** rotation
convention. If :option:`+transpose` is not added the **Coordinate Frame**
rotation convention is used.
Mathematical description
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -63,7 +63,9 @@ the coordinate is part of the coordinate tuple.
Suppose we want to model the deformation of the 2008 earthquake in Iceland in
a transformation of data from 2005 to 2009::
echo 63.992 -21.014 10.0 2005.0 | cct +proj=hgridshift +grids=iceland2008.gsb +t_epoch=2008.4071 +t_final=2009.0
echo 63.992 -21.014 10.0 2005.0 |
cct +proj=hgridshift +grids=iceland2008.gsb \
+t_epoch=2008.4071 +t_final=2009.0
63.9920021 -21.0140013 10.0 2005.0
.. note::
@@ -30,7 +30,7 @@ Examples
Vertical offset from LN02 height to EVRF2000 height with horizontal coordinates in ETRS89::
+proj=vertoffset +lat_0=46.9166666666666666 +lon_0=8.183333333333334 \
+dh=-0.245 +slope_lat=-0.210 +slope_lon=-0.032 +ellps=GRS80
+dh=-0.245 +slope_lat=-0.210 +slope_lon=-0.032
Parameters
################################################################################
@@ -45,8 +45,8 @@ NTF to RGF93 transformation using :file:`gr3df97a.tif` grid
+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=xyzgridshift +grids=gr3df97a.tif +grid_ref=output_crs
+step +proj=cart +inv
+step +proj=pop +v_3
Parameters
+6 -4
View File
@@ -37,19 +37,21 @@ PROJ 5, this was handled incorrectly when a custom central meridian was set with
:option:`+lon_0`. This caused a change in sign on the resulting easting as seen
below::
$ proj +proj=merc +lon_0=110
$ proj +proj=merc +lon_0=110 <<EOF
-70 0
-20037508.34 0.00
290 0
EOF
20037508.34 0.00
-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
$ proj +proj=merc +lon_0=110 <<EOF
-70 0
-20037508.34 0.00
290 0
EOF
-20037508.34 0.00
-20037508.34 0.00
The change is made on the basis that :math:`\lambda=290^{\circ}` is a full
+57 -20
View File
@@ -23,17 +23,17 @@ documenting the individual :doc:`projections<../operations/projections/index>`.
+ellps Ellipsoid name (see ``proj -le``)
+k Scaling factor (deprecated)
+k_0 Scaling factor
+lat_0 Latitude of origin
+lon_0 Central meridian
+lat_0 Latitude of origin (in degree if no angular unit specified)
+lon_0 Central meridian (in degree if no angular unit specified)
+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
+units Horizontal coordinate system units (meters, US survey feet, etc.)
+vunits Vertical coordinate system units.
+x_0 False easting (always in meters)
+y_0 False northing (always in meters)
========== ================================================================
In the sections below most of the parameters are explained in details.
@@ -43,13 +43,16 @@ In the sections below most of the parameters are explained in details.
Units
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Horizontal units can be specified using the ``+units`` keyword with a symbolic
name for a unit (i.e. ``us-ft``). Alternatively the translation to meters can be
Horizontal coordinate system units can be specified using the ``+units`` keyword
with a symbolic me for a unit (i.e. ``us-ft``).
Alternatively the translation to meters can be
specified with the ``+to_meter`` keyword (i.e. 0.304800609601219 for US feet). The
``-lu`` argument to :program:`cs2cs` or :program:`proj` can be used to list
symbolic unit names. The default unit for projected coordinates is the meter.
A few special projections deviate from this behavior, most notably the
latlong pseudo-projection that returns degrees.
Note that this does *not* affect the units of linear parameters such as ``+x_0``
or ``+y_0`` which should always be specified in meters.
Vertical (Z) units can be specified using the ``+vunits`` keyword with a
symbolic name for a unit (i.e. ``us-ft``). Alternatively the translation to
@@ -62,15 +65,15 @@ vertical units will default to be the same as the horizontal coordinates.
:program:`proj` does 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.
Scaling of output units can be done by applying the ``+k_0`` argument (unitless).
The returned coordinates are scaled by the value assigned with the ``+k_0``
parameter. This parameter is only used by projections that mention using it,
and its exact effect is projection dependent.
Input units for parameters that can be understood to be either decimal degrees or
radians are interpreted to be decimal degrees by convention.
Explicit specification of input units can be accomplished by adding the appropriate
suffix to input values.
Input units for angular parameters (``+lon_0``, ``+lat_0``, etc.) are
interpreted to be decimal degrees by convention.
Explicit specification of input angular units can be accomplished by adding the
appropriate ruffix to input values.
+----------------+---------------------+
@@ -117,9 +120,17 @@ to a straight line, ``+over`` will have no effect or will not lead to expected
results.
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
longitude wrapping. It has only effect with operations that output angular
coordinates, such as ``+proj=longlat`` The argument to this option is a
center longitude. So ``+lon_wrap=180`` means wrap longitudes in the range 0 to
360. Note that ``+over`` does **not** disable ``+lon_wrap``.
360.
::
$ echo -1 0 cs2cs +proj=longlat +to +proj=longlat +lon_wrap=180
359dE 0dN 0.000
Note that ``+over`` does **not** disable ``+lon_wrap``.
Prime Meridian
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -129,8 +140,8 @@ 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.
Currently prime meridian declarations are not used by the ``pj_inv()`` and
``pj_fwd()`` calls.
Consequently the user utility :program:`cs2cs` does honour prime meridians but
the :program:`proj` user utility ignores them.
@@ -193,3 +204,29 @@ They can be combined in +axis in forms like:
The ``+axis`` argument does not work with the :program:`proj` command line
utility.
Order of applications of parameters
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
In the forward direction (from geodetic to projected coordinates), steps
are performed in the following order:
- subtracting prime meridian (``+pm``) to input coordinate longitude
- subtracting central meridian (``+lon_0``) to input coordinate longitude
- normalizing input coordinate longitude to [-180, 180], unless ``+over`` is
specified
- application of map projection formula on a spheroid of radius 1 and with
the eccentricity of the target spheroid specified. Includes taking into account
projection parameters such as ``+k_0``, ``+lat_0``, and other projection specific
parameters
- scaling of output x, y values by the semimajor axis
- addition of false easting ``+x_0`` to x and false northing ``+y_0`` to y
- scaling of output x, y by the output horizontal unit (``+units`` / ``+to_meter``)
- scaling of output z by the output vertical unit (``+vunits`` / ``+vto_meter``)
- application of axis orientation and order (``+axis``)
This is implemented mostly in :source_file:`src/fwd.cpp`
For the reverse direction (from projected coordinates to geodetic coordinates),
reverse steps are performed in the reverse order.
+3 -1
View File
@@ -70,7 +70,9 @@ 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
the introduction).
(Note, for the rest of this book the "+"s are removed from the examples.)
In PROJ it can be implemented as
::
+1
View File
@@ -30,6 +30,7 @@ Proprietary licensed software
- `FME <http://www.safe.com>`_ A GIS translator package. Includes a PROJ based transformer.
- `Avenza Maps <https://www.avenzamaps.com>`_ Top mobile mapping app for offline navigation and data collection.
- `Bunting Labs <https://buntinglabs.com/>`_ No-code GIS infrastructure
- `Pix4D <https://www.pix4d.com>`_ Cloud, desktop and mobile photogrammetry processing and data capture software.
Geodetic organizations
----------------------
+4
View File
@@ -726,6 +726,10 @@ class PROJ_GCC_DLL SingleOperation : virtual public CoordinateOperation {
createOperationParameterValueFromInterpolationCRS(int methodEPSGCode,
int crsEPSGCode);
PROJ_INTERNAL static void
exportToPROJStringChangeVerticalUnit(io::PROJStringFormatter *formatter,
double convFactor);
private:
PROJ_OPAQUE_PRIVATE_DATA
SingleOperation &operator=(const SingleOperation &other) = delete;
+19 -3
View File
@@ -42,6 +42,7 @@
#include <map>
#include <memory>
#include <string>
#include <type_traits>
#include <vector>
#ifndef NS_PROJ
@@ -203,10 +204,25 @@ using ::dropbox::oxygen::nn_static_pointer_cast;
template <typename T> using nn_shared_ptr = nn<std::shared_ptr<T>>;
// Possible implementation of C++14 std::remove_reference_t
// (cf https://en.cppreference.com/w/cpp/types/remove_cv)
template <class T>
using remove_reference_t = typename std::remove_reference<T>::type;
// Possible implementation of C++14 std::remove_cv_t
// (cf https://en.cppreference.com/w/cpp/types/remove_cv)
template <class T> using remove_cv_t = typename std::remove_cv<T>::type;
// Possible implementation of C++20 std::remove_cvref
// (cf https://en.cppreference.com/w/cpp/types/remove_cvref)
template <class T> struct remove_cvref {
typedef remove_cv_t<remove_reference_t<T>> type;
};
#define NN_NO_CHECK(p) \
::dropbox::oxygen::nn<typename std::remove_const< \
typename std::remove_reference<decltype(p)>::type>::type>( \
dropbox::oxygen::i_promise_i_checked_for_null, (p))
::dropbox::oxygen::nn< \
typename ::NS_PROJ::util::remove_cvref<decltype(p)>::type>( \
::dropbox::oxygen::i_promise_i_checked_for_null, (p))
//! @endcond
+2 -2
View File
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "CCT" "1" "1 Sep 2023" "9.3" "PROJ"
.TH "CCT" "1" "01 Dec 2023" "9.3" "PROJ"
.SH NAME
cct \- Coordinate Conversion and Transformation
.SH SYNOPSIS
@@ -281,7 +281,7 @@ cct \-t 0 \-z 0 +proj=utm +ellps=GRS80 +zone=32
.UNINDENT
.INDENT 0.0
.IP 6. 3
Auxiliary data following the coordinate input is forward to the output
Auxiliary data following the coordinate input is forwarded to the output
stream:
.UNINDENT
.INDENT 0.0
+1 -1
View File
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "CS2CS" "1" "1 Sep 2023" "9.3" "PROJ"
.TH "CS2CS" "1" "01 Dec 2023" "9.3" "PROJ"
.SH NAME
cs2cs \- Cartographic coordinate system filter
.SH SYNOPSIS
+1 -1
View File
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "GEOD" "1" "1 Sep 2023" "9.3" "PROJ"
.TH "GEOD" "1" "01 Dec 2023" "9.3" "PROJ"
.SH NAME
geod \- Geodesic computations
.SH SYNOPSIS
+1 -1
View File
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "GIE" "1" "1 Sep 2023" "9.3" "PROJ"
.TH "GIE" "1" "01 Dec 2023" "9.3" "PROJ"
.SH NAME
gie \- The Geospatial Integrity Investigation Environment
.SH SYNOPSIS
+3 -2
View File
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "PROJ" "1" "1 Sep 2023" "9.3" "PROJ"
.TH "PROJ" "1" "01 Dec 2023" "9.3" "PROJ"
.SH NAME
proj \- Cartographic projection filter
.SH SYNOPSIS
@@ -228,7 +228,7 @@ The following script
.sp
.nf
.ft C
proj +proj=utm +zone=12 +ellps=GRS80 \-r <<EOF
proj +proj=utm +zone=12 \-r <<EOF
45d15\(aq33.1" 111.5W
45d15.551666667N \-111d30
+45.25919444444 111d30\(aq000w
@@ -239,6 +239,7 @@ EOF
.UNINDENT
.sp
will perform UTM zone 12 forward projection.
The default +ellps=GRS80 is used as no +ellps was specified.
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:
+1 -1
View File
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "PROJINFO" "1" "1 Sep 2023" "9.3" "PROJ"
.TH "PROJINFO" "1" "01 Dec 2023" "9.3" "PROJ"
.SH NAME
projinfo \- Geodetic object and coordinate operation queries
.SH SYNOPSIS
+1 -1
View File
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "PROJSYNC" "1" "1 Sep 2023" "9.3" "PROJ"
.TH "PROJSYNC" "1" "01 Dec 2023" "9.3" "PROJ"
.SH NAME
projsync \- Downloading tool of resource files
.SH SYNOPSIS
+19 -5
View File
@@ -569,12 +569,15 @@ def import_geogcs():
datum_written = set()
# last 2 ones epoch,model are actually missing in most records...
assert nfields == 17
while True:
try:
row = next(reader)
except StopIteration:
break
assert len(row) == nfields, row
assert len(row) in (nfields, nfields -2), (row, header, len(row), nfields)
code = row[idx_wkid]
latestWkid = row[idx_latestWkid]
@@ -654,6 +657,13 @@ def import_geogcs():
assert is_degree or is_grad, row
cs_code = '6422' if is_degree else '6403'
if "CS[ellipsoidal,3]" in wkt2:
assert 'AXIS["Ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["Meter",1.0]' in wkt2
cs_code = '6423'
geodetic_crs_type = "geographic 3D"
else:
geodetic_crs_type = "geographic 2D"
deprecated = 1 if row[idx_deprecated] == 'yes' else 0
extent_auth_name, extent_code = find_extent(
@@ -709,7 +719,7 @@ def import_geogcs():
if esri_name not in map_geogcs_esri_name_to_auth_code:
map_geogcs_esri_name_to_auth_code[esri_name] = ['ESRI', code]
sql = """INSERT INTO "geodetic_crs" VALUES('ESRI','%s','%s',NULL,'geographic 2D','EPSG','%s','%s','%s',NULL,%d);""" % (
sql = f"""INSERT INTO "geodetic_crs" VALUES('ESRI','%s','%s',NULL,'{geodetic_crs_type}','EPSG','%s','%s','%s',NULL,%d);""" % (
code, esri_name, cs_code, datum_auth_name, datum_code, deprecated)
all_sql.append(sql)
sql = """INSERT INTO "usage" VALUES('ESRI', '%s_USAGE','geodetic_crs','ESRI','%s','%s','%s','%s','%s');""" % (code, code, extent_auth_name, extent_code, 'EPSG', '1024')
@@ -917,6 +927,10 @@ def get_wkt_unit(UNIT_NAME, UNIT_VALUE, is_rate=False) -> Unit:
uom_auth_name = 'EPSG'
uom_code = '1041' if is_rate else '9202'
assert UNIT_VALUE == '0.000001', UNIT_VALUE
elif UNIT_NAME == 'Parts_Per_Billion':
uom_auth_name = 'EPSG'
uom_code = '1030' if is_rate else '1028'
assert UNIT_VALUE == '0.000000001', UNIT_VALUE
elif UNIT_NAME == 'Unity':
assert not is_rate
uom_auth_name = 'EPSG'
@@ -1451,8 +1465,6 @@ def import_projcs():
'Lambert Conic Conformal (1SP)']
assert params['Scale_Factor'].unit.uom_code == '9201', 'Unhandled scale unit {}'.format(
params['Scale_Factor'].unit.uom_code)
assert params['Standard_Parallel_1'].value == params['Latitude_Of_Origin'].value
assert params['Standard_Parallel_1'].unit == params['Latitude_Of_Origin'].unit
elif method == 'Lambert_Conformal_Conic' and 'Standard_Parallel_2' in params:
conversion_mapping = MAPPED_PROJCS_WITH_EXTRA_LOGIC['Lambert_Conformal_Conic']['Lambert Conic Conformal (2SP)']
@@ -1647,6 +1659,8 @@ def import_vertcs():
idx_rlon = header.index('rlon')
assert idx_rlon >= 0
assert nfields == 17
vdatum_written = set()
sql = """-- vertical coordinate system for ellipsoidal height. Not really ISO 19111 valid..."""
@@ -1661,7 +1675,7 @@ def import_vertcs():
row = next(reader)
except StopIteration:
break
assert len(row) == nfields, row
assert len(row) in (nfields, nfields - 2), (row, len(row), nfields)
code = row[idx_wkid]
latestWkid = row[idx_latestWkid]
+66 -31
View File
@@ -322,22 +322,16 @@ int pj_get_suggested_operation(PJ_CONTEXT *,
// onshore and offshore Tunisia area of uses, but is slightly
// onshore. So in a general way, prefer a onshore area to a
// offshore one.
if (iBest < 0 || (alt.accuracy >= 0 &&
(alt.accuracy < bestAccuracy ||
// If two operations have the same accuracy, use
// the one that is contained within a larger one
(alt.accuracy == bestAccuracy &&
alt.minxSrc >= opList[iBest].minxSrc &&
alt.minySrc >= opList[iBest].minySrc &&
alt.maxxSrc <= opList[iBest].maxxSrc &&
alt.maxySrc <= opList[iBest].maxySrc &&
// check that this is not equality
!(alt.minxSrc == opList[iBest].minxSrc &&
alt.minySrc == opList[iBest].minySrc &&
alt.maxxSrc == opList[iBest].maxxSrc &&
alt.maxySrc == opList[iBest].maxySrc) &&
!opList[iBest].isPriorityOp)) &&
!alt.isOffshore)) {
if (iBest < 0 ||
(((alt.accuracy >= 0 && alt.accuracy < bestAccuracy) ||
// If two operations have the same accuracy, use
// the one that has the smallest area
(alt.accuracy == bestAccuracy &&
alt.pseudoArea < opList[iBest].pseudoArea &&
!(alt.isUnknownAreaName &&
!opList[iBest].isUnknownAreaName) &&
!opList[iBest].isPriorityOp)) &&
!alt.isOffshore)) {
if (skipNonInstantiable && !alt.isInstantiable()) {
continue;
@@ -1701,7 +1695,7 @@ static PJ *add_coord_op_to_list(
int idxInOriginalList, PJ *op, double west_lon, double south_lat,
double east_lon, double north_lat, PJ *pjGeogToSrc, PJ *pjGeogToDst,
const PJ *pjSrcGeocentricToLonLat, const PJ *pjDstGeocentricToLonLat,
bool isOffshore, std::vector<PJCoordOperation> &altCoordOps) {
const char *areaName, std::vector<PJCoordOperation> &altCoordOps) {
/*****************************************************************************/
double minxSrc;
@@ -1713,6 +1707,16 @@ static PJ *add_coord_op_to_list(
double maxxDst;
double maxyDst;
double w = west_lon / 180 * M_PI;
double s = south_lat / 180 * M_PI;
double e = east_lon / 180 * M_PI;
double n = north_lat / 180 * M_PI;
if (w > e) {
e += 2 * M_PI;
}
// Integrate cos(lat) between south_lat and north_lat
const double pseudoArea = (e - w) * (std::sin(n) - std::sin(s));
if (pjSrcGeocentricToLonLat) {
minxSrc = west_lon;
minySrc = south_lat;
@@ -1740,7 +1744,7 @@ static PJ *add_coord_op_to_list(
const double accuracy = proj_coordoperation_get_accuracy(op->ctx, op);
altCoordOps.emplace_back(
idxInOriginalList, minxSrc, minySrc, maxxSrc, maxySrc, minxDst,
minyDst, maxxDst, maxyDst, op, name, accuracy, isOffshore,
minyDst, maxxDst, maxyDst, op, name, accuracy, pseudoArea, areaName,
pjSrcGeocentricToLonLat, pjDstGeocentricToLonLat);
op = nullptr;
}
@@ -2016,23 +2020,22 @@ pj_create_prepared_operations(PJ_CONTEXT *ctx, const PJ *source_crs,
north_lat = 90;
}
const bool isOffshore = areaName && strstr(areaName, "- offshore");
if (west_lon <= east_lon) {
op = add_coord_op_to_list(
i, op, west_lon, south_lat, east_lon, north_lat,
pjGeogToSrc, pjGeogToDst, pjSrcGeocentricToLonLat,
pjDstGeocentricToLonLat, isOffshore, preparedOpList);
pjDstGeocentricToLonLat, areaName, preparedOpList);
} else {
auto op_clone = proj_clone(ctx, op);
op = add_coord_op_to_list(
i, op, west_lon, south_lat, 180, north_lat, pjGeogToSrc,
pjGeogToDst, pjSrcGeocentricToLonLat,
pjDstGeocentricToLonLat, isOffshore, preparedOpList);
pjDstGeocentricToLonLat, areaName, preparedOpList);
op_clone = add_coord_op_to_list(
i, op_clone, -180, south_lat, east_lon, north_lat,
pjGeogToSrc, pjGeogToDst, pjSrcGeocentricToLonLat,
pjDstGeocentricToLonLat, isOffshore, preparedOpList);
pjDstGeocentricToLonLat, areaName, preparedOpList);
proj_destroy(op_clone);
}
@@ -2884,6 +2887,16 @@ PJ_FACTORS proj_factors(PJ *P, PJ_COORD lp) {
const auto type = proj_get_type(P);
if (type == PJ_TYPE_COMPOUND_CRS) {
auto ctx = P->ctx;
auto horiz = proj_crs_get_sub_crs(ctx, P, 0);
if (horiz) {
auto ret = proj_factors(horiz, lp);
proj_destroy(horiz);
return ret;
}
}
if (type == PJ_TYPE_PROJECTED_CRS) {
// If it is a projected CRS, then compute the factors on the conversion
// associated to it. We need to start from a temporary geographic CRS
@@ -2897,14 +2910,34 @@ PJ_FACTORS proj_factors(PJ *P, PJ_COORD lp) {
auto ctx = P->ctx;
auto geodetic_crs = proj_get_source_crs(ctx, P);
assert(geodetic_crs);
auto datum = proj_crs_get_datum(ctx, geodetic_crs);
auto datum_ensemble = proj_crs_get_datum_ensemble(ctx, geodetic_crs);
auto pm = proj_get_prime_meridian(ctx, geodetic_crs);
double pm_longitude = 0;
proj_prime_meridian_get_parameters(ctx, pm, &pm_longitude, nullptr,
nullptr);
proj_destroy(pm);
PJ *geogCRSNormalized;
auto cs = proj_create_ellipsoidal_2D_cs(
ctx, PJ_ELLPS2D_LONGITUDE_LATITUDE, "Radian", 1.0);
auto geogCRSNormalized = proj_create_geographic_crs_from_datum(
ctx, "unnamed crs", datum ? datum : datum_ensemble, cs);
proj_destroy(datum);
proj_destroy(datum_ensemble);
if (pm_longitude != 0) {
auto ellipsoid = proj_get_ellipsoid(ctx, geodetic_crs);
double semi_major_metre = 0;
double inv_flattening = 0;
proj_ellipsoid_get_parameters(ctx, ellipsoid, &semi_major_metre,
nullptr, nullptr, &inv_flattening);
geogCRSNormalized = proj_create_geographic_crs(
ctx, "unname crs", "unnamed datum", proj_get_name(ellipsoid),
semi_major_metre, inv_flattening, "reference prime meridian", 0,
nullptr, 0, cs);
proj_destroy(ellipsoid);
} else {
auto datum = proj_crs_get_datum(ctx, geodetic_crs);
auto datum_ensemble =
proj_crs_get_datum_ensemble(ctx, geodetic_crs);
geogCRSNormalized = proj_create_geographic_crs_from_datum(
ctx, "unnamed crs", datum ? datum : datum_ensemble, cs);
proj_destroy(datum);
proj_destroy(datum_ensemble);
}
proj_destroy(cs);
auto conversion = proj_crs_get_coordoperation(ctx, P);
auto projCS = proj_create_cartesian_2D_cs(
@@ -2987,13 +3020,15 @@ PJCoordOperation::PJCoordOperation(
int idxInOriginalListIn, double minxSrcIn, double minySrcIn,
double maxxSrcIn, double maxySrcIn, double minxDstIn, double minyDstIn,
double maxxDstIn, double maxyDstIn, PJ *pjIn, const std::string &nameIn,
double accuracyIn, bool isOffshoreIn, const PJ *pjSrcGeocentricToLonLatIn,
const PJ *pjDstGeocentricToLonLatIn)
double accuracyIn, double pseudoAreaIn, const char *areaNameIn,
const PJ *pjSrcGeocentricToLonLatIn, const PJ *pjDstGeocentricToLonLatIn)
: idxInOriginalList(idxInOriginalListIn), minxSrc(minxSrcIn),
minySrc(minySrcIn), maxxSrc(maxxSrcIn), maxySrc(maxySrcIn),
minxDst(minxDstIn), minyDst(minyDstIn), maxxDst(maxxDstIn),
maxyDst(maxyDstIn), pj(pjIn), name(nameIn), accuracy(accuracyIn),
isOffshore(isOffshoreIn),
pseudoArea(pseudoAreaIn), areaName(areaNameIn ? areaNameIn : ""),
isOffshore(areaName.find("- offshore") != std::string::npos),
isUnknownAreaName(areaName.empty() || areaName == "unknown"),
isPriorityOp(isSpecialCaseForNAD83_to_NAD83HARN(name) ||
isSpecialCaseForGDA94_to_WGS84(name) ||
isSpecialCaseForWGS84_to_GDA2020(name)),
+2
View File
@@ -37,10 +37,12 @@ if(NOT MSVC)
else()
if(NOT WINDOWS_STORE)
# Linking to setargv.obj enables wildcard globbing for the
# command line utilities, when compiling with MSVC
# https://docs.microsoft.com/cpp/c-language/expanding-wildcard-arguments
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} setargv.obj")
endif()
endif()
+4 -4
View File
@@ -171,7 +171,7 @@ static void process(FILE *fid)
if (data.u != HUGE_VAL) {
if (srcIsLongLat) {
if (srcIsLongLat && fabs(srcToRadians - M_PI / 180) < 1e-10) {
/* dmstor gives values to radians. Convert now to the SRS unit
*/
data.u /= srcToRadians;
@@ -922,10 +922,10 @@ int main(int argc, char **argv) {
}
/* set input formatting control */
if (!srcIsLongLat)
informat = strtod;
else {
if (srcIsLongLat && fabs(srcToRadians - M_PI / 180) < 1e-10)
informat = dmstor;
else {
informat = strtod;
}
if (!destIsLongLat && !oform)
+42 -9
View File
@@ -537,7 +537,20 @@ int main(int argc, char **argv) {
eargc--;
// logic copied from proj_factors function
if (PJ *P = proj_create(nullptr, ocrs.c_str())) {
const auto type = proj_get_type(P);
auto type = proj_get_type(P);
auto ctx = P->ctx;
if (type == PJ_TYPE_COMPOUND_CRS) {
auto horiz = proj_crs_get_sub_crs(ctx, P, 0);
if (horiz) {
if (proj_get_type(horiz) == PJ_TYPE_PROJECTED_CRS) {
proj_destroy(P);
P = horiz;
type = proj_get_type(P);
} else {
proj_destroy(horiz);
}
}
}
if (type == PJ_TYPE_PROJECTED_CRS) {
try {
auto crs = dynamic_cast<const NS_PROJ::crs::ProjectedCRS *>(
@@ -548,18 +561,38 @@ int main(int argc, char **argv) {
dir == NS_PROJ::cs::AxisDirection::SOUTH;
} catch (...) {
}
auto ctx = P->ctx;
auto geodetic_crs = proj_get_source_crs(ctx, P);
assert(geodetic_crs);
auto datum = proj_crs_get_datum(ctx, geodetic_crs);
auto datum_ensemble =
proj_crs_get_datum_ensemble(ctx, geodetic_crs);
auto pm = proj_get_prime_meridian(ctx, geodetic_crs);
double pm_longitude = 0;
proj_prime_meridian_get_parameters(ctx, pm, &pm_longitude,
nullptr, nullptr);
proj_destroy(pm);
PJ *geogCRSNormalized;
auto cs = proj_create_ellipsoidal_2D_cs(
ctx, PJ_ELLPS2D_LONGITUDE_LATITUDE, "Radian", 1.0);
auto geogCRSNormalized = proj_create_geographic_crs_from_datum(
ctx, "unnamed crs", datum ? datum : datum_ensemble, cs);
proj_destroy(datum);
proj_destroy(datum_ensemble);
if (pm_longitude != 0) {
auto ellipsoid = proj_get_ellipsoid(ctx, geodetic_crs);
double semi_major_metre = 0;
double inv_flattening = 0;
proj_ellipsoid_get_parameters(ctx, ellipsoid,
&semi_major_metre, nullptr,
nullptr, &inv_flattening);
geogCRSNormalized = proj_create_geographic_crs(
ctx, "unname crs", "unnamed datum",
proj_get_name(ellipsoid), semi_major_metre,
inv_flattening, "reference prime meridian", 0, nullptr,
0, cs);
proj_destroy(ellipsoid);
} else {
auto datum = proj_crs_get_datum(ctx, geodetic_crs);
auto datum_ensemble =
proj_crs_get_datum_ensemble(ctx, geodetic_crs);
geogCRSNormalized = proj_create_geographic_crs_from_datum(
ctx, "unnamed crs", datum ? datum : datum_ensemble, cs);
proj_destroy(datum);
proj_destroy(datum_ensemble);
}
proj_destroy(cs);
Proj = proj_create_crs_to_crs_from_pj(ctx, geogCRSNormalized, P,
nullptr, nullptr);
+2 -1
View File
@@ -9110,7 +9110,8 @@ PJ *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ *obj) {
alt.idxInOriginalList, minxSrc, minySrc, maxxSrc,
maxySrc, minxDst, minyDst, maxxDst, maxyDst,
pjNormalized, co->nameStr(), alt.accuracy,
alt.isOffshore, alt.pjSrcGeocentricToLonLat,
alt.pseudoArea, alt.areaName.c_str(),
alt.pjSrcGeocentricToLonLat,
alt.pjDstGeocentricToLonLat);
}
}
+37 -21
View File
@@ -636,16 +636,18 @@ CRSNNPtr CRS::createBoundCRSToWGS84IfPossible(
auto geogCRS = extractGeographicCRS();
auto hubCRS = util::nn_static_pointer_cast<CRS>(GeographicCRS::EPSG_4326);
if (geodCRS && !geogCRS) {
if (geodCRS->_isEquivalentTo(GeographicCRS::EPSG_4978.get(),
if (geodCRS->datumNonNull(dbContext)->nameStr() != "unknown" &&
geodCRS->_isEquivalentTo(GeographicCRS::EPSG_4978.get(),
util::IComparable::Criterion::EQUIVALENT,
dbContext)) {
return thisAsCRS;
}
hubCRS = util::nn_static_pointer_cast<CRS>(GeodeticCRS::EPSG_4978);
} else if (!geogCRS ||
geogCRS->_isEquivalentTo(
GeographicCRS::EPSG_4326.get(),
util::IComparable::Criterion::EQUIVALENT, dbContext)) {
(geogCRS->datumNonNull(dbContext)->nameStr() != "unknown" &&
geogCRS->_isEquivalentTo(
GeographicCRS::EPSG_4326.get(),
util::IComparable::Criterion::EQUIVALENT, dbContext))) {
return thisAsCRS;
} else {
geodCRS = geogCRS;
@@ -2432,7 +2434,7 @@ void GeodeticCRS::addDatumInfoToPROJString(
const auto &nadgrids = formatter->getHDatumExtension();
const auto l_datum = datumNonNull(formatter->databaseContext());
if (formatter->getCRSExport() && TOWGS84Params.empty() &&
nadgrids.empty()) {
nadgrids.empty() && l_datum->nameStr() != "unknown") {
if (l_datum->_isEquivalentTo(
datum::GeodeticReferenceFrame::EPSG_6326.get(),
util::IComparable::Criterion::EQUIVALENT)) {
@@ -3135,12 +3137,20 @@ bool GeographicCRS::_isEquivalentTo(
const auto standardCriterion = getStandardCriterion(criterion);
if (GeodeticCRS::_isEquivalentToNoTypeCheck(other, standardCriterion,
dbContext)) {
// Make sure GeoPackage "Undefined geographic SRS" != EPSG:4326
const auto otherGeogCRS = dynamic_cast<const GeographicCRS *>(other);
if ((nameStr() == "Undefined geographic SRS" ||
otherGeogCRS->nameStr() == "Undefined geographic SRS") &&
otherGeogCRS->nameStr() != nameStr()) {
return false;
}
return true;
}
if (criterion !=
util::IComparable::Criterion::EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS) {
return false;
}
const auto axisOrder = coordinateSystem()->axisOrder();
if (axisOrder == cs::EllipsoidalCS::AxisOrder::LONG_EAST_LAT_NORTH ||
axisOrder == cs::EllipsoidalCS::AxisOrder::LAT_NORTH_LONG_EAST) {
@@ -4846,22 +4856,28 @@ ProjectedCRS::identify(const io::AuthorityFactoryPtr &authorityFactory) const {
const auto addCRS = [&](const ProjectedCRSNNPtr &crs, const bool eqName,
bool hasNonMatchingId) {
const auto &l_unit = cs->axisList()[0]->unit();
if (_isEquivalentTo(crs.get(),
util::IComparable::Criterion::
EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS,
dbContext) ||
(l_implicitCS &&
l_unit._isEquivalentTo(
crs->coordinateSystem()->axisList()[0]->unit(),
util::IComparable::Criterion::EQUIVALENT) &&
l_baseCRS->_isEquivalentTo(
crs->baseCRS().get(),
util::IComparable::Criterion::
EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS,
dbContext) &&
derivingConversionRef()->_isEquivalentTo(
crs->derivingConversionRef().get(),
util::IComparable::Criterion::EQUIVALENT, dbContext))) {
if ((_isEquivalentTo(crs.get(),
util::IComparable::Criterion::
EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS,
dbContext) ||
(l_implicitCS &&
l_unit._isEquivalentTo(
crs->coordinateSystem()->axisList()[0]->unit(),
util::IComparable::Criterion::EQUIVALENT) &&
l_baseCRS->_isEquivalentTo(
crs->baseCRS().get(),
util::IComparable::Criterion::
EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS,
dbContext) &&
derivingConversionRef()->_isEquivalentTo(
crs->derivingConversionRef().get(),
util::IComparable::Criterion::EQUIVALENT, dbContext))) &&
!((baseCRS()->datumNonNull(dbContext)->nameStr() == "unknown" &&
crs->baseCRS()->datumNonNull(dbContext)->nameStr() !=
"unknown") ||
(baseCRS()->datumNonNull(dbContext)->nameStr() != "unknown" &&
crs->baseCRS()->datumNonNull(dbContext)->nameStr() ==
"unknown"))) {
if (crs->nameStr() == thisName) {
res.clear();
res.emplace_back(crs, hasNonMatchingId ? 70 : 100);
+4 -1
View File
@@ -1156,7 +1156,7 @@ bool Ellipsoid::_isEquivalentTo(const util::IComparable *other,
}
} else {
if (!otherEllipsoid->computeSemiMinorAxis()._isEquivalentTo(
if (!computeSemiMinorAxis()._isEquivalentTo(
otherEllipsoid->computeSemiMinorAxis(), criterion)) {
return false;
}
@@ -1547,6 +1547,9 @@ bool GeodeticReferenceFrame::_isEquivalentTo(
bool GeodeticReferenceFrame::hasEquivalentNameToUsingAlias(
const IdentifiedObject *other,
const io::DatabaseContextPtr &dbContext) const {
if (nameStr() == "unknown" || other->nameStr() == "unknown") {
return true;
}
if (dbContext) {
if (!identifiers().empty()) {
const auto &id = identifiers().front();
+10 -5
View File
@@ -330,10 +330,10 @@ std::shared_ptr<SQLiteHandle> SQLiteHandle::open(PJ_CONTEXT *ctx,
}
sqlite3 *sqlite_handle = nullptr;
// SQLITE_OPEN_FULLMUTEX as this will be used from concurrent threads
if (sqlite3_open_v2(path.c_str(), &sqlite_handle,
SQLITE_OPEN_READONLY | SQLITE_OPEN_FULLMUTEX,
vfsName.empty() ? nullptr : vfsName.c_str()) !=
SQLITE_OK ||
if (sqlite3_open_v2(
path.c_str(), &sqlite_handle,
SQLITE_OPEN_READONLY | SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_URI,
vfsName.empty() ? nullptr : vfsName.c_str()) != SQLITE_OK ||
!sqlite_handle) {
if (sqlite_handle != nullptr) {
sqlite3_close(sqlite_handle);
@@ -5037,8 +5037,13 @@ AuthorityFactory::createGeodeticCRS(const std::string &code) const {
crs::GeographicCRSNNPtr
AuthorityFactory::createGeographicCRS(const std::string &code) const {
return NN_NO_CHECK(util::nn_dynamic_pointer_cast<crs::GeographicCRS>(
auto crs(util::nn_dynamic_pointer_cast<crs::GeographicCRS>(
createGeodeticCRS(code, true)));
if (!crs) {
throw NoSuchAuthorityCodeException("geographicCRS not found",
d->authority(), code);
}
return NN_NO_CHECK(crs);
}
// ---------------------------------------------------------------------------
+281 -14
View File
@@ -1308,6 +1308,8 @@ struct WKTParser::Private {
Private &operator=(const Private &) = delete;
void emitRecoverableWarning(const std::string &errorMsg);
void emitRecoverableMissingUNIT(const std::string &parentNodeName,
const UnitOfMeasure &fallbackUnit);
BaseObjectNNPtr build(const WKTNodeNNPtr &node);
@@ -1732,6 +1734,8 @@ PropertyMap &WKTParser::Private::buildProperties(const WKTNodeNNPtr &node,
esriStyle_ = true;
if (name == "GCS_WGS_1984") {
name = "WGS 84";
} else if (name == "GCS_unknown") {
name = "unknown";
} else {
tableNameForAlias = "geodetic_crs";
}
@@ -2376,6 +2380,8 @@ GeodeticReferenceFrameNNPtr WKTParser::Private::buildGeodeticReferenceFrame(
name = "European Terrestrial Reference System 1989";
authNameFromAlias = Identifier::EPSG;
codeFromAlias = "6258";
} else if (name == "D_unknown") {
name = "unknown";
} else {
tableNameForAlias = "geodetic_datum";
}
@@ -2733,16 +2739,36 @@ WKTParser::Private::buildAxis(const WKTNodeNNPtr &node,
static const PropertyMap emptyPropertyMap{};
// ---------------------------------------------------------------------------
PROJ_NO_RETURN static void ThrowParsingException(const std::string &msg) {
throw ParsingException(msg);
}
// ---------------------------------------------------------------------------
static ParsingException
buildParsingExceptionInvalidAxisCount(const std::string &csType) {
return ParsingException(
concat("buildCS: invalid CS axis count for ", csType));
}
// ---------------------------------------------------------------------------
void WKTParser::Private::emitRecoverableMissingUNIT(
const std::string &parentNodeName, const UnitOfMeasure &fallbackUnit) {
std::string msg("buildCS: missing UNIT in ");
msg += parentNodeName;
if (!strict_ && fallbackUnit == UnitOfMeasure::METRE) {
msg += ". Assuming metre";
} else if (!strict_ && fallbackUnit == UnitOfMeasure::DEGREE) {
msg += ". Assuming degree";
}
emitRecoverableWarning(msg);
}
// ---------------------------------------------------------------------------
CoordinateSystemNNPtr
WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
const WKTNodeNNPtr &parentNode,
@@ -2752,6 +2778,7 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
const int numberOfAxis =
parentNode->countChildrenOfName(WKTConstants::AXIS);
int axisCount = numberOfAxis;
const auto &parentNodeName = parentNode->GP()->value();
if (!isNull(node)) {
const auto *nodeP = node->GP();
const auto &children = nodeP->children();
@@ -2767,7 +2794,6 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
}
} else {
const char *csTypeCStr = "";
const auto &parentNodeName = parentNode->GP()->value();
if (ci_equal(parentNodeName, WKTConstants::GEOCCS)) {
csTypeCStr = "Cartesian";
isGeocentric = true;
@@ -2775,7 +2801,8 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
auto unit =
buildUnitInSubNode(parentNode, UnitOfMeasure::Type::LINEAR);
if (unit == UnitOfMeasure::NONE) {
ThrowParsingExceptionMissingUNIT();
unit = UnitOfMeasure::METRE;
emitRecoverableMissingUNIT(parentNodeName, unit);
}
return CartesianCS::createGeocentric(unit);
}
@@ -2787,7 +2814,8 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
auto unit = buildUnitInSubNode(parentNode,
UnitOfMeasure::Type::ANGULAR);
if (unit == UnitOfMeasure::NONE) {
ThrowParsingExceptionMissingUNIT();
unit = defaultAngularUnit;
emitRecoverableMissingUNIT(parentNodeName, unit);
}
// ESRI WKT for geographic 3D CRS
@@ -2823,10 +2851,9 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
auto unit =
buildUnitInSubNode(parentNode, UnitOfMeasure::Type::LINEAR);
if (unit == UnitOfMeasure::NONE) {
unit = UnitOfMeasure::METRE;
if (ci_equal(parentNodeName, WKTConstants::PROJCS)) {
ThrowParsingExceptionMissingUNIT();
} else {
unit = UnitOfMeasure::METRE;
emitRecoverableMissingUNIT(parentNodeName, unit);
}
}
return CartesianCS::createEastingNorthing(unit);
@@ -2868,11 +2895,10 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
auto unit =
buildUnitInSubNode(parentNode, UnitOfMeasure::Type::LINEAR);
if (unit == UnitOfMeasure::NONE) {
unit = UnitOfMeasure::METRE;
if (ci_equal(parentNodeName, WKTConstants::VERT_CS) ||
ci_equal(parentNodeName, WKTConstants::VERTCS)) {
ThrowParsingExceptionMissingUNIT();
} else {
unit = UnitOfMeasure::METRE;
emitRecoverableMissingUNIT(parentNodeName, unit);
}
}
if (downDirection) {
@@ -2895,7 +2921,7 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
return CartesianCS::createEastingNorthing(unit);
} else if (axisCount == 1) {
csTypeCStr = "vertical";
} else if (axisCount == 2) {
} else if (axisCount == 2 || axisCount == 3) {
csTypeCStr = "Cartesian";
} else {
throw ParsingException(
@@ -2964,6 +2990,14 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */
: UnitOfMeasure::Type::UNKNOWN;
UnitOfMeasure unit = buildUnitInSubNode(parentNode, unitType);
if (unit == UnitOfMeasure::NONE) {
if (ci_equal(parentNodeName, WKTConstants::VERT_CS) ||
ci_equal(parentNodeName, WKTConstants::VERTCS)) {
unit = UnitOfMeasure::METRE;
emitRecoverableMissingUNIT(parentNodeName, unit);
}
}
std::vector<CoordinateSystemAxisNNPtr> axisList;
for (int i = 0; i < axisCount; i++) {
axisList.emplace_back(
@@ -5981,7 +6015,7 @@ IdentifierNNPtr JSONParser::buildId(const json &j, bool removeInverseOf) {
static_cast<int>(dblVersion) == dblVersion) {
version = internal::toString(static_cast<int>(dblVersion));
} else {
version = internal::toString(dblVersion);
version = internal::toString(dblVersion, /*precision=*/15);
}
} else {
throw ParsingException("Unexpected type for value of \"version\"");
@@ -8661,8 +8695,8 @@ const std::string &PROJStringFormatter::toString() const {
}
// +step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X2 +z_out=Z2
// +step +proj=unitconvert +z_in=Z2 +z_out=Z3
// ==> step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X2
// +step +proj=unitconvert +z_in=Z2 +z_out=Z3
// ==> +step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X2
// +z_out=Z3
if (prevStep.name == "unitconvert" &&
curStep.name == "unitconvert" && !prevStep.inverted &&
@@ -8693,6 +8727,157 @@ const std::string &PROJStringFormatter::toString() const {
continue;
}
// +step +proj=unitconvert +z_in=Z1 +z_out=Z2
// +step +proj=unitconvert +xy_in=X1 +z_in=Z2 +xy_out=X2 +z_out=Z3
// ==> +step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X2
// +z_out=Z3
if (prevStep.name == "unitconvert" &&
curStep.name == "unitconvert" && !prevStep.inverted &&
!curStep.inverted && prevStep.paramValues.size() == 2 &&
curStep.paramValues.size() == 4 &&
prevStep.paramValues[0].keyEquals("z_in") &&
prevStep.paramValues[1].keyEquals("z_out") &&
curStep.paramValues[0].keyEquals("xy_in") &&
curStep.paramValues[1].keyEquals("z_in") &&
curStep.paramValues[2].keyEquals("xy_out") &&
curStep.paramValues[3].keyEquals("z_out") &&
prevStep.paramValues[1].value == curStep.paramValues[1].value) {
auto xy_in = curStep.paramValues[0].value;
auto z_in = prevStep.paramValues[0].value;
auto xy_out = curStep.paramValues[2].value;
auto z_out = curStep.paramValues[3].value;
iterCur->paramValues.clear();
iterCur->paramValues.emplace_back(
Step::KeyValue("xy_in", xy_in));
iterCur->paramValues.emplace_back(Step::KeyValue("z_in", z_in));
iterCur->paramValues.emplace_back(
Step::KeyValue("xy_out", xy_out));
iterCur->paramValues.emplace_back(
Step::KeyValue("z_out", z_out));
deletePrevIter();
continue;
}
// +step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X2 +z_out=Z2
// +step +proj=unitconvert +xy_in=X2 +xy_out=X3
// ==> +step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X3
// +z_out=Z2
if (prevStep.name == "unitconvert" &&
curStep.name == "unitconvert" && !prevStep.inverted &&
!curStep.inverted && prevStep.paramValues.size() == 4 &&
curStep.paramValues.size() == 2 &&
prevStep.paramValues[0].keyEquals("xy_in") &&
prevStep.paramValues[1].keyEquals("z_in") &&
prevStep.paramValues[2].keyEquals("xy_out") &&
prevStep.paramValues[3].keyEquals("z_out") &&
curStep.paramValues[0].keyEquals("xy_in") &&
curStep.paramValues[1].keyEquals("xy_out") &&
prevStep.paramValues[2].value == curStep.paramValues[0].value) {
auto xy_in = prevStep.paramValues[0].value;
auto z_in = prevStep.paramValues[1].value;
auto xy_out = curStep.paramValues[1].value;
auto z_out = prevStep.paramValues[3].value;
iterCur->paramValues.clear();
iterCur->paramValues.emplace_back(
Step::KeyValue("xy_in", xy_in));
iterCur->paramValues.emplace_back(Step::KeyValue("z_in", z_in));
iterCur->paramValues.emplace_back(
Step::KeyValue("xy_out", xy_out));
iterCur->paramValues.emplace_back(
Step::KeyValue("z_out", z_out));
deletePrevIter();
continue;
}
// clang-format off
// A bit odd. Used to simplify geog3d_feet -> EPSG:6318+6360
// of https://github.com/OSGeo/PROJ/issues/3938
// where we get originally
// +step +proj=unitconvert +xy_in=deg +z_in=ft +xy_out=rad +z_out=us-ft
// +step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m
// and want it simplified as:
// +step +proj=unitconvert +xy_in=deg +z_in=ft +xy_out=deg +z_out=us-ft
//
// More generally:
// +step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X2 +z_out=Z2
// +step +proj=unitconvert +xy_in=X2 +z_in=Z3 +xy_out=X3 +z_out=Z3
// ==> +step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X3 +z_out=Z2
// clang-format on
if (prevStep.name == "unitconvert" &&
curStep.name == "unitconvert" && !prevStep.inverted &&
!curStep.inverted && prevStep.paramValues.size() == 4 &&
curStep.paramValues.size() == 4 &&
prevStep.paramValues[0].keyEquals("xy_in") &&
prevStep.paramValues[1].keyEquals("z_in") &&
prevStep.paramValues[2].keyEquals("xy_out") &&
prevStep.paramValues[3].keyEquals("z_out") &&
curStep.paramValues[0].keyEquals("xy_in") &&
curStep.paramValues[1].keyEquals("z_in") &&
curStep.paramValues[2].keyEquals("xy_out") &&
curStep.paramValues[3].keyEquals("z_out") &&
prevStep.paramValues[2].value == curStep.paramValues[0].value &&
curStep.paramValues[1].value == curStep.paramValues[3].value) {
auto xy_in = prevStep.paramValues[0].value;
auto z_in = prevStep.paramValues[1].value;
auto xy_out = curStep.paramValues[2].value;
auto z_out = prevStep.paramValues[3].value;
iterCur->paramValues.clear();
iterCur->paramValues.emplace_back(
Step::KeyValue("xy_in", xy_in));
iterCur->paramValues.emplace_back(Step::KeyValue("z_in", z_in));
iterCur->paramValues.emplace_back(
Step::KeyValue("xy_out", xy_out));
iterCur->paramValues.emplace_back(
Step::KeyValue("z_out", z_out));
deletePrevIter();
continue;
}
// clang-format off
// Variant of above
// +step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X2 +z_out=Z1
// +step +proj=unitconvert +xy_in=X2 +z_in=Z2 +xy_out=X3 +z_out=Z3
// ==> +step +proj=unitconvert +xy_in=X1 +z_in=Z2 +xy_out=X3 +z_out=Z3
// clang-format on
if (prevStep.name == "unitconvert" &&
curStep.name == "unitconvert" && !prevStep.inverted &&
!curStep.inverted && prevStep.paramValues.size() == 4 &&
curStep.paramValues.size() == 4 &&
prevStep.paramValues[0].keyEquals("xy_in") &&
prevStep.paramValues[1].keyEquals("z_in") &&
prevStep.paramValues[2].keyEquals("xy_out") &&
prevStep.paramValues[3].keyEquals("z_out") &&
curStep.paramValues[0].keyEquals("xy_in") &&
curStep.paramValues[1].keyEquals("z_in") &&
curStep.paramValues[2].keyEquals("xy_out") &&
curStep.paramValues[3].keyEquals("z_out") &&
prevStep.paramValues[1].value ==
prevStep.paramValues[3].value &&
curStep.paramValues[0].value == prevStep.paramValues[2].value) {
auto xy_in = prevStep.paramValues[0].value;
auto z_in = curStep.paramValues[1].value;
auto xy_out = curStep.paramValues[2].value;
auto z_out = curStep.paramValues[3].value;
iterCur->paramValues.clear();
iterCur->paramValues.emplace_back(
Step::KeyValue("xy_in", xy_in));
iterCur->paramValues.emplace_back(Step::KeyValue("z_in", z_in));
iterCur->paramValues.emplace_back(
Step::KeyValue("xy_out", xy_out));
iterCur->paramValues.emplace_back(
Step::KeyValue("z_out", z_out));
deletePrevIter();
continue;
}
// unitconvert (1), axisswap order=2,1, unitconvert(2) ==>
// axisswap order=2,1, unitconvert (1), unitconvert(2) which
// will get further optimized by previous case
@@ -9241,6 +9426,59 @@ const std::string &PROJStringFormatter::toString() const {
}
}
{
auto iterCur = steps.begin();
if (iterCur != steps.end()) {
++iterCur;
}
while (iterCur != steps.end()) {
assert(iterCur != steps.begin());
auto iterPrev = std::prev(iterCur);
auto &prevStep = *iterPrev;
auto &curStep = *iterCur;
const auto curStepParamCount = curStep.paramValues.size();
const auto prevStepParamCount = prevStep.paramValues.size();
const auto deletePrevAndCurIter = [&steps, &iterPrev, &iterCur]() {
iterCur = steps.erase(iterPrev, std::next(iterCur));
if (iterCur != steps.begin())
iterCur = std::prev(iterCur);
if (iterCur == steps.begin() && iterCur != steps.end())
++iterCur;
};
// axisswap order=2,1 followed by itself is a no-op
if (curStep.name == "axisswap" && prevStep.name == "axisswap" &&
curStepParamCount == 1 && prevStepParamCount == 1 &&
curStep.paramValues[0].equals("order", "2,1") &&
prevStep.paramValues[0].equals("order", "2,1")) {
deletePrevAndCurIter();
continue;
}
// detect a step and its inverse
if (curStep.inverted != prevStep.inverted &&
curStep.name == prevStep.name &&
curStepParamCount == prevStepParamCount) {
bool allSame = true;
for (size_t j = 0; j < curStepParamCount; j++) {
if (curStep.paramValues[j] != prevStep.paramValues[j]) {
allSame = false;
break;
}
}
if (allSame) {
deletePrevAndCurIter();
continue;
}
}
++iterCur;
}
}
if (steps.size() > 1 ||
(steps.size() == 1 &&
(steps.front().inverted || steps.front().hasKey("omit_inv") ||
@@ -10177,6 +10415,12 @@ static bool isGeocentricStep(const std::string &name) {
// ---------------------------------------------------------------------------
static bool isTopocentricStep(const std::string &name) {
return name == "topocentric";
}
// ---------------------------------------------------------------------------
static bool isProjectedStep(const std::string &name) {
if (name == "etmerc" || name == "utm" ||
!getMappingsFromPROJName(name).empty()) {
@@ -10853,7 +11097,7 @@ GeodeticCRSNNPtr
PROJStringParser::Private::buildGeocentricCRS(int iStep, int iUnitConvert) {
auto &step = steps_[iStep];
assert(isGeocentricStep(step.name));
assert(isGeocentricStep(step.name) || isTopocentricStep(step.name));
assert(iUnitConvert < 0 ||
ci_equal(steps_[iUnitConvert].name, "unitconvert"));
@@ -11505,6 +11749,13 @@ PROJStringParser::Private::buildProjectedCRS(int iStep,
? CartesianCS::create(emptyPropertyMap, axis[0], axis[1])
: CartesianCS::create(emptyPropertyMap, axis[0], axis[1],
csGeodCRS->axisList()[2]);
if (isTopocentricStep(step.name)) {
cs = CartesianCS::create(
emptyPropertyMap,
createAxis("topocentric East", "U", AxisDirection::EAST, unit),
createAxis("topocentric North", "V", AxisDirection::NORTH, unit),
createAxis("topocentric Up", "W", AxisDirection::UP, unit));
}
auto props = PropertyMap().set(IdentifiedObject::NAME_KEY,
title.empty() ? "unknown" : title);
@@ -11611,6 +11862,10 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
(d->steps_.size() == 2 && d->steps_[1].name == "unitconvert")) &&
!d->steps_[0].inverted && isGeocentricStep(d->steps_[0].name);
const bool isTopocentricCRS =
(d->steps_.size() == 1 && isTopocentricStep(d->steps_[0].name) &&
d->getParamValue(d->steps_[0], "type") == "crs");
// +init=xxxx:yyyy syntax
if (d->steps_.size() == 1 && d->steps_[0].isInit &&
!d->steps_[0].inverted) {
@@ -12003,6 +12258,18 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
}
}
if (isTopocentricCRS) {
// First run is dry run to mark all recognized/unrecognized tokens
for (int iter = 0; iter < 2; iter++) {
auto obj = d->buildBoundOrCompoundCRSIfNeeded(
0,
d->buildProjectedCRS(0, d->buildGeocentricCRS(0, -1), -1, -1));
if (iter == 1) {
return nn_static_pointer_cast<BaseObject>(obj);
}
}
}
if (!unexpectedStructure) {
if (iFirstGeogStep == 0 && !d->steps_[iFirstGeogStep].inverted &&
iSecondGeogStep < 0 && iProjStep < 0 &&
+16 -13
View File
@@ -343,6 +343,13 @@ bool GeographicBoundingBox::Private::intersects(const Private &other) const {
return false;
}
// Bail out on longitudes not in [-180,180]. We could probably make
// some sense of them, but this check at least avoid potential infinite
// recursion.
if (oW > 180 || oE < -180) {
return false;
}
return intersects(Private(oW, oS, 180.0, oN)) ||
intersects(Private(-180.0, oS, oE, oN));
@@ -1088,10 +1095,11 @@ void Identifier::_exportToWKT(WKTFormatter *formatter) const {
formatter->addQuotedString(l_code);
}
if (!l_version.empty()) {
try {
(void)c_locale_stod(l_version);
bool isDouble = false;
(void)c_locale_stod(l_version, isDouble);
if (isDouble) {
formatter->add(l_version);
} catch (const std::exception &) {
} else {
formatter->addQuotedString(l_version);
}
}
@@ -1140,16 +1148,11 @@ void Identifier::_exportToJSON(JSONFormatter *formatter) const {
if (!l_version.empty()) {
writer->AddObjKey("version");
try {
const double dblVersion = c_locale_stod(l_version);
if (dblVersion >= std::numeric_limits<int>::min() &&
dblVersion <= std::numeric_limits<int>::max() &&
static_cast<int>(dblVersion) == dblVersion) {
writer->Add(static_cast<int>(dblVersion));
} else {
writer->Add(dblVersion);
}
} catch (const std::exception &) {
bool isDouble = false;
(void)c_locale_stod(l_version, isDouble);
if (isDouble) {
writer->AddUnquoted(l_version.c_str());
} else {
writer->Add(l_version);
}
}
+1 -23
View File
@@ -4144,29 +4144,7 @@ void Conversion::_exportToPROJString(
"requires an input and output vertical CRS");
}
}
auto uom = common::UnitOfMeasure(std::string(), convFactor,
common::UnitOfMeasure::Type::LINEAR)
.exportToPROJString();
auto reverse_uom =
convFactor == 0.0
? std::string()
: common::UnitOfMeasure(std::string(), 1.0 / convFactor,
common::UnitOfMeasure::Type::LINEAR)
.exportToPROJString();
if (uom == "m") {
// do nothing
} else if (!uom.empty()) {
formatter->addStep("unitconvert");
formatter->addParam("z_in", uom);
formatter->addParam("z_out", "m");
} else if (!reverse_uom.empty()) {
formatter->addStep("unitconvert");
formatter->addParam("z_in", "m");
formatter->addParam("z_out", reverse_uom);
} else {
formatter->addStep("affine");
formatter->addParam("s33", convFactor);
}
exportToPROJStringChangeVerticalUnit(formatter, convFactor);
bConversionDone = true;
bEllipsoidParametersDone = true;
} else if (methodEPSGCode == EPSG_CODE_METHOD_GEOGRAPHIC_TOPOCENTRIC) {
@@ -1384,16 +1384,23 @@ struct FilterResults {
}
#if 0
std::cerr << op->nameStr() << " ";
std::cerr << area << " ";
std::cerr << getAccuracy(op) << " ";
std::cerr << isPROJExportable << " ";
std::cerr << hasGrids << " ";
std::cerr << gridsAvailable << " ";
std::cerr << gridsKnown << " ";
std::cerr << stepCount << " ";
std::cerr << op->hasBallparkTransformation() << " ";
std::cerr << isNullTransformation(op->nameStr()) << " ";
std::cerr << "name=" << op->nameStr() << " ";
std::cerr << "area=" << area << " ";
std::cerr << "accuracy=" << getAccuracy(op) << " ";
std::cerr << "isPROJExportable=" << isPROJExportable << " ";
std::cerr << "hasGrids=" << hasGrids << " ";
std::cerr << "gridsAvailable=" << gridsAvailable << " ";
std::cerr << "gridsKnown=" << gridsKnown << " ";
std::cerr << "stepCount=" << stepCount << " ";
std::cerr << "projStepCount=" << projStepCount << " ";
std::cerr << "ballpark=" << op->hasBallparkTransformation() << " ";
std::cerr << "vertBallpark="
<< (op->nameStr().find(
BALLPARK_VERTICAL_TRANSFORMATION) !=
std::string::npos)
<< " ";
std::cerr << "isNull=" << isNullTransformation(op->nameStr())
<< " ";
std::cerr << std::endl;
#endif
map[op.get()] = PrecomputedOpCharacteristics(
@@ -1664,6 +1671,10 @@ void CoordinateOperationFactory::Private::buildCRSIds(
std::vector<io::AuthorityFactory::ObjectType> allowedObjects;
auto geogCRS = dynamic_cast<const crs::GeographicCRS *>(crs.get());
if (geogCRS) {
if (geogCRS->datumNonNull(authFactory->databaseContext())
->nameStr() == "unknown") {
return;
}
allowedObjects.push_back(
geogCRS->coordinateSystem()->axisList().size() == 2
? io::AuthorityFactory::ObjectType::GEOGRAPHIC_2D_CRS
@@ -1939,6 +1950,20 @@ findCandidateGeodCRSForDatum(const io::AuthorityFactoryPtr &authFactory,
//! @cond Doxygen_Suppress
static bool
isSameGeodeticDatum(const datum::GeodeticReferenceFrameNNPtr &datum1,
const datum::GeodeticReferenceFrameNNPtr &datum2,
const io::DatabaseContextPtr &dbContext) {
if (datum1->nameStr() == "unknown" && datum2->nameStr() != "unknown")
return false;
if (datum2->nameStr() == "unknown" && datum1->nameStr() != "unknown")
return false;
return datum1->_isEquivalentTo(
datum2.get(), util::IComparable::Criterion::EQUIVALENT, dbContext);
}
// ---------------------------------------------------------------------------
// Look in the authority registry for operations from sourceCRS to targetCRS
// using an intermediate pivot
std::vector<CoordinateOperationNNPtr>
@@ -1978,10 +2003,7 @@ CoordinateOperationFactory::Private::findsOpsInRegistryWithIntermediate(
candidateSrcGeod->datumNonNull(dbContext);
const auto dstDatum = geodDst->datumNonNull(dbContext);
const bool sameGeodeticDatum =
srcDatum->_isEquivalentTo(
dstDatum.get(),
util::IComparable::Criterion::EQUIVALENT,
dbContext);
isSameGeodeticDatum(srcDatum, dstDatum, dbContext);
if (sameGeodeticDatum) {
continue;
}
@@ -2133,9 +2155,8 @@ createBallparkGeographicOffset(const crs::CRSNNPtr &sourceCRS,
dynamic_cast<const crs::GeographicCRS *>(targetCRS.get());
const bool isSameDatum =
geogSrc && geogDst &&
geogSrc->datumNonNull(dbContext)->_isEquivalentTo(
geogDst->datumNonNull(dbContext).get(),
util::IComparable::Criterion::EQUIVALENT, dbContext);
isSameGeodeticDatum(geogSrc->datumNonNull(dbContext),
geogDst->datumNonNull(dbContext), dbContext);
auto name = buildOpName(isSameDatum ? NULL_GEOGRAPHIC_OFFSET
: BALLPARK_GEOGRAPHIC_OFFSET,
@@ -2229,16 +2250,12 @@ struct MyPROJStringExportableHorizVertical final
// cppcheck-suppress functionStatic
_exportToPROJString(io::PROJStringFormatter *formatter) const override {
formatter->pushOmitZUnitConversion();
horizTransform->_exportToPROJString(formatter);
formatter->startInversion();
geogDst->addAngularUnitConvertAndAxisSwap(formatter);
formatter->stopInversion();
formatter->popOmitZUnitConversion();
formatter->pushOmitHorizontalConversionInVertTransformation();
verticalTransform->_exportToPROJString(formatter);
formatter->popOmitHorizontalConversionInVertTransformation();
@@ -2378,6 +2395,29 @@ struct MyPROJStringExportableHorizVerticalHorizPROJBased final
MyPROJStringExportableHorizVerticalHorizPROJBased::
~MyPROJStringExportableHorizVerticalHorizPROJBased() = default;
// ---------------------------------------------------------------------------
struct MyPROJStringExportableHorizNullVertical final
: public io::IPROJStringExportable {
CoordinateOperationPtr horizTransform{};
MyPROJStringExportableHorizNullVertical(
const CoordinateOperationPtr &horizTransformIn)
: horizTransform(horizTransformIn) {}
~MyPROJStringExportableHorizNullVertical() override;
void
// cppcheck-suppress functionStatic
_exportToPROJString(io::PROJStringFormatter *formatter) const override {
horizTransform->_exportToPROJString(formatter);
}
};
MyPROJStringExportableHorizNullVertical::
~MyPROJStringExportableHorizNullVertical() = default;
//! @endcond
} // namespace operation
@@ -2388,6 +2428,7 @@ namespace dropbox{ namespace oxygen {
template<> nn<std::shared_ptr<NS_PROJ::operation::MyPROJStringExportableGeodToGeod>>::~nn() = default;
template<> nn<std::shared_ptr<NS_PROJ::operation::MyPROJStringExportableHorizVertical>>::~nn() = default;
template<> nn<std::shared_ptr<NS_PROJ::operation::MyPROJStringExportableHorizVerticalHorizPROJBased>>::~nn() = default;
template<> nn<std::shared_ptr<NS_PROJ::operation::MyPROJStringExportableHorizNullVertical>>::~nn() = default;
}}
#endif
@@ -2662,6 +2703,40 @@ static CoordinateOperationNNPtr createHorizVerticalHorizPROJBased(
nullptr, accuracies, hasBallparkTransformation);
}
// ---------------------------------------------------------------------------
static CoordinateOperationNNPtr createHorizNullVerticalPROJBased(
const crs::CRSNNPtr &sourceCRS, const crs::CRSNNPtr &targetCRS,
const operation::CoordinateOperationNNPtr &horizTransform,
const operation::CoordinateOperationNNPtr &verticalTransform) {
auto exportable =
util::nn_make_shared<MyPROJStringExportableHorizNullVertical>(
horizTransform);
std::vector<CoordinateOperationNNPtr> ops = {horizTransform,
verticalTransform};
const std::string opName = computeConcatenatedName(ops);
auto properties = util::PropertyMap();
properties.set(common::IdentifiedObject::NAME_KEY, opName);
bool emptyIntersection = false;
auto extent = getExtent(ops, false, emptyIntersection);
if (extent) {
properties.set(common::ObjectUsage::DOMAIN_OF_VALIDITY_KEY,
NN_NO_CHECK(extent));
}
const auto remarks = getRemarks(ops);
if (!remarks.empty()) {
properties.set(common::IdentifiedObject::REMARKS_KEY, remarks);
}
return createPROJBased(properties, exportable, sourceCRS, targetCRS,
nullptr, {}, /*hasBallparkTransformation=*/true);
}
//! @endcond
// ---------------------------------------------------------------------------
@@ -2706,9 +2781,9 @@ CoordinateOperationFactory::Private::createOperationsGeogToGeog(
const auto dbContext =
authFactory ? authFactory->databaseContext().as_nullable() : nullptr;
const bool sameDatum = geogSrc->datumNonNull(dbContext)->_isEquivalentTo(
geogDst->datumNonNull(dbContext).get(),
util::IComparable::Criterion::EQUIVALENT, dbContext);
const bool sameDatum =
isSameGeodeticDatum(geogSrc->datumNonNull(dbContext),
geogDst->datumNonNull(dbContext), dbContext);
// Do the CRS differ by their axis order ?
bool axisReversal2D = false;
@@ -3610,9 +3685,8 @@ bool CoordinateOperationFactory::Private::createOperationsFromDatabase(
const auto srcDatum = geodSrc->datumNonNull(dbContext);
const auto dstDatum = geodDst->datumNonNull(dbContext);
sameGeodeticDatum = srcDatum->_isEquivalentTo(
dstDatum.get(), util::IComparable::Criterion::EQUIVALENT,
dbContext);
sameGeodeticDatum = isSameGeodeticDatum(srcDatum, dstDatum, dbContext);
if (res.empty() && !sameGeodeticDatum &&
!context.inCreateOperationsWithDatumPivotAntiRecursion) {
@@ -4829,6 +4903,18 @@ void CoordinateOperationFactory::Private::createOperationsBoundToVert(
// ---------------------------------------------------------------------------
static std::string
getBallparkTransformationVertToVert(const crs::CRSNNPtr &sourceCRS,
const crs::CRSNNPtr &targetCRS) {
auto name = buildTransfName(sourceCRS->nameStr(), targetCRS->nameStr());
name += " (";
name += BALLPARK_VERTICAL_TRANSFORMATION;
name += ')';
return name;
}
// ---------------------------------------------------------------------------
void CoordinateOperationFactory::Private::createOperationsVertToVert(
const crs::CRSNNPtr &sourceCRS, const crs::CRSNNPtr &targetCRS,
Private::Context &context, const crs::VerticalCRS *vertSrc,
@@ -4874,10 +4960,8 @@ void CoordinateOperationFactory::Private::createOperationsVertToVert(
: metadata::Extent::WORLD);
if (!equivalentVDatum) {
auto name = buildTransfName(sourceCRS->nameStr(), targetCRS->nameStr());
name += " (";
name += BALLPARK_VERTICAL_TRANSFORMATION;
name += ')';
const auto name =
getBallparkTransformationVertToVert(sourceCRS, targetCRS);
auto conv = Transformation::createChangeVerticalUnit(
map.set(common::IdentifiedObject::NAME_KEY, name), sourceCRS,
targetCRS,
@@ -5681,14 +5765,16 @@ void CoordinateOperationFactory::Private::createOperationsCompoundToGeog(
}
}
const bool hasOnlyOneOp =
srcToInterpOps.size() == 1 && interpToTargetOps.size() == 1;
for (const auto &srcToInterp : srcToInterpOps) {
for (const auto &interpToTarget : interpToTargetOps) {
if ((srcAndTargetGeogAreSame &&
mapSetDatumsUsed[srcToInterp.get()] !=
mapSetDatumsUsed[interpToTarget.get()]) ||
!useCompatibleTransformationsForSameSourceTarget(
srcToInterp, interpToTarget)) {
if (!hasOnlyOneOp &&
((srcAndTargetGeogAreSame &&
mapSetDatumsUsed[srcToInterp.get()] !=
mapSetDatumsUsed[interpToTarget.get()]) ||
!useCompatibleTransformationsForSameSourceTarget(
srcToInterp, interpToTarget))) {
#ifdef TRACE_CREATE_OPERATIONS
logTrace(
"Considering that '" + srcToInterp->nameStr() +
@@ -6096,6 +6182,7 @@ void CoordinateOperationFactory::Private::createOperationsCompoundToCompound(
}
for (const auto &verticalTransform : verticalTransforms) {
auto interpolationGeogCRS = NN_NO_CHECK(srcGeog);
auto interpTransformCRS = verticalTransform->interpolationCRS();
if (interpTransformCRS) {
@@ -6138,6 +6225,37 @@ void CoordinateOperationFactory::Private::createOperationsCompoundToCompound(
}
}
}
if (verticalTransforms.size() == 1U &&
verticalTransform->hasBallparkTransformation() &&
context.context->getAuthorityFactory() &&
dynamic_cast<crs::ProjectedCRS *>(componentsSrc[0].get()) &&
dynamic_cast<crs::ProjectedCRS *>(componentsDst[0].get()) &&
verticalTransform->nameStr() ==
getBallparkTransformationVertToVert(componentsSrc[1],
componentsDst[1])) {
// e.g EPSG:3912+EPSG:5779 to EPSG:3794+EPSG:8690
// "MGI 1901 / Slovene National Grid + SVS2000 height" to
// "Slovenia 1996 / Slovene National Grid + SVS2010 height"
// using the "D48/GK to D96/TM (xx)" family of horizontal
// transformatoins between the projected CRS
// Cf
// https://github.com/OSGeo/PROJ/issues/3854#issuecomment-1689964773
// We restrict to a ballpark vertical transformation for now,
// but ideally we should deal with a regular vertical transformation
// but that would involve doing a transformation to its
// interpolation CRS and we don't have such cases for now.
std::vector<CoordinateOperationNNPtr> opsHoriz;
createOperationsFromDatabase(
componentsSrc[0], componentsDst[0], context, srcGeog.get(),
dstGeog.get(), srcGeog.get(), dstGeog.get(),
/*vertSrc=*/nullptr, /*vertDst=*/nullptr, opsHoriz);
for (const auto &opHoriz : opsHoriz) {
res.emplace_back(createHorizNullVerticalPROJBased(
sourceCRS, targetCRS, opHoriz, verticalTransform));
}
}
}
if (verticalTransforms.empty()) {
+65 -28
View File
@@ -3001,6 +3001,50 @@ static void setupPROJGeodeticTargetCRS(io::PROJStringFormatter *formatter,
// ---------------------------------------------------------------------------
/* static */
void SingleOperation::exportToPROJStringChangeVerticalUnit(
io::PROJStringFormatter *formatter, double convFactor) {
const auto uom = common::UnitOfMeasure(std::string(), convFactor,
common::UnitOfMeasure::Type::LINEAR)
.exportToPROJString();
const auto reverse_uom =
convFactor == 0.0
? std::string()
: common::UnitOfMeasure(std::string(), 1.0 / convFactor,
common::UnitOfMeasure::Type::LINEAR)
.exportToPROJString();
if (uom == "m") {
// do nothing
} else if (!uom.empty()) {
formatter->addStep("unitconvert");
formatter->addParam("z_in", uom);
formatter->addParam("z_out", "m");
} else if (!reverse_uom.empty()) {
formatter->addStep("unitconvert");
formatter->addParam("z_in", "m");
formatter->addParam("z_out", reverse_uom);
} else if (fabs(convFactor -
common::UnitOfMeasure::FOOT.conversionToSI() /
common::UnitOfMeasure::US_FOOT.conversionToSI()) <
1e-10) {
formatter->addStep("unitconvert");
formatter->addParam("z_in", "ft");
formatter->addParam("z_out", "us-ft");
} else if (fabs(convFactor -
common::UnitOfMeasure::US_FOOT.conversionToSI() /
common::UnitOfMeasure::FOOT.conversionToSI()) < 1e-10) {
formatter->addStep("unitconvert");
formatter->addParam("z_in", "us-ft");
formatter->addParam("z_out", "ft");
} else {
formatter->addStep("affine");
formatter->addParam("s33", convFactor);
}
}
// ---------------------------------------------------------------------------
bool SingleOperation::exportToPROJStringGeneric(
io::PROJStringFormatter *formatter) const {
const int methodEPSGCode = method()->getEPSGCode();
@@ -3124,30 +3168,7 @@ bool SingleOperation::exportToPROJStringGeneric(
if (methodEPSGCode == EPSG_CODE_METHOD_CHANGE_VERTICAL_UNIT) {
const double convFactor = parameterValueNumericAsSI(
EPSG_CODE_PARAMETER_UNIT_CONVERSION_SCALAR);
const auto uom =
common::UnitOfMeasure(std::string(), convFactor,
common::UnitOfMeasure::Type::LINEAR)
.exportToPROJString();
const auto reverse_uom =
convFactor == 0.0
? std::string()
: common::UnitOfMeasure(std::string(), 1.0 / convFactor,
common::UnitOfMeasure::Type::LINEAR)
.exportToPROJString();
if (uom == "m") {
// do nothing
} else if (!uom.empty()) {
formatter->addStep("unitconvert");
formatter->addParam("z_in", uom);
formatter->addParam("z_out", "m");
} else if (!reverse_uom.empty()) {
formatter->addStep("unitconvert");
formatter->addParam("z_in", "m");
formatter->addParam("z_out", reverse_uom);
} else {
formatter->addStep("affine");
formatter->addParam("s33", convFactor);
}
exportToPROJStringChangeVerticalUnit(formatter, convFactor);
return true;
}
@@ -3498,15 +3519,31 @@ bool SingleOperation::exportToPROJStringGeneric(
auto sourceCRSGeog =
dynamic_cast<const crs::GeographicCRS *>(sourceCRS().get());
if (!sourceCRSGeog) {
throw io::FormattingException(
"Can apply Geographic 3D offsets only to GeographicCRS");
auto boundCRS =
dynamic_cast<const crs::BoundCRS *>(sourceCRS().get());
if (boundCRS) {
sourceCRSGeog = dynamic_cast<crs::GeographicCRS *>(
boundCRS->baseCRS().get());
}
if (!sourceCRSGeog) {
throw io::FormattingException(
"Can apply Geographic 3D offsets only to GeographicCRS");
}
}
auto targetCRSGeog =
dynamic_cast<const crs::GeographicCRS *>(targetCRS().get());
if (!targetCRSGeog) {
throw io::FormattingException(
"Can apply Geographic 3D offsets only to GeographicCRS");
auto boundCRS =
dynamic_cast<const crs::BoundCRS *>(targetCRS().get());
if (boundCRS) {
targetCRSGeog = dynamic_cast<const crs::GeographicCRS *>(
boundCRS->baseCRS().get());
}
if (!targetCRSGeog) {
throw io::FormattingException(
"Can apply Geographic 3D offsets only to GeographicCRS");
}
}
formatter->startInversion();
+4
View File
@@ -66,6 +66,10 @@ NS_PROJ_START
// ---------------------------------------------------------------------------
const NameSpaceNNPtr NameSpace::GLOBAL(NameSpace::createGLOBAL());
// ---------------------------------------------------------------------------
/** \brief Key to set the authority citation of a metadata::Identifier.
*
* The value is to be provided as a string or a metadata::Citation.
-4
View File
@@ -494,10 +494,6 @@ NameSpaceNNPtr NameSpace::createGLOBAL() {
// ---------------------------------------------------------------------------
const NameSpaceNNPtr NameSpace::GLOBAL(NameSpace::createGLOBAL());
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
struct LocalName::Private {
NameSpacePtr scope{};
+1 -1
View File
@@ -175,7 +175,7 @@ extern "C" {
/* The version numbers should be updated with every release! **/
#define PROJ_VERSION_MAJOR 9
#define PROJ_VERSION_MINOR 3
#define PROJ_VERSION_PATCH 0
#define PROJ_VERSION_PATCH 1
/* Note: the following 3 defines have been introduced in PROJ 8.0.1 */
/* Macro to compute a PROJ version number from its components */
+13 -5
View File
@@ -342,7 +342,10 @@ struct PJCoordOperation {
PJ *pj = nullptr;
std::string name{};
double accuracy = -1.0;
double pseudoArea = 0.0;
std::string areaName{};
bool isOffshore = false;
bool isUnknownAreaName = false;
bool isPriorityOp = false;
bool srcIsLonLatDegree = false;
bool srcIsLatLonDegree = false;
@@ -363,8 +366,8 @@ struct PJCoordOperation {
double minySrcIn, double maxxSrcIn, double maxySrcIn,
double minxDstIn, double minyDstIn, double maxxDstIn,
double maxyDstIn, PJ *pjIn, const std::string &nameIn,
double accuracyIn, bool isOffshoreIn,
const PJ *pjSrcGeocentricToLonLatIn,
double accuracyIn, double pseudoAreaIn,
const char *areaName, const PJ *pjSrcGeocentricToLonLatIn,
const PJ *pjDstGeocentricToLonLatIn);
PJCoordOperation(const PJCoordOperation &) = delete;
@@ -376,7 +379,10 @@ struct PJCoordOperation {
minyDst(other.minyDst), maxxDst(other.maxxDst),
maxyDst(other.maxyDst), pj(proj_clone(ctx, other.pj)),
name(std::move(other.name)), accuracy(other.accuracy),
isOffshore(other.isOffshore), isPriorityOp(other.isPriorityOp),
pseudoArea(other.pseudoArea), areaName(other.areaName),
isOffshore(other.isOffshore),
isUnknownAreaName(other.isUnknownAreaName),
isPriorityOp(other.isPriorityOp),
srcIsLonLatDegree(other.srcIsLonLatDegree),
srcIsLatLonDegree(other.srcIsLatLonDegree),
dstIsLonLatDegree(other.dstIsLonLatDegree),
@@ -396,7 +402,9 @@ struct PJCoordOperation {
maxySrc(other.maxySrc), minxDst(other.minxDst),
minyDst(other.minyDst), maxxDst(other.maxxDst),
maxyDst(other.maxyDst), name(std::move(other.name)),
accuracy(other.accuracy), isOffshore(other.isOffshore),
accuracy(other.accuracy), pseudoArea(other.pseudoArea),
areaName(std::move(other.areaName)), isOffshore(other.isOffshore),
isUnknownAreaName(other.isUnknownAreaName),
isPriorityOp(other.isPriorityOp),
srcIsLonLatDegree(other.srcIsLonLatDegree),
srcIsLatLonDegree(other.srcIsLatLonDegree),
@@ -420,7 +428,7 @@ struct PJCoordOperation {
maxxDst == other.maxxDst && maxyDst == other.maxyDst &&
name == other.name &&
proj_is_equivalent_to(pj, other.pj, PJ_COMP_STRICT) &&
accuracy == other.accuracy && isOffshore == other.isOffshore;
accuracy == other.accuracy && areaName == other.areaName;
}
bool operator!=(const PJCoordOperation &other) const {
+5
View File
@@ -219,6 +219,11 @@ void CPLJSonStreamingWriter::Add(const char *pszStr) {
Print(FormatString(pszStr));
}
void CPLJSonStreamingWriter::AddUnquoted(const char *pszStr) {
EmitCommaIfNeeded();
Print(pszStr);
}
void CPLJSonStreamingWriter::Add(GIntBig nVal) {
EmitCommaIfNeeded();
Print(CPLSPrintf(CPL_FRMT_GIB, nVal));
+1
View File
@@ -86,6 +86,7 @@ class CPL_DLL CPLJSonStreamingWriter {
void Add(const std::string &str);
void Add(const char *pszStr);
void AddUnquoted(const char *pszStr);
void Add(bool bVal);
void Add(int nVal) { Add(static_cast<GIntBig>(nVal)); }
void Add(unsigned int nVal) { Add(static_cast<GIntBig>(nVal)); }
+1 -1
View File
@@ -8,6 +8,6 @@
char const pj_release[] = "Rel. " STR(PROJ_VERSION_MAJOR) "." STR(
PROJ_VERSION_MINOR) "." STR(PROJ_VERSION_PATCH) ", "
"September 1st, 2023";
"December 1st, 2023";
const char *pj_get_release() { return pj_release; }
+1 -1
View File
@@ -559,7 +559,7 @@ PJ *PROJECTION(horner) {
P->inv3d = nullptr;
P->fwd = nullptr;
P->inv = nullptr;
P->left = P->right = PJ_IO_UNITS_PROJECTED;
P->left = P->right = PJ_IO_UNITS_WHATEVER;
P->destructor = horner_freeup;
/* Polynomial degree specified? */
+9 -6
View File
@@ -43,23 +43,26 @@ endif()
proj_add_gie_test("Builtins" "gie/builtins.gie")
proj_add_gie_test("Builtins2" "gie/more_builtins.gie")
proj_add_gie_test("Axisswap" "gie/axisswap.gie")
proj_add_gie_test("Deformation" "gie/deformation.gie")
proj_add_gie_test("Ellipsoid" "gie/ellipsoid.gie")
proj_add_gie_test("GDA" "gie/GDA.gie")
proj_add_gie_test("4D-API-cs2cs-style" "gie/4D-API_cs2cs-style.gie")
proj_add_gie_test("DHDN_ETRS89" "gie/DHDN_ETRS89.gie")
proj_add_gie_test("Unitconvert" "gie/unitconvert.gie")
proj_add_gie_test("geotiff_grids" "gie/geotiff_grids.gie")
proj_add_gie_test("adams_hemi" "gie/adams_hemi.gie")
proj_add_gie_test("adams_ws1" "gie/adams_ws1.gie")
proj_add_gie_test("adams_ws2" "gie/adams_ws2.gie")
proj_add_gie_test("guyou" "gie/guyou.gie")
proj_add_gie_test("peirce_q" "gie/peirce_q.gie")
proj_add_gie_test("defmodel" "gie/defmodel.gie")
proj_add_gie_test("tinshift" "gie/tinshift.gie")
proj_add_gie_test("gridshift" "gie/gridshift.gie")
if(CURL_ENABLED AND RUN_NETWORK_DEPENDENT_TESTS)
if(TIFF_ENABLED)
proj_add_gie_test("Deformation" "gie/deformation.gie")
proj_add_gie_test("geotiff_grids" "gie/geotiff_grids.gie")
proj_add_gie_test("defmodel" "gie/defmodel.gie")
proj_add_gie_test("gridshift" "gie/gridshift.gie")
endif()
if(TIFF_ENABLED AND CURL_ENABLED AND RUN_NETWORK_DEPENDENT_TESTS)
proj_add_gie_network_dependent_test("nkg" "gie/nkg.gie")
endif()
@@ -72,7 +75,7 @@ proj_add_gie_test("GIGS-5101.4-jhs-etmerc" "gigs/5101.4-jhs-etmerc.gie")
# Same as above, but using etmerc instead of tmerc
#proj_add_gie_test("GIGS-5101.4-jhs" "gigs/5101.4-jhs.gie")
proj_add_gie_test("GIGS-5102.1" "gigs/5102.1.gie")
#proj_add_gie_test("GIGS-5102.2" "gigs/5102.2.gie")
proj_add_gie_test("GIGS-5102.2" "gigs/5102.2.gie")
proj_add_gie_test("GIGS-5103.1" "gigs/5103.1.gie")
proj_add_gie_test("GIGS-5103.2" "gigs/5103.2.gie")
proj_add_gie_test("GIGS-5103.3" "gigs/5103.3.gie")
+15
View File
@@ -41,6 +41,21 @@ echo "Test CRS option"
$EXE EPSG:32620 -S >>${OUT} <<EOF
-63 0
EOF
echo "Test projection factors on projected CRS with non-Greenwhich prime meridian"
#
$EXE EPSG:27571 -S >>${OUT} <<EOF
2.33722917 49.5
EOF
echo "Test projection factors on compound CRS with a projected CRS"
#
$EXE EPSG:5972 -S >>${OUT} <<EOF
9 0
EOF
# On some architectures the angular distortion (omega) of EPSG:27571 is
# not exactly 0, but 8.53878e-07
cat ${OUT} | sed "s/8.53878e-07/0/" > ${OUT}.tmp
mv ${OUT}.tmp ${OUT}
#
# do 'diff' with distribution results
+2
View File
@@ -1,2 +1,4 @@
2 49 2.000 49.000
500000.00 0.00 <0.9996 0.9996 0.9992 0 0.9996 0.9996>
600000.00 1200000.00 <0.999877 0.999877 0.999755 0 0.999877 0.999877>
500000.00 0.00 <0.9996 0.9996 0.9992 0 0.9996 0.9996>
+36
View File
@@ -120,6 +120,12 @@ $EXE +proj=utm +zone=11 +datum=WGS84 +pm=3 \
500000 3000000
EOF
echo "##############################################################" >> ${OUT}
echo Test input in grad >> ${OUT}
#
$EXE EPSG:4807 EPSG:27572 -E >>${OUT} <<EOF
64.44444444 2.9586342556
EOF
echo "##############################################################" >> ${OUT}
echo Test geocentric x/y/z generation. >> ${OUT}
#
$EXE +proj=latlong +datum=WGS84 \
@@ -1320,6 +1326,36 @@ $EXE -d 3 EPSG:25831 EPSG:23031 -E >>${OUT} 2>&1 <<EOF
299905.060 4499796.515
EOF
echo "##############################################################" >> ${OUT}
echo "Test Similarity Transformation through CompoundCRS" >> ${OUT}
# Cf https://github.com/OSGeo/PROJ/issues/3854#issuecomment-1689964773
#
$EXE -d 3 EPSG:3912 EPSG:3794 -E >>${OUT} 2>&1 <<EOF
477134.28 95134.21
EOF
$EXE -d 3 EPSG:3912+EPSG:5779 EPSG:3794+EPSG:8690 -E >>${OUT} 2>&1 <<EOF
477134.28 95134.21 5
EOF
echo "##############################################################" >> ${OUT}
echo "Test +proj=topocentric +datum=WGS84 +X_0=-3982059.42 +Y_0=3331314.88 +Z_0=3692463.58 +no_defs +type=crs +to EPSG:4978" >> ${OUT}
#
$EXE -d 3 +proj=topocentric +datum=WGS84 +X_0=-3982059.42 +Y_0=3331314.88 +Z_0=3692463.58 +no_defs +type=crs +to EPSG:4978 -E >>${OUT} 2>&1 <<EOF
0 0 0
EOF
echo "##############################################################" >> ${OUT}
echo "Test cs2cs EPSG:5488 (RGAF09) to EPSG:4559+5757 (RRAF 1991 / UTM zone 20N + Guadeloupe 1988 height)" >> ${OUT}
echo "Check that we use the horizontal transformation for Guadeloupe (RRAF 1991 to RGAF09 (2)), and not the one for Martinique" >> ${OUT}
#
if test "${TIFF_ENABLED}" = "YES"; then
PROJ_DATA=${PROJ_DATA}:${PROJ_DATA}/tests $EXE -d 3 EPSG:5488 EPSG:4559+5757 >> ${OUT} <<EOF
16.248285304 -61.484212843 53.073
EOF
else
printf "661991.318\t1796999.201 93.846\n" >> ${OUT}
fi
# Done!
# do 'diff' with distribution results
+14
View File
@@ -31,6 +31,9 @@ Test support for the lon_wrap switch.
Test simple prime meridian handling within a projection.
500000 3000000 113dW 27d7'20.891"N 0.000
##############################################################
Test input in grad
64.44444444 2.9586342556 760724.02 3457334.86 0.00
##############################################################
Test geocentric x/y/z generation.
0d00'00.001"W 0d00'00.001"N 0.0 6378137.00 -0.03 0.03
0d00'00.001"W 0d00'00.001"N 10.0 6378147.00 -0.03 0.03
@@ -633,3 +636,14 @@ Test Similarity Transformation (example from EPSG Guidance Note 7.2)
##############################################################
Test inverse of Similarity Transformation (example from EPSG Guidance Note 7.2)
299905.060 4499796.515 300000.000 4500000.000 0.000
##############################################################
Test Similarity Transformation through CompoundCRS
477134.28 95134.21 476763.303 95620.222 0.000
477134.28 95134.21 5 476763.303 95620.222 5.000
##############################################################
Test +proj=topocentric +datum=WGS84 +X_0=-3982059.42 +Y_0=3331314.88 +Z_0=3692463.58 +no_defs +type=crs +to EPSG:4978
0 0 0 -3982059.420 3331314.880 3692463.580
##############################################################
Test cs2cs EPSG:5488 (RGAF09) to EPSG:4559+5757 (RRAF 1991 / UTM zone 20N + Guadeloupe 1988 height)
Check that we use the horizontal transformation for Guadeloupe (RRAF 1991 to RGAF09 (2)), and not the one for Martinique
661991.318 1796999.201 93.846
@@ -1,14 +1,20 @@
--------------------------------------------------------------------------------
Test 5102 (part 2), Lambert Conic Conformal (1SP), v2-0_2011-06-28.
--------------------------------------------------------------------------------
<gie>
<gie-strict>
use_proj4_init_rules true
--------------------------------------------------------------------------------
operation +proj=pipeline
+step +init=epsg:4807 +inv
# We need to add this grad->rad step as +init=epsg:4807 assumes
# degrees (if front operation), or radians (if non-front), as this was the case
# in PROJ < 6 era
# Note: "cs2cs EPSG:4807 EPSG:27572" does the right job.
operation +proj=pipeline \
+step +proj=unitconvert +xy_in=grad +xy_out=rad \
+step +init=epsg:4807 +inv \
+step +init=epsg:27572
--------------------------------------------------------------------------------
tolerance 0.03 m
@@ -88,9 +94,13 @@ accept 9.6253009222 58.8888888889
expect 1183926.705 2923124.876
--------------------------------------------------------------------------------
operation +proj=pipeline
+step +init=epsg:27572 +inv
+step +init=epsg:4807
# We need to add this rad->grad step as +init=epsg:4807 assumes
# degrees (if last operation), or radians (if non-last), as this was the case
# in PROJ < 6 era
operation +proj=pipeline \
+step +init=epsg:27572 +inv \
+step +init=epsg:4807 \
+step +proj=unitconvert +xy_in=rad +xy_out=grad
--------------------------------------------------------------------------------
tolerance 0.03 m
accept 760724.023 3457334.864
@@ -169,8 +179,12 @@ accept 1183926.705 2923124.876
expect 9.6253009222 58.8888888889
--------------------------------------------------------------------------------
operation +proj=pipeline
+step +init=epsg:4807 +inv
# We need to add this grad->rad step as +init=epsg:4807 assumes
# degrees (if front operation), or radians (if non-front), as this was the case
# in PROJ < 6 era
operation +proj=pipeline \
+step +proj=unitconvert +xy_in=grad +xy_out=rad \
+step +init=epsg:4807 +inv \
+step +init=epsg:27572
--------------------------------------------------------------------------------
tolerance 0.006 m
@@ -249,4 +263,4 @@ tolerance 0.006 m
accept 9.6253009222 58.8888888889
roundtrip 1000
</gie>
</gie-strict>
+9
View File
@@ -154,6 +154,9 @@ target_link_libraries(proj_test_cpp_api
add_test(NAME proj_test_cpp_api COMMAND proj_test_cpp_api)
set_property(TEST proj_test_cpp_api
PROPERTY ENVIRONMENT ${PROJ_TEST_ENVIRONMENT})
if(TIFF_ENABLED)
target_compile_definitions(proj_test_cpp_api PRIVATE -DTIFF_ENABLED)
endif()
add_executable(gie_self_tests
main.cpp
@@ -161,9 +164,13 @@ add_executable(gie_self_tests
target_link_libraries(gie_self_tests
PRIVATE GTest::gtest
PRIVATE ${PROJ_LIBRARIES})
add_test(NAME gie_self_tests COMMAND gie_self_tests)
set_property(TEST gie_self_tests
PROPERTY ENVIRONMENT ${PROJ_TEST_ENVIRONMENT})
if(TIFF_ENABLED)
target_compile_definitions(gie_self_tests PRIVATE -DTIFF_ENABLED)
endif()
add_executable(test_network
main.cpp
@@ -183,9 +190,11 @@ target_link_libraries(test_network
PRIVATE GTest::gtest
PRIVATE ${PROJ_LIBRARIES}
PRIVATE ${SQLITE3_LIBRARY})
if(TIFF_ENABLED)
add_test(NAME test_network COMMAND test_network)
set_property(TEST test_network
PROPERTY ENVIRONMENT ${PROJ_TEST_ENVIRONMENT})
endif()
add_executable(test_defmodel
main.cpp
+30
View File
@@ -407,6 +407,7 @@ TEST(gie, info_functions) {
proj_destroy(P);
#ifdef TIFF_ENABLED
/* proj_grid_info() */
grid_info = proj_grid_info("tests/test_hgrid.tif");
ASSERT_NE(std::string(grid_info.filename), "");
@@ -420,6 +421,7 @@ TEST(gie, info_functions) {
EXPECT_NEAR(grid_info.lowerleft.phi, 0.90757121103705141, 1e-15);
EXPECT_NEAR(grid_info.upperright.lam, 0.12217304763960307, 1e-15);
EXPECT_NEAR(grid_info.upperright.phi, 0.95993108859688125, 1e-15);
#endif
grid_info = proj_grid_info("nonexistinggrid");
ASSERT_EQ(std::string(grid_info.filename), "");
@@ -588,6 +590,34 @@ TEST(gie, info_functions) {
proj_destroy(P);
}
// Test with a projected CRS whose datum has a non-Greenwich prime meridian
{
P = proj_create(PJ_DEFAULT_CTX, "EPSG:27571");
PJ_COORD c;
c.lp.lam = proj_torad(0.0689738);
c.lp.phi = proj_torad(49.508567);
const auto factors2 = proj_factors(P, c);
EXPECT_NEAR(factors2.meridional_scale, 1 - 12.26478760 * 1e-5, 1e-8);
proj_destroy(P);
}
// Test with a compound CRS of a projected CRS
{
P = proj_create(PJ_DEFAULT_CTX, "EPSG:5972");
PJ_COORD c;
c.lp.lam = proj_torad(10.729030600);
c.lp.phi = proj_torad(59.916494500);
const auto factors2 = proj_factors(P, c);
EXPECT_NEAR(factors2.meridional_scale, 1 - 28.54587730 * 1e-5, 1e-8);
proj_destroy(P);
}
// Test with a geographic CRS --> error
{
P = proj_create(PJ_DEFAULT_CTX, "EPSG:4326");

Some files were not shown because too many files have changed in this diff Show More