Compare commits

...
80 Commits
Author SHA1 Message Date
Even Rouault a83433e499 Merge pull request #3833 from aumuell/v7.2-gcc13
fix building with GCC 13
2023-07-20 01:13:10 +02:00
Martin Aumüller 3f38a67a35 fix building with GCC 13
include <cstdint> in order to fix the following error:
/usr/bin/c++ -DCURL_ENABLED -DMUTEX_pthread -DPROJ_LIB=\"/usr/local/share/proj\" -DTIFF_ENABLED -Dproj_EXPORTS -I/home/ma/git/PROJ/src -I/home/ma/git/PROJ/include -I/home/ma/git/PROJ/b/src -O3 -DNDEBUG -std=c++11 -fPIC -fvisibility=hidden -Wall -Wextra -Wswitch -Wshadow -Wunused-parameter -Wmissing-declarations -Wformat -Wformat-security -MD -MT src/CMakeFiles/proj.dir/proj_json_streaming_writer.cpp.o -MF src/CMakeFiles/proj.dir/proj_json_streaming_writer.cpp.o.d -o src/CMakeFiles/proj.dir/proj_json_streaming_writer.cpp.o -c /home/ma/git/PROJ/src/proj_json_streaming_writer.cpp
In file included from /home/ma/git/PROJ/src/proj_json_streaming_writer.cpp:34:
/home/ma/git/PROJ/src/proj_json_streaming_writer.hpp:42:14: error: ‘int64_t’ in namespace ‘std’ does not name a type
   42 | typedef std::int64_t GIntBig;
      |              ^~~~~~~
2023-07-20 00:51:34 +02:00
Mike Taves edd8c19d4a ReadTheDocs: fix branch ref [ci skip] 2023-01-25 22:48:40 +13:00
Mike Taves 9d29cd6f17 ReadTheDocs: update output directory for artefacts, other updates 2023-01-25 19:58:43 +13:00
Mike Taves e9f25afc6d Improve docs for 7.2 2023-01-25 02:05:31 +13:00
Mike Taves 88d58b5bd4 Implement ReadTheDocs for 7.2, disable other CI workflows (#3560) 2023-01-14 17:16:29 +13:00
Mike Taves cc2d1758ac CI: specify pip < 21.0 2021-03-11 23:57:58 +13:00
Mike Taves 647e25f0dd Fix configuration for sphinxcontrib-bibtex version 2 or later (#2572) 2021-03-11 23:29:35 +13:00
Kristian Evers f55bb077c8 Merge branch '7.2' of https://github.com/OSGeo/PROJ into 7.2 2021-03-01 13:04:29 +01:00
Kristian Evers 43407f7ba4 Dont' build website from 7.2 branch any more 2021-03-01 13:04:22 +01:00
Kristian Evers ac0bb4b447 Merge pull request #2507 from guiguite/patch-1
Add documentation entry for proj_content_set_search_paths
2021-02-19 14:46:33 +01:00
guiguite b0687dfb1e Add entry for proj_content_set_search_paths 2021-01-22 11:03:10 +13:00
Kristian Evers 8db9cc2876 Merge pull request #2505 from visr/typos
fix a few typos in the docs
2021-01-18 09:01:16 +01:00
Even Rouault 9399b64afa CMakeLists.txt: update proj_version() to 7.2.1 2021-01-06 13:51:51 +01:00
Kristian Evers f909fc05e1 Update version numbers for website 2021-01-06 10:45:46 +01:00
Even Rouault 5c382df1ba createFromUserInput(): accept leading white space (fixes #2498) 2021-01-05 16:50:23 +01:00
Kristian Evers e9cbf983e1 Update website for 7.2.1 2021-01-01 17:10:39 +01:00
Kristian Evers 1212e9b818 Update CITATION year to 2021 2020-12-26 19:56:40 +01:00
Kristian Evers 6ef2325d23 Update version numbers for 7.2.1 2020-12-26 19:55:40 +01:00
Kristian Evers a0a1b4255e Update NEWS for 7.2.1 release 2020-12-26 19:40:43 +01:00
Kristian Evers b2177db68b Update man-pages from Sphinx-docs 2020-12-25 17:04:42 +01:00
Kristian Evers 78c4ac5c29 Update ABI numbers for 7.2.1 release 2020-12-25 17:03:05 +01:00
Kristian Evers 5a174a9899 Merge pull request #2495 from kbevers/nkg_trans_72
Implementing the NKG transformations in proj.db
2020-12-21 18:11:28 +01:00
Kristian Evers 7f1a1897d7 Implementing the NKG transformations in proj.db
This adds the NKG 2008 and 2020 transformations to proj.db. The NKG
transformations offers transformations between global reference frames
and the national realisations of ETRS89 in Denmark, Estonia, Finland,
Latvia, Lithuania, Norway and Sweden.

The 2008 transformations are already implemented in the NKG 2008 file
but will now be more accessible with the modern API.

The 2020 transformations are new to PROJ and offers and updated version
of the 2008 transformations using a new and improved deformation model
(eu_nkg_nkgrf17vel.tif). A 2020 version of the NKG transformations are
currently not available for Norway but will in all likelyhood be
included at a later point in time.
2020-12-21 17:30:16 +01:00
Even Rouault 30d17d7243 Database: register AGQG_20191107.gsb grid. Related to https://github.com/OSGeo/PROJ-data/pull/53 2020-12-18 22:42:50 +01:00
Guillaume Lostis 930661beaa Fix typos in resource_files.rst 2020-12-17 15:35:24 +01:00
Even Rouault 4639b891e8 Merge pull request #2490 from rouault/backport_7_2_epsg_10_0_008
[Backport 7.2] Database: update to EPSG v10.008
2020-12-16 21:02:44 +01:00
Even Rouault 4a89f16eff Database: update to EPSG v10.008 2020-12-16 16:09:44 +01:00
Even Rouault 2968770ea2 createOperations(): fix inconsistent chaining exception when transforming from BoundCRS of projected CRS based on NTF Paris to BoundCRS of geog CRS NTF Paris. Fixes https://github.com/OSGeo/gdal/issues/3273 2020-12-14 21:43:06 +01:00
Even Rouault cf438683b9 Merge pull request #2484 from rouault/backport_7_2_split_coordinateoperation
[Backport 7.2] Split coordinateoperation.cpp and test_operation.cpp in several parts
2020-12-14 21:41:57 +01:00
Even Rouault 28032616a9 CMake: install data/*.json files (fixes #2485) 2020-12-13 21:23:08 +01:00
Even Rouault b451382cda Split test_operation.cpp in two parts 2020-12-13 00:05:12 +01:00
Even Rouault b79a32d723 Split coordinateoperation.cpp in many files in iso19111/operation directory
The big size of coordinateoperation.cpp could require significant amount
of RAM to build it with -O2 level, and cause compiler crashes in some
environments.
2020-12-12 23:51:31 +01:00
Even Rouault b9d7c0a8f8 funtions.rst: fix sphynx syntax 2020-12-11 21:51:02 +01:00
Even Rouault fdd7cc1f8b Doc: fix return data type of proj_trans_array() 2020-12-09 19:28:13 +01:00
Even Rouault d68ba7bc1a Merge pull request #2478 from jzmiller1/patch-1
Update isea.rst to clarify defaults for ISEA.
2020-12-08 23:02:07 +01:00
Even Rouault bccb57ec04 Database: fix building proj.db with SQLite built with -DSQLITE_DQS=0
That is the option to make SQLite reject misuses of double quotes instead
of single quotes. Most SQLite builds are forgiving, but some forks proposing
a CMake build system default to SQLITE_DQS=0
2020-12-04 22:46:08 +01:00
Zac Miller 23c4c69b3a Update isea.rst
Clarifying defaults for ISEA.
2020-12-02 12:23:28 -05:00
Even Rouault 42fa3b5791 Database: add metadata with the version number of the database layout and check it in the code
This is aimed at detecting running a PROJ version against a proj.db that is not
meant to work with it. This happens sometimes in complex setups mixing PROJ
versions. Hopefully this will help spotting the issue earlier.
2020-11-30 17:38:40 +01:00
Even Rouault 90a5526263 test_io.cpp: formatting fix 2020-11-30 13:37:38 +01:00
Even Rouault 0d3c815efe Merge pull request #2470 from rouault/backport_7_2_pr2450
Add option to allow export of Geographic/Projected 3D CRS in WKT1_GDAL
2020-11-29 20:59:12 +01:00
Even Rouault 9bb6e214fa Add option to allow export of Geographic/Projected 3D CRS in WKT1_GDAL
as CompoundCRS with a VerticalCRS being an ellipsoidal height, which is
not conformant. But needed for LAS 1.4 that only supports WKT1

This is a partial backport of https://github.com/OSGeo/PROJ/pull/2450,
with only the new ALLOW_ELLIPSOIDAL_HEIGHT_AS_VERTICAL_CRS=YES option
of proj_as_wkt()
2020-11-29 17:38:23 +01:00
Even Rouault f7d17d4450 Inverse tmerc spherical: fix wrong sign of latitude when lat_0 is used (fixes #2468)
Corrected formula given by @evanmiller
2020-11-29 16:31:12 +01:00
Even Rouault 7f18caa6a6 .travis.yml: disable osx build that is broken due to homebrew issues 2020-11-28 23:41:19 +01:00
Even Rouault 9901c65290 WKT1 import: better deal with apps.epsg.org output w.r.t datum ensemble names 2020-11-28 20:34:30 +01:00
Houder 54616dbd34 Use same arguments to printf format string for both radians and degrees in output by cct (#2453)
Currently the output of the cct utility is different between radians
and degrees (as expected by cct), because of a bug in cct:

$ printf "1 2\n" | cct -z 0 -t 0 +proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad
  1.0000000000    2.0000000000        0.0000        0.0000

$ printf "1 2\n" | cct -z 0 -t 0 +proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=deg
       1.0000         2.0000        0.0000        0.0000

The arguments to the printf format string are as follows:

 * radians: width 14, precision 10
 * degrees: width 13, precision  4 (this is by mistake. bug!)

After the suggested fix has been applied, output will be the same for
both radians and degrees:

$ printf "1 2\n" | cct -z 0 -t 0 +proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad
  1.0000000000    2.0000000000        0.0000        0.0000

$ printf "1 2\n" | cct -z 0 -t 0 +proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=deg
  1.0000000000    2.0000000000        0.0000        0.0000

The cause of the bug is that cct does test if it "has radians to output",
but "neglects" to test if it "has degrees to output", resulting in using
different arguments to the printf format string in the latter case.

The fix makes cct test if it "has either radians or degrees to output".
2020-11-28 13:47:57 +01:00
Even Rouault f0ef1b95e3 createObjectsFromName(): in exact match, make looking for 'ETRS89 / UTM zone 32N' return only the exact match 2020-11-28 02:08:26 +01:00
Even Rouault a8ad205903 PRIMEM WKT handling: fixes on import for 'sexagesimal DMS' or from WKT1:GDAL/ESRI when GEOGCS UNIT != Degree; morph to ESRI the PRIMEM name on export 2020-11-27 13:16:01 +01:00
Even Rouault 4be79fdefd createOperation(): add a ballpark vertical transformation when dealing with GEOIDMODEL[] 2020-11-24 17:36:51 +01:00
Even Rouault 78857020b1 GeographicCRS::_isEquivalentTo(EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS): make it work when comparing easting,northing,up and northing,easting,up 2020-11-23 19:23:13 +01:00
Even Rouault 14b0496b00 projinfo.cpp: improve hint when to use --spatial-test intersects 2020-11-22 23:17:39 +01:00
Even Rouault 17b5dbea2a PROJJSON parsing: fix parsing of a Geodetic CRS with a DatumEnsemble, and fix parsing of a ProjectedCRS whose base is a Geocentric CRS 2020-11-22 01:23:51 +01:00
Even Rouault 35cd325e73 WKT parsing: fix ingestion of WKT with a Geocentric CRS as the base of the projected CRS 2020-11-22 01:23:51 +01:00
Even Rouault 66a4bef622 createOperation(): make it work properly when one of the CRS is a BoundCRS of a DerivedGeographicCRS (+proj=ob_tran +o_proj=lonlat +towgs84=....) 2020-11-21 15:25:42 +01:00
Even Rouault c3a50e5384 Make GeographicCRS/GeodeticCRS::isEquivalentTo() work properly when comparing to a DerivedGeographicCRS/DerivedGeodeticCRS 2020-11-21 15:25:41 +01:00
Even Rouault 03853d63ae Merge pull request #2438 from NomitRwt/patch-1
Update utm.rst
2020-11-20 16:51:12 +01:00
Nomit Rawat e4834bb6e1 Update utm.rst
Typo
2020-11-20 21:13:40 +05:30
J.H. van de Water e100c8334b Replace line feed in input line by null character
As result of a modification in logging (adding a line feed),
many changes had to be made in different places of cct.cpp.
However, one missed the line feed in input to cct.
As result of missing this, the output from cct showed a
superfluous empty line after each output line, but only if
the corresponding input line ended with comment.
Replacing the LF in the "comment" string (present if the
input line ended with comment) by a null character ('\0')
solves this issue.

Modification in logging?
https://github.com/OSGeo/PROJ/commit/37da5e243191c04607597f6b8a77acfa017a5c99
( cct: revise end-of-line handling in logging, and always output debug )

See also:
https://github.com/OSGeo/PROJ/issues/1677
( cct outputs excessive whitespace comments are included in input data )
2020-11-19 11:47:49 +01:00
Even Rouault 014156cf86 Merge pull request #2435 from rouault/backport_7.2_epsg_10_007
Database: update to EPSG v10.007
2020-11-19 00:03:06 +01:00
Even Rouault be5379fab5 Database: update to EPSG v10.007 2020-11-18 18:07:56 +01:00
Even Rouault a85e2aed15 cs2cs, cct, proj and geod: fflush(stdout) after each line to emit each result as soon as it is produced
This is needed when working with pipes, when stdout is not an interactive terminal,
and thus the behaviour is to have it buffered as a regular file, whereas with
an interactive terminal, each newline character causes an implicit flush.
2020-11-17 17:35:45 +01:00
Even Rouault eac2b01309 github actions: update to conda-incubator/setup-miniconda@v2 to be compatible with latest github action security fix constraints 2020-11-17 16:38:41 +01:00
Even Rouault 7c1d10962e Merge pull request #2428 from PROJ-BOT/backport-2427-to-7.2
[Backport 7.2] WKT2 parsing: several fixes related to map projection parameter units
2020-11-16 15:58:54 +01:00
github-actions[bot] 4136e326c4 WKT2 parsing: several fixes related to map projection parameter units 2020-11-16 13:35:05 +00:00
Even Rouault 48b240ffdc Merge pull request #2412 from PROJ-BOT/backport-2411-to-7.2
[Backport 7.2] createBoundCRSToWGS84IfPossible(): make it return same result with a CRS built from EPSG code or WKT1
2020-11-05 11:59:27 +01:00
github-actions[bot] 1046781930 createBoundCRSToWGS84IfPossible(): make it return same result with a CRS built from EPSG code or WKT1 2020-11-04 17:51:09 +00:00
Even Rouault fce2557010 Merge pull request #2410 from PROJ-BOT/backport-2409-to-7.2
[Backport 7.2] docs/Makefile: restore custom 'html' target
2020-11-04 10:43:46 +01:00
github-actions[bot] e4e467e0ce docs/Makefile: restore custom 'html' target 2020-11-04 05:39:06 +00:00
github-actions[bot] f64c6be4fd Correct links to github issues in release notes from 7.1.0 to 7.2.0 2020-11-03 13:19:11 +01:00
Even Rouault 17de9159a4 Merge pull request #2405 from PROJ-BOT/backport-2404-to-7.2
[Backport 7.2] Set CURL_ENABLED definition on projinfo build
2020-11-02 14:45:41 +01:00
github-actions[bot] 9ba423879a Set CURL_ENABLED definition on projinfo build 2020-11-02 07:26:20 +00:00
Even Rouault 40daf707a1 Doxygen: improve doc of functions related to Datum/DatumEnsemble 2020-11-01 11:35:48 +01:00
Even Rouault 65a78535d5 Fill remarks for PROJ-based operation mixing horizontal and vertical transformations 2020-11-01 11:35:48 +01:00
Even Rouault 9355385402 Make sure that remarks is preserved when substituting (EPSG) grid name by PROJ one 2020-11-01 11:35:47 +01:00
Even Rouault b4f5ee6be9 proj_create_ellipsoidal_2D/3D_cs(): doc improvement 2020-11-01 11:35:47 +01:00
Kristian Evers f4049630d9 Switch website 'edit on GitHub' to 7.2 branch 2020-11-01 11:05:35 +01:00
Kristian Evers ceddaabe3d Update docs for 7.2.0 release 2020-11-01 10:42:05 +01:00
Juan Hernando 1e7679bc83 Update GSIGEO2011 grid alternative to latest PROJ-data 2020-10-28 12:22:41 +01:00
Kristian Evers 9537bcd932 Use correct PROJ_API_VERSION following updated procedure in HOWTORELEASE 2020-10-28 12:22:26 +01:00
Kristian Evers 46939ba0b2 Update PROJ_API_VERSION instructions 2020-10-28 12:22:15 +01:00
135 changed files with 28965 additions and 23516 deletions
+1 -1
View File
@@ -96,9 +96,9 @@ install_manifest.txt
/data/for_tests/
# docs
tmp_breathe
/docs/.doxygen_up_to_date
/docs/build
/docs/plot/images
/latex
# m4
+52
View File
@@ -0,0 +1,52 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
build:
os: "ubuntu-22.04"
tools:
python: "mambaforge-4.10"
jobs:
post_checkout:
# Cancel building pull requests when there aren't changed in the docs directory or YAML file.
# You can add any other files or directories that you'd like here as well,
# like your docs requirements file, or other files that will change your docs build.
#
# If there are no changes (git diff exits with 0) we force the command to return with 183.
# This is a special exit code on Read the Docs that will cancel the build immediately.
- |
if [ "$READTHEDOCS_VERSION_TYPE" = "external" ] && git diff --quiet origin/7.2 -- docs/ .readthedocs.yaml;
then
exit 183;
fi
- (git --no-pager log --pretty="tformat:%s -- %b" -1 | grep -viq "skip ci") || exit 183
pre_build:
- ./docs/rtd/pre_build.sh
- ./scripts/doxygen.sh
- ./docs/rtd/plot.sh
post_build:
- ./docs/rtd/post_build.sh
apt_packages:
- cmake
- ninja-build
- g++
- sqlite3
- libsqlite3-dev
- libtiff-dev
- libcurl4-openssl-dev
formats:
- pdf
- epub
conda:
environment: docs/environment.yml
sphinx:
configuration: docs/source/conf.py
fail_on_warning: true
+2 -2
View File
@@ -1,6 +1,6 @@
To cite PROJ in publications use:
PROJ contributors (2020). PROJ coordinate transformation software
PROJ contributors (2021). PROJ coordinate transformation software
library. Open Source Geospatial Foundation. URL https://proj.org/.
A BibTeX entry for LaTeX users is
@@ -11,6 +11,6 @@ A BibTeX entry for LaTeX users is
title = {{PROJ} coordinate transformation software library},
author = {{PROJ contributors}},
organization = {Open Source Geospatial Foundation},
year = {2020},
year = {2021},
url = {https://proj.org/},
}
+3 -3
View File
@@ -110,9 +110,9 @@ message(STATUS "Configuring PROJ:")
#PROJ version information
################################################################################
include(ProjVersion)
proj_version(MAJOR 7 MINOR 2 PATCH 0)
set(PROJ_API_VERSION "21")
set(PROJ_BUILD_VERSION "21.0.2")
proj_version(MAJOR 7 MINOR 2 PATCH 1)
set(PROJ_API_VERSION "19")
set(PROJ_BUILD_VERSION "21.1.2")
################################################################################
# Build features and variants
+1 -1
View File
@@ -766,7 +766,7 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.
INPUT = src/iso19111 include/proj src/proj.h src/proj_experimental.h src/general_doc.dox src/filemanager.cpp src/networkfilemanager.cpp
INPUT = src/iso19111 src/iso19111/operation include/proj src/proj.h src/proj_experimental.h src/general_doc.dox src/filemanager.cpp src/networkfilemanager.cpp
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+2 -2
View File
@@ -52,7 +52,7 @@ Update the following files with the new ABI version number:
- `src/Makefile.am` Update -version-info
- `CMakeLists.txt`: Update PROJ_BUILD_VERSION (cur:rev:age) and
PROJ_API_VERSION (current)
PROJ_API_VERSION (current-age)
*Commit the changes to master.*
@@ -179,7 +179,7 @@ See step 1.6 above. Do not rename the archives with RC postfixes.
These vim substitutions are helpfull when converting NEWS to rst:
:s!(\#\(\d\{4}\))!(`\#\1 <https://github.com/OSGeo/issues/\1>`_)!
:s!(\#\(\d\{4}\))!(`\#\1 <https://github.com/OSGeo/PROJ/issues/\1>`_)!
:s/^o/*/
- Update download links in `docs/source/download.rst`
+66
View File
@@ -1,3 +1,69 @@
7.2.1 Release Notes
-------------------
Updates
-------
o Add metadata with the version number of the database layout (#2474)
o Split coordinateoperation.cpp and test_operation.cpp in several parts (#2484)
o Update to EPSG v10.008 (#2490)
o Added the NKG 2008 and 2020 transformations in proj.db (#2495)
Bug fixes
---------
o Set CURL_ENABLED definition on projinfo build (#2405)
o createBoundCRSToWGS84IfPossible(): make it return same result with a CRS
built from EPSG code or WKT1 (#2412)
o WKT2 parsing: several fixes related to map projection parameter units (#2428)
o createOperation(): make it work properly when one of the CRS is a BoundCRS of
a DerivedGeographicCRS (+proj=ob_tran +o_proj=lonlat +towgs84=....) (#2441)
o WKT parsing: fix ingestion of WKT with a Geocentric CRS as the base of the
projected CRS (#2443)
o GeographicCRS::_isEquivalentTo(EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS):
make it work when comparing easting,northing,up and northing,easting,up (#2446)
o createOperation(): add a ballpark vertical transformation when dealing
with GEOIDMODEL[] (#2449)
o Use same arguments to printf format string for both radians and degrees in
output by cct (#2453)
o PRIMEM WKT handling: fixes on import for 'sexagesimal DMS' or from WKT1:GDAL/ESRI
when GEOGCS UNIT != Degree; morph to ESRI the PRIMEM name on export (#2455)
o createObjectsFromName(): in exact match, make looking for 'ETRS89 / UTM zone 32N'
return only the exact match (#2462)
o Inverse tmerc spherical: fix wrong sign of latitude when lat_0 is used (#2469)
o Add option to allow export of Geographic/Projected 3D CRS in WKT1_GDAL (#2470)
o Fix building proj.db with SQLite built with -DSQLITE_DQS=0 (#2480)
o Include JSON Schema files in CMake builds (#2485)
o createOperations(): fix inconsistent chaining exception when transforming from BoundCRS of projected CRS based on NTF Paris to BoundCRS of geog CRS NTF Paris (#2486)
THANKS TO
---------
Zac Miller
Nomit Rawat
Guillaume Lostis
J.H. van de Water
Kristian Evers
Even Rouault
7.2.0 Release Notes
-------------------
+1 -1
View File
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT([PROJ], [7.2.0],
AC_INIT([PROJ], [7.2.1],
[https://github.com/OSGeo/PROJ/issues], proj, [https://proj.org])
AC_CONFIG_MACRO_DIR([m4])
AC_LANG(C)
+3
View File
@@ -27,6 +27,8 @@ file(GLOB GSB_FILES *.gsb)
file(GLOB GTX_FILES *.gtx)
set(GRIDSHIFT_FILES ${GSB_FILES} ${GTX_FILES})
file(GLOB SCHEMA_FILES *.json)
set(ALL_SQL_IN "${CMAKE_CURRENT_BINARY_DIR}/all.sql.in")
set(PROJ_DB "${CMAKE_CURRENT_BINARY_DIR}/proj.db")
include(sql_filelist.cmake)
@@ -106,6 +108,7 @@ set(ALL_DATA_FILE
${PROJ_DICTIONARY}
${GRIDSHIFT_FILES}
${PROJ_DB}
${SCHEMA_FILES}
)
install(
FILES ${ALL_DATA_FILE}
+1
View File
@@ -42,6 +42,7 @@ SQL_ORDERED_LIST = sql/begin.sql \
sql/grid_alternatives.sql \
sql/grid_alternatives_generated_noaa.sql \
sql/customizations.sql \
sql/nkg.sql \
sql/commit.sql
EXTRA_DIST = proj.ini GL27 nad.lst nad27 nad83 \
+36 -21
View File
@@ -192,7 +192,6 @@ INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1192','NAD83(CSRS96)','
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1195','NAD83(CSRS)v4','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6265','Rome 1940','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6806','Rome 1940 (Rome)','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6670','IGM95','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6673','CI1979','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5172','NG-L','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5174','NN1954','EPSG');
@@ -333,7 +332,6 @@ INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5202','Bora Bora 2001',
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5124','Fahud HD','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5132','DNN','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5138','ODN Orkney','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5215','EVRF2007','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6743','Karbala 1979 (Polservice)','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5149','British Vertical Datum','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1029','IGRS','EPSG');
@@ -361,7 +359,6 @@ INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6903','Madrid','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1156','WGS 84 (G1762)','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1157','PZ-90.02','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1158','PZ-90.11','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1274','EVRF2019','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1275','REDNAP','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1276','REDNAP','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1277','REDNAP','EPSG');
@@ -506,7 +503,6 @@ INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1283','REDNAP','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1284','REDNAP','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1285','REDNAP','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1243','SIRGAS-Chile 2010','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1287','EVRF2019mean','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1289','GBK19-IRF','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1291','ATRF2014','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1270','MSL NL','EPSG');
@@ -609,6 +605,13 @@ INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1130','JGD2000 (vertica
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1129','JSLD72','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1132','RDN2008','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1288','BI','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6258','European Terrestrial Reference System 1989','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6326','World Geodetic System 1984','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6670','IGM95','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5215','EVRF2007','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1274','EVRF2019','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1287','EVRF2019mean','EPSG');
INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1302','Pago Pago 2020','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');
@@ -720,7 +723,6 @@ INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5701','Newlyn height','EP
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5702','National Geodetic Vertical Datum of 1929 height (ftUS)','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5703','North American Vertical Datum of 1988 height (m)','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5709','Normaal Amsterdams Peil height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','Australian Height Datum height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5712','Australian Height Datum (Tasmania) height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5713','Canadian Geodetic Vertical Datum of 1928 height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5714','mean sea level height','EPSG');
@@ -1027,7 +1029,6 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29849','Timbalai 1948 /
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29850','Timbalai 1948 / UTM 50N','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29871','Timbalai / Borneo (ch)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29872','Timbalai / Borneo (ftSe)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29873','Timbalai / Borneo (m)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29900','TM65 / Irish Nat Grid','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','30161','Tokyo / Japan zone I','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','30162','Tokyo / Japan zone II','EPSG');
@@ -1713,8 +1714,6 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6861','CORS96 / OCRS_SAN
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3069','NAD27 / WTM 27','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5723','Japanese Standard Levelling Datum height','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','7005','Nahrwan 1934 / UTM 37N','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6875','RDN2008 / Fuso Italia (N-E)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6876','RDN2008 / Fuso 12 (N-E)','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5787','Baltic 1980 height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5782','REDNAP height','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3072','Maine Coordinate System of 2000 East Zone','EPSG');
@@ -2204,10 +2203,8 @@ INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4298','Timbalai 1968','EP
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4298','BT68','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29849','BT68 / UTM zone 49N','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29850','BT68 / UTM zone 50N','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29873','BT68 / RSO Borneo (m)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29849','Timbalai 1968 / UTM zone 49N','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29850','Timbalai 1968 / UTM zone 50N','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29873','Timbalai 1968 / RSO Borneo (m)','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4245','MRT68','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','24500','MRT68 / Singapore Grid','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','24547','MRT68 / UTM zone 47N','EPSG');
@@ -4244,8 +4241,6 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3088','NAD83 / KY1Z (m)'
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','9379','726','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3857','WGS 84 / Popular Visualisation Pseudo-Mercator','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','9379','IGb14 - LatLonEHt','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','9380','725','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','9380','IGb14 - LatLon','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','3886','National Elevation Network height','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3893','ED50 / Iraq Nat. Grid','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4743','Karbala 1979 (Polservice)','EPSG');
@@ -4763,7 +4758,6 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3857','Web Mercator','EP
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9391','BGS2005 / UTM zone 35 (E-N)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','5634','REGCAN95 - LCC','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9400','REDNAP height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9389','EVRF2019_AMST / NH','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9392','REDNAP height','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','7692','Kyrg06-68','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','7693','Kyrg06-71','EPSG');
@@ -5086,8 +5080,6 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8383','NCRS Las Vegas (m
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8387','NCRS Las Vegas high (ftUS)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8433','Macao 1920 Grid System','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','5514','S-JTSK [JTSK] / Krovak East North','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','AHD71 height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','AHD-TAS83 height','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','4414','GGN93 / Guam Map Grid','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','4414','Guam Geodetic Network 1993 / Guam Map Grid','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','4414','NAD83 / Guam Map Grid','EPSG');
@@ -5608,8 +5600,6 @@ INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4202','298','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4202','AGD66 - LatLon','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4203','350','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4203','AGD84 - LatLon','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','339','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','AHD - NOHt','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','7844','284','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','7844','GDA2020 - LatLon','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','7843','329','EPSG');
@@ -6083,7 +6073,6 @@ INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','8690','SI_KOP / NH','EPSG
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5195','SI_TRIE / NOH','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5195','MK_TRIE / NOH','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','4826','WGS 84 / Cape Verde New','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9390','EVRF2019mean_AMST / NH','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4479','732','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4480','733','EPSG');
INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9450','ETRS89 + Belfast Lough height','EPSG');
@@ -7189,8 +7178,34 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6677','JGD2011 / Japan z
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','6693','Japan Levelling Datum height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','6693','Japanese Standard Levelling Datum height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','6693','JSLD height','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6707','RDN2008 / TM32','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6708','RDN2008 / TM33','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6709','RDN2008 / TM34','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','2062','Madrid (Madrid) / Spain LCC','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','2062','Madrid - LCC','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','9380','725','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','9380','IGb14 - LatLon','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','Australian Height Datum height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','AHD71 height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','AHD-TAS83 height','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','339','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5711','AHD - NOHt','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29873','Timbalai / Borneo (m)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29873','BT68 / RSO Borneo (m)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29873','Timbalai 1968 / RSO Borneo (m)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','29874','BT68 / RSO Sarawak LSD (m)','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','6705','ETRF2000 epoca 2008.0','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','6704','ETRF2000 epoca 2008.0','EPSG');
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','6706','ETRF2000 epoca 2008.0','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6708','RDN2008 / TM33','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6708','ETRF2000 epoca 2008.0 fuso 33','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6707','RDN2008 / TM32','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6707','ETRF2000 epoca 2008.0 fuso 32','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6709','RDN2008 / TM34','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6709','ETRF2000 epoca 2008.0 fuso 34','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6875','RDN2008 / Fuso Italia (N-E)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6875','ETRF2000 epoca 2008.0 fuso Italia','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6876','RDN2008 / Fuso 12 (N-E)','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','6876','ETRF2000 epoca 2008.0 fuso 12','EPSG');
INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9498','CABA-P07','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9389','EVRF2019_AMST / NH','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9390','EVRF2019mean_AMST / NH','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9675','741','EPSG');
INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9675','LT at Pago Pago - NOHt','EPSG');
+6
View File
@@ -1734,6 +1734,10 @@ INSERT INTO "conversion" VALUES('EPSG','9385','AbInvA96_2020-TM','In conjunction
INSERT INTO "usage" VALUES('EPSG','14062','conversion','EPSG','9385','EPSG','4589','EPSG','1196');
INSERT INTO "conversion" VALUES('EPSG','9455','GBK19-TM','In conjunction with transformation ETRS89 to GBK19-IRF (1) (code 9454), emulates the TPEN11 Snake projection.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',55.45,'EPSG','9110','EPSG','8802','Longitude of natural origin',-4.21,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',93720.394,'EPSG','9001','EPSG','8807','False northing',113870.493,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14130','conversion','EPSG','9455','EPSG','4607','EPSG','1141');
INSERT INTO "conversion" VALUES('EPSG','9497','Gauss-Kruger CABA 2019','Projection created in 2017 for the purpose of modernizing the city''s cadastre and linking it to modern reference frames. Origin approximates the 1919 origin of the cross of the main tower of the San José de Flores church ("0 de Flores" plane grid).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',-34.374536,'EPSG','9110','EPSG','8802','Longitude of natural origin',-58.274791,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',20000.0,'EPSG','9001','EPSG','8807','False northing',70000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14242','conversion','EPSG','9497','EPSG','4610','EPSG','1056');
INSERT INTO "conversion" VALUES('EPSG','9673','US Forest Service region 6 Albers','','EPSG','9822','Albers Equal Area','EPSG','8821','Latitude of false origin',34.0,'EPSG','9102','EPSG','8822','Longitude of false origin',-120.0,'EPSG','9102','EPSG','8823','Latitude of 1st standard parallel',43.0,'EPSG','9102','EPSG','8824','Latitude of 2nd standard parallel',48.0,'EPSG','9102','EPSG','8826','Easting at false origin',600000.0,'EPSG','9001','EPSG','8827','Northing at false origin',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14786','conversion','EPSG','9673','EPSG','2381','EPSG','1165');
INSERT INTO "conversion" VALUES('EPSG','10101','Alabama CS27 East zone','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.3,'EPSG','9110','EPSG','8802','Longitude of natural origin',-85.5,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.99996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','11101','conversion','EPSG','10101','EPSG','2154','EPSG','1142');
INSERT INTO "conversion" VALUES('EPSG','10102','Alabama CS27 West zone','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-87.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.999933333,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
@@ -4545,6 +4549,8 @@ INSERT INTO "conversion" VALUES('EPSG','18451','CS63 zone C1','','EPSG','9807','
INSERT INTO "usage" VALUES('EPSG','12917','conversion','EPSG','18451','EPSG','3174','EPSG','1207');
INSERT INTO "conversion" VALUES('EPSG','18452','CS63 zone C2','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.06,'EPSG','9110','EPSG','8802','Longitude of natural origin',27.57,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',2250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','12918','conversion','EPSG','18452','EPSG','3175','EPSG','1207');
INSERT INTO "conversion" VALUES('EPSG','19838','Rectified Skew Orthomorphic Sarawak LSD (metres)','Used by the Sarawak Land and Survey Department. Conversion 19958 but using Hotine Oblique Mercator (variant A) and with FE increased by 2,000,000 m and FN by 5,000,000 m. If using variant B method (code 9815) FE = 2590476.871 m and FN = 5442857.653 m.','EPSG','9812','Hotine Oblique Mercator (variant A)','EPSG','8811','Latitude of projection centre',4.0,'EPSG','9110','EPSG','8812','Longitude of projection centre',115.0,'EPSG','9110','EPSG','8813','Azimuth of initial line',53.18569537,'EPSG','9110','EPSG','8814','Angle from Rectified to Skew Grid',53.07483685,'EPSG','9110','EPSG','8815','Scale factor on initial line',0.99984,'EPSG','9201','EPSG','8806','False easting',2000000.0,'EPSG','9001','EPSG','8807','False northing',5000000.0,'EPSG','9001',0);
INSERT INTO "usage" VALUES('EPSG','14399','conversion','EPSG','19838','EPSG','4611','EPSG','1142');
INSERT INTO "conversion" VALUES('EPSG','19839','Dubai Local Transverse Mercator','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',55.2,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','12919','conversion','EPSG','19839','EPSG','3531','EPSG','1055');
INSERT INTO "conversion" VALUES('EPSG','19840','IBCAO Polar Stereographic','Used for the International Bathymetric Chart of Arctic Ocean.','EPSG','9829','Polar Stereographic (variant B)','EPSG','8832','Latitude of standard parallel',75.0,'EPSG','9102','EPSG','8833','Longitude of origin',0.0,'EPSG','9102','EPSG','8806','False easting',0.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
-6
View File
@@ -274,12 +274,6 @@ INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6277','OSGB36','PROJ');
-- to the EPSG:4326 CRS, as this is a common use case (https://github.com/OSGeo/PROJ/issues/2216)
INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4326','WGS84','PROJ');
---- Aliases from old datum names to new datum ensemble names -----
-- Those have been reported to IOGP and will hopefully be integrated in a later EPSG release
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6326','World Geodetic System 1984','PROJ');
INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6258','European Terrestrial Reference System 1989','PROJ');
---- PROJ unit short names -----
-- Linear units
+11 -7
View File
@@ -1202,8 +1202,8 @@ INSERT INTO "extent" VALUES('EPSG','2222','USA - Nebraska - SPCS27 - S','United
INSERT INTO "extent" VALUES('EPSG','2223','USA - Nevada - SPCS - C','United States (USA) - Nevada - counties of Lander; Nye.',36.0,41.0,-118.19,-114.99,0);
INSERT INTO "extent" VALUES('EPSG','2224','USA - Nevada - SPCS - E','United States (USA) - Nevada - counties of Clark; Elko; Eureka; Lincoln; White Pine.',34.99,42.0,-117.01,-114.03,0);
INSERT INTO "extent" VALUES('EPSG','2225','USA - Nevada - SPCS - W','United States (USA) - Nevada - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe.',36.95,42.0,-120.0,-116.99,0);
INSERT INTO "extent" VALUES('EPSG','2226','Canada - Newfoundland - east of 54.5°W','Canada - Newfoundland - onshore east of 54°30''W.',46.56,49.71,-54.5,-52.54,0);
INSERT INTO "extent" VALUES('EPSG','2227','Canada - Newfoundland and Labrador - 57.5°W to 54.5°W','Canada - Newfoundland and Labrador between 57°30''W and 54°30''W.',46.81,54.71,-57.5,-54.49,0);
INSERT INTO "extent" VALUES('EPSG','2226','Canada - Newfoundland - east of 54.5°W','Canada - Newfoundland - onshore east of 54°30''W.',46.567800287196,49.880440168616,-54.5,-52.543563434093,0);
INSERT INTO "extent" VALUES('EPSG','2227','Canada - Newfoundland and Labrador - 57.5°W to 54.5°W','Canada - Newfoundland and Labrador between 57°30''W and 54°30''W.',46.810451303426,54.704265687623,-57.5,-54.5,0);
INSERT INTO "extent" VALUES('EPSG','2228','USA - New Mexico - SPCS - E','United States (USA) - New Mexico - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union.',32.0,37.0,-105.72,-102.99,0);
INSERT INTO "extent" VALUES('EPSG','2229','USA - New Mexico - SPCS27 - C','United States (USA) - New Mexico - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance.',31.78,37.0,-107.73,-104.83,0);
INSERT INTO "extent" VALUES('EPSG','2230','USA - New Mexico - SPCS27 - W','United States (USA) - New Mexico - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra; Valencia.',31.33,37.0,-109.06,-106.32,0);
@@ -1346,7 +1346,7 @@ INSERT INTO "extent" VALUES('EPSG','2366','Spain - mainland onshore','Spain - ma
INSERT INTO "extent" VALUES('EPSG','2367','Spain - mainland northeast','Spain - onshore mainland north of the parallel of approximately 41°58''N from approximately 6°35''W to the meridian of 4°W of Greenwich and then a line from 41°58''N, 4°W through 40°N, 0°E of Greenwich.',39.96,43.82,-9.37,3.39,0);
INSERT INTO "extent" VALUES('EPSG','2368','Spain - mainland southwest','Spain - onshore mainland south of the parallel of approximately 41°58''N from approximately 6°35''W to the meridian of 4°W of Greenwich and then a line from 41°58''N, 4°W through 40°N, 0°E of Greenwich.',35.95,41.98,-7.54,0.28,0);
INSERT INTO "extent" VALUES('EPSG','2369','Seychelles - Mahe Island','Seychelles - Mahe Island.',-4.86,-4.5,55.3,55.59,0);
INSERT INTO "extent" VALUES('EPSG','2370','Europe - former Yugoslavia onshore','Boznia and Herzegovina; Croatia - onshore; Kosovo; Montenegro - onshore; North Macedonia; Serbia; Slovenia - onshore.',40.85,46.88,13.38,23.04,0);
INSERT INTO "extent" VALUES('EPSG','2370','Europe - former Yugoslavia onshore','Bosnia and Herzegovina; Croatia - onshore; Kosovo; Montenegro - onshore; North Macedonia; Serbia; Slovenia - onshore.',40.855888366699,46.876247406006,13.383471488953,23.030969619751,0);
INSERT INTO "extent" VALUES('EPSG','2371','Nigeria - south','Nigeria - onshore south.',4.22,6.95,4.35,9.45,0);
INSERT INTO "extent" VALUES('EPSG','2372','Italy - mainland','Italy - mainland including San Marino and Vatican City State.',37.86,47.1,6.62,18.58,0);
INSERT INTO "extent" VALUES('EPSG','2373','USA - Alaska including EEZ','United States (USA) - Alaska including EEZ.',47.88,74.71,167.65,-129.99,0);
@@ -1392,7 +1392,7 @@ INSERT INTO "extent" VALUES('EPSG','2412','USA - Alaska mainland','United States
INSERT INTO "extent" VALUES('EPSG','2413','Bahamas - main islands onshore','Bahamas - onshore southwest of a line from 27°30''N, 77°30''W through 23°15''N, 74°30''W to 22°30''N, 72°30''W.',20.86,27.29,-79.04,-72.68,0);
INSERT INTO "extent" VALUES('EPSG','2414','Bahamas (San Salvador Island) - onshore','Bahamas (San Salvador Island) - onshore.',23.9,24.19,-74.6,-74.37,0);
INSERT INTO "extent" VALUES('EPSG','2415','Canada - Manitoba and Ontario','Canada - Manitoba; Ontario.',41.67,60.01,-102.0,-74.35,0);
INSERT INTO "extent" VALUES('EPSG','2416','Canada - eastern provinces','Canada - onshore - New Brunswick; Newfoundland and Labrador; Nova Scotia; Prince Edward Island; Quebec.',43.41,62.62,-79.85,-52.54,0);
INSERT INTO "extent" VALUES('EPSG','2416','Canada - eastern provinces','Canada - onshore - New Brunswick; Newfoundland and Labrador; Nova Scotia; Prince Edward Island; Quebec.',43.415647861102,62.61106035396,-79.847158104293,-52.543563434093,0);
INSERT INTO "extent" VALUES('EPSG','2417','Canada - Yukon','Canada - Yukon.',59.99,69.7,-141.01,-123.91,0);
INSERT INTO "extent" VALUES('EPSG','2418','Caribbean - central (DMA tfm)','Antigua; Barbados; Barbuda; Cuba; Dominican Republic; Grand Cayman; Jamaica; Turks and Caicos Islands. Note: does not include other islands within this geographic area.',13.0,23.25,-85.01,-59.37,0);
INSERT INTO "extent" VALUES('EPSG','2419','Central America - Belize to Costa Rica','Onshore Belize, Costa Rica, El Salvador, Guatemala, Honduras and Nicaragua.',7.98,18.49,-92.29,-82.53,0);
@@ -1807,7 +1807,7 @@ INSERT INTO "extent" VALUES('EPSG','2827','Africa - South Sudan and Sudan - 24°
INSERT INTO "extent" VALUES('EPSG','2828','Guadeloupe - St Martin and St Barthelemy - onshore','Guadeloupe - onshore - St Martin and St Barthélemy islands.',17.82,18.17,-63.21,-62.73,0);
INSERT INTO "extent" VALUES('EPSG','2829','Guadeloupe - Grande-Terre and surrounding islands - onshore','Guadeloupe - onshore - Basse-Terre, Grande-Terre, La Desirade, Marie-Galante, Les Saintes.',15.8,16.55,-61.85,-60.97,0);
INSERT INTO "extent" VALUES('EPSG','2830','World (by country)','World: Afghanistan, Albania, Algeria, American Samoa, Andorra, Angola, Anguilla, Antarctica, Antigua and Barbuda, Argentina, Armenia, Aruba, Australia, Austria, Azerbaijan, Bahamas, Bahrain, Bangladesh, Barbados, Belgium, Belgium, Belize, Benin, Bermuda, Bhutan, Bolivia, Bonaire, Saint Eustasius and Saba, Bosnia and Herzegovina, Botswana, Bouvet Island, Brazil, British Indian Ocean Territory, British Virgin Islands, Brunei Darussalam, Bulgaria, Burkina Faso, Burundi, Cambodia, Cameroon, Canada, Cape Verde, Cayman Islands, Central African Republic, Chad, Chile, China, Christmas Island, Cocos (Keeling) Islands, Comoros, Congo, Cook Islands, Costa Rica, Côte d''Ivoire (Ivory Coast), Croatia, Cuba, Curacao, Cyprus, Czechia, Denmark, Djibouti, Dominica, Dominican Republic, East Timor, Ecuador, Egypt, El Salvador, Equatorial Guinea, Eritrea, Estonia, Eswatini (Swaziland), Ethiopia, Falkland Islands (Malvinas), Faroe Islands, Fiji, Finland, France, French Guiana, French Polynesia, French Southern Territories, Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, Guadeloupe, Guam, Guatemala, Guinea, Guinea-Bissau, Guyana, Haiti, Heard Island and McDonald Islands, Holy See (Vatican City State), Honduras, China - Hong Kong, Hungary, Iceland, India, Indonesia, Islamic Republic of Iran, Iraq, Ireland, Israel, Italy, Jamaica, Japan, Jordan, Kazakhstan, Kenya, Kiribati, Democratic People''s Republic of Korea (North Korea), Republic of Korea (South Korea), Kosovo, Kuwait, Kyrgyzstan, Lao People''s Democratic Republic (Laos), Latvia, Lebanon, Lesotho, Liberia, Libyan Arab Jamahiriya, Liechtenstein, Lithuania, Luxembourg, China - Macao, Madagascar, Malawi, Malaysia, Maldives, Mali, Malta, Marshall Islands, Martinique, Mauritania, Mauritius, Mayotte, Mexico, Federated States of Micronesia, Monaco, Mongolia, Montenegro, Montserrat, Morocco, Mozambique, Myanmar (Burma), Namibia, Nauru, Nepal, Netherlands, New Caledonia, New Zealand, Nicaragua, Niger, Nigeria, Niue, Norfolk Island, North Macedonia, Northern Mariana Islands, Norway, Oman, Pakistan, Palau, Panama, Papua New Guinea (PNG), Paraguay, Peru, Philippines, Pitcairn, Poland, Portugal, Puerto Rico, Qatar, Reunion, Romania, Russian Federation, Rwanda, Saint Kitts and Nevis, Saint Helena, Ascension and Tristan da Cunha, Saint Lucia, Saint Pierre and Miquelon, Saint Vincent and the Grenadines, Samoa, San Marino, Sao Tome and Principe, Saudi Arabia, Senegal, Serbia, Seychelles, Sierra Leone, Singapore, Slovakia (Slovak Republic), Slovenia, Sint Maarten, Solomon Islands, Somalia, South Africa, South Georgia and the South Sandwich Islands, South Sudan, Spain, Sri Lanka, Sudan, Suriname, Svalbard and Jan Mayen, Sweden, Switzerland, Syrian Arab Republic, Taiwan, Tajikistan, United Republic of Tanzania, Thailand, The Democratic Republic of the Congo (Zaire), Togo, Tokelau, Tonga, Trinidad and Tobago, Tunisia, Turkey, Turkmenistan, Turks and Caicos Islands, Tuvalu, Uganda, Ukraine, United Arab Emirates (UAE), United Kingdom (UK), United States (USA), United States Minor Outlying Islands, Uruguay, Uzbekistan, Vanuatu, Venezuela, Vietnam, US Virgin Islands, Wallis and Futuna, Western Sahara, Yemen, Zambia, Zimbabwe.',-90.0,90.0,-180.0,180.0,0);
INSERT INTO "extent" VALUES('EPSG','2831','Canada - Atlantic offshore','Canada - offshore Newfoundland and Labrador, New Brunswick and Nova Scotia.',40.04,64.21,-67.75,-47.74,0);
INSERT INTO "extent" VALUES('EPSG','2831','Canada - Atlantic offshore','Canada - offshore Newfoundland and Labrador, New Brunswick and Nova Scotia.',40.040199904302,64.205208824162,-67.743055559783,-47.743430543984,0);
INSERT INTO "extent" VALUES('EPSG','2832','Canada - British Columbia','Canada - British Columbia.',48.25,60.01,-139.04,-114.08,0);
INSERT INTO "extent" VALUES('EPSG','2833','Sweden - 12 00','Sweden - communes west of approximately 12°45''E and south of approximately 60°N. See information source for map.',56.74,60.13,10.93,13.11,0);
INSERT INTO "extent" VALUES('EPSG','2834','Sweden - 13 30','Sweden - communes between approximately 12°45''E and 14°15''E and south of approximately 62°10''N. See information source for map.',55.28,62.28,12.12,14.79,0);
@@ -2442,7 +2442,7 @@ INSERT INTO "extent" VALUES('EPSG','3462','Mexico - offshore GoM - Campeche area
INSERT INTO "extent" VALUES('EPSG','3463','World - 86°S to 86°N','World between 86°S and 86°N.',-86.0,86.0,-180.0,180.0,0);
INSERT INTO "extent" VALUES('EPSG','3464','World - N hemisphere - 12°E to 18°E - by country and WGS 72BE','Between 12°E and 18°E, northern hemisphere between equator and 84°N, onshore and offshore. Chad - west of 18°E.',0.0,84.0,12.0,18.0,0);
INSERT INTO "extent" VALUES('EPSG','3465','World - N hemisphere - 18°E to 24°E - by country and WGS 72BE','Between 12°E and 18°E, northern hemisphere between equator and 84°N, onshore and offshore. Chad - east of 18°E.',0.0,84.0,18.0,24.0,0);
INSERT INTO "extent" VALUES('EPSG','3466','China - Ordos - 108°E to 108.5°E and 37.75°N to 38.25°N','China - Ordos basin.',35.0,39.0,107.0,110.01,0);
INSERT INTO "extent" VALUES('EPSG','3466','China - Ordos basin','China - Ordos basin.',35.0,39.0,107.0,110.007,0);
INSERT INTO "extent" VALUES('EPSG','3467','North America - Great Lakes basin','Canada and United States (USA) - Great Lakes basin.',40.99,50.74,-93.17,-74.47,0);
INSERT INTO "extent" VALUES('EPSG','3468','North America - Great Lakes basin and St Lawrence Seaway','Canada and United States (USA) - Great Lakes basin and St Lawrence Seaway.',40.99,52.22,-93.17,-54.75,0);
INSERT INTO "extent" VALUES('EPSG','3469','China - offshore - Yellow Sea','China - offshore - Huang Hai (Yellow Sea).',31.23,37.4,119.23,125.06,0);
@@ -3518,7 +3518,7 @@ INSERT INTO "extent" VALUES('EPSG','4539','Angola - east of 18°E','Angola - eas
INSERT INTO "extent" VALUES('EPSG','4540','Africa - South Africa, Lesotho and Eswatini.','Eswatini (Swaziland); Lesotho; South Africa - onshore and offshore.',-50.32,-22.13,13.33,42.85,0);
INSERT INTO "extent" VALUES('EPSG','4541','Vietnam - Dien Bien and Lai Chau','Vietnam - Dien Bien and Lai Chau provinces.',20.89,22.82,102.14,103.99,0);
INSERT INTO "extent" VALUES('EPSG','4542','Kosovo','Kosovo.',41.85,43.25,19.97,21.8,0);
INSERT INTO "extent" VALUES('EPSG','4543','Serbia','Serbia including Vojvodinja.',42.23,46.19,18.81,23.01,0);
INSERT INTO "extent" VALUES('EPSG','4543','Serbia','Serbia including Vojvodina.',42.232494354248,46.18111038208,18.81702041626,23.004997253418,0);
INSERT INTO "extent" VALUES('EPSG','4544','North America - Canada, US (Conus+AK), PRVI','North America - onshore and offshore: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. Puerto Rico. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. US Virgin Islands.',14.92,86.46,167.65,-47.74,0);
INSERT INTO "extent" VALUES('EPSG','4545','Vietnam - Ca Mau and Kien Giang','Vietnam - Ca Mau and Kien Giang provinces.',8.33,10.55,103.4,105.54,0);
INSERT INTO "extent" VALUES('EPSG','4546','Vietnam - An Giang, Lao Cai, Nghe An, Phu Tho, Yen Bai','Vietnam - An Giang, Lao Cai, Nghe An, Phu Tho and Yen Bai provinces.',10.18,22.85,103.53,105.86,0);
@@ -3585,3 +3585,7 @@ INSERT INTO "extent" VALUES('EPSG','4606','Europe - British Isles - UK and Irela
INSERT INTO "extent" VALUES('EPSG','4607','UK - Glasgow to Kilmarnock','UK - on or related to the rail route from Glasgow via Barrhead to Kilmarnock and the branch to East Kilbride.',55.55,55.95,-4.65,-4.05,0);
INSERT INTO "extent" VALUES('EPSG','4608','Europe - EVRF2019','Europe - onshore - Andorra; Austria; Belarus; Belgium; Bosnia and Herzegovina; Bulgaria; Croatia; Czechia; Denmark; Estonia; Finland; France - mainland; Germany; Gibraltar, Hungary; Italy - mainland and Sicily; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; North Macedonia; Norway; Poland; Portugal - mainland; Romania; Russia – west of approximately 60°E; San Marino; Slovakia; Slovenia; Spain - mainland; Sweden; Switzerland; United Kingdom (UK) - Great Britain mainland; Ukraine; Vatican City State.',35.95,77.07,-9.56,69.15,0);
INSERT INTO "extent" VALUES('EPSG','4609','Europe - ETRF EVRF2019','Europe - onshore - Andorra; Austria; Belgium; Bosnia and Herzegovina; Bulgaria; Croatia; Czechia; Denmark; Estonia; Finland; France - mainland; Germany; Gibraltar, Hungary; Italy - mainland and Sicily; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; North Macedonia; Norway; Poland; Portugal - mainland; Romania; San Marino; Slovakia; Slovenia; Spain - mainland; Sweden; Switzerland; United Kingdom (UK) - Great Britain mainland; Vatican City State.',35.95,71.21,-9.56,31.59,0);
INSERT INTO "extent" VALUES('EPSG','4610','Argentina - Buenos Aires city','Argentina - autonomous city of Buenos Aires.',-34.705314975913,-34.506992229796,-58.531465195974,-58.29240989685,0);
INSERT INTO "extent" VALUES('EPSG','4611','Malaysia - East Malaysia - Sarawak onshore','Malaysia - East Malaysia - Sarawak onshore.',0.85,5.03,109.54,115.69,0);
INSERT INTO "extent" VALUES('EPSG','4612','Canada - Newfoundland','Canada - Newfoundland - onshore.',46.567800287196,51.674372389257,-59.477936442937,-52.543563434093,0);
INSERT INTO "extent" VALUES('EPSG','4614','Argentina - Comodoro Rivadavia - west of 67.5°W','Argentina - Comodoro Rivadavia area west of 67°30''W.',-46.699998855591,-45.199998855591,-69.5,-67.5,0);
+12 -8
View File
@@ -807,7 +807,7 @@ INSERT INTO "usage" VALUES('EPSG','3498','geodetic_crs','EPSG','4668','EPSG','12
INSERT INTO "geodetic_crs" VALUES('EPSG','4669','LKS94',NULL,'geographic 2D','EPSG','6422','EPSG','6126',NULL,0);
INSERT INTO "usage" VALUES('EPSG','3499','geodetic_crs','EPSG','4669','EPSG','1145','EPSG','1183');
INSERT INTO "geodetic_crs" VALUES('EPSG','4670','IGM95',NULL,'geographic 2D','EPSG','6422','EPSG','6670',NULL,0);
INSERT INTO "usage" VALUES('EPSG','3500','geodetic_crs','EPSG','4670','EPSG','3343','EPSG','1183');
INSERT INTO "usage" VALUES('EPSG','14404','geodetic_crs','EPSG','4670','EPSG','3343','EPSG','1183');
INSERT INTO "geodetic_crs" VALUES('EPSG','4671','Voirol 1879',NULL,'geographic 2D','EPSG','6422','EPSG','6671',NULL,0);
INSERT INTO "usage" VALUES('EPSG','3501','geodetic_crs','EPSG','4671','EPSG','1365','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','4672','Chatham Islands 1971',NULL,'geographic 2D','EPSG','6422','EPSG','6672',NULL,0);
@@ -1241,9 +1241,9 @@ INSERT INTO "usage" VALUES('EPSG','3780','geodetic_crs','EPSG','4980','EPSG','12
INSERT INTO "geodetic_crs" VALUES('EPSG','4981','Yemen NGN96',NULL,'geographic 3D','EPSG','6423','EPSG','6163',NULL,0);
INSERT INTO "usage" VALUES('EPSG','3781','geodetic_crs','EPSG','4981','EPSG','1257','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','4982','IGM95',NULL,'geocentric','EPSG','6500','EPSG','6670',NULL,0);
INSERT INTO "usage" VALUES('EPSG','3782','geodetic_crs','EPSG','4982','EPSG','3343','EPSG','1027');
INSERT INTO "usage" VALUES('EPSG','14402','geodetic_crs','EPSG','4982','EPSG','3343','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','4983','IGM95',NULL,'geographic 3D','EPSG','6423','EPSG','6670',NULL,0);
INSERT INTO "usage" VALUES('EPSG','3783','geodetic_crs','EPSG','4983','EPSG','3343','EPSG','1027');
INSERT INTO "usage" VALUES('EPSG','14403','geodetic_crs','EPSG','4983','EPSG','3343','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','4984','WGS 72',NULL,'geocentric','EPSG','6500','EPSG','6322',NULL,0);
INSERT INTO "usage" VALUES('EPSG','3784','geodetic_crs','EPSG','4984','EPSG','1262','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','4985','WGS 72',NULL,'geographic 3D','EPSG','6423','EPSG','6322',NULL,0);
@@ -1455,11 +1455,11 @@ INSERT INTO "usage" VALUES('EPSG','4886','geodetic_crs','EPSG','6667','EPSG','11
INSERT INTO "geodetic_crs" VALUES('EPSG','6668','JGD2011',NULL,'geographic 2D','EPSG','6422','EPSG','1128',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4887','geodetic_crs','EPSG','6668','EPSG','1129','EPSG','1183');
INSERT INTO "geodetic_crs" VALUES('EPSG','6704','RDN2008',NULL,'geocentric','EPSG','6500','EPSG','1132',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4919','geodetic_crs','EPSG','6704','EPSG','3343','EPSG','1027');
INSERT INTO "usage" VALUES('EPSG','14411','geodetic_crs','EPSG','6704','EPSG','3343','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','6705','RDN2008',NULL,'geographic 3D','EPSG','6423','EPSG','1132',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4920','geodetic_crs','EPSG','6705','EPSG','3343','EPSG','1027');
INSERT INTO "usage" VALUES('EPSG','14410','geodetic_crs','EPSG','6705','EPSG','3343','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','6706','RDN2008',NULL,'geographic 2D','EPSG','6422','EPSG','1132',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4921','geodetic_crs','EPSG','6706','EPSG','3343','EPSG','1183');
INSERT INTO "usage" VALUES('EPSG','14412','geodetic_crs','EPSG','6706','EPSG','3343','EPSG','1183');
INSERT INTO "geodetic_crs" VALUES('EPSG','6781','NAD83(CORS96)',NULL,'geocentric','EPSG','6500','EPSG','1133',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4937','geodetic_crs','EPSG','6781','EPSG','1511','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','6782','NAD83(CORS96)',NULL,'geographic 3D','EPSG','6423','EPSG','1133',NULL,0);
@@ -2090,8 +2090,8 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','9378','IGb14',NULL,'geocentric','EPSG'
INSERT INTO "usage" VALUES('EPSG','13999','geodetic_crs','EPSG','9378','EPSG','2830','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','9379','IGb14',NULL,'geographic 3D','EPSG','6423','EPSG','1272',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14000','geodetic_crs','EPSG','9379','EPSG','1262','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','9380','IGb14',NULL,'geographic 2D','EPSG','6422','EPSG','1191',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14001','geodetic_crs','EPSG','9380','EPSG','1262','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','9380','IGb14',NULL,'geographic 2D','EPSG','6422','EPSG','1272',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14213','geodetic_crs','EPSG','9380','EPSG','1262','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','9384','AbInvA96_2020-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1273',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14028','geodetic_crs','EPSG','9384','EPSG','4589','EPSG','1196');
INSERT INTO "geodetic_crs" VALUES('EPSG','9403','PN68',NULL,'geographic 2D','EPSG','6422','EPSG','1286',NULL,0);
@@ -2104,3 +2104,7 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','9469','SRGI2013',NULL,'geographic 3D',
INSERT INTO "usage" VALUES('EPSG','14151','geodetic_crs','EPSG','9469','EPSG','1122','EPSG','1027');
INSERT INTO "geodetic_crs" VALUES('EPSG','9470','SRGI2013',NULL,'geographic 2D','EPSG','6422','EPSG','1293',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14152','geodetic_crs','EPSG','9470','EPSG','1122','EPSG','1183');
INSERT INTO "geodetic_crs" VALUES('EPSG','9474','PZ-90.02',NULL,'geographic 2D','EPSG','6422','EPSG','1157',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14195','geodetic_crs','EPSG','9474','EPSG','1262','EPSG','1183');
INSERT INTO "geodetic_crs" VALUES('EPSG','9475','PZ-90.11',NULL,'geographic 2D','EPSG','6422','EPSG','1158',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14194','geodetic_crs','EPSG','9475','EPSG','1262','EPSG','1183');
+4 -4
View File
@@ -934,8 +934,8 @@ INSERT INTO "geodetic_datum" VALUES('EPSG','6667','Iraq-Kuwait Boundary Datum 19
INSERT INTO "usage" VALUES('EPSG','13727','geodetic_datum','EPSG','6667','EPSG','2876','EPSG','1053');
INSERT INTO "geodetic_datum" VALUES('EPSG','6668','European Datum 1979',NULL,'EPSG','7022','EPSG','8901','1979-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13728','geodetic_datum','EPSG','6668','EPSG','1297','EPSG','1027');
INSERT INTO "geodetic_datum" VALUES('EPSG','6670','Istituto Geografico Militaire 1995',NULL,'EPSG','7030','EPSG','8901','1995-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13729','geodetic_datum','EPSG','6670','EPSG','3343','EPSG','1027');
INSERT INTO "geodetic_datum" VALUES('EPSG','6670','Istituto Geografico Militaire 1995',NULL,'EPSG','7019','EPSG','8901','1995-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14401','geodetic_datum','EPSG','6670','EPSG','3343','EPSG','1027');
INSERT INTO "geodetic_datum" VALUES('EPSG','6671','Voirol 1879',NULL,'EPSG','7011','EPSG','8901','1879-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13730','geodetic_datum','EPSG','6671','EPSG','1365','EPSG','1153');
INSERT INTO "geodetic_datum" VALUES('EPSG','6672','Chatham Islands Datum 1971',NULL,'EPSG','7022','EPSG','8901','1971-01-01',NULL,NULL,0);
@@ -1177,6 +1177,6 @@ INSERT INTO "usage" VALUES('EPSG','13848','geodetic_datum','EPSG','6903','EPSG',
INSERT INTO "geodetic_datum" VALUES('EPSG','6904','Lisbon 1890 (Lisbon)',NULL,'EPSG','7004','EPSG','8902','1937-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13849','geodetic_datum','EPSG','6904','EPSG','1294','EPSG','1153');
INSERT INTO "geodetic_datum" VALUES('EPSG','6258','European Terrestrial Reference System 1989 ensemble',NULL,'EPSG','7019','EPSG','8901',NULL,NULL,0.1,0);
INSERT INTO "usage" VALUES('EPSG','13599','geodetic_datum','EPSG','6258','EPSG','1298','EPSG','1026');
INSERT INTO "usage" VALUES('EPSG','14235','geodetic_datum','EPSG','6258','EPSG','1298','EPSG','1026');
INSERT INTO "geodetic_datum" VALUES('EPSG','6326','World Geodetic System 1984 ensemble',NULL,'EPSG','7030','EPSG','8901',NULL,NULL,2.0,0);
INSERT INTO "usage" VALUES('EPSG','13661','geodetic_datum','EPSG','6326','EPSG','1262','EPSG','1245');
INSERT INTO "usage" VALUES('EPSG','14343','geodetic_datum','EPSG','6326','EPSG','1262','EPSG','1245');
+2 -1
View File
@@ -21,6 +21,7 @@ VALUES
('AUSGeoid09_GDA94_V1.01_DOV_windows.gsb','au_ga_AUSGeoid09_V1.01.tif','AUSGeoid09_V1.01.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/au_ga_AUSGeoid09_V1.01.tif',1,1,NULL),
-- source file contains undulation in first band, and deflection in 2nd and 3d band
('AUSGeoid2020_20180201.gsb','au_ga_AUSGeoid2020_20180201.tif','AUSGeoid2020_20180201.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/au_ga_AUSGeoid2020_20180201.tif',1,1,NULL),
('AGQG_20191107.gsb','au_ga_AGQG_20191107.tif',NULL,'GTiff','geoid_like',0,NULL,'https://cdn.proj.org/au_ga_AGQG_20191107.tif',1,1,NULL),
-- au_icsm - Australian Intergovernmental Committee on Surveying and Mapping
('A66 National (13.09.01).gsb','au_icsm_A66_National_13_09_01.tif','A66_National_13_09_01.gsb','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/au_icsm_A66_National_13_09_01.tif',1,1,NULL),
@@ -162,7 +163,7 @@ VALUES
('ISN2004_ISN2016.gsb','is_lmi_ISN2004_ISN2016.tif','ISN2004_ISN2016.gsb','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/is_lmi_ISN2004_ISN2016.tif',1,1,NULL),
-- jp_gsi - Geospatial Information Authority of Japan
('jp_gsi_gsigeo2011_mainland.tif','jp_gsi_gsigeo2011_mainland.tif',NULL,'GTiff','geoid_like',0,NULL,'https://cdn.proj.org/jp_gsi_gsigeo2011_mainland.tif',1,1,NULL),
('jp_gsi_gsigeo2011.tif','jp_gsi_gsigeo2011.tif',NULL,'GTiff','geoid_like',0,NULL,'https://cdn.proj.org/jp_gsi_gsigeo2011.tif',1,1,NULL),
-- nc_dittt - Gouvernement de Nouvelle Calédonie - DITTT
('Ranc08_Circe.mnt','nc_dittt_Ranc08_Circe.tif',NULL,'GTiff','geoid_like',0,NULL,'https://cdn.proj.org/nc_dittt_Ranc08_Circe.tif',1,1,NULL),
+100 -20
View File
@@ -277,7 +277,7 @@ INSERT INTO "usage" VALUES('EPSG','8673','grid_transformation','EPSG','1752','EP
INSERT INTO "grid_transformation" VALUES('EPSG','1803','AGD66 to GDA94 (11)','Replaces AGD66 to GDA94 variants 6, 7 and 10 (codes 1506 1507 1596). Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east. May be used as tfm to WGS 84 - see code 15786.','EPSG','9615','NTv2','EPSG','4202','EPSG','4283',0.1,'EPSG','8656','Latitude and longitude difference file','A66 National (13.09.01).gsb',NULL,NULL,NULL,NULL,NULL,NULL,'ICSM-Aus 0.1m',0);
INSERT INTO "usage" VALUES('EPSG','8724','grid_transformation','EPSG','1803','EPSG','2575','EPSG','1031');
INSERT INTO "grid_transformation" VALUES('EPSG','1804','AGD84 to GDA94 (5)','Replaces AGD84 to GDA94 (4) (code 1593) which itself replaced variant 3 (code 1559). Input expects longitudes to be + west; EPSG GeogCRS AGD84 (code 4203) and GDA94 (code 4283) both have longitudes positive east. May be used as tfm to WGS 84 - see 15785','EPSG','9615','NTv2','EPSG','4203','EPSG','4283',0.1,'EPSG','8656','Latitude and longitude difference file','National 84 (02.07.01).gsb',NULL,NULL,NULL,NULL,NULL,NULL,'Auslig-Aus 0.1m',0);
INSERT INTO "usage" VALUES('EPSG','8725','grid_transformation','EPSG','1804','EPSG','2576','EPSG','1031');
INSERT INTO "usage" VALUES('EPSG','14199','grid_transformation','EPSG','1804','EPSG','2576','EPSG','1031');
INSERT INTO "grid_transformation" VALUES('EPSG','1841','ATS77 to NAD83(CSRS) (1)','Introduced in 1999. Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1688.','EPSG','9615','NTv2','EPSG','4122','EPSG','4617',1.5,'EPSG','8656','Latitude and longitude difference file','NB7783v2.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'GIC-Can NB',1);
INSERT INTO "usage" VALUES('EPSG','8762','grid_transformation','EPSG','1841','EPSG','1447','EPSG','1231');
INSERT INTO "grid_transformation" VALUES('EPSG','1843','NAD83 to NAD83(CSRS) (1)','Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(CSRS) (code 4617) have longitudes positive east. Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1696.','EPSG','9615','NTv2','EPSG','4269','EPSG','4617',1.5,'EPSG','8656','Latitude and longitude difference file','NAD83-98.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'SGQ-Can QC',1);
@@ -323,7 +323,7 @@ INSERT INTO "usage" VALUES('EPSG','9347','grid_transformation','EPSG','5334','EP
INSERT INTO "grid_transformation" VALUES('EPSG','5335','ETRS89 to Malin Head height (1)','May be used for transformations from WGS 84 to Malin Head. Replaced by ETRS89 to Malin Head height (2) (code 7959).','EPSG','1045','Geographic3D to GravityRelatedHeight (OSGM02-Ire)','EPSG','4937','EPSG','5731',0.04,'EPSG','8666','Geoid (height correction) model file','OSGM02_RoI.txt',NULL,NULL,NULL,NULL,NULL,NULL,'OS-Ire',0);
INSERT INTO "usage" VALUES('EPSG','9348','grid_transformation','EPSG','5335','EPSG','1305','EPSG','1133');
INSERT INTO "grid_transformation" VALUES('EPSG','5338','OSGB 1936 to ETRS89 (1)','Approximate alternative to official OSTN02 method (tfm code 7952). Accuracy at 2000 test points compared to OSTN02 (tfm code 1039): latitude 0.5mm av, 17mm max; longitude 0.8mm av, 23mm max. May be taken as approximate CT to WGS 84 - see code 5339.','EPSG','9615','NTv2','EPSG','4277','EPSG','4258',0.03,'EPSG','8656','Latitude and longitude difference file','OSTN02_NTv2.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'OSGB-UK Gbr02 NT',0);
INSERT INTO "usage" VALUES('EPSG','9349','grid_transformation','EPSG','5338','EPSG','1264','EPSG','1033');
INSERT INTO "usage" VALUES('EPSG','9349','grid_transformation','EPSG','5338','EPSG','1264','EPSG','1273');
INSERT INTO "grid_transformation" VALUES('EPSG','5339','OSGB 1936 to WGS 84 (7)','Parameter values taken from OSGB 1936 to ETRS89 (1) (tfm code 5338) assuming that ETRS89 is coincident with WGS 84 within the accuracy of the tfm. Within accuracy of the tfm equivalent to OSGB 1936 / British National Grid to WGS 84 (2) (tfm code 15956).','EPSG','9615','NTv2','EPSG','4277','EPSG','4326',1.0,'EPSG','8656','Latitude and longitude difference file','OSTN02_NTv2.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'OGP-UK Gbr02 NT',0);
INSERT INTO "usage" VALUES('EPSG','9350','grid_transformation','EPSG','5339','EPSG','1264','EPSG','1041');
INSERT INTO "grid_transformation" VALUES('EPSG','5409','NGVD29 height to NAVD88 height (1)','Interpolation within the gridded data file may be made using any of the horizontal CRSs NAD27, NAD83 or NAD83(HARN).','EPSG','9658','Vertical Offset by Grid Interpolation (VERTCON)','EPSG','5702','EPSG','5703',0.02,'EPSG','8732','Vertical offset file','vertconw.94',NULL,NULL,NULL,NULL,NULL,NULL,'NGS-US Conus W',1);
@@ -425,7 +425,7 @@ INSERT INTO "usage" VALUES('EPSG','10205','grid_transformation','EPSG','7673','E
INSERT INTO "grid_transformation" VALUES('EPSG','7674','CH1903 to ETRS89 (2)','Replaces tfm code 1646. Equivalent to concatenation of transformations 15486 and 1647 to within 2cm. Also used as transformation between CH1903 and CHTRF95 (see code 7673). May be used as approximate tfm CH1903 to WGS 84 - see code 7788.','EPSG','9615','NTv2','EPSG','4149','EPSG','4258',0.25,'EPSG','8656','Latitude and longitude difference file','CHENyx06_ETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BfL-Che NTv2',0);
INSERT INTO "usage" VALUES('EPSG','10206','grid_transformation','EPSG','7674','EPSG','1286','EPSG','1083');
INSERT INTO "grid_transformation" VALUES('EPSG','7709','OSGB 1936 to ETRS89 (2)','Approximate alternative to official OSTN15 method (tfm code 7953). May be taken as approximate transformation OSGB 1936 to WGS 84 - see code 7710. Replaces OSGB 1936 to ETRS89 (1) (tfm code 5338).','EPSG','9615','NTv2','EPSG','4277','EPSG','4258',0.03,'EPSG','8656','Latitude and longitude difference file','OSTN15_NTv2_OSGBtoETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'OSGB-UK Gbr15 NT',0);
INSERT INTO "usage" VALUES('EPSG','10222','grid_transformation','EPSG','7709','EPSG','4390','EPSG','1133');
INSERT INTO "usage" VALUES('EPSG','10222','grid_transformation','EPSG','7709','EPSG','4390','EPSG','1273');
INSERT INTO "grid_transformation" VALUES('EPSG','7710','OSGB 1936 to WGS 84 (9)','Parameter values taken from OSGB 1936 to ETRS89 (3) (tfm code 7709) assuming that ETRS89 is coincident with WGS 84 within the accuracy of the tfm. Replaces OSGB 1936 to WGS 84 (7) (tfm code 5339).','EPSG','9615','NTv2','EPSG','4277','EPSG','4326',1.0,'EPSG','8656','Latitude and longitude difference file','OSTN15_NTv2_OSGBtoETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'OGP-UK Gbr15 NT',0);
INSERT INTO "usage" VALUES('EPSG','10223','grid_transformation','EPSG','7710','EPSG','4390','EPSG','1252');
INSERT INTO "grid_transformation" VALUES('EPSG','7711','ETRS89 to ODN height (2)','OSGM15 supersedes OSGM02 geoid model. Replaces ETRS89 to Newlyn height (1) (tfm code 10021).','EPSG','9663','Geographic3D to GravityRelatedHeight (OSGM-GB)','EPSG','4937','EPSG','5701',0.008,'EPSG','8666','Geoid (height correction) model file','OSTN15_OSGM15_GB.txt',NULL,NULL,NULL,NULL,NULL,NULL,'OS-UK Gbr 2015',0);
@@ -670,8 +670,8 @@ INSERT INTO "grid_transformation" VALUES('EPSG','9239','NAD27 to NAD83(CSRS)v2 (
INSERT INTO "usage" VALUES('EPSG','13884','grid_transformation','EPSG','9239','EPSG','1368','EPSG','1151');
INSERT INTO "grid_transformation" VALUES('EPSG','9240','NAD27(CGQ77) to NAD83(CSRS)v2 (1)','Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27(CGQ77) (code 4609) and NAD83(CSRS) (code 4617) have longitudes positive east. Can be taken as an approximate transformation NAD27(CGQ77) to WGS 84 - see code 1691.','EPSG','9615','NTv2','EPSG','4609','EPSG','8237',1.5,'EPSG','8656','Latitude and longitude difference file','CGQ77-98.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'SGQ-Can QC',0);
INSERT INTO "usage" VALUES('EPSG','13885','grid_transformation','EPSG','9240','EPSG','1368','EPSG','1151');
INSERT INTO "grid_transformation" VALUES('EPSG','9241','NAD83 to NAD83(CSRS)v2 (1)','Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(CSRS) (code 4617) have longitudes positive east. Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1696.','EPSG','9615','NTv2','EPSG','4269','EPSG','8237',1.5,'EPSG','8656','Latitude and longitude difference file','NAD83-98.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'SGQ-Can QC',0);
INSERT INTO "usage" VALUES('EPSG','13886','grid_transformation','EPSG','9241','EPSG','1368','EPSG','1151');
INSERT INTO "grid_transformation" VALUES('EPSG','9241','NAD83 to NAD83(CSRS)v2 (1)','Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(CSRS)v2 (code 8237) have longitudes positive east. Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1696.','EPSG','9615','NTv2','EPSG','4269','EPSG','8237',1.5,'EPSG','8656','Latitude and longitude difference file','NAD83-98.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'SGQ-Can QC',0);
INSERT INTO "usage" VALUES('EPSG','14556','grid_transformation','EPSG','9241','EPSG','1368','EPSG','1151');
INSERT INTO "grid_transformation" VALUES('EPSG','9242','NAD27 to NAD83(CSRS)v3 (2)','Can be taken as an approximate transformation NAD27 to WGS 84 - see code 1703.','EPSG','9615','NTv2','EPSG','4267','EPSG','8240',1.5,'EPSG','8656','Latitude and longitude difference file','SK27-98.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'SK PMC-Can SK',0);
INSERT INTO "usage" VALUES('EPSG','13887','grid_transformation','EPSG','9242','EPSG','2375','EPSG','1151');
INSERT INTO "grid_transformation" VALUES('EPSG','9243','NAD83 to NAD83(CSRS)v3 (2)','Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1697.','EPSG','9615','NTv2','EPSG','4269','EPSG','8240',1.5,'EPSG','8656','Latitude and longitude difference file','SK83-98.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'SK PMC-Can SK',0);
@@ -786,35 +786,35 @@ INSERT INTO "grid_transformation" VALUES('EPSG','9420','REGCAN95 to La Palma hei
INSERT INTO "usage" VALUES('EPSG','14076','grid_transformation','EPSG','9420','EPSG','4596','EPSG','1133');
INSERT INTO "grid_transformation" VALUES('EPSG','9421','REGCAN95 to El Hierro height (1)','','EPSG','1025','Geographic3D to GravityRelatedHeight (EGM2008)','EPSG','4080','EPSG','9401',0.05,'EPSG','8666','Geoid (height correction) model file','EGM08_REDNAP_Canarias.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Esp 2008',0);
INSERT INTO "usage" VALUES('EPSG','14077','grid_transformation','EPSG','9421','EPSG','4597','EPSG','1133');
INSERT INTO "grid_transformation" VALUES('EPSG','9431','GHA height to EVRF2019 height (1)','Determined at 147 points, SD 0.060m. Offset: mean -0.306m, minimum -0.442m, maximum -0.219m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5778','EPSG','9389',0.12,'EPSG','8732','Vertical offset file','at_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Aut 2019z',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9431','GHA height to EVRF2019 height (1)','Determined at 147 points, SD 0.060m. Offset: mean -0.306m, minimum -0.442m, maximum -0.219m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5778','EPSG','9389',0.12,'EPSG','8732','Vertical offset file','at_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Aut 2019z',1);
INSERT INTO "usage" VALUES('EPSG','14089','grid_transformation','EPSG','9431','EPSG','1037','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9432','GHA height to EVRF2019 mean-tide height (1)','Determined at 147 points, SD 0.058m. Offset: mean -0.330m, minimum -0.463m, maximum -0.245m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5778','EPSG','9390',0.116,'EPSG','8732','Vertical offset file','at_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Aut 2019m',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9432','GHA height to EVRF2019 mean-tide height (1)','Determined at 147 points, SD 0.058m. Offset: mean -0.330m, minimum -0.463m, maximum -0.245m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5778','EPSG','9390',0.116,'EPSG','8732','Vertical offset file','at_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Aut 2019m',1);
INSERT INTO "usage" VALUES('EPSG','14090','grid_transformation','EPSG','9432','EPSG','1037','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9433','Ostend height to EVRF2019 mean-tide height (1)','Determined at 39 points, SD 0.016m. Offset: mean -2.323m, minimum -2.372m, maximum -2.290m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5710','EPSG','9390',0.032,'EPSG','8732','Vertical offset file','be_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bel 2019m',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9433','Ostend height to EVRF2019 mean-tide height (1)','Determined at 39 points, SD 0.016m. Offset: mean -2.323m, minimum -2.372m, maximum -2.290m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5710','EPSG','9390',0.032,'EPSG','8732','Vertical offset file','be_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bel 2019m',1);
INSERT INTO "usage" VALUES('EPSG','14091','grid_transformation','EPSG','9433','EPSG','1347','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9434','Ostend height to EVRF2019 height (1)','Determined at 39 points, SD 0.017m. Offset: mean -2.315m, minimum -2.364m, maximum -2.279m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5710','EPSG','9389',0.034,'EPSG','8732','Vertical offset file','be_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bel 2019z',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9434','Ostend height to EVRF2019 height (1)','Determined at 39 points, SD 0.017m. Offset: mean -2.315m, minimum -2.364m, maximum -2.279m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5710','EPSG','9389',0.034,'EPSG','8732','Vertical offset file','be_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bel 2019z',1);
INSERT INTO "usage" VALUES('EPSG','14092','grid_transformation','EPSG','9434','EPSG','1347','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9435','DHHN2016 height to EVRF2019 height (1)','Determined at 802 points, SD 0.010m. Offset: mean 0.013m, minimum -0.008m, maximum 0.039m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','7837','EPSG','9389',0.02,'EPSG','8732','Vertical offset file','de_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Deu 2019z',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9435','DHHN2016 height to EVRF2019 height (1)','Determined at 802 points, SD 0.010m. Offset: mean 0.013m, minimum -0.008m, maximum 0.039m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','7837','EPSG','9389',0.02,'EPSG','8732','Vertical offset file','de_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Deu 2019z',1);
INSERT INTO "usage" VALUES('EPSG','14093','grid_transformation','EPSG','9435','EPSG','3339','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9436','DHHN2016 height to EVRF2019 mean-tide height (1)','Determined at 802 points, SD 0.003m. Offset: mean 0.007m, minimum -0.004m, maximum 0.018m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','7837','EPSG','9390',0.006,'EPSG','8732','Vertical offset file','de_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Deu 2019m',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9436','DHHN2016 height to EVRF2019 mean-tide height (1)','Determined at 802 points, SD 0.003m. Offset: mean 0.007m, minimum -0.004m, maximum 0.018m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','7837','EPSG','9390',0.006,'EPSG','8732','Vertical offset file','de_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Deu 2019m',1);
INSERT INTO "usage" VALUES('EPSG','14094','grid_transformation','EPSG','9436','EPSG','3339','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9437','Trieste height to EVRF2019 height (1)','Determined at 46 points, SD 0.016m. Offset: mean -0.548m, minimum -0.595m, maximum -0.500m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5195','EPSG','9389',0.032,'EPSG','8732','Vertical offset file','mk_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Mkd 2019z',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9437','Trieste height to EVRF2019 height (1)','Determined at 46 points, SD 0.016m. Offset: mean -0.548m, minimum -0.595m, maximum -0.500m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5195','EPSG','9389',0.032,'EPSG','8732','Vertical offset file','mk_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Mkd 2019z',1);
INSERT INTO "usage" VALUES('EPSG','14095','grid_transformation','EPSG','9437','EPSG','1148','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9438','Trieste height to EVRF2019 mean-tide height (1)','Determined at 46 points, SD 0.015m. Offset: mean -0.604m, minimum -0.650m, maximum -0.558m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5195','EPSG','9390',0.03,'EPSG','8732','Vertical offset file','mk_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Mkd 2019m',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9438','Trieste height to EVRF2019 mean-tide height (1)','Determined at 46 points, SD 0.015m. Offset: mean -0.604m, minimum -0.650m, maximum -0.558m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5195','EPSG','9390',0.03,'EPSG','8732','Vertical offset file','mk_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Mkd 2019m',1);
INSERT INTO "usage" VALUES('EPSG','14096','grid_transformation','EPSG','9438','EPSG','1148','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9439','Cascais height to EVRF2019 height (1)','Determined at 18 points, SD 0.010m. Offset: mean -0.277m, minimum -0.323m, maximum -0.264m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5780','EPSG','9389',0.02,'EPSG','8732','Vertical offset file','pt_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Prt 2019z',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9439','Cascais height to EVRF2019 height (1)','Determined at 18 points, SD 0.010m. Offset: mean -0.277m, minimum -0.323m, maximum -0.264m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5780','EPSG','9389',0.02,'EPSG','8732','Vertical offset file','pt_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Prt 2019z',1);
INSERT INTO "usage" VALUES('EPSG','14097','grid_transformation','EPSG','9439','EPSG','1294','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9440','Cascais height to EVRF2019 mean-tide height (1)','Determined at 18 points, SD 0.007m. Offset: mean -0.343m, minimum -0.383m, maximum -0.332m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5780','EPSG','9390',0.014,'EPSG','8732','Vertical offset file','pt_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Prt 2019m',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9440','Cascais height to EVRF2019 mean-tide height (1)','Determined at 18 points, SD 0.007m. Offset: mean -0.343m, minimum -0.383m, maximum -0.332m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5780','EPSG','9390',0.014,'EPSG','8732','Vertical offset file','pt_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Prt 2019m',1);
INSERT INTO "usage" VALUES('EPSG','14098','grid_transformation','EPSG','9440','EPSG','1294','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9441','SVS2010 height to EVRF2019 height (1)','Determined at 66 points, SD 0.003m. Offset: mean -0.258m, minimum -0.264m, maximum -0.250m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','8690','EPSG','9389',0.006,'EPSG','8732','Vertical offset file','si_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Svn 2019z',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9441','SVS2010 height to EVRF2019 height (1)','Determined at 66 points, SD 0.003m. Offset: mean -0.258m, minimum -0.264m, maximum -0.250m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','8690','EPSG','9389',0.006,'EPSG','8732','Vertical offset file','si_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Svn 2019z',1);
INSERT INTO "usage" VALUES('EPSG','14099','grid_transformation','EPSG','9441','EPSG','3307','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9442','SVS2010 height to EVRF2019 mean-tide height (1)','Determined at 66 points, SD 0.004m. Offset: mean -0.290m, minimum -0.295m, maximum -0.280m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','8690','EPSG','9390',0.008,'EPSG','8732','Vertical offset file','si_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Svn 2019m',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9442','SVS2010 height to EVRF2019 mean-tide height (1)','Determined at 66 points, SD 0.004m. Offset: mean -0.290m, minimum -0.295m, maximum -0.280m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','8690','EPSG','9390',0.008,'EPSG','8732','Vertical offset file','si_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Svn 2019m',1);
INSERT INTO "usage" VALUES('EPSG','14100','grid_transformation','EPSG','9442','EPSG','3307','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9443','LHN95 height to EVRF2019 height (1)','Determined at 553 points, SD 0.075m. Offset: mean -0.204m, minimum -0.330m, maximum -0.130m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5729','EPSG','9389',0.15,'EPSG','8732','Vertical offset file','ch_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Che 2019z',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9443','LHN95 height to EVRF2019 height (1)','Determined at 553 points, SD 0.075m. Offset: mean -0.204m, minimum -0.330m, maximum -0.130m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5729','EPSG','9389',0.15,'EPSG','8732','Vertical offset file','ch_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Che 2019z',1);
INSERT INTO "usage" VALUES('EPSG','14101','grid_transformation','EPSG','9443','EPSG','1286','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9444','LHN95 height to EVRF2019 mean-tide height (1)','Determined at 553 points, SD 0.073m. Offset: mean -0.233m, minimum -0.353m, maximum -0.044m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5729','EPSG','9390',0.146,'EPSG','8732','Vertical offset file','ch_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Che 2019m',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9444','LHN95 height to EVRF2019 mean-tide height (1)','Determined at 553 points, SD 0.073m. Offset: mean -0.233m, minimum -0.353m, maximum -0.044m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5729','EPSG','9390',0.146,'EPSG','8732','Vertical offset file','ch_2019_m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Che 2019m',1);
INSERT INTO "usage" VALUES('EPSG','14102','grid_transformation','EPSG','9444','EPSG','1286','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9445','ODN height to EVRF2019 height (1)','Determined at 35 points, SD 0.011m. Offset: mean -0.181m, minimum -0.202m, maximum -0.161m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5701','EPSG','9389',0.022,'EPSG','8732','Vertical offset file','gb_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Gbr 2019z',0);
INSERT INTO "grid_transformation" VALUES('EPSG','9445','ODN height to EVRF2019 height (1)','Determined at 35 points, SD 0.011m. Offset: mean -0.181m, minimum -0.202m, maximum -0.161m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5701','EPSG','9389',0.022,'EPSG','8732','Vertical offset file','gb_2019_z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Gbr 2019z',1);
INSERT INTO "usage" VALUES('EPSG','14103','grid_transformation','EPSG','9445','EPSG','2792','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9454','ETRS89 to GBK19-IRF (1)','In conjunction with the GBK19-TM map projection (code 9455) applied to GBK19-IRF (code 9453), emulates the GBK19 Snake projection. Applied to ETRS89 (as realized through the OSNet v2009 CORS) defines GBK19-IRF hence is errorless.','EPSG','9615','NTv2','EPSG','4258','EPSG','9453',0.0,'EPSG','8656','Latitude and longitude difference file','TN15-ETRS89-to-GBK19-IRF.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NR-Gbr GBK19 OSNet2009',0);
INSERT INTO "usage" VALUES('EPSG','14129','grid_transformation','EPSG','9454','EPSG','4607','EPSG','1141');
@@ -826,6 +826,86 @@ INSERT INTO "grid_transformation" VALUES('EPSG','9466','GDA2020 to GDA2020 + AHD
INSERT INTO "usage" VALUES('EPSG','14146','grid_transformation','EPSG','9466','EPSG','4493','EPSG','1133');
INSERT INTO "grid_transformation" VALUES('EPSG','9467','GDA94 to GDA94 + AHD height (1)','Reversible alternative to GDA94 to AHD height (1) (code 5656). Uses AUSGeoid09 model which uses bi-cubic interpolation; bi-linear interpolation of the grid file will give results agreeing to within 1cm 99.97% of the time.','EPSG','1083','Geog3D to Geog2D+Vertical (AUSGeoid v2)','EPSG','4939','EPSG','9464',0.15,'EPSG','8666','Geoid (height correction) model file','AUSGeoid09_V1.01.gsb',NULL,NULL,NULL,NULL,'EPSG','4283','GA-Aus09',0);
INSERT INTO "usage" VALUES('EPSG','14147','grid_transformation','EPSG','9467','EPSG','4493','EPSG','1133');
INSERT INTO "grid_transformation" VALUES('EPSG','9483','Canada velocity grid v7','','EPSG','1070','Point motion by grid (Canada NTv2_Vel)','EPSG','8254','EPSG','8254',0.01,'EPSG','1050','Point motion velocity grid file','cvg70.cvb',NULL,NULL,NULL,NULL,NULL,NULL,'NRC-Can cvg7.0',0);
INSERT INTO "usage" VALUES('EPSG','14214','grid_transformation','EPSG','9483','EPSG','1061','EPSG','1131');
INSERT INTO "grid_transformation" VALUES('EPSG','9484','ETRS89 to NN54 height (1)','','EPSG','9665','Geographic3D to GravityRelatedHeight (gtx)','EPSG','4937','EPSG','5776',0.02,'EPSG','8666','Geoid (height correction) model file','href2008a.gtx',NULL,NULL,NULL,NULL,NULL,NULL,'SK-Nor 2008',0);
INSERT INTO "usage" VALUES('EPSG','14215','grid_transformation','EPSG','9484','EPSG','1352','EPSG','1133');
INSERT INTO "grid_transformation" VALUES('EPSG','9485','ETRS89 to NN2000 height (1)','','EPSG','9665','Geographic3D to GravityRelatedHeight (gtx)','EPSG','4937','EPSG','5941',0.02,'EPSG','8666','Geoid (height correction) model file','HREF2018B_NN2000_EUREF89.gtx',NULL,NULL,NULL,NULL,NULL,NULL,'SK-Nor 2018',0);
INSERT INTO "usage" VALUES('EPSG','14216','grid_transformation','EPSG','9485','EPSG','1352','EPSG','1133');
INSERT INTO "grid_transformation" VALUES('EPSG','9496','MGI 1901 to SRB-ETRS89 (9)','','EPSG','9615','NTv2','EPSG','3906','EPSG','8685',0.03,'EPSG','8656','Latitude and longitude difference file','MGI1901_TO_SRBETRS89_NTv2.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'RGZ-Srb 0.1m 2020',0);
INSERT INTO "usage" VALUES('EPSG','14226','grid_transformation','EPSG','9496','EPSG','4543','EPSG','1185');
INSERT INTO "grid_transformation" VALUES('EPSG','9550','NAD83 to NAD83(CSRS)v6 (10)','File NLCSRSV4A.GSB corrects error in file header record previously released as NLCSRSV4.GSB. No change to gridded data.','EPSG','9615','NTv2','EPSG','4269','EPSG','8252',0.1,'EPSG','8656','Latitude and longitude difference file','NLCSRSV4A.GSB ',NULL,NULL,NULL,NULL,NULL,NULL,'CGS-Can Nfl island',0);
INSERT INTO "usage" VALUES('EPSG','14831','grid_transformation','EPSG','9550','EPSG','4612','EPSG','1026');
INSERT INTO "grid_transformation" VALUES('EPSG','9553','Cascais height to EVRF2019 height (2)','Determined at 18 points, SD 0.014m. Offset: mean -0.275m, minimum -0.322m, maximum -0.262m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5780','EPSG','9389',0.028,'EPSG','8732','Vertical offset file','pt_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Prt 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14842','grid_transformation','EPSG','9553','EPSG','1294','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9554','Cascais height to EVRF2019 mean-tide height (2)','Determined at 18 points, SD 0.012m. Offset: mean -0.340m, minimum -0.383m, maximum -0.324m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5780','EPSG','9390',0.024,'EPSG','8732','Vertical offset file','pt_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Prt 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14671','grid_transformation','EPSG','9554','EPSG','1294','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9555','DHHN2016 height to EVRF2019 height (2)','Determined at 802 points, SD 0.010m. Offset: mean 0.016m, minimum -0.004m, maximum 0.052m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','7837','EPSG','9389',0.02,'EPSG','8732','Vertical offset file','de_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Deu 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14672','grid_transformation','EPSG','9555','EPSG','3339','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9556','DHHN2016 height to EVRF2019 mean-tide height (2)','Determined at 802 points, SD 0.004m. Offset: mean 0.009m, minimum -0.011m, maximum 0.028m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','7837','EPSG','9390',0.008,'EPSG','8732','Vertical offset file','de_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Deu 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14843','grid_transformation','EPSG','9556','EPSG','3339','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9557','GHA height to EVRF2019 height (2)','Determined at 150 points, SD 0.068m. Offset: mean -0.309m, minimum -0.450m, maximum -0.210m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5778','EPSG','9389',0.136,'EPSG','8732','Vertical offset file','at_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Aut 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14673','grid_transformation','EPSG','9557','EPSG','1037','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9558','GHA height to EVRF2019 mean-tide height (2)','Determined at 150 points, SD 0.065m. Offset: mean -0.333m, minimum -0.471m, maximum -0.236m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5778','EPSG','9390',0.13,'EPSG','8732','Vertical offset file','at_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Aut 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14674','grid_transformation','EPSG','9558','EPSG','1037','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9559','LHN95 height to EVRF2019 height (2)','Determined at 553 points, SD 0.073m. Offset: mean -0.216m, minimum -0.478m, maximum -0.021m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5729','EPSG','9389',0.146,'EPSG','8732','Vertical offset file','ch_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Che 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14675','grid_transformation','EPSG','9559','EPSG','1286','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9560','LHN95 height to EVRF2019 mean-tide height (2)','Determined at 553 points, SD 0.071m. Offset: mean -0.244m, minimum -0.506m, maximum -0.012m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5729','EPSG','9390',0.142,'EPSG','8732','Vertical offset file','ch_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Che 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14676','grid_transformation','EPSG','9560','EPSG','1286','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9561','ODN height to EVRF2019 height (2)','Determined at 35 points, SD 0.012m. Offset: mean -0.178m, minimum -0.199m, maximum -0.159m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5701','EPSG','9389',0.024,'EPSG','8732','Vertical offset file','gb_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Gbr 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14677','grid_transformation','EPSG','9561','EPSG','2792','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9563','Ostend height to EVRF2019 height (2)','Determined at 39 points, SD 0.021m. Offset: mean -2.312m, minimum -2.362m, maximum -2.275m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5710','EPSG','9389',0.042,'EPSG','8732','Vertical offset file','be_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bel 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14678','grid_transformation','EPSG','9563','EPSG','1347','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9564','Ostend height to EVRF2019 mean-tide height (2)','Determined at 39 points, SD 0.020m. Offset: mean -2.320m, minimum -2.370m, maximum -2.285m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5710','EPSG','9390',0.04,'EPSG','8732','Vertical offset file','be_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bel 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14679','grid_transformation','EPSG','9564','EPSG','1347','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9565','SVS2010 height to EVRF2019 height (2)','Determined at 65 points, SD 0.003m. Offset: mean -0.259m, minimum -0.265m, maximum -0.251m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','8690','EPSG','9389',0.006,'EPSG','8732','Vertical offset file','si_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Svn 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14680','grid_transformation','EPSG','9565','EPSG','3307','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9566','SVS2010 height to EVRF2019 mean-tide height (2)','Determined at 65 points, SD 0.004m. Offset: mean -0.290m, minimum -0.295m, maximum -0.280m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','8690','EPSG','9390',0.008,'EPSG','8732','Vertical offset file','si_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Svn 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14681','grid_transformation','EPSG','9566','EPSG','3307','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9567','Trieste height to EVRF2019 height (2)','Determined at 46 points, SD 0.021m. Offset: mean -0.551m, minimum -0.606m, maximum -0.490m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5195','EPSG','9389',0.042,'EPSG','8732','Vertical offset file','mk_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Mkd 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14668','grid_transformation','EPSG','9567','EPSG','1148','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9568','Trieste height to EVRF2019 mean-tide height (2)','Determined at 46 points, SD 0.022m. Offset: mean -0.606m, minimum -0.662m, maximum -0.548m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5195','EPSG','9390',0.044,'EPSG','8732','Vertical offset file','mk_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Mkd 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14667','grid_transformation','EPSG','9568','EPSG','1148','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9569','Trieste height to EVRF2019 height (3)','Determined at 10 points, SD 0.006m. Offset: mean -0.336m, minimum -0.346m, maximum -0.326m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5195','EPSG','9389',0.012,'EPSG','8732','Vertical offset file','ba_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bih 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14666','grid_transformation','EPSG','9569','EPSG','1050','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9570','Trieste height to EVRF2019 mean-tide height (3)','Determined at 10 points, SD 0.005m. Offset: mean -0.377m, minimum -0.386m, maximum -0.368m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5195','EPSG','9390',0.01,'EPSG','8732','Vertical offset file','ba_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bih 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14665','grid_transformation','EPSG','9570','EPSG','1050','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9571','Baltic 1982 height to EVRF2019 height (1)','Determined at 58 points, SD 0.024m. Offset: mean 0.228m, minimum 0.167m, maximum 0.277m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5786','EPSG','9389',0.048,'EPSG','8732','Vertical offset file','bgalt_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bgr 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14628','grid_transformation','EPSG','9571','EPSG','3224','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9572','Baltic 1982 height to EVRF2019 mean-tide height (1)','Determined at 58 points, SD 0.021m. Offset: mean 0.180m, minimum 0.123m, maximum 0.228m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5786','EPSG','9390',0.042,'EPSG','8732','Vertical offset file','bgalt_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Bgr 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14781','grid_transformation','EPSG','9572','EPSG','3224','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9573','N2000 height to EVRF2019 height (1)','Determined at 191 points, SD 0.002m. Offset: mean 0.002m, minimum -0.005m, maximum 0.007m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','3900','EPSG','9389',0.004,'EPSG','8732','Vertical offset file','fi_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Fin 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14664','grid_transformation','EPSG','9573','EPSG','3333','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9574','N2000 height to EVRF2019 mean-tide height (1)','Determined at 191 points, SD 0.012m. Offset: mean 0.054m, minimum 0.034m, maximum 0.079m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','3900','EPSG','9390',0.024,'EPSG','8732','Vertical offset file','fi_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Fin 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14663','grid_transformation','EPSG','9574','EPSG','3333','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9575','NGF-IGN69 height to EVRF2019 height (1)','Determined at 1228 points, SD 0.054m. Offset: mean -0.539m, minimum -0.651m, maximum -0.380m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5720','EPSG','9389',0.108,'EPSG','8732','Vertical offset file','fr_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Fra 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14662','grid_transformation','EPSG','9575','EPSG','1326','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9576','NGF-IGN69 height to EVRF2019 mean-tide height (1)','Determined at 1228 points, SD 0.043m. Offset: mean -0.561m, minimum -0.658m, maximum -0.430m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5720','EPSG','9390',0.086,'EPSG','8732','Vertical offset file','fr_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Fra 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14682','grid_transformation','EPSG','9576','EPSG','1326','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9577','EOMA height 1980 to EVRF2019 height (1)','Determined at 35 points, SD 0.003m. Offset: mean 0.163m, minimum 0.156m, maximum 0.171m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5787','EPSG','9389',0.006,'EPSG','8732','Vertical offset file','hu_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Hun 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14844','grid_transformation','EPSG','9577','EPSG','1119','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9578','EOMA 1980 height to EVRF2019 mean-tide height (1)','Determined at 35 points, SD 0.005m. Offset: mean 0.138m, minimum 0.127m, maximum 0.149m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5787','EPSG','9390',0.01,'EPSG','8732','Vertical offset file','hu_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Hun 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14686','grid_transformation','EPSG','9578','EPSG','1119','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9579','Latvia 2000 height to EVRF2019 height (1)','Determined at 134 points, SD 0.003m. Offset: mean 0.009m, minimum 0.000m, maximum 0.019m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','7700','EPSG','9389',0.006,'EPSG','8732','Vertical offset file','lv_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Lva 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14687','grid_transformation','EPSG','9579','EPSG','3268','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9580','Latvia 2000 height to EVRF2019 mean-tide height (1)','Determined at 134 points, SD 0.004m. Offset: mean 0.031m, minimum 0.025m, maximum 0.045m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','7700','EPSG','9390',0.008,'EPSG','8732','Vertical offset file','lv_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Lva 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14780','grid_transformation','EPSG','9580','EPSG','3268','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9581','NAP height to EVRF2019 height (1)','Determined at 1095 points, SD 0.008m. Offset: mean 0.021m, minimum 0.009m, maximum 0.055m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5709','EPSG','9389',0.016,'EPSG','8732','Vertical offset file','nl_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Nld 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14689','grid_transformation','EPSG','9581','EPSG','1275','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9582','NAP height to EVRF2019 mean-tide height (1)','Determined at 1095 points, SD 0.006m. Offset: mean 0.021m, minimum 0.008m, maximum 0.047m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5709','EPSG','9390',0.012,'EPSG','8732','Vertical offset file','nl_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Nld 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14779','grid_transformation','EPSG','9582','EPSG','1275','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9583','Constanta height to EVRF2019 height (1)','Determined at 96 points, SD 0.006m. Offset: mean 0.050m, minimum 0.029m, maximum 0.063m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5781','EPSG','9389',0.12,'EPSG','8732','Vertical offset file','ro_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Rou 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14693','grid_transformation','EPSG','9583','EPSG','3295','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9645','Constanta height to EVRF2019 mean-tide height (1)','Determined at 96 points, SD 0.010m. Offset: mean 0.015m, minimum -0.006m, maximum 0.040m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5781','EPSG','9390',0.02,'EPSG','8732','Vertical offset file','ro_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Rou 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14692','grid_transformation','EPSG','9645','EPSG','3295','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9646','Alicante height to EVRF2019 height (1)','Determined at 155 points, SD 0.041m. Offset: mean -0.427m, minimum -0.555m, maximum -0.355m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5782','EPSG','9389',0.082,'EPSG','8732','Vertical offset file','es_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Esp 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14696','grid_transformation','EPSG','9646','EPSG','2366','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9647','Alicante height to EVRF2019 mean-tide height (1)','Determined at 155 points, SD 0.039m. Offset: mean -0.488m, minimum -0.603m, maximum -0.426m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5782','EPSG','9390',0.078,'EPSG','8732','Vertical offset file','es_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Esp 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14854','grid_transformation','EPSG','9647','EPSG','2366','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9648','RH2000 height to EVRF2019 height (1)','Determined at 3356 points, SD 0.003m. Offset: mean -0.003m, minimum -0.014m, maximum 0.003m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5613','EPSG','9389',0.006,'EPSG','8732','Vertical offset file','se_2019z.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Swe 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14697','grid_transformation','EPSG','9648','EPSG','3313','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','9649','RH2000 height to EVRF2019 mean-tide height (1)','Determined at 3356 points, SD 0.016m. Offset: mean 0.036m, minimum 0.003m, maximum 0.071m.','EPSG','1085','Vertical Offset by Grid Interpolation (asc)','EPSG','5613','EPSG','9390',0.032,'EPSG','8732','Vertical offset file','se_2019m.asc',NULL,NULL,NULL,NULL,'EPSG','4258','EuG-Swe 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14778','grid_transformation','EPSG','9649','EPSG','3313','EPSG','1059');
INSERT INTO "grid_transformation" VALUES('EPSG','10000','RGF93 to NGF-IGN69 height (1)','May be used for transformations from WGS 84 to NGF-IGN69 height. Accuracy at each 0.1 deg x 0.1 degree grid node is given within the geoid model file.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4965','EPSG','5720',0.5,'EPSG','8666','Geoid (height correction) model file','ggf97a.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra',0);
INSERT INTO "usage" VALUES('EPSG','11001','grid_transformation','EPSG','10000','EPSG','1326','EPSG','1133');
INSERT INTO "grid_transformation" VALUES('EPSG','10001','ETRS89 to NGF-IGN69 height (1)','Parameter values taken from RGF93 to NGF-IGN69 height (1) (code 10000) assuming that RGF93 is equivalent to ETRS89 within the accuracy of the transformation. Accuracy at each 0.1 deg x 0.1 degree grid node is given within the geoid model file.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4937','EPSG','5720',0.5,'EPSG','8666','Geoid (height correction) model file','ggf97a.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra',0);
+1 -1
View File
@@ -157,7 +157,7 @@ INSERT INTO "grid_transformation" VALUES(
'EPSG','6667', -- source CRS (JDG2011)
'EPSG','6695', -- target CRS (JDG2011 (vertical) height)
NULL,
'EPSG','8666','Geoid (height correction) model file','jp_gsi_gsigeo2011_mainland.tif',
'EPSG','8666','Geoid (height correction) model file','jp_gsi_gsigeo2011.tif',
NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES(
+12 -8
View File
@@ -79,9 +79,9 @@ INSERT INTO "usage" VALUES('EPSG','8017','helmert_transformation','EPSG','1096',
INSERT INTO "helmert_transformation" VALUES('EPSG','1097','Dealul Piscului 1970 to WGS 84 (2)','Parameter values taken from Pulkovo 1942 to WGS 84 (9) (code 1293) assuming that Pulkovo 1942 in Romania is equivalent to Dealul Piscului 1970.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4317','EPSG','4326',7.0,28.0,-121.0,-77.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-Rom',1);
INSERT INTO "usage" VALUES('EPSG','8018','helmert_transformation','EPSG','1097','EPSG','1197','EPSG','1160');
INSERT INTO "helmert_transformation" VALUES('EPSG','1098','IGM95 to ETRS89 (1)','IGM95 is a realization of ETRS89. May be taken as approximate transformation IGM95 to WGS 84 - see code 1099.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4670','EPSG','4258',0.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,'IGM-Ita',0);
INSERT INTO "usage" VALUES('EPSG','8019','helmert_transformation','EPSG','1098','EPSG','3343','EPSG','1161');
INSERT INTO "usage" VALUES('EPSG','14407','helmert_transformation','EPSG','1098','EPSG','3343','EPSG','1161');
INSERT INTO "helmert_transformation" VALUES('EPSG','1099','IGM95 to WGS 84 (1)','Parameter values taken from IGM95 to ETRS89 (1) (code 1098) assuming that ETRS89 is coincident with WGS 84 within the accuracy of the transformation.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4670','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,'IGM-Ita',0);
INSERT INTO "usage" VALUES('EPSG','8020','helmert_transformation','EPSG','1099','EPSG','3343','EPSG','1252');
INSERT INTO "usage" VALUES('EPSG','14408','helmert_transformation','EPSG','1099','EPSG','3343','EPSG','1252');
INSERT INTO "helmert_transformation" VALUES('EPSG','1100','Adindan to WGS 84 (1)','Derived at 22 stations. Accuracy 5m in each axis.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4201','EPSG','4326',9.0,-166.0,-15.0,204.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-Eth Sud',0);
INSERT INTO "usage" VALUES('EPSG','8021','helmert_transformation','EPSG','1100','EPSG','1271','EPSG','1160');
INSERT INTO "helmert_transformation" VALUES('EPSG','1101','Adindan to WGS 84 (2)','Derived at 1 station connected to the Adindan (Blue Nile 1958) network through the 1968-69 12th parallel traverse. Accuracy 25m in each axis. Note: the Adindan (Blue Nile 1958) CRS is used in Ethiopia and Sudan, not Burkino Faso.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4201','EPSG','4326',44.0,-118.0,-14.0,218.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-Bfa',0);
@@ -416,7 +416,7 @@ INSERT INTO "usage" VALUES('EPSG','8199','helmert_transformation','EPSG','1278',
INSERT INTO "helmert_transformation" VALUES('EPSG','1279','AGD84 to GDA94 (1)','Derived at 327 stations. May be taken as approximate transformation AGD84 to WGS 84 - see code 15789. For higher accuracy use AGD84 to GDA94 (2) (code 1280). Note: AGD84 officially adopted only in Queensland, South Australia and Western Australia.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4203','EPSG','4283',5.0,-128.5,-53.0,153.4,'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,'Auslig-Aus 5m',0);
INSERT INTO "usage" VALUES('EPSG','8200','helmert_transformation','EPSG','1279','EPSG','2576','EPSG','1045');
INSERT INTO "helmert_transformation" VALUES('EPSG','1280','AGD84 to GDA94 (2)','Replaces AGD84 to WGS 84 (2) (code 1236). May be taken as approximate transformation AGD84 to WGS 84 - see code 1669. Note: although applicable nationwide, AGD84 officially adopted only in Queensland, South Australia and Western Australia.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4203','EPSG','4283',1.0,-117.763,-51.51,139.061,'EPSG','9001',-0.292,-0.443,-0.277,'EPSG','9104',-0.191,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'Auslig-Aus 1m',0);
INSERT INTO "usage" VALUES('EPSG','8201','helmert_transformation','EPSG','1280','EPSG','2576','EPSG','1041');
INSERT INTO "usage" VALUES('EPSG','14198','helmert_transformation','EPSG','1280','EPSG','2576','EPSG','1041');
INSERT INTO "helmert_transformation" VALUES('EPSG','1281','Pulkovo 1995 to WGS 84 (1)','Derived through concatenation of Pulkovo 1995 to PZ-90 (1) (tfm code 1257) and PZ-90 to WGS 84 (2) (tfm code 1244). Mandated for use in Russia by GOST R 51794-2001, but this has been superseded by GOST R 51794-2008. Replaced by tfm code 5043.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4200','EPSG','4326',1.0,24.82,-131.21,-82.66,'EPSG','9001',0.0,0.0,-0.16,'EPSG','9104',-0.12,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GOST-Rus',0);
INSERT INTO "usage" VALUES('EPSG','8202','helmert_transformation','EPSG','1281','EPSG','1198','EPSG','1041');
INSERT INTO "helmert_transformation" VALUES('EPSG','1282','Samboja to WGS 84 (1)','Datum shift derived through ITRF93.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4125','EPSG','4326',NULL,-404.78,685.68,45.47,'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,'TOT-Idn Mah',1);
@@ -2036,8 +2036,8 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','8270','Saint Pierre et Mique
INSERT INTO "usage" VALUES('EPSG','10463','helmert_transformation','EPSG','8270','EPSG','3299','EPSG','1041');
INSERT INTO "helmert_transformation" VALUES('EPSG','8365','ETRS89 to S-JTSK [JTSK03] (1)','Derived at 684 points with known S-JTSK and ETRS89 (ETRF2000 realization) coordinates. Scale parameter was constrained to be zero. UGKK consider this transformation to not be reversible at the 1mm accuracy level: for reverse see transformation code 8367.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4258','EPSG','8351',0.001,-485.014055,-169.473618,-483.842943,'EPSG','9001',7.78625453,4.39770887,4.10248899,'EPSG','9104',0.0,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'UGKK-Svk',0);
INSERT INTO "usage" VALUES('EPSG','10512','helmert_transformation','EPSG','8365','EPSG','1211','EPSG','1115');
INSERT INTO "helmert_transformation" VALUES('EPSG','8366','ITRF2014 to ETRF2014 (1)','Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m. See ITRF2014 to ETRF2014 (2) (code 8407) for an exactly equivalent transformation but with the transformation''s parameter values at epoch 2010.00.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','7789','EPSG','8401',0.0,0.0,0.0,0.0,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',0.0,0.0,0.0,'EPSG','1027',0.085,0.531,-0.77,'EPSG','1032',0.0,'EPSG','1030',1989.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'EUREF-Eur',0);
INSERT INTO "usage" VALUES('EPSG','10513','helmert_transformation','EPSG','8366','EPSG','1298','EPSG','1129');
INSERT INTO "helmert_transformation" VALUES('EPSG','8366','ITRF2014 to ETRF2014 (1)','Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m. See ITRF2014 to ETRF2014 (2) (code 8880) for an exactly equivalent transformation but with the transformation''s parameter values at epoch 2010.00.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','7789','EPSG','8401',0.0,0.0,0.0,0.0,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',0.0,0.0,0.0,'EPSG','1027',0.085,0.531,-0.77,'EPSG','1032',0.0,'EPSG','1030',1989.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'EUREF-Eur',0);
INSERT INTO "usage" VALUES('EPSG','14203','helmert_transformation','EPSG','8366','EPSG','1298','EPSG','1129');
INSERT INTO "helmert_transformation" VALUES('EPSG','8367','S-JTSK [JTSK03] to ETRS89 (1)','Derived at 684 points. At the 1mm accuracy level this transformation is not reversible: for reverse see transformation code 8365. May be taken as approximate transformation to WGS 84 - see code 8368.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','8351','EPSG','4258',0.001,485.021,169.465,483.839,'EPSG','9001',-7.786342,-4.397554,-4.102655,'EPSG','9104',0.0,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'UGKK-Svk',0);
INSERT INTO "usage" VALUES('EPSG','10514','helmert_transformation','EPSG','8367','EPSG','1211','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','8368','S-JTSK [JTSK03] to WGS 84 (1)','Parameter values taken from S-JTSK [JTSK03] to ETRS89 (1) (code 8367) assuming that ETRS89 (ETRF2000 realization) is coincident with WGS 84 within the accuracy of the transformation. Within the 1m accuracy of this transformation, it is reversible.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','8351','EPSG','4326',1.0,485.021,169.465,483.839,'EPSG','9001',-7.786342,-4.397554,-4.102655,'EPSG','9104',0.0,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'UGKK-Svk',0);
@@ -2172,8 +2172,8 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','8878','ITRF90 to ETRF2014 (1
INSERT INTO "usage" VALUES('EPSG','10820','helmert_transformation','EPSG','8878','EPSG','1298','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','8879','ITRF89 to ETRF2014 (1)','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','4911','EPSG','8401',0.0,-30.4,-35.5,130.8,'EPSG','1025',1.785,11.151,-16.43,'EPSG','1031',-8.19,'EPSG','1028',-0.1,0.5,3.3,'EPSG','1027',0.085,0.531,-0.79,'EPSG','1032',-0.12,'EPSG','1030',2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'EUREF-Eur 2014',0);
INSERT INTO "usage" VALUES('EPSG','10821','helmert_transformation','EPSG','8879','EPSG','1298','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','8880','ITRF2014 to ETRF2014 (2)','Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9. See ITRF2014 to ETRF2014 (1) (code 8366) for transformation which defines ETRF2014. Transformation 8407 is equivalent to 8366 but with parameter values at epoch 2010.00.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','7789','EPSG','8401',0.0,0.0,0.0,0.0,'EPSG','1025',1.785,11.151,-16.17,'EPSG','1031',0.0,'EPSG','1028',0.0,0.0,0.0,'EPSG','1027',0.085,0.531,-0.77,'EPSG','1032',0.0,'EPSG','1030',2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'EUREF-Eur 2014',0);
INSERT INTO "usage" VALUES('EPSG','10822','helmert_transformation','EPSG','8880','EPSG','1298','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','8880','ITRF2014 to ETRF2014 (2)','Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9. See ITRF2014 to ETRF2014 (1) (code 8366) for transformation which defines ETRF2014. Transformation 8880 is equivalent to 8366 but with parameter values at epoch 2010.00.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','7789','EPSG','8401',0.0,0.0,0.0,0.0,'EPSG','1025',1.785,11.151,-16.17,'EPSG','1031',0.0,'EPSG','1028',0.0,0.0,0.0,'EPSG','1027',0.085,0.531,-0.77,'EPSG','1032',0.0,'EPSG','1030',2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'EUREF-Eur 2014',0);
INSERT INTO "usage" VALUES('EPSG','14204','helmert_transformation','EPSG','8880','EPSG','1298','EPSG','1027');
INSERT INTO "helmert_transformation" VALUES('EPSG','8882','Camacupa 2015 to WGS 84 (11)','Used by CIDDEMA for delimitation of Angola''s EEZ boundary. Derived by Univ. of Lisbon using 38 REPANGOL points. Average horizontal error 1m, vertical 3m; max radial error 6m. Application offshore differs from Camacupa 1948 to WGS 84 by approx 25m.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','8694','EPSG','4326',3.0,-93.799,-132.737,-219.073,'EPSG','9001',1.844,-0.648,6.37,'EPSG','9104',-0.169,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'CIDDEMA-Ago',0);
INSERT INTO "usage" VALUES('EPSG','10823','helmert_transformation','EPSG','8882','EPSG','1029','EPSG','1053');
INSERT INTO "helmert_transformation" VALUES('EPSG','8883','Camacupa 1948 to RSAO13 (1)','Parameter values taken from Camacupa 1948 to WGS 84 (7) (code 1324) assuming that RSAO13 is coincident with WGS 84 within the accuracy of the transformation.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4220','EPSG','8699',3.0,-48.0,-345.0,-231.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,'ELF-Ago B15',0);
@@ -2406,6 +2406,10 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','9460','ITRF2014 to ATRF2014
INSERT INTO "usage" VALUES('EPSG','14140','helmert_transformation','EPSG','9460','EPSG','4177','EPSG','1268');
INSERT INTO "helmert_transformation" VALUES('EPSG','9472','DGN95 to SRGI2013 (1)','Derived at 533 stations. Mean residual 0.218m. Note: information source gives rotations given in radians.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4755','EPSG','9470',0.2,-0.2773,0.0534,0.4819,'EPSG','9001',0.0935,-0.0286,0.00969,'EPSG','9109',-0.028,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'SRGI-Idn',0);
INSERT INTO "usage" VALUES('EPSG','14154','helmert_transformation','EPSG','9472','EPSG','1122','EPSG','1026');
INSERT INTO "helmert_transformation" VALUES('EPSG','9486','MGI 1901 to WGS 84 (15)','Parameter values from MGI 1901 to ETRS89 (8) (code 9495). Assumes SRB-ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','3906','EPSG','4326',1.0,577.84843,165.45019,390.43652,'EPSG','9001',-4.93131,0.96052,13.05072,'EPSG','9104',7.86546,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IOGP-Srb 2020',0);
INSERT INTO "usage" VALUES('EPSG','14220','helmert_transformation','EPSG','9486','EPSG','4543','EPSG','1041');
INSERT INTO "helmert_transformation" VALUES('EPSG','9495','MGI 1901 to SRB-ETRS89 (8)','','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','3906','EPSG','8685',0.46,577.84843,165.45019,390.43652,'EPSG','9001',-4.93131,0.96052,13.05072,'EPSG','9104',7.86546,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'RGZ-Srb 0.5m 2020',0);
INSERT INTO "usage" VALUES('EPSG','14227','helmert_transformation','EPSG','9495','EPSG','4543','EPSG','1153');
INSERT INTO "helmert_transformation" VALUES('EPSG','10085','Trinidad 1903 to WGS 84 (2)','Parameter values provided to EOG by Trinidad Ministry of Energy and Energy Industries. Used by EOG offshore Trinidad (including Pelican, Kiskadee and Ibis fields) since 1996.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4302','EPSG','4326',3.0,-61.0,285.2,471.6,'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,'EOG-Tto Trin',0);
INSERT INTO "usage" VALUES('EPSG','11086','helmert_transformation','EPSG','10085','EPSG','1339','EPSG','1136');
INSERT INTO "helmert_transformation" VALUES('EPSG','10086','JAD69 to WGS 72 (1)','Derived in 1977 through Transit observations at 2 stations by US DMA.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4242','EPSG','4322',15.0,48.0,208.0,382.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,'SD-Jam',0);
@@ -2896,7 +2900,7 @@ INSERT INTO "usage" VALUES('EPSG','11987','helmert_transformation','EPSG','15977
INSERT INTO "helmert_transformation" VALUES('EPSG','15978','NAD27 to WGS 84 (88)','','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4267','EPSG','4326',1.0,2.478,149.752,197.726,'EPSG','9001',-0.526,-0.498,0.501,'EPSG','9104',0.685,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ONHG-Cub',0);
INSERT INTO "usage" VALUES('EPSG','11988','helmert_transformation','EPSG','15978','EPSG','1077','EPSG','1041');
INSERT INTO "helmert_transformation" VALUES('EPSG','15979','AGD66 to GDA94 (12)','Use only offshore: onshore, tfms 1458 (ACT), 1594 (Tas), 1460 (NSW and Vic) and 1595 (NT) are more accurate.May be used as a tfm to WGS 84 - see code 15980.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4202','EPSG','4283',3.0,-117.808,-51.536,137.784,'EPSG','9001',-0.303,-0.446,-0.234,'EPSG','9104',-0.29,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ICSM-Aus off',0);
INSERT INTO "usage" VALUES('EPSG','11989','helmert_transformation','EPSG','15979','EPSG','3559','EPSG','1043');
INSERT INTO "usage" VALUES('EPSG','14200','helmert_transformation','EPSG','15979','EPSG','3559','EPSG','1043');
INSERT INTO "helmert_transformation" VALUES('EPSG','15980','AGD66 to WGS 84 (18)','Parameter values from AGD66 to GDA94 (12) (code 15979). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation. Use only offshore: onshore tfms 1665-68 for ACT, NSW/Vic, Tas and NT respectively are more accurate.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4202','EPSG','4326',3.0,-117.808,-51.536,137.784,'EPSG','9001',-0.303,-0.446,-0.234,'EPSG','9104',-0.29,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-Aus off',0);
INSERT INTO "usage" VALUES('EPSG','11990','helmert_transformation','EPSG','15980','EPSG','3559','EPSG','1043');
INSERT INTO "helmert_transformation" VALUES('EPSG','15981','MGI to Slovenia 1996 (1)','Info source also gives a separate reverse tfm with slightly different parameter values. Given the tfm accuracy these differences are not significant and this tfm can be considered reversible. May be taken as approximate tfm MGI to WGS 84 (see code 15982)','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4312','EPSG','4765',1.0,409.545,72.164,486.872,'EPSG','9001',-3.085957,-5.46911,11.020289,'EPSG','9104',17.919665,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GuRS-Svn',1);
+13 -2
View File
@@ -1,2 +1,13 @@
INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.003');
INSERT INTO "metadata" VALUES('EPSG.DATE', '2020-10-05');
-- Version of the database structure.
-- The major number indicates an incompatible change (e.g. table or column
-- removed or renamed).
-- The minor number is incremented if a backward compatible change done, that
-- is the new database can still work with an older PROJ version.
-- When updating those numbers, the DATABASE_LAYOUT_VERSION_MAJOR and
-- DATABASE_LAYOUT_VERSION_MINOR constants in src/iso19111/factory.cpp must be
-- updated as well.
INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MAJOR', 1);
INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MINOR', 0);
INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.008');
INSERT INTO "metadata" VALUES('EPSG.DATE', '2020-12-16');
+2174
View File
File diff suppressed because it is too large Load Diff
+9 -3
View File
@@ -438,12 +438,18 @@ INSERT INTO "other_transformation" VALUES('EPSG','8359','Baltic 1957 height to B
INSERT INTO "usage" VALUES('EPSG','10507','other_transformation','EPSG','8359','EPSG','1306','EPSG','1111');
INSERT INTO "other_transformation" VALUES('EPSG','9371','Vienna height to GHA height (1)','Defines Wiener Null surface. GHA vertical reference surface is 156.68m below Wiener Null surface.','EPSG','9616','Vertical Offset','EPSG','8881','EPSG','5778',0.0,'EPSG','8603','Vertical Offset',156.68,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'BEV-Aut Wien',0);
INSERT INTO "usage" VALUES('EPSG','13986','other_transformation','EPSG','9371','EPSG','4585','EPSG','1059');
INSERT INTO "other_transformation" VALUES('EPSG','9446','ODN height to EVRF2019 mean-tide height (1)','Determined at Channel Tunnel portal.','EPSG','9616','Vertical Offset','EPSG','5701','EPSG','9390',0.02,'EPSG','8603','Vertical Offset',-0.173,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EuG-Gbr 2019m',0);
INSERT INTO "other_transformation" VALUES('EPSG','9446','ODN height to EVRF2019 mean-tide height (1)','Determined at Channel Tunnel portal.','EPSG','9616','Vertical Offset','EPSG','5701','EPSG','9390',0.02,'EPSG','8603','Vertical Offset',-0.173,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EuG-Gbr 2019m',1);
INSERT INTO "usage" VALUES('EPSG','14104','other_transformation','EPSG','9446','EPSG','2792','EPSG','1059');
INSERT INTO "other_transformation" VALUES('EPSG','9447','Antalya height to EVRF2019 mean-tide height (1)','Determined at two points. No accuracy figure available. Applicable for points up to a maximum height of about 1000 m.','EPSG','9616','Vertical Offset','EPSG','5775','EPSG','9390',0.02,'EPSG','8603','Vertical Offset',-0.446,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EuG-Tur 2019m',0);
INSERT INTO "other_transformation" VALUES('EPSG','9447','Antalya height to EVRF2019 mean-tide height (1)','Determined at two points. No accuracy figure available. Applicable for points up to a maximum height of about 1000 m.','EPSG','9616','Vertical Offset','EPSG','5775','EPSG','9390',0.02,'EPSG','8603','Vertical Offset',-0.446,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EuG-Tur 2019m',1);
INSERT INTO "usage" VALUES('EPSG','14105','other_transformation','EPSG','9447','EPSG','3322','EPSG','1059');
INSERT INTO "other_transformation" VALUES('EPSG','9448','Antalya height to EVRF2019 height (1)','Determined at two points. No accuracy figure available. Applicable for points up to a maximum height of about 1000 m.','EPSG','9616','Vertical Offset','EPSG','5775','EPSG','9389',0.02,'EPSG','8603','Vertical Offset',-0.392,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EuG-Tur 2019z',0);
INSERT INTO "other_transformation" VALUES('EPSG','9448','Antalya height to EVRF2019 height (1)','Determined at two points. No accuracy figure available. Applicable for points up to a maximum height of about 1000 m.','EPSG','9616','Vertical Offset','EPSG','5775','EPSG','9389',0.02,'EPSG','8603','Vertical Offset',-0.392,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EuG-Tur 2019z',1);
INSERT INTO "usage" VALUES('EPSG','14106','other_transformation','EPSG','9448','EPSG','3322','EPSG','1059');
INSERT INTO "other_transformation" VALUES('EPSG','9551','Antalya height to EVRF2019 height (2)','Determined at two points. No accuracy figure available. Applicable for points up to a maximum height of about 1000 m.','EPSG','9616','Vertical Offset','EPSG','5775','EPSG','9389',0.02,'EPSG','8603','Vertical Offset',-0.394,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EuG-Tur 2019z 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14651','other_transformation','EPSG','9551','EPSG','3322','EPSG','1059');
INSERT INTO "other_transformation" VALUES('EPSG','9552','Antalya height to EVRF2019 mean-tide height (2)','Determined at two points. No accuracy figure available. Applicable for points up to a maximum height of about 1000 m.','EPSG','9616','Vertical Offset','EPSG','5775','EPSG','9390',0.02,'EPSG','8603','Vertical Offset',-0.448,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EuG-Tur 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14650','other_transformation','EPSG','9552','EPSG','3322','EPSG','1059');
INSERT INTO "other_transformation" VALUES('EPSG','9562','ODN height to EVRF2019 mean-tide height (2)','Determined at Channel Tunnel portal.','EPSG','9616','Vertical Offset','EPSG','5701','EPSG','9390',0.02,'EPSG','8603','Vertical Offset',-0.17,'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,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EuG-Gbr 2019m 2020-09',0);
INSERT INTO "usage" VALUES('EPSG','14640','other_transformation','EPSG','9562','EPSG','2792','EPSG','1059');
INSERT INTO "other_transformation" VALUES('EPSG','10087','Jamaica 1875 / Jamaica (Old Grid) to JAD69 / Jamaica National Grid (1)','Derived by least squares fit at primary triangulation stations. Accuracy will be less outside of this network due to extrapolation.','EPSG','9624','Affine parametric transformation','EPSG','24100','EPSG','24200',1.5,'EPSG','8623','A0',82357.457,'EPSG','9001','EPSG','8624','A1',0.304794369,'EPSG','9203','EPSG','8625','A2',1.5417425e-05,'EPSG','9203','EPSG','8639','B0',28091.324,'EPSG','9001','EPSG','8640','B1',-1.5417425e-05,'EPSG','9203','EPSG','8641','B2',0.304794369,'EPSG','9203',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'SD-Jam',0);
INSERT INTO "usage" VALUES('EPSG','11088','other_transformation','EPSG','10087','EPSG','3342','EPSG','1153');
INSERT INTO "other_transformation" VALUES('EPSG','10088','JAD69 / Jamaica National Grid to Jamaica 1875 / Jamaica (Old Grid) (1)','Derived by least squares fit at primary triangulation stations. Accuracy will be less outside of this network due to extrapolation.','EPSG','9624','Affine parametric transformation','EPSG','24200','EPSG','24100',1.5,'EPSG','8623','A0',-270201.96,'EPSG','9005','EPSG','8624','A1',0.00016595792,'EPSG','9203','EPSG','8625','A2',3.2809005,'EPSG','9203','EPSG','8639','B0',-92178.51,'EPSG','9005','EPSG','8640','B1',3.2809005,'EPSG','9203','EPSG','8641','B2',-0.00016595792,'EPSG','9203',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'SD-Jam',1);
+2 -2
View File
@@ -1460,9 +1460,9 @@ CREATE VIEW object_view AS
UNION ALL
SELECT 'prime_meridian', auth_name, code, name, NULL, deprecated FROM prime_meridian
UNION ALL
SELECT 'geodetic_datum', auth_name, code, name, CASE WHEN ensemble_accuracy IS NOT NULL THEN "ensemble" ELSE "datum" END, deprecated FROM geodetic_datum
SELECT 'geodetic_datum', auth_name, code, name, CASE WHEN ensemble_accuracy IS NOT NULL THEN 'ensemble' ELSE 'datum' END, deprecated FROM geodetic_datum
UNION ALL
SELECT 'vertical_datum', auth_name, code, name, CASE WHEN ensemble_accuracy IS NOT NULL THEN "ensemble" ELSE "datum" END, deprecated FROM vertical_datum
SELECT 'vertical_datum', auth_name, code, name, CASE WHEN ensemble_accuracy IS NOT NULL THEN 'ensemble' ELSE 'datum' END, deprecated FROM vertical_datum
UNION ALL
SELECT 'axis', auth_name, code, name, NULL, 0 as deprecated FROM axis
UNION ALL
+14 -8
View File
@@ -2114,9 +2114,9 @@ INSERT INTO "usage" VALUES('EPSG','2080','projected_crs','EPSG','3062','EPSG','1
INSERT INTO "projected_crs" VALUES('EPSG','3063','Azores Central 1995 / UTM zone 26N',NULL,'EPSG','4400','EPSG','4665','EPSG','16026',NULL,0);
INSERT INTO "usage" VALUES('EPSG','2081','projected_crs','EPSG','3063','EPSG','1301','EPSG','1153');
INSERT INTO "projected_crs" VALUES('EPSG','3064','IGM95 / UTM zone 32N',NULL,'EPSG','4400','EPSG','4670','EPSG','16032',NULL,0);
INSERT INTO "usage" VALUES('EPSG','2082','projected_crs','EPSG','3064','EPSG','1718','EPSG','1027');
INSERT INTO "usage" VALUES('EPSG','14405','projected_crs','EPSG','3064','EPSG','1718','EPSG','1027');
INSERT INTO "projected_crs" VALUES('EPSG','3065','IGM95 / UTM zone 33N',NULL,'EPSG','4400','EPSG','4670','EPSG','16033',NULL,0);
INSERT INTO "usage" VALUES('EPSG','2083','projected_crs','EPSG','3065','EPSG','1719','EPSG','1027');
INSERT INTO "usage" VALUES('EPSG','14406','projected_crs','EPSG','3065','EPSG','1719','EPSG','1027');
INSERT INTO "projected_crs" VALUES('EPSG','3066','ED50 / Jordan TM',NULL,'EPSG','4400','EPSG','4230','EPSG','19995',NULL,0);
INSERT INTO "usage" VALUES('EPSG','2084','projected_crs','EPSG','3066','EPSG','1130','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','3067','ETRS89 / TM35FIN(E,N)',NULL,'EPSG','4400','EPSG','4258','EPSG','16065',NULL,0);
@@ -5685,11 +5685,11 @@ INSERT INTO "usage" VALUES('EPSG','4911','projected_crs','EPSG','6692','EPSG','3
INSERT INTO "projected_crs" VALUES('EPSG','6703','WGS 84 / TM 60 SW',NULL,'EPSG','4400','EPSG','4326','EPSG','6702',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4918','projected_crs','EPSG','6703','EPSG','4172','EPSG','1136');
INSERT INTO "projected_crs" VALUES('EPSG','6707','RDN2008 / UTM zone 32N (N-E)',NULL,'EPSG','4500','EPSG','6706','EPSG','16032',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4922','projected_crs','EPSG','6707','EPSG','1718','EPSG','1142');
INSERT INTO "usage" VALUES('EPSG','14415','projected_crs','EPSG','6707','EPSG','1718','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','6708','RDN2008 / UTM zone 33N (N-E)',NULL,'EPSG','4500','EPSG','6706','EPSG','16033',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4923','projected_crs','EPSG','6708','EPSG','4186','EPSG','1142');
INSERT INTO "usage" VALUES('EPSG','14414','projected_crs','EPSG','6708','EPSG','4186','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','6709','RDN2008 / UTM zone 34N (N-E)',NULL,'EPSG','4500','EPSG','6706','EPSG','16034',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4924','projected_crs','EPSG','6709','EPSG','4187','EPSG','1142');
INSERT INTO "usage" VALUES('EPSG','14416','projected_crs','EPSG','6709','EPSG','4187','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','6720','WGS 84 / CIG92',NULL,'EPSG','4400','EPSG','4326','EPSG','6716',NULL,0);
INSERT INTO "usage" VALUES('EPSG','4926','projected_crs','EPSG','6720','EPSG','4169','EPSG','1029');
INSERT INTO "projected_crs" VALUES('EPSG','6721','GDA94 / CIG94',NULL,'EPSG','4400','EPSG','4283','EPSG','6717',NULL,0);
@@ -5879,9 +5879,9 @@ INSERT INTO "usage" VALUES('EPSG','5021','projected_crs','EPSG','6868','EPSG','1
INSERT INTO "projected_crs" VALUES('EPSG','6870','ETRS89 / Albania TM 2010',NULL,'EPSG','4530','EPSG','4258','EPSG','6869',NULL,0);
INSERT INTO "usage" VALUES('EPSG','5022','projected_crs','EPSG','6870','EPSG','3212','EPSG','1092');
INSERT INTO "projected_crs" VALUES('EPSG','6875','RDN2008 / Italy zone (N-E)',NULL,'EPSG','4500','EPSG','6706','EPSG','6877',NULL,0);
INSERT INTO "usage" VALUES('EPSG','5024','projected_crs','EPSG','6875','EPSG','1127','EPSG','1241');
INSERT INTO "usage" VALUES('EPSG','14417','projected_crs','EPSG','6875','EPSG','1127','EPSG','1241');
INSERT INTO "projected_crs" VALUES('EPSG','6876','RDN2008 / Zone 12 (N-E)',NULL,'EPSG','4500','EPSG','6706','EPSG','6878',NULL,0);
INSERT INTO "usage" VALUES('EPSG','5025','projected_crs','EPSG','6876','EPSG','1127','EPSG','1142');
INSERT INTO "usage" VALUES('EPSG','14418','projected_crs','EPSG','6876','EPSG','1127','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','6879','NAD83(2011) / Wisconsin Central',NULL,'EPSG','4499','EPSG','6318','EPSG','14832',NULL,0);
INSERT INTO "usage" VALUES('EPSG','5026','projected_crs','EPSG','6879','EPSG','2266','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','6880','NAD83(2011) / Nebraska (ftUS)',NULL,'EPSG','4497','EPSG','6318','EPSG','15396',NULL,0);
@@ -7302,6 +7302,10 @@ INSERT INTO "projected_crs" VALUES('EPSG','9493','SRGI2013 / UTM zone 53S',NULL,
INSERT INTO "usage" VALUES('EPSG','14171','projected_crs','EPSG','9493','EPSG','1662','EPSG','1266');
INSERT INTO "projected_crs" VALUES('EPSG','9494','SRGI2013 / UTM zone 54S',NULL,'EPSG','4400','EPSG','9470','EPSG','16154',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14172','projected_crs','EPSG','9494','EPSG','1663','EPSG','1266');
INSERT INTO "projected_crs" VALUES('EPSG','9498','POSGAR 2007 / CABA 2019',NULL,'EPSG','4530','EPSG','5340','EPSG','9497',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14513','projected_crs','EPSG','9498','EPSG','4610','EPSG','1056');
INSERT INTO "projected_crs" VALUES('EPSG','9674','NAD83 / USFS R6 Albers',NULL,'EPSG','4400','EPSG','4269','EPSG','9673',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14787','projected_crs','EPSG','9674','EPSG','2381','EPSG','1165');
INSERT INTO "projected_crs" VALUES('EPSG','20004','Pulkovo 1995 / Gauss-Kruger zone 4',NULL,'EPSG','4530','EPSG','4200','EPSG','16204',NULL,0);
INSERT INTO "usage" VALUES('EPSG','6177','projected_crs','EPSG','20004','EPSG','1763','EPSG','1211');
INSERT INTO "projected_crs" VALUES('EPSG','20005','Pulkovo 1995 / Gauss-Kruger zone 5',NULL,'EPSG','4530','EPSG','4200','EPSG','16205',NULL,0);
@@ -8923,7 +8927,9 @@ INSERT INTO "usage" VALUES('EPSG','6985','projected_crs','EPSG','29871','EPSG','
INSERT INTO "projected_crs" VALUES('EPSG','29872','Timbalai 1948 / RSO Borneo (ftSe)',NULL,'EPSG','4405','EPSG','4298','EPSG','19957',NULL,0);
INSERT INTO "usage" VALUES('EPSG','6986','projected_crs','EPSG','29872','EPSG','3977','EPSG','1136');
INSERT INTO "projected_crs" VALUES('EPSG','29873','Timbalai 1948 / RSO Borneo (m)',NULL,'EPSG','4400','EPSG','4298','EPSG','19958',NULL,0);
INSERT INTO "usage" VALUES('EPSG','6987','projected_crs','EPSG','29873','EPSG','1362','EPSG','1149');
INSERT INTO "usage" VALUES('EPSG','14397','projected_crs','EPSG','29873','EPSG','1362','EPSG','1149');
INSERT INTO "projected_crs" VALUES('EPSG','29874','Timbalai 1948 / RSO Sarawak LSD (m)',NULL,'EPSG','4400','EPSG','4298','EPSG','19838',NULL,0);
INSERT INTO "usage" VALUES('EPSG','14400','projected_crs','EPSG','29874','EPSG','4611','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','29900','TM65 / Irish National Grid',NULL,'EPSG','4400','EPSG','4299','EPSG','19908',NULL,1);
INSERT INTO "usage" VALUES('EPSG','6988','projected_crs','EPSG','29900','EPSG','1305','EPSG','1142');
INSERT INTO "projected_crs" VALUES('EPSG','29901','OSNI 1952 / Irish National Grid',NULL,'EPSG','4400','EPSG','4188','EPSG','19973',NULL,0);
+2
View File
@@ -107,6 +107,7 @@ INSERT INTO "scope" VALUES('EPSG','1127','Geodesy. Defines ETRF2000.',0);
INSERT INTO "scope" VALUES('EPSG','1128','Geodesy. Defines ETRF2005.',0);
INSERT INTO "scope" VALUES('EPSG','1129','Geodesy. Defines ETRF2014.',0);
INSERT INTO "scope" VALUES('EPSG','1130','EEZ delimitation.',0);
INSERT INTO "scope" VALUES('EPSG','1131','Change of coordinate epoch for points referenced to NAD83(CSRS)v7.',0);
INSERT INTO "scope" VALUES('EPSG','1132','Derivation of approximate gravity-related heights from GNSS observations.',0);
INSERT INTO "scope" VALUES('EPSG','1133','Derivation of gravity-related heights from GNSS observations.',0);
INSERT INTO "scope" VALUES('EPSG','1134','Description of the use or purpose of the CRS.',0);
@@ -245,3 +246,4 @@ INSERT INTO "scope" VALUES('EPSG','1266','Engineering survey, topographic mappin
INSERT INTO "scope" VALUES('EPSG','1267','Location-based services, Intelligent Transport Services, navigation, positioning.',0);
INSERT INTO "scope" VALUES('EPSG','1268','Geodesy, location based services, intelligent transport services.',0);
INSERT INTO "scope" VALUES('EPSG','1269','Intermediate CRS in transformation to and from projected CRS.',0);
INSERT INTO "scope" VALUES('EPSG','1273','Transformation of coordinates at 0.03m level of accuracy.',0);
+2
View File
@@ -246,3 +246,5 @@ INSERT INTO "supersession" VALUES('grid_transformation','EPSG','9168','grid_tran
INSERT INTO "supersession" VALUES('grid_transformation','EPSG','9169','grid_transformation','EPSG','9174','EPSG',0);
INSERT INTO "supersession" VALUES('grid_transformation','EPSG','15932','grid_transformation','EPSG','9409','EPSG',1);
INSERT INTO "supersession" VALUES('grid_transformation','EPSG','15932','grid_transformation','EPSG','9408','EPSG',1);
INSERT INTO "supersession" VALUES('helmert_transformation','EPSG','7675','helmert_transformation','EPSG','9495','EPSG',0);
INSERT INTO "supersession" VALUES('helmert_transformation','EPSG','7676','helmert_transformation','EPSG','9486','EPSG',1);
+6 -4
View File
@@ -85,7 +85,7 @@ INSERT INTO "usage" VALUES('EPSG','4152','vertical_crs','EPSG','5709','EPSG','11
INSERT INTO "vertical_crs" VALUES('EPSG','5710','Ostend height',NULL,'EPSG','6499','EPSG','5110',0);
INSERT INTO "usage" VALUES('EPSG','4153','vertical_crs','EPSG','5710','EPSG','1347','EPSG','1179');
INSERT INTO "vertical_crs" VALUES('EPSG','5711','AHD height',NULL,'EPSG','6499','EPSG','5111',0);
INSERT INTO "usage" VALUES('EPSG','4154','vertical_crs','EPSG','5711','EPSG','4493','EPSG','1263');
INSERT INTO "usage" VALUES('EPSG','14230','vertical_crs','EPSG','5711','EPSG','4493','EPSG','1263');
INSERT INTO "vertical_crs" VALUES('EPSG','5712','AHD (Tasmania) height',NULL,'EPSG','6499','EPSG','5112',0);
INSERT INTO "usage" VALUES('EPSG','4155','vertical_crs','EPSG','5712','EPSG','2947','EPSG','1179');
INSERT INTO "vertical_crs" VALUES('EPSG','5713','CGVD28 height',NULL,'EPSG','6499','EPSG','5114',0);
@@ -453,9 +453,9 @@ INSERT INTO "usage" VALUES('EPSG','13922','vertical_crs','EPSG','9335','EPSG','3
INSERT INTO "vertical_crs" VALUES('EPSG','9351','NGNC08 height',NULL,'EPSG','6499','EPSG','1255',0);
INSERT INTO "usage" VALUES('EPSG','13977','vertical_crs','EPSG','9351','EPSG','3430','EPSG','1026');
INSERT INTO "vertical_crs" VALUES('EPSG','9389','EVRF2019 height',NULL,'EPSG','6499','EPSG','1274',0);
INSERT INTO "usage" VALUES('EPSG','14080','vertical_crs','EPSG','9389','EPSG','4608','EPSG','1261');
INSERT INTO "usage" VALUES('EPSG','14658','vertical_crs','EPSG','9389','EPSG','4608','EPSG','1261');
INSERT INTO "vertical_crs" VALUES('EPSG','9390','EVRF2019 mean-tide height',NULL,'EPSG','6499','EPSG','1287',0);
INSERT INTO "usage" VALUES('EPSG','14081','vertical_crs','EPSG','9390','EPSG','4608','EPSG','1262');
INSERT INTO "usage" VALUES('EPSG','14659','vertical_crs','EPSG','9390','EPSG','4608','EPSG','1262');
INSERT INTO "vertical_crs" VALUES('EPSG','9392','Mallorca height',NULL,'EPSG','6499','EPSG','1275',0);
INSERT INTO "usage" VALUES('EPSG','14031','vertical_crs','EPSG','9392','EPSG','4602','EPSG','1178');
INSERT INTO "vertical_crs" VALUES('EPSG','9393','Menorca height',NULL,'EPSG','6499','EPSG','1276',0);
@@ -481,6 +481,8 @@ INSERT INTO "usage" VALUES('EPSG','14041','vertical_crs','EPSG','9402','EPSG','4
INSERT INTO "vertical_crs" VALUES('EPSG','9451','BI height',NULL,'EPSG','6499','EPSG','1288',0);
INSERT INTO "usage" VALUES('EPSG','14087','vertical_crs','EPSG','9451','EPSG','4606','EPSG','1026');
INSERT INTO "vertical_crs" VALUES('EPSG','9458','AVWS height',NULL,'EPSG','6499','EPSG','1292',0);
INSERT INTO "usage" VALUES('EPSG','14138','vertical_crs','EPSG','9458','EPSG','4177','EPSG','1264');
INSERT INTO "usage" VALUES('EPSG','14231','vertical_crs','EPSG','9458','EPSG','4177','EPSG','1264');
INSERT INTO "vertical_crs" VALUES('EPSG','9471','INAGeoid2020 height',NULL,'EPSG','6499','EPSG','1294',0);
INSERT INTO "usage" VALUES('EPSG','14153','vertical_crs','EPSG','9471','EPSG','1122','EPSG','1178');
INSERT INTO "vertical_crs" VALUES('EPSG','9675','Pago Pago 2020 height',NULL,'EPSG','6499','EPSG','1302',0);
INSERT INTO "usage" VALUES('EPSG','14793','vertical_crs','EPSG','9675','EPSG','2288','EPSG','1026');
+7 -5
View File
@@ -176,8 +176,8 @@ INSERT INTO "vertical_datum" VALUES('EPSG','1269','Kingdom of Saudi Arabia Verti
INSERT INTO "usage" VALUES('EPSG','13897','vertical_datum','EPSG','1269','EPSG','3303','EPSG','1181');
INSERT INTO "vertical_datum" VALUES('EPSG','1270','Mean Sea Level Netherlands',NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14119','vertical_datum','EPSG','1270','EPSG','1630','EPSG','1265');
INSERT INTO "vertical_datum" VALUES('EPSG','1274','European Vertical Reference Frame 2019',NULL,'2019-05-22',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14078','vertical_datum','EPSG','1274','EPSG','4608','EPSG','1261');
INSERT INTO "vertical_datum" VALUES('EPSG','1274','European Vertical Reference Frame 2019',NULL,'2020-09-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14738','vertical_datum','EPSG','1274','EPSG','4608','EPSG','1261');
INSERT INTO "vertical_datum" VALUES('EPSG','1275','Mallorca',NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14014','vertical_datum','EPSG','1275','EPSG','4602','EPSG','1178');
INSERT INTO "vertical_datum" VALUES('EPSG','1276','Menorca',NULL,NULL,NULL,NULL,0);
@@ -200,14 +200,16 @@ INSERT INTO "vertical_datum" VALUES('EPSG','1284','El Hierro',NULL,NULL,NULL,NUL
INSERT INTO "usage" VALUES('EPSG','14023','vertical_datum','EPSG','1284','EPSG','4597','EPSG','1178');
INSERT INTO "vertical_datum" VALUES('EPSG','1285','Ceuta 2',NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14024','vertical_datum','EPSG','1285','EPSG','4590','EPSG','1178');
INSERT INTO "vertical_datum" VALUES('EPSG','1287','European Vertical Reference Frame 2019 mean tide',NULL,'2019-05-22',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14079','vertical_datum','EPSG','1287','EPSG','4608','EPSG','1262');
INSERT INTO "vertical_datum" VALUES('EPSG','1287','European Vertical Reference Frame 2019 mean tide',NULL,'2020-09-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14739','vertical_datum','EPSG','1287','EPSG','4608','EPSG','1262');
INSERT INTO "vertical_datum" VALUES('EPSG','1290','Lowest Astronomical Tide Netherlands',NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14120','vertical_datum','EPSG','1290','EPSG','1630','EPSG','1198');
INSERT INTO "vertical_datum" VALUES('EPSG','1292','Australian Vertical Working Surface',NULL,'2020-07-14',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14134','vertical_datum','EPSG','1292','EPSG','4177','EPSG','1264');
INSERT INTO "vertical_datum" VALUES('EPSG','1294','Indonesian Geoid 2020',NULL,'2020-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14149','vertical_datum','EPSG','1294','EPSG','1122','EPSG','1178');
INSERT INTO "vertical_datum" VALUES('EPSG','1302','Local Tidal Datum at Pago Pago 2020',NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','14795','vertical_datum','EPSG','1302','EPSG','2288','EPSG','1026');
INSERT INTO "vertical_datum" VALUES('EPSG','5100','Mean Sea Level',NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13307','vertical_datum','EPSG','5100','EPSG','1262','EPSG','1199');
INSERT INTO "vertical_datum" VALUES('EPSG','5101','Ordnance Datum Newlyn',NULL,'1956-01-01',NULL,NULL,0);
@@ -437,6 +439,6 @@ INSERT INTO "usage" VALUES('EPSG','13419','vertical_datum','EPSG','5213','EPSG',
INSERT INTO "vertical_datum" VALUES('EPSG','5214','IGN 1988 SM',NULL,'1988-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13420','vertical_datum','EPSG','5214','EPSG','2890','EPSG','1178');
INSERT INTO "vertical_datum" VALUES('EPSG','5215','European Vertical Reference Frame 2007',NULL,'2008-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13421','vertical_datum','EPSG','5215','EPSG','3594','EPSG','1027');
INSERT INTO "usage" VALUES('EPSG','14655','vertical_datum','EPSG','5215','EPSG','3594','EPSG','1027');
INSERT INTO "vertical_datum" VALUES('EPSG','1288','British Isles height ensemble',NULL,NULL,NULL,0.4,0);
INSERT INTO "usage" VALUES('EPSG','14086','vertical_datum','EPSG','1288','EPSG','4606','EPSG','1026');
+1
View File
@@ -35,5 +35,6 @@ set(SQL_FILES
"${SQL_DIR}/grid_alternatives.sql"
"${SQL_DIR}/grid_alternatives_generated_noaa.sql"
"${SQL_DIR}/customizations.sql"
"${SQL_DIR}/nkg.sql"
"${SQL_DIR}/commit.sql"
)
@@ -82,10 +82,10 @@ matrix:
- BUILD_NAME=linux_generic
- DETAILS="linux, arm64"
- os: osx
env:
- BUILD_NAME=osx
- DETAILS="osx"
# - os: osx
# env:
# - BUILD_NAME=osx
# - DETAILS="osx"
- os: linux
dist: xenial
@@ -20,7 +20,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- uses: goanpeca/setup-miniconda@v1
- uses: conda-incubator/setup-miniconda@v2
with:
channels: conda-forge
auto-update-conda: true
@@ -11,7 +11,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v2
- uses: goanpeca/setup-miniconda@v1
- uses: conda-incubator/setup-miniconda@v2
with:
channels: conda-forge
auto-update-conda: true
@@ -48,6 +48,8 @@ jobs:
run: |
python3 --version
sphinx-build --version
python3 -m pip list --not-required --format=columns
- uses: actions/download-artifact@v2
name: Images
with:
+23 -1
View File
@@ -4,18 +4,40 @@
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
HTMLOPTS ?= -W
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
.PHONY: clean
clean:
rm -rf $(BUILDDIR)/*
rm -rf .doxygen_up_to_date
.doxygen_up_to_date:
../scripts/doxygen.sh
touch .doxygen_up_to_date
.PHONY: html
html: .doxygen_up_to_date
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(HTMLOPTS) $(BUILDDIR)/html
# Undoes the hack done in scripts/doxygen.sh
@sed "s/io::Convention_/io::Convention/g" < $(BUILDDIR)/html/development/reference/cpp/io.html | sed "s/>Convention_/>Convention/g" | sed "s/_WKT2/WKT2/g" | sed "s/_WKT1/WKT1/g" > $(BUILDDIR)/html/development/reference/cpp/io.html.tmp
@mv $(BUILDDIR)/html/development/reference/cpp/io.html.tmp $(BUILDDIR)/html/development/reference/cpp/io.html
@cp -r ../schemas $(BUILDDIR)/html/schemas
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+16
View File
@@ -0,0 +1,16 @@
name: proj
channels:
- conda-forge
dependencies:
- descartes
- doxygen < 1.9
- geojson
- matplotlib
- shapely < 1.8
- pip
- pip:
- breathe
- pybtex
- sphinx-rtd-theme
- sphinxcontrib-bibtex
- sphinxcontrib-spelling
-86
View File
@@ -1,86 +0,0 @@
name: proj
channels:
- defaults
dependencies:
- blas=1.0=mkl
- bzip2=1.0.6=h1de35cc_5
- ca-certificates=2018.03.07=0
- cairo=1.14.12=hc4e6be7_4
- certifi=2018.8.24=py37_1
- click=6.7=py37_0
- click-plugins=1.0.3=py37_1
- cligj=0.4.0=py37_1
- curl=7.61.0=ha441bb4_0
- cycler=0.10.0=py37_0
- descartes=1.1.0=py37_0
- expat=2.2.6=h0a44026_0
- fiona=1.7.12=py37h0dff353_0
- fontconfig=2.13.0=h5d5b041_1
- freetype=2.9.1=hb4e5f40_0
- freexl=1.0.5=h1de35cc_0
- gdal=2.2.4=py37h6440ff4_1
- geos=3.6.2=h5470d99_2
- gettext=0.19.8.1=h15daf44_3
- giflib=5.1.4=h1de35cc_1
- glib=2.56.2=hd9629dc_0
- hdf4=4.2.13=h39711bb_2
- hdf5=1.10.2=hfa1e0ec_1
- icu=58.2=h4b95b61_1
- intel-openmp=2019.0=118
- jpeg=9b=he5867d9_2
- json-c=0.13.1=h3efe00b_0
- kealib=1.4.7=h40e48e4_6
- kiwisolver=1.0.1=py37h0a44026_0
- krb5=1.16.1=h24a3359_6
- libboost=1.67.0=hebc422b_4
- libcurl=7.61.0=hf30b1f0_0
- libcxx=4.0.1=h579ed51_0
- libcxxabi=4.0.1=hebd6815_0
- libdap4=3.19.1=h3d3e54a_0
- libedit=3.1.20170329=hb402a30_2
- libffi=3.2.1=h475c297_4
- libgdal=2.2.4=h7b1ea53_1
- libgfortran=3.0.1=h93005f0_2
- libiconv=1.15=hdd342a3_7
- libkml=1.3.0=hbe12b63_4
- libnetcdf=4.6.1=h4e6abe9_1
- libpng=1.6.34=he12f830_0
- libpq=10.5=hf30b1f0_0
- libspatialite=4.3.0a=ha12ebda_19
- libssh2=1.8.0=h322a93b_4
- libtiff=4.0.9=hcb84e12_2
- libuuid=1.0.3=h6bb4b03_2
- libxml2=2.9.8=hab757c2_1
- matplotlib=2.2.3=py37h54f8f79_0
- mkl=2019.0=118
- mkl_fft=1.0.4=py37h5d10147_1
- mkl_random=1.0.1=py37h5d10147_1
- munch=2.3.2=py37_0
- ncurses=6.1=h0a44026_0
- numpy=1.15.1=py37h6a91979_0
- numpy-base=1.15.1=py37h8a80b8c_0
- openjpeg=2.3.0=hb95cd4c_1
- openssl=1.0.2p=h1de35cc_0
- pcre=8.42=h378b8a2_0
- pip=10.0.1=py37_0
- pixman=0.34.0=hca0a616_3
- poppler=0.65.0=ha097c24_1
- poppler-data=0.4.9=0
- proj4=5.0.1=h1de35cc_0
- pyparsing=2.2.0=py37_1
- python=3.7.0=hc167b69_0
- python-dateutil=2.7.3=py37_0
- pytz=2018.5=py37_0
- readline=7.0=h1de35cc_5
- setuptools=40.2.0=py37_0
- shapely=1.6.4=py37h20de77a_0
- six=1.11.0=py37_1
- sqlite=3.24.0=ha441bb4_0
- tk=8.6.8=ha441bb4_0
- tornado=5.1=py37h1de35cc_0
- wheel=0.31.1=py37_0
- xerces-c=3.2.1=h44e365a_0
- xz=5.2.4=h1de35cc_4
- zlib=1.2.11=hf3cbc9b_2
prefix: /usr/local/miniconda3/envs/proj
Regular → Executable
+91 -54
View File
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
'''
Plot map data in different projections supported by PROJ.4
Plot map data in different projections supported by PROJ.
Call with:
@@ -41,30 +42,28 @@ or "line". The rest of the inputs are fairly free form.
Change PROJ to path on your local system before running the script.
'''
from __future__ import print_function
from __future__ import division
import argparse
import os
import os.path
import shutil
import sys
import json
import subprocess
import functools
from pathlib import Path
import geojson
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import fiona
from shapely.geometry import Polygon
from shapely.geometry import MultiPolygon
from shapely.geometry import MultiPolygon, Polygon, box as Box
from shapely.geometry import shape
from shapely.ops import transform
from descartes import PolygonPatch
PROJ_COMMAND = os.environ.get('PROJ_EXE', '../../src/proj')
if not os.path.exists(PROJ_COMMAND):
PROJ = shutil.which(PROJ_COMMAND)
PROJ = shutil.which('proj')
if PROJ is None:
raise ValueError("specify PROJ_EXE or modify PATH to find proj")
else:
PROJ = PROJ_COMMAND
PROJ_LIB = os.environ.get('PROJ_LIB', '../../data')
@@ -240,31 +239,46 @@ def resample_polygon(polygon):
return Polygon(ext, rings)
def plot_with_interruptions(axes, x, y, delta_cut=1e100, **kwargs):
"""
Plot x/y with proper splitting for interrupted projections.
"""
_x = np.atleast_1d(x)
_y = np.atleast_1d(y)
dx = np.nan_to_num(_x[1: ]) - np.nan_to_num(_x[0: -1])
dy = np.nan_to_num(_y[1: ]) - np.nan_to_num(_y[0: -1])
split, = ((np.abs(dx) > delta_cut) | (np.abs(dy) > delta_cut)).nonzero()
split = np.append(split, _x.size - 1)
split += 1
last_part = 0
for part in split:
axes.plot(x[last_part: part],
y[last_part: part],
**kwargs)
last_part = part
def plotproj(plotdef, data, outdir):
'''
Plot map.
'''
axes = plt.axes()
bounds = (plotdef['lonmin'], plotdef['latmin'], plotdef['lonmax'], plotdef['latmax'])
for geom in data.filter(bbox=bounds):
temp_pol = shape(geom['geometry'])
box = Polygon([
(plotdef['lonmin'], plotdef['latmin']),
(plotdef['lonmin'], plotdef['latmax']),
(plotdef['lonmax'], plotdef['latmax']),
(plotdef['lonmax'], plotdef['latmin']),
])
try:
temp_pol = temp_pol.intersection(box)
except Exception as e:
box = Box(
plotdef['lonmin'], plotdef['latmin'],
plotdef['lonmax'], plotdef['latmax'])
for feat in data["features"]:
geom = shape(feat["geometry"])
if not geom.intersects(box):
continue
temp_pol = geom.intersection(box)
if plotdef['type'] == 'poly':
if isinstance(temp_pol, MultiPolygon):
polys = [resample_polygon(polygon) for polygon in temp_pol]
polys = [resample_polygon(polygon) for polygon in temp_pol.geoms]
pol = MultiPolygon(polys)
else:
pol = resample_polygon(temp_pol)
@@ -282,7 +296,8 @@ def plotproj(plotdef, data, outdir):
pass
else:
x, y = proj_geom.xy
axes.plot(x, y, color=COLOR_COAST, linewidth=0.5)
plot_with_interruptions(axes, x, y, color=COLOR_COAST, linewidth=0.5,
delta_cut=plotdef.get('delta_cut', 1e100))
# Plot frame
frame = [
@@ -293,7 +308,8 @@ def plotproj(plotdef, data, outdir):
line = project(line, plotdef['projstring'])
x = line[:, 0]
y = line[:, 1]
axes.plot(x, y, '-k')
plot_with_interruptions(axes, x, y, color='black', linestyle='-',
delta_cut=plotdef.get('delta_cut', 1e6))
graticule = build_graticule(
plotdef['lonmin'],
@@ -307,7 +323,28 @@ def plotproj(plotdef, data, outdir):
feature = project(feature, plotdef['projstring'])
x = feature[:, 0]
y = feature[:, 1]
axes.plot(x, y, color=COLOR_GRAT, linewidth=0.4)
plot_with_interruptions(axes, x, y, color=COLOR_GRAT, linewidth=0.4,
delta_cut=plotdef.get('delta_cut', 1e6))
# Plot interrupted boundaries if necessary
interrupted_lines = []
if 'top_interrupted_lons' in plotdef:
for lon in plotdef['top_interrupted_lons']:
for delta in [-0.0001, 0.0001]:
merid = meridian(lon + delta, 0.0, plotdef['latmax'])
interrupted_lines.append(project(merid, plotdef['projstring']))
if 'bottom_interrupted_lons' in plotdef:
for lon in plotdef['bottom_interrupted_lons']:
for delta in [-0.0001, 0.0001]:
merid = meridian(lon + delta, plotdef['latmin'], 0)
interrupted_lines.append(project(merid, plotdef['projstring']))
for line in interrupted_lines:
x = line[:, 0]
y = line[:, 1]
plot_with_interruptions(axes, x, y, color=COLOR_GRAT, linewidth=0.4,
delta_cut=plotdef.get('delta_cut', 1e100))
# Switch off the axis lines...
plt.axis('off')
@@ -326,9 +363,12 @@ def plotproj(plotdef, data, outdir):
# Make sure the plot is not stretched
axes.set_aspect('equal')
if not os.path.exists(outdir):
os.makedirs(outdir)
plt.savefig(outdir + '/' + plotdef['filename'],
outdir = Path(outdir)
if not outdir.exists():
outdir.mkdir(parents=True)
if not outdir.is_dir():
raise OSError("outdir is not a directory")
plt.savefig(outdir / plotdef['filename'],
dpi=400,
bbox_inches='tight')
@@ -338,36 +378,22 @@ def plotproj(plotdef, data, outdir):
plt.close()
def main():
def main(plotdefs, outdir, plots=[]):
'''
Main function of plotting script.
Parses json-file with plot setups and runs the plotting
for each plot setup.
'''
plotdefs = json.loads(Path(plotdefs).read_text())
data = {
('line', 'low'): fiona.open(LINE_LOW),
('line', 'med'): fiona.open(LINE_MED),
('poly', 'low'): fiona.open(POLY_LOW),
('poly', 'med'): fiona.open(POLY_MED),
('line', 'low'): geojson.loads(Path(LINE_LOW).read_text()),
('line', 'med'): geojson.loads(Path(LINE_MED).read_text()),
('poly', 'low'): geojson.loads(Path(POLY_LOW).read_text()),
('poly', 'med'): geojson.loads(Path(POLY_MED).read_text()),
}
if os.path.exists(sys.argv[1]):
# first argument is the JSON plot definition setup file
with open(sys.argv[1]) as plotsetup:
plotdefs = json.load(plotsetup)
else:
raise ValueError('No plot definition file entered')
plots = []
# second argument is the output dir
outdir = sys.argv[2]
# subsecond arguments are (optional) names of plot in plotdef.json
if len(sys.argv) > 3:
plots = sys.argv[3:len(sys.argv)]
for i, plotdef in enumerate(plotdefs):
if plots != [] and plotdef['name'] not in plots:
continue
@@ -379,9 +405,20 @@ def main():
plotproj(plotdef, data[(plotdef['type'], plotdef['res'])], outdir)
for key in data:
data[key].close()
if __name__ == "__main__":
sys.exit(main())
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument(
'plotdefs',
help='A JSON file with setup for each auto-generated plot')
parser.add_argument(
'outdir',
help='Directory to put the plots in.')
parser.add_argument(
'plots', nargs='*',
help='A list of plot names within the plotdefs file. '
'More than one plotname can be given at once.')
args = parser.parse_args()
sys.exit(main(**vars(args)))
-2
View File
@@ -1,2 +0,0 @@
python3 plot.py plotdefs.json images/
+12
View File
@@ -0,0 +1,12 @@
#!/bin/sh
set -e
export PATH="$HOME/.local/bin:$PATH"
export PROJ_LIB="$HOME/.local/share/proj"
cd docs/plot
python plot.py plotdefs.json images
cd ../..
mkdir -p docs/source/operations/projections/images/
cp -r docs/plot/images/* docs/source/operations/projections/images/
+16
View File
@@ -0,0 +1,16 @@
#!/bin/sh
set -e
# https://github.com/readthedocs/readthedocs.org/pull/9888
READTHEDOCS_OUTPUT="_readthedocs"
find ${READTHEDOCS_OUTPUT} -type d
READTHEDOCS_OUTPUT_HTML="${READTHEDOCS_OUTPUT}/html"
# Undoes the hack done in scripts/doxygen.sh
sed "s/io::Convention_/io::Convention/g" < ${READTHEDOCS_OUTPUT_HTML}/development/reference/cpp/io.html | sed "s/>Convention_/>Convention/g" | sed "s/_WKT2/WKT2/g" | sed "s/_WKT1/WKT1/g" > ${READTHEDOCS_OUTPUT_HTML}/development/reference/cpp/io.html.tmp
mv ${READTHEDOCS_OUTPUT_HTML}/development/reference/cpp/io.html.tmp ${READTHEDOCS_OUTPUT_HTML}/development/reference/cpp/io.html
# Copy JSON schemas for public consumption
READTHEDOCS_OUTPUT_SCHEMAS="${READTHEDOCS_OUTPUT_HTML}/schemas"
cp -r schemas ${READTHEDOCS_OUTPUT_SCHEMAS}
cp ./data/triangulation.schema.json ${READTHEDOCS_OUTPUT_SCHEMAS}
+9
View File
@@ -0,0 +1,9 @@
#!/bin/sh
set -e
mkdir build
cd build
cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX=$HOME/.local ..
ninja install
+1 -1
View File
@@ -60,7 +60,7 @@ Coding style
^^^^^^^^^^^^
The parts of the code base that has started its life as C++ is formatted with
``clang-format`` using the sript ``scripts/reformat_cpp.sh``. This is mostly
``clang-format`` using the script ``scripts/reformat_cpp.sh``. This is mostly
contained to the code in `src/iso19111/` but a few other `.cpp`-files are
covered as well.
+18 -17
View File
@@ -14,7 +14,6 @@
import sys
import os
import datetime
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -43,6 +42,9 @@ extensions = [
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# BibTeX configuration
bibtex_bibfiles = ['references.bib']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
@@ -62,29 +64,25 @@ project = 'PROJ'
# See CITATION file
title = 'PROJ coordinate transformation software library'
author = 'PROJ contributors'
now = datetime.datetime.now()
copyright = u'1983-{0}'.format(now.year)
copyright = u'1983-2021'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
version = '7.2.0'
data_version = '1.2'
# use same |release| as |version|
release = version
version = '7.2'
release = '7.2.1'
data_version = '1.4'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# language = 'en'
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
today = 'January 2021'
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
@@ -188,16 +186,16 @@ html_favicon = '../images/favicon.png'
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
htm_css_files = [
'theme_overrides.css', # override wide tables in RTD theme
]
html_context = {
'display_github': True,
'theme_vcs_pageview_mode': 'edit',
'github_user': 'OSGeo',
'github_repo': 'PROJ',
# TODO: edit when switching active branch
'github_version': '/7.1/docs/source/',
'css_files': [
'_static/theme_overrides.css', # override wide tables in RTD theme
],
'github_version': '/7.2/docs/source/',
}
# Add any extra paths that contain custom files (such as robots.txt or
@@ -270,6 +268,8 @@ preamble = r"""
\ifdefined\DeclareUnicodeCharacter
\DeclareUnicodeCharacter{2032}{$'$}% prime
\fi
\usepackage[notbib]{tocbibind}
"""
latex_elements = {
@@ -281,7 +281,8 @@ latex_elements = {
# Additional stuff for the LaTeX preamble.
'preamble': preamble,
'inputenc':'\\usepackage[utf8]{inputenc}'
'inputenc': r'\usepackage[utf8]{inputenc}',
'makeindex': r'\usepackage[columns=1]{idxlayout}\makeindex',
# Latex figure (float) alignment
#'figure_align': 'htbp',
+2 -2
View File
@@ -30,8 +30,8 @@ Go bindings and idiomatic wrapper for PROJ
Julia
=====
`Proj4.jl <https://github.com/JuliaGeo/Proj4.jl>`_"
Low-level bindings and a Julian API over PROJ.
`Proj4.jl <https://github.com/JuliaGeo/Proj4.jl>`_:
Julia bindings and idiomatic wrapper for PROJ.
TCL
========
@@ -3,5 +3,5 @@
General documentation
---------------------
.. doxygenfile:: general_doc.dox.reworked.h
.. doxygenpage:: general_doc
:project: doxygen_api
@@ -180,7 +180,7 @@ paragraph for more details.
coordinate reference systems.
This is the same as :c:func:`proj_create_crs_to_crs` except that the source and
target CRS are passed as PJ* objects which must of the CRS variety.
target CRS are passed as PJ* objects which must be of the CRS variety.
:param `options`: should be set to NULL currently.
@@ -268,7 +268,7 @@ Coordinate transformation
3. of length one, i.e. a constant, which will be treated as a fully
populated array of that constant value
.. note:: Even though he coordinate components are named :c:data:`x`, :c:data:`y`,
.. note:: Even though the coordinate components are named :c:data:`x`, :c:data:`y`,
:c:data:`z` and :c:data:`t`, axis ordering of the to and from CRS
is respected. Transformations exhibit the same behavior
as if they were gathered in a :c:type:`PJ_COORD` struct.
@@ -352,7 +352,7 @@ Coordinate transformation
.. c:function:: size_t proj_trans_array(PJ *P, PJ_DIRECTION direction, size_t n, PJ_COORD *coord)
.. c:function:: int proj_trans_array(PJ *P, PJ_DIRECTION direction, size_t n, PJ_COORD *coord)
Batch transform an array of :c:type:`PJ_COORD`.
@@ -362,7 +362,7 @@ Coordinate transformation
:type `direction`: PJ_DIRECTION
:param n: Number of coordinates in :c:data:`coord`
:type n: `size_t`
:returns: :c:type:`size_t` 0 if all observations are transformed without error, otherwise returns error number
:returns: `int` 0 if all observations are transformed without error, otherwise returns error number
Error reporting
@@ -783,6 +783,17 @@ Setting custom I/O functions
.. doxygenfunction:: proj_context_set_sqlite3_vfs_name
:project: doxygen_api
.. c:function:: void proj_context_set_search_paths (PJ_CONTEXT *ctx , int count_paths, const char* const* paths)
Sets the resource files search paths.
:param ctx: Threading context.
:type ctx: :c:type:`PJ_CONTEXT` *
:param `count_paths`: Number of paths.
:type `count_paths`: `int`
:param `paths`: Array of paths.
:type `paths`: `const char* const*`
Network related functionality
+21 -14
View File
@@ -13,18 +13,8 @@ distribution of the source code and various resource file archives. See
Current Release
--------------------------------------------------------------------------------
* **2020-09-01** `proj-7.1.1.tar.gz`_ (`md5`_)
* **2020-07-01** `proj-7.1.0.tar.gz`_
* **2020-05-01** `proj-6.3.2.tar.gz`_
* **2020-09-01** `proj-data-1.2.tar.gz`_
* **2020-05-01** `proj-data-1.1.tar.gz`_
* **2020-03-01** `proj-data-1.0.tar.gz`_
* **2018-09-15** `proj-datumgrid-1.8.zip`_
* **2020-03-01** `proj-datumgrid-europe-1.6.zip`_
* **2020-03-01** `proj-datumgrid-north-america-1.4.zip`_
* **2020-03-01** `proj-datumgrid-oceania-1.2.zip`_
* **2019-03-01** `proj-datumgrid-world-1.0.zip`_
* **PDF Manual** `proj.pdf`_
* **2021-01-01** `proj-7.2.1.tar.gz`_ (`md5`_)
* **2021-01-01** `proj-data-1.4.tar.gz`_
.. note::
@@ -37,6 +27,10 @@ Current Release
Past Releases
--------------------------------------------------------------------------------
* **2020-11-01** `proj-7.2.0.tar.gz`_
* **2020-09-01** `proj-7.1.1.tar.gz`_
* **2020-07-01** `proj-7.1.0.tar.gz`_
* **2020-05-01** `proj-6.3.2.tar.gz`_
* **2020-05-01** `proj-7.0.1.tar.gz`_
* **2020-03-01** `proj-7.0.0.tar.gz`_
* **2020-02-11** `proj-6.3.1.tar.gz`_
@@ -54,8 +48,16 @@ Past Releases
* **2015-09-13** `proj-4.9.2.tar.gz`_
* **2015-03-04** `proj-4.9.1.tar.gz`_
* **2020-11-01** `proj-data-1.3.tar.gz`_
* **2020-09-01** `proj-data-1.2.tar.gz`_
* **2020-05-01** `proj-data-1.1.tar.gz`_
* **2020-03-01** `proj-data-1.0.tar.gz`_
* **2018-09-15** `proj-datumgrid-1.8.zip`_
* **2020-03-01** `proj-datumgrid-europe-1.6.zip`_
* **2020-03-01** `proj-datumgrid-north-america-1.4.zip`_
* **2020-03-01** `proj-datumgrid-oceania-1.2.zip`_
* **2019-03-01** `proj-datumgrid-world-1.0.zip`_
* **2018-03-01** `proj-datumgrid-1.7.zip`_
* **2016-09-11** `proj-datumgrid-1.6.zip`_
* **2019-09-01** `proj-datumgrid-europe-1.5.zip`_
@@ -71,8 +73,10 @@ Past Releases
* **2018-03-01** `proj-datumgrid-oceania-1.1.zip`_
* **2018-03-01** `proj-datumgrid-oceania-1.0.zip`_
.. _`proj-7.2.1.tar.gz`: https://download.osgeo.org/proj/proj-7.2.1.tar.gz
.. _`md5`: https://download.osgeo.org/proj/proj-7.2.1.tar.gz.md5
.. _`proj-7.2.0.tar.gz`: https://download.osgeo.org/proj/proj-7.2.0.tar.gz
.. _`proj-7.1.1.tar.gz`: https://download.osgeo.org/proj/proj-7.1.1.tar.gz
.. _`md5`: https://download.osgeo.org/proj/proj-7.1.1.tar.gz.md5
.. _`proj-7.1.0.tar.gz`: https://download.osgeo.org/proj/proj-7.1.0.tar.gz
.. _`proj-7.0.1.tar.gz`: https://download.osgeo.org/proj/proj-7.0.1.tar.gz
.. _`proj-7.0.0.tar.gz`: https://download.osgeo.org/proj/proj-7.0.0.tar.gz
@@ -91,9 +95,13 @@ Past Releases
.. _`proj-4.9.1.tar.gz`: https://download.osgeo.org/proj/proj-4.9.1.tar.gz
.. _`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.4.tar.gz`: https://download.osgeo.org/proj/proj-data-1.4.tar.gz
.. _`proj-data-1.3.tar.gz`: https://download.osgeo.org/proj/proj-data-1.3.tar.gz
.. _`proj-data-1.2.tar.gz`: https://download.osgeo.org/proj/proj-data-1.2.tar.gz
.. _`proj-data-1.1.tar.gz`: https://download.osgeo.org/proj/proj-data-1.1.tar.gz
.. _`proj-data-1.0.tar.gz`: https://download.osgeo.org/proj/proj-data-1.0.tar.gz
.. _`proj-datumgrid-1.6.zip`: https://download.osgeo.org/proj/proj-datumgrid-1.6.zip
.. _`proj-datumgrid-1.7.zip`: https://download.osgeo.org/proj/proj-datumgrid-1.7.zip
.. _`proj-datumgrid-1.8.zip`: https://download.osgeo.org/proj/proj-datumgrid-1.8.zip
@@ -113,4 +121,3 @@ Past Releases
.. _`proj-datumgrid-oceania-1.1.zip`: https://download.osgeo.org/proj/proj-datumgrid-oceania-1.1.zip
.. _`proj-datumgrid-oceania-1.2.zip`: https://download.osgeo.org/proj/proj-datumgrid-oceania-1.2.zip
.. _`proj-datumgrid-world-1.0.zip`: https://download.osgeo.org/proj/proj-datumgrid-world-1.0.zip
.. _`proj.pdf`: https://raw.githubusercontent.com/OSGeo/PROJ/gh-pages/proj.pdf
-5
View File
@@ -30,8 +30,3 @@ PROJ
You can download the source code for PROJ on the :ref:`download section<download>`
and find links to prepackaged executables in the
:ref:`installation section<install>`.
In addition to this website the PROJ documentation is also available in `PDF`_
form.
.. _`PDF`: https://raw.githubusercontent.com/OSGeo/proj.4/gh-pages/proj.pdf
+193 -58
View File
@@ -3,6 +3,141 @@
News
###############################################################################
7.2.1 Release Notes
-------------------
*January 1st 2021*
Updates
-------
* Add metadata with the version number of the database layout (`#2474 <https://github.com/OSGeo/PROJ/issues/2474>`_)
* Split ``coordinateoperation.cpp`` and ``test_operation.cpp`` in several parts (`#2484 <https://github.com/OSGeo/PROJ/issues/2484>`_)
* Update to EPSG v10.008 (`#2490 <https://github.com/OSGeo/PROJ/issues/2490>`_)
* Added the NKG 2008 and 2020 transformations in ``proj.db`` (`#2495 <https://github.com/OSGeo/PROJ/issues/2495>`_)
Bug fixes
---------
* Set ``CURL_ENABLED`` definition on projinfo build (`#2405 <https://github.com/OSGeo/PROJ/issues/2405>`_)
* :c:func:`createBoundCRSToWGS84IfPossible()`: make it return same result with a CRS
built from EPSG code or WKT1 (`#2412 <https://github.com/OSGeo/PROJ/issues/2412>`_)
* WKT2 parsing: several fixes related to map projection parameter units (`#2428 <https://github.com/OSGeo/PROJ/issues/2428>`_)
* :c:func:`createOperation()`: make it work properly when one of the CRS is a BoundCRS of
a DerivedGeographicCRS (``+proj=ob_tran +o_proj=lonlat +towgs84=....``) (`#2441 <https://github.com/OSGeo/PROJ/issues/2441>`_)
* WKT parsing: fix ingestion of WKT with a Geocentric CRS as the base of the
projected CRS (`#2443 <https://github.com/OSGeo/PROJ/issues/2443>`_)
* ``GeographicCRS::_isEquivalentTo(EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS)``:
make it work when comparing easting,northing,up and northing,easting,up (`#2446 <https://github.com/OSGeo/PROJ/issues/2446>`_)
* :c:func:`createOperation()`: add a ballpark vertical transformation when dealing
with ``GEOIDMODEL[]`` (`#2449 <https://github.com/OSGeo/PROJ/issues/2449>`_)
* Use same arguments to printf format string for both radians and degrees in
output by cct (`#2453 <https://github.com/OSGeo/PROJ/issues/2453>`_)
* PRIMEM WKT handling: fixes on import for 'sexagesimal DMS' or from WKT1:GDAL/ESRI
when GEOGCS UNIT != Degree; morph to ESRI the PRIMEM name on export (`#2455 <https://github.com/OSGeo/PROJ/issues/2455>`_)
* :c:func:`createObjectsFromName()`: in exact match, make looking for 'ETRS89 / UTM zone 32N'
return only the exact match (`#2462 <https://github.com/OSGeo/PROJ/issues/2462>`_)
* Inverse tmerc spherical: fix wrong sign of latitude when lat_0 is used (`#2469 <https://github.com/OSGeo/PROJ/issues/2469>`_)
* Add option to allow export of Geographic/Projected 3D CRS in WKT1_GDAL (`#2470 <https://github.com/OSGeo/PROJ/issues/2470>`_)
* Fix building ``proj.db`` with SQLite built with ``-DSQLITE_DQS=0`` (`#2480 <https://github.com/OSGeo/PROJ/issues/2480>`_)
* Include JSON Schema files in CMake builds (`#2485 <https://github.com/OSGeo/PROJ/issues/2485>`_)
* :c:func:`createOperations()`: fix inconsistent chaining exception when transforming from BoundCRS of projected CRS based on NTF Paris to BoundCRS of geog CRS NTF Paris (`#2486 <https://github.com/OSGeo/PROJ/issues/2486>`_)
7.2.0 Release Notes
++++++++++++++++++++++++++++++++++++++++
*November 1st 2020*
Updates
-------
+ **Command line tools**
* Add multi-line PROJ string export capability, and use it by default in
:program:`projinfo` (unless ``--single-line`` is specified) (`#2381 <https://github.com/OSGeo/PROJ/issues/2381>`_)
+ **Coordinate operations**
* :ref:`col_urban` projection, implementing a EPSG projection method
used by a number of projected CRS in Colombia (`#2395 <https://github.com/OSGeo/PROJ/issues/2395>`_)
* :ref:`tinshift` for triangulation-based transformations (`#2344 <https://github.com/OSGeo/PROJ/issues/2344>`_)
* Added ellipsoidal formulation of :ref:`ortho` (`#2361 <https://github.com/OSGeo/PROJ/issues/2361>`_)
+ **Database**
* Update to EPSG 10.003 and make code base robust to dealing with
WKT CRS with DatumEnsemble (`#2370 <https://github.com/OSGeo/PROJ/issues/2370>`_)
* Added Finland tinshift operations (`#2392 <https://github.com/OSGeo/PROJ/issues/2392>`_)
* Added transformation from JGD2011 Geographic 3D to JGD2011
height using GSIGEO2011 (`#2393 <https://github.com/OSGeo/PROJ/issues/2393>`_)
* Improve CompoundCRS identification and name morphing in VerticalCRS
with ESRI WKT1 (`#2386 <https://github.com/OSGeo/PROJ/issues/2386>`_)
* Added OGC:CRS27 and OGC:CRS83 CRS entries for NAD27 and NAD83
in longitude, latitude order (`#2350 <https://github.com/OSGeo/PROJ/issues/2350>`_)
+ **API**
* Added temporal, engineering, and parametric datum :c:type:`PJ_TYPE` enumerations (`#2274 <https://github.com/OSGeo/PROJ/issues/2274>`_)
* Various improvements to context handling (#2329, #2331)
* :c:func:`proj_create_vertical_crs_ex()`: add a ``ACCURACY`` option to provide
an explicit accuracy, or derive it from the grid name if it is
known (`#2342 <https://github.com/OSGeo/PROJ/issues/2342>`_)
* :c:func:`proj_crs_create_bound_crs_to_WGS84()`: make it work on
verticalCRS/compoundCRS such as EPSG:4326+5773 and
EPSG:4326+3855 (`#2365 <https://github.com/OSGeo/PROJ/issues/2365>`_)
* :cpp:func:`promoteTo3D()`: add a remark with the original CRS identifier (`#2369 <https://github.com/OSGeo/PROJ/issues/2369>`_)
* Added :c:func:`proj_context_clone` (`#2383 <https://github.com/OSGeo/PROJ/issues/2383>`_)
Bug fixes
---------
* Avoid core dumps when copying contexts in certain scenarios (`#2324 <https://github.com/OSGeo/PROJ/issues/2324>`_)
* :c:func:`proj_trans()`: reset errno before attemptying a retry with a new
coordinate operation (`#2353 <https://github.com/OSGeo/PROJ/issues/2353>`_)
* PROJJSON schema corrected to allow prime meridians values with
explicitly stating a unit (degrees assumed) (`#2354 <https://github.com/OSGeo/PROJ/issues/2354>`_)
* Adjust :cpp:func:`createBoundCRSToWGS84IfPossible()` and operation filtering
(for POSGAR 2007 to WGS84 issues) (`#2357 <https://github.com/OSGeo/PROJ/issues/2357>`_)
* :cpp:func:`createOperations()`: several fixes affecting NAD83 -> NAD83(2011) (`#2364 <https://github.com/OSGeo/PROJ/issues/2364>`_)
* WKT2:2019 import/export: handle DATUM (at top level object) with PRIMEM
* WKT1_ESRI: fix import and export of CompoundCRS (`#2389 <https://github.com/OSGeo/PROJ/issues/2389>`_)
7.1.1 Release Notes
++++++++++++++++++++++++++++++++++++++++
*September 1st 2020*
@@ -11,36 +146,36 @@ News
Updates
-------
* Added various Brazillian grids to the database (`#2277 <https://github.com/OSGeo/issues/2277>`_)
* Added various Brazillian grids to the database (`#2277 <https://github.com/OSGeo/PROJ/issues/2277>`_)
* Added geoid file for Canary Islands to the database (`#2312 <https://github.com/OSGeo/issues/2312>`_)
* Added geoid file for Canary Islands to the database (`#2312 <https://github.com/OSGeo/PROJ/issues/2312>`_)
* Updated EPSG database to version 9.8.15 (`#2310 <https://github.com/OSGeo/issues/2310>`_)
* Updated EPSG database to version 9.8.15 (`#2310 <https://github.com/OSGeo/PROJ/issues/2310>`_)
Bug fixes
---------
* WKT parser: do not raise warning when parsing a WKT2:2015 TIMECRS
whose TIMEUNIT is at the CS level, and not inside (`#2281 <https://github.com/OSGeo/issues/2281>`_)
whose TIMEUNIT is at the CS level, and not inside (`#2281 <https://github.com/OSGeo/PROJ/issues/2281>`_)
* Parse '+proj=something_not_latlong +vunits=' without +geoidgrids as a
Projected3D CRS and not a compound CRS with a unknown datum (`#2289 <https://github.com/OSGeo/issues/2289>`_)
Projected3D CRS and not a compound CRS with a unknown datum (`#2289 <https://github.com/OSGeo/PROJ/issues/2289>`_)
* C API: Avoid crashing due to missing SANITIZE_CTX() in entry points (`#2293 <https://github.com/OSGeo/issues/2293>`_)
* C API: Avoid crashing due to missing SANITIZE_CTX() in entry points (`#2293 <https://github.com/OSGeo/PROJ/issues/2293>`_)
* CMake build: Check "target_clones" before use (`#2297 <https://github.com/OSGeo/issues/2297>`_)
* CMake build: Check "target_clones" before use (`#2297 <https://github.com/OSGeo/PROJ/issues/2297>`_)
* PROJ string export of +proj=krovak +czech: make sure we export +czech… (`#2301 <https://github.com/OSGeo/issues/2301>`_)
* PROJ string export of +proj=krovak +czech: make sure we export +czech… (`#2301 <https://github.com/OSGeo/PROJ/issues/2301>`_)
* Helmert 2D: do not require a useless +convention= parameter (`#2305 <https://github.com/OSGeo/issues/2305>`_)
* Helmert 2D: do not require a useless +convention= parameter (`#2305 <https://github.com/OSGeo/PROJ/issues/2305>`_)
* Fix a few spelling errors ("vgridshit" vs. "vgridshift") (`#2307 <https://github.com/OSGeo/issues/2307>`_)
* Fix a few spelling errors ("vgridshit" vs. "vgridshift") (`#2307 <https://github.com/OSGeo/PROJ/issues/2307>`_)
* Fix ability to identify EPSG:2154 as a candidate for 'RGF93_Lambert_93' (`#2316 <https://github.com/OSGeo/issues/2316>`_)
* Fix ability to identify EPSG:2154 as a candidate for 'RGF93_Lambert_93' (`#2316 <https://github.com/OSGeo/PROJ/issues/2316>`_)
* WKT importer: tune for Oracle WKT and 'Lambert Conformal Conic' (`#2322 <https://github.com/OSGeo/issues/2322>`_)
* WKT importer: tune for Oracle WKT and 'Lambert Conformal Conic' (`#2322 <https://github.com/OSGeo/PROJ/issues/2322>`_)
* Revert compiler generated Fused Multiply Addition optimized routines (`#2328 <https://github.com/OSGeo/issues/2328>`_)
* Revert compiler generated Fused Multiply Addition optimized routines (`#2328 <https://github.com/OSGeo/PROJ/issues/2328>`_)
@@ -57,7 +192,7 @@ Updates
+ **New projections**
* Add square conformal projections from libproject (`#2148 <https://github.com/OSGeo/issues/2148>`_):
* Add square conformal projections from libproject (`#2148 <https://github.com/OSGeo/PROJ/issues/2148>`_):
- :ref:`adams_hemi`
@@ -70,117 +205,117 @@ Updates
- :ref:`peirce_q`
* Adams Square II: map ESRI WKT to PROJ string, and implement iterative
inverse method (`#2157 <https://github.com/OSGeo/issues/2157>`_)
inverse method (`#2157 <https://github.com/OSGeo/PROJ/issues/2157>`_)
* Added :ref:`igh_o` projection (`#2226 <https://github.com/OSGeo/issues/2226>`_)
* Added :ref:`igh_o` projection (`#2226 <https://github.com/OSGeo/PROJ/issues/2226>`_)
* Add :ref:`wink2` inverse by generic inversion of forward method (`#2243 <https://github.com/OSGeo/issues/2243>`_)
* Add :ref:`wink2` inverse by generic inversion of forward method (`#2243 <https://github.com/OSGeo/PROJ/issues/2243>`_)
+ **Database**
* Update to EPSG 9.8.12, ESRI 10.8.1 and import scope and remarks for
conversion (`#2238 <https://github.com/OSGeo/issues/2238>`_) (#2267)
conversion (`#2238 <https://github.com/OSGeo/PROJ/issues/2238>`_) (#2267)
* Map the Behrman projection to ``cae`` when converting ESRI CRSes (`#1986 <https://github.com/OSGeo/issues/1986>`_)
* Map the Behrman projection to ``cae`` when converting ESRI CRSes (`#1986 <https://github.com/OSGeo/PROJ/issues/1986>`_)
* Support conversion of Flat_Polar_Quartic projection method (`#1987 <https://github.com/OSGeo/issues/1987>`_)
* Support conversion of Flat_Polar_Quartic projection method (`#1987 <https://github.com/OSGeo/PROJ/issues/1987>`_)
* Register 4 new Austrian height grids (see https://github.com/OSGeo/PROJ-data/pull/13)
and handle 'Vertical Offset by Grid Interpolation (BEV AT)' method (`#1989 <https://github.com/OSGeo/issues/1989>`_)
and handle 'Vertical Offset by Grid Interpolation (BEV AT)' method (`#1989 <https://github.com/OSGeo/PROJ/issues/1989>`_)
* Add ESRI projection method mappings for Mercator_Variant_A, Mercator_Variant_B
and Transverse_Cylindrical_Equal_Area and various grid mappings (`#2020 <https://github.com/OSGeo/issues/2020>`_) (#2195)
and Transverse_Cylindrical_Equal_Area and various grid mappings (`#2020 <https://github.com/OSGeo/PROJ/issues/2020>`_) (#2195)
* Map ESRI Transverse_Mercator_Complex to Transverse Mercator (`#2040 <https://github.com/OSGeo/issues/2040>`_)
* Map ESRI Transverse_Mercator_Complex to Transverse Mercator (`#2040 <https://github.com/OSGeo/PROJ/issues/2040>`_)
* Register grids for New Caledonia (see https://github.com/OSGeo/PROJ-data/pull/16) (`#2051 <https://github.com/OSGeo/issues/2051>`_) (#2239)
* Register grids for New Caledonia (see https://github.com/OSGeo/PROJ-data/pull/16) (`#2051 <https://github.com/OSGeo/PROJ/issues/2051>`_) (#2239)
* Register NZGD2000 -> ITRF96 transformation for NZGD2000 database (`#2248 <https://github.com/OSGeo/issues/2248>`_)
* Register NZGD2000 -> ITRF96 transformation for NZGD2000 database (`#2248 <https://github.com/OSGeo/PROJ/issues/2248>`_)
* Register geoid file for UK added
(see https://github.com/OSGeo//PROJ-data/pull/25() (`#2250 <https://github.com/OSGeo/issues/2250>`_)
(see https://github.com/OSGeo//PROJ-data/pull/25() (`#2250 <https://github.com/OSGeo/PROJ/issues/2250>`_)
* Register Slovakian geoid transformations with needed code changes (`#2259 <https://github.com/OSGeo/issues/2259>`_)
* Register Slovakian geoid transformations with needed code changes (`#2259 <https://github.com/OSGeo/PROJ/issues/2259>`_)
* Register Spanish SPED2ETV2 grid for ED50->ETRS89 (`#2261 <https://github.com/OSGeo/issues/2261>`_)
* Register Spanish SPED2ETV2 grid for ED50->ETRS89 (`#2261 <https://github.com/OSGeo/PROJ/issues/2261>`_)
+ **API**
* Add API function :c:func:`proj_get_units_from_database()` (`#2065 <https://github.com/OSGeo/issues/2065>`_)
* Add API function :c:func:`proj_get_units_from_database()` (`#2065 <https://github.com/OSGeo/PROJ/issues/2065>`_)
* Add API function :c:func:`proj_get_suggested_operation()` (`#2068 <https://github.com/OSGeo/issues/2068>`_)
* Add API function :c:func:`proj_get_suggested_operation()` (`#2068 <https://github.com/OSGeo/PROJ/issues/2068>`_)
* Add API functions :c:func:`proj_degree_input()` and :c:func:`proj_degree_output()` (`#2144 <https://github.com/OSGeo/issues/2144>`_)
* Add API functions :c:func:`proj_degree_input()` and :c:func:`proj_degree_output()` (`#2144 <https://github.com/OSGeo/PROJ/issues/2144>`_)
* Moved :c:func:`proj_context_get_url_endpoint()` & :c:func:`proj_context_get_user_writable_directory()`
from ``proj_experimental.h`` to ``proj.h`` (`#2162 <https://github.com/OSGeo/issues/2162>`_)
from ``proj_experimental.h`` to ``proj.h`` (`#2162 <https://github.com/OSGeo/PROJ/issues/2162>`_)
* :c:func:`createFromUserInput()`: allow compound CRS with the 2 parts given by names,
e.g. 'WGS 84 + EGM96 height' (`#2126 <https://github.com/OSGeo/issues/2126>`_)
e.g. 'WGS 84 + EGM96 height' (`#2126 <https://github.com/OSGeo/PROJ/issues/2126>`_)
* :c:func:`createOperations()`: when converting CompoundCRS<-->Geographic3DCrs, do not
use discard change of ellipsoidal height if a Helmert transformation is
involved (`#2227 <https://github.com/OSGeo/issues/2227>`_)
involved (`#2227 <https://github.com/OSGeo/PROJ/issues/2227>`_)
+ **Optimizations**
* ``tmerc/utm``: add a +algo=auto/evenden_snyder/poder_engsager parameter (`#2030 <https://github.com/OSGeo/issues/2030>`_)
* ``tmerc/utm``: add a +algo=auto/evenden_snyder/poder_engsager parameter (`#2030 <https://github.com/OSGeo/PROJ/issues/2030>`_)
* Extended ``tmerc`` (Poder/Engsager): speed optimizations (`#2036 <https://github.com/OSGeo/issues/2036>`_)
* Extended ``tmerc`` (Poder/Engsager): speed optimizations (`#2036 <https://github.com/OSGeo/PROJ/issues/2036>`_)
* Approximate ``tmerc`` (Snyder): speed optimizations (`#2039 <https://github.com/OSGeo/issues/2039>`_)
* Approximate ``tmerc`` (Snyder): speed optimizations (`#2039 <https://github.com/OSGeo/PROJ/issues/2039>`_)
* :c:func:`pj_phi2()`: speed-up computation (and thus inverse ellipsoidal Mercator and LCC) (`#2052 <https://github.com/OSGeo/issues/2052>`_)
* :c:func:`pj_phi2()`: speed-up computation (and thus inverse ellipsoidal Mercator and LCC) (`#2052 <https://github.com/OSGeo/PROJ/issues/2052>`_)
* Inverse ``cart``: speed-up computation by 33% (`#2145 <https://github.com/OSGeo/issues/2145>`_)
* Inverse ``cart``: speed-up computation by 33% (`#2145 <https://github.com/OSGeo/PROJ/issues/2145>`_)
* Extended ``tmerc``: speed-up forward path by ~5% (`#2147 <https://github.com/OSGeo/issues/2147>`_)
* Extended ``tmerc``: speed-up forward path by ~5% (`#2147 <https://github.com/OSGeo/PROJ/issues/2147>`_)
+ **Various**
* Follow PDAL's CMake RPATH strategy (`#2009 <https://github.com/OSGeo/issues/2009>`_)
* Follow PDAL's CMake RPATH strategy (`#2009 <https://github.com/OSGeo/PROJ/issues/2009>`_)
* WKT import/export: add support for WKT1_ESRI VERTCS synta (`#2024 <https://github.com/OSGeo/issues/2024>`_)
* WKT import/export: add support for WKT1_ESRI VERTCS synta (`#2024 <https://github.com/OSGeo/PROJ/issues/2024>`_)
* :program:`projinfo`: add a ``--hide-ballpark`` option (`#2127 <https://github.com/OSGeo/issues/2127>`_)
* :program:`projinfo`: add a ``--hide-ballpark`` option (`#2127 <https://github.com/OSGeo/PROJ/issues/2127>`_)
* :program:`gie`: implement a strict mode with ``<gie-strict> </gie-strict>`` (`#2168 <https://github.com/OSGeo/issues/2168>`_)
* :program:`gie`: implement a strict mode with ``<gie-strict> </gie-strict>`` (`#2168 <https://github.com/OSGeo/PROJ/issues/2168>`_)
* Allow importing WKT1 COMPD_CS with a VERT_DATUM[Ellipsoid,2002] (`#2229 <https://github.com/OSGeo/issues/2229>`_)
* Allow importing WKT1 COMPD_CS with a VERT_DATUM[Ellipsoid,2002] (`#2229 <https://github.com/OSGeo/PROJ/issues/2229>`_)
* Add runtime checking that sqlite3 is >= 3.11 (`#2235 <https://github.com/OSGeo/issues/2235>`_)
* Add runtime checking that sqlite3 is >= 3.11 (`#2235 <https://github.com/OSGeo/PROJ/issues/2235>`_)
Bug fixes
---------
* :cpp:func:`createOperations()`: do not remove ballpark transformation if there are only grid
based operations, even if they cover the whole area of use (`#2155 <https://github.com/OSGeo/issues/2155>`_)
based operations, even if they cover the whole area of use (`#2155 <https://github.com/OSGeo/PROJ/issues/2155>`_)
* :cpp:func:`createFromProjString()`: handle default parameters of '+krovak +type=crs', and
handle ``+czech`` correctly (`#2200 <https://github.com/OSGeo/issues/2200>`_)
handle ``+czech`` correctly (`#2200 <https://github.com/OSGeo/PROJ/issues/2200>`_)
* :cpp:func:`ProjectedCRS::identify()`: fix identification of EPSG:3059 (`#2215 <https://github.com/OSGeo/issues/2215>`_)
* :cpp:func:`ProjectedCRS::identify()`: fix identification of EPSG:3059 (`#2215 <https://github.com/OSGeo/PROJ/issues/2215>`_)
* Database: add a 'WGS84' alias for the EPSG:4326 CRS (`#2218 <https://github.com/OSGeo/issues/2218>`_)
* Database: add a 'WGS84' alias for the EPSG:4326 CRS (`#2218 <https://github.com/OSGeo/PROJ/issues/2218>`_)
* Fixes related to CompoundCRS and BoundCRS (`#2222 <https://github.com/OSGeo/issues/2222>`_)
* Fixes related to CompoundCRS and BoundCRS (`#2222 <https://github.com/OSGeo/PROJ/issues/2222>`_)
* Avoid 2 warnings about missing database indices (`#2223 <https://github.com/OSGeo/issues/2223>`_)
* Avoid 2 warnings about missing database indices (`#2223 <https://github.com/OSGeo/PROJ/issues/2223>`_)
* Make ``projinfo --3d --boundcrs-to-wgs84`` work better (`#2224 <https://github.com/OSGeo/issues/2224>`_)
* Make ``projinfo --3d --boundcrs-to-wgs84`` work better (`#2224 <https://github.com/OSGeo/PROJ/issues/2224>`_)
* Many fixes regarding BoundCRS, CompoundCRS, Geographic3D CRS with
non-metre units (`#2234 <https://github.com/OSGeo/issues/2234>`_)
non-metre units (`#2234 <https://github.com/OSGeo/PROJ/issues/2234>`_)
* Fix identification of (one of the) ESRI WKT formulations of EPSG:3035 (`#2240 <https://github.com/OSGeo/issues/2240>`_)
* Fix identification of (one of the) ESRI WKT formulations of EPSG:3035 (`#2240 <https://github.com/OSGeo/PROJ/issues/2240>`_)
* Avoid using deprecated and removed Windows API function with Mingw32 (`#2246 <https://github.com/OSGeo/issues/2246>`_)
* Avoid using deprecated and removed Windows API function with Mingw32 (`#2246 <https://github.com/OSGeo/PROJ/issues/2246>`_)
* :cpp:func:`normalizeForVisualization()`: make it switch axis for EPSG:5482
(RSRGD2000 / RSPS2000) (`#2256 <https://github.com/OSGeo/issues/2256>`_)
(RSRGD2000 / RSPS2000) (`#2256 <https://github.com/OSGeo/PROJ/issues/2256>`_)
* Fix access violation in :c:func:`proj_context_get_database_metadata()` (`#2260 <https://github.com/OSGeo/issues/2260>`_)
* Fix access violation in :c:func:`proj_context_get_database_metadata()` (`#2260 <https://github.com/OSGeo/PROJ/issues/2260>`_)
7.0.1 Release Notes
+1 -1
View File
@@ -21,7 +21,7 @@ Convert geodetic coordinates to cartesian coordinates (in the forward path).
This conversion converts geodetic coordinate values (longitude, latitude,
elevation above ellipsoid) to their geocentric (X, Y, Z) representation, where
the first axis (X) points from the Earth centre to the point of longitude=0,
latitude=0, the second axis (Y) points from the Earth centrer to the point of
latitude=0, the second axis (Y) points from the Earth centre to the point of
longitude=90, latitude=0 and the third axis (Z) points to the North pole.
Usage
@@ -27,7 +27,7 @@ This document is meant as a plain text explanation of the code for developers,
but also as a in-depth examination of what happens under the hood for curious PROJ
users. It is important to keep in mind that it is not meant to be the ultimate
source of truth of how coordinate operations should be computed. There are clearly
implementation choices and compromises that can be questionned.
implementation choices and compromises that can be questioned.
Let us start with an example to research operations between the NAD27 and NAD83
geographic CRS:
@@ -123,7 +123,7 @@ must be retained or discarded:
The sorting algorithm determines the order of relevance of the operations we got.
A comparison function compares pair of operations to determine which of the
two is the most releavant. This is implemented by the :cpp:func:`operator ()`
two is the most relevant. This is implemented by the :cpp:func:`operator ()`
method of the SortFunction structure.
When comparing two operations, the following criteria are used. The tests are
performed in the order they are listed below:
@@ -163,7 +163,7 @@ In a number of situations, the source and/or target CRS do not have an identifie
The first step is to try to find in the ``proj.db`` a CRS of the same nature of
the CRS to identify and whose name exactly matches the one provided to the
:c:func:`createOperations` method. If there is exactly one match and that the CRS are
"computationnaly" equivalent, then use the code of the CRS for further computations.
"computationally" equivalent, then use the code of the CRS for further computations.
If this search did not succeed, or if the previous case with known CRS identifiers
did not result in matches in the database, the search will be based on the
@@ -195,7 +195,7 @@ one can define a geographic 2D CRS (latitude, longitude), a geographic 3D crs
case, the EPSG dataset has also included two extra definitions corresponding to a
longitude, latitude, [ellipsoidal height] coordinate system, as found in the official
French IGNF registry. This IGNF registry has also definitions for a geographic 2D
CRS (with an extra subtelty with an entry using decimal degree as unit and another
CRS (with an extra subtlety with an entry using decimal degree as unit and another
one degree-minute-second), geographic 3D and geocentric.
For EPSG:6258, there are 7 matching (non-deprecated) geodetic CRSs:
+5 -1
View File
@@ -43,7 +43,9 @@ Parameters
.. option:: +orient=<string>
Can be set to either ``isea`` or ``pole``.
Can be set to either ``isea`` or ``pole``. See Snyder's Figure 12 for pole orientation :cite:`Snyder1992`.
*Defaults to isea*
.. option:: +azi=<value>
@@ -62,6 +64,8 @@ Parameters
.. option:: +mode=<string>
Can be either ``plane``, ``di``, ``dd`` or ``hex``.
*Defaults to plane*
.. include:: ../options/lon_0.rst
+2 -2
View File
@@ -6,7 +6,7 @@ Universal Transverse Mercator (UTM)
The Universal Transverse Mercator is a system of map projections divided into
sixty zones across the globe, with each zone corresponding to 6 degrees of
longigude.
longitude.
+---------------------+----------------------------------------------------------+
| **Classification** | Transverse cylindrical, conformal |
@@ -37,7 +37,7 @@ to which specific parameters, such as central meridians, have been applied.
The Earth is divided into 60 zones each generally 6° wide in longitude.
Bounding meridians are evenly divisible by 6°, and zones are
numbered from 1 to 60 proceeding east from the 180th meridian from Greenwich
with minor exceptions [Snyder1987]_.
with minor exceptions :cite:`Snyder1987`.
Usage
#####
@@ -64,7 +64,7 @@ Parameters
Mathematical definition
#######################
The formulas describing the Mercator projection are all taken from G. Evenden's libproj manuals [Evenden2005]_.
The formulas describing the Mercator projection are all taken from G. Evenden's libproj manuals :cite:`Evenden2005`.
Forward projection
==================
@@ -7,7 +7,7 @@ Affine transformation
.. versionadded:: 6.0.0
The affine transformation applies translation and scaling/rotation terms on the
x,y,z coordinates, and translation and scaling on the temporal cordinate.
x,y,z coordinates, and translation and scaling on the temporal coordinate.
+---------------------+----------------------------------------------------------+
| **Alias** | affine |
@@ -56,7 +56,7 @@ Required
Example
-------------------------------------------------------------------------------
Transformating a point with the LINZ NZGD2000 deformation model:
Transforming a point with the LINZ NZGD2000 deformation model:
::
@@ -167,7 +167,7 @@ represented as a grid of velocities in three dimensions. Coordinate corrections
applied in cartesian space. For a given coordinate, :math:`(X, Y, Z)`, velocities
:math:`(V_X, V_Y, V_Z)` can be interpolated from the gridded model. The time span
between :math:`t_{obs}` and :math:`t_c` determine the magnitude of the coordinate
correcton as seen in eq. :eq:`apply_velocity` below.
correction as seen in eq. :eq:`apply_velocity` below.
.. math::
:label: apply_velocity
@@ -349,7 +349,7 @@ For :math:`\mathbf{R}`, this yields:
\end{bmatrix}
Using the small angle approxition the rotation matrix can be simplified to
Using the small angle approximation the rotation matrix can be simplified to
.. math::
:label: rot_approx
@@ -17,7 +17,7 @@ Horner polynomial evaluation
+-----------------+-------------------------------------------------------------------+
The Horner polynomial evaluation scheme is used for transformations between reference
frames where one or both are inhomogenous or internally distorted. This will typically
frames where one or both are inhomogeneous or internally distorted. This will typically
be reference frames created before the introduction of space geodetic techniques such
as GPS.
@@ -43,7 +43,7 @@ Required
Example
-------------------------------------------------------------------------------
Transformating a point with the Finland EPSG:2393 ("KKJ / Finland Uniform
Transforming a point with the Finland EPSG:2393 ("KKJ / Finland Uniform
Coordinate System") projected CRS to EPSG:3067 ("ETRS89 / TM35FIN(E,N)")
::
@@ -126,7 +126,7 @@ Optional
Z_{target} = Z_{source} + multiplier \times gridvalue
The multiplier can be used to control whether the gridvalue should be added
or sustracted, and if unit conversion must be done (the multiplied gridvalue
or subtracted, and if unit conversion must be done (the multiplied gridvalue
must be expressed in metre).
Note that the default is `-1.0` for historical reasons.
+7 -7
View File
@@ -151,7 +151,7 @@ proj-datumgrid
series of packages are not maintained anymore and are only kept available for
legacy purposes.
For a functioning builds of PROJ prior to version 7, installation of the
For a functioning build of PROJ prior to version 7, installation of the
`proj-datumgrid <https://github.com/OSGeo/proj-datumgrid>`_ is needed. If you
have installed PROJ from a package system chances are that this will already be
done for you. The *proj-datumgrid* package provides transformation grids that
@@ -197,7 +197,7 @@ includes grids that have global extent, e.g. the global geoid model EGM08.
All packages above come in different versions, e.g proj-datumgrid-1.8 or
proj-datumgrid-europe-1.4. The `-latest` packages are symbolic links to the
latest version of a given packages. That means that the link
latest version of a given package. That means that the link
https://download.osgeo.org/proj/proj-datumgrid-north-america-latest.zip is
equivalent to https://download.osgeo.org/proj/proj-datumgrid-north-america-1.2.zip
(as of the time of writing this).
@@ -278,7 +278,7 @@ than one foot over the last two decades).
Getting and building HTDP
................................................................................
The HTDP modelling program is in written FORTRAN. The source and documentation
The HTDP modelling program is written in FORTRAN. The source and documentation
can be found on the HTDP page at http://www.ngs.noaa.gov/TOOLS/Htdp/Htdp.shtml
On linux systems it will be necessary to install `gfortran` or some FORTRAN
@@ -322,10 +322,10 @@ Usage
[-htdp <path_to_exe>] [-wrkdir <dirpath>] [-kwf]
-o <output_grid_name>
-griddef: by default the following values for roughly the continental USA
at a six minute step size are used:
-127 50 -66 25 251 611
-kwf: keep working files in the working directory for review.
-griddef: by default the following values for roughly the continental USA
at a six minute step size are used:
-127 50 -66 25 251 611
-kwf: keep working files in the working directory for review.
::
+10
View File
@@ -155,6 +155,11 @@ class PROJ_GCC_DLL CRS : public common::ObjectUsage,
const;
PROJ_INTERNAL bool hasImplicitCS() const;
PROJ_INTERNAL static CRSNNPtr
getResolvedCRS(const CRSNNPtr &crs,
const io::AuthorityFactoryPtr &authFactory,
metadata::ExtentPtr &extentOut);
//! @endcond
protected:
@@ -335,6 +340,11 @@ class PROJ_GCC_DLL GeodeticCRS : virtual public SingleCRS,
PROJ_INTERNAL std::list<std::pair<CRSNNPtr, int>>
_identify(const io::AuthorityFactoryPtr &authorityFactory) const override;
PROJ_INTERNAL bool
_isEquivalentToNoTypeCheck(const util::IComparable *other,
util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const;
INLINED_MAKE_SHARED
private:
-3
View File
@@ -1,9 +1,6 @@
SUBDIRS = nlohmann
noinst_HEADERS = \
coordinateoperation_constants.hpp \
coordinateoperation_internal.hpp \
esri_projection_mappings.hpp \
coordinatesystem_internal.hpp \
internal.hpp \
io_internal.hpp \
+4
View File
@@ -342,6 +342,10 @@ class PROJ_GCC_DLL WKTFormatter {
PROJ_INTERNAL void ingestWKTNode(const WKTNodeNNPtr &node);
PROJ_INTERNAL WKTFormatter &
setAllowEllipsoidalHeightAsVerticalCRS(bool allow) noexcept;
PROJ_INTERNAL bool isAllowedEllipsoidalHeightAsVerticalCRS() const noexcept;
//! @endcond
protected:
+8
View File
@@ -213,6 +213,14 @@ template <typename T> using nn_shared_ptr = nn<std::shared_ptr<T>>;
// To avoid formatting differences between clang-format 3.8 and 7
#define PROJ_NOEXCEPT noexcept
//! @cond Doxygen_Suppress
// isOfExactType<MyType>(*p) checks that the type of *p is exactly MyType
template <typename TemplateT, typename ObjectT>
inline bool isOfExactType(const ObjectT &o) {
return typeid(TemplateT).hash_code() == typeid(o).hash_code();
}
//! @endcond
/** \brief Loose transposition of [std::optional]
* (https://en.cppreference.com/w/cpp/utility/optional) available from C++17. */
template <class T> class optional {
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
.TH "CCT" "1" "Nov 01, 2020" "7.2.0" "PROJ"
.TH "CCT" "1" "Dec 25, 2020" "7.2.1" "PROJ"
.SH NAME
cct \- Coordinate Conversion and Transformation
.
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
.TH "CS2CS" "1" "Nov 01, 2020" "7.2.0" "PROJ"
.TH "CS2CS" "1" "Dec 25, 2020" "7.2.1" "PROJ"
.SH NAME
cs2cs \- Cartographic coordinate system filter
.
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
.TH "GEOD" "1" "Nov 01, 2020" "7.2.0" "PROJ"
.TH "GEOD" "1" "Dec 25, 2020" "7.2.1" "PROJ"
.SH NAME
geod \- Geodesic computations
.
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
.TH "GIE" "1" "Nov 01, 2020" "7.2.0" "PROJ"
.TH "GIE" "1" "Dec 25, 2020" "7.2.1" "PROJ"
.SH NAME
gie \- The Geospatial Integrity Investigation Environment
.
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
.TH "PROJ" "1" "Nov 01, 2020" "7.2.0" "PROJ"
.TH "PROJ" "1" "Dec 25, 2020" "7.2.1" "PROJ"
.SH NAME
proj \- Cartographic projection filter
.
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
.TH "PROJINFO" "1" "Nov 01, 2020" "7.2.0" "PROJ"
.TH "PROJINFO" "1" "Dec 25, 2020" "7.2.1" "PROJ"
.SH NAME
projinfo \- Geodetic object and coordinate operation queries
.
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
.TH "PROJSYNC" "1" "Nov 01, 2020" "7.2.0" "PROJ"
.TH "PROJSYNC" "1" "Dec 25, 2020" "7.2.1" "PROJ"
.SH NAME
projsync \- Downloading tool of resource files
.
+5
View File
@@ -401,6 +401,9 @@ def fill_helmert_transformation(proj_db_cursor):
assert param_code[6] == 8611
assert param_uom_code[3] == param_uom_code[4]
assert param_uom_code[3] == param_uom_code[5]
for i in range(7):
assert param_uom_code[i] is not None
if n_params == 8: # Time-specific transformation
assert param_code[7] == 1049, (code, name, param_code[7])
param_value[14] = param_value[7]
@@ -438,6 +441,8 @@ def fill_helmert_transformation(proj_db_cursor):
assert param_uom_code[7] == param_uom_code[9]
assert param_uom_code[10] == param_uom_code[11]
assert param_uom_code[10] == param_uom_code[12]
for i in range(15):
assert param_uom_code[i] is not None, (code, name, i, param_name[i])
arg = (EPSG_AUTHORITY, code, name,
remarks,
+48 -16
View File
@@ -751,7 +751,19 @@ def generate_mapping(WKT2_name, esri_proj_name, Params, suffix=''):
all_projs.append([esri_proj_name, WKT2_name_s, c_name])
else:
all_projs.append([esri_proj_name, WKT2_name, c_name])
print('static const ESRIParamMapping %s[] = { ' % c_name)
qualifier = 'static '
if c_name in ('paramsESRI_Plate_Carree',
'paramsESRI_Equidistant_Cylindrical',
'paramsESRI_Gauss_Kruger',
'paramsESRI_Transverse_Mercator',
'paramsESRI_Hotine_Oblique_Mercator_Azimuth_Natural_Origin',
'paramsESRI_Rectified_Skew_Orthomorphic_Natural_Origin',
'paramsESRI_Hotine_Oblique_Mercator_Azimuth_Center',
'paramsESRI_Rectified_Skew_Orthomorphic_Center'):
qualifier = ''
print(qualifier + 'const ESRIParamMapping %s[] = { ' % c_name)
for param in Params:
for param_name in param:
param_value = param[param_name]
@@ -803,25 +815,23 @@ print("""
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#ifndef FROM_COORDINATE_OPERATION_CPP
#error This file should only be included from coordinateoperation.cpp
#ifndef FROM_PROJ_CPP
#define FROM_PROJ_CPP
#endif
#ifndef ESRI_PROJECTION_MAPPINGS_HH_INCLUDED
#define ESRI_PROJECTION_MAPPINGS_HH_INCLUDED
#include "esriparammappings.hpp"
#include "proj_constants.h"
#include "coordinateoperation_internal.hpp"
#include "proj/internal/internal.hpp"
NS_PROJ_START
using namespace internal;
namespace operation {
//! @cond Doxygen_Suppress
// ---------------------------------------------------------------------------
// anonymous namespace
namespace {
using namespace ::NS_PROJ;
using namespace ::NS_PROJ::operation;
""")
for item in config:
@@ -841,6 +851,7 @@ for item in config:
count += 1
print('')
print('static const ESRIMethodMapping esriMappings[] = {')
for esri_proj_name, WKT2_name, c_name in all_projs:
if WKT2_name.startswith('EPSG_'):
@@ -852,11 +863,32 @@ for esri_proj_name, WKT2_name, c_name in all_projs:
print('};')
print("""
// ---------------------------------------------------------------------------
} // namespace {
const ESRIMethodMapping *getEsriMappings(size_t &nElts) {
nElts = sizeof(esriMappings) / sizeof(esriMappings[0]);
return esriMappings;
}
// ---------------------------------------------------------------------------
std::vector<const ESRIMethodMapping *>
getMappingsFromESRI(const std::string &esri_name) {
std::vector<const ESRIMethodMapping *> res;
for (const auto &mapping : esriMappings) {
if (ci_equal(esri_name, mapping.esri_name)) {
res.push_back(&mapping);
}
}
return res;
}
//! @endcond
#endif // ESRI_PROJECTION_MAPPINGS_HH_INCLUDED
// ---------------------------------------------------------------------------
} // namespace operation
NS_PROJ_END
""")
+12 -24
View File
@@ -18,6 +18,15 @@ TOPDIR="$SCRIPT_DIR/.."
pushd "${TOPDIR}" > /dev/null || exit
doxygen_version_cmd=$(doxygen --version)
# remove extra info after space
doxygen_version=${doxygen_version_cmd%% *}
echo "Doxygen version $doxygen_version"
if test $doxygen_version = "1.8.17" ; then
echo "Doxygen 1.8.17 is incompatible" && /bin/false;
fi
# HTML generation
# Check that doxygen runs warning free
rm -rf docs/build/html/
@@ -30,40 +39,19 @@ else
fi
# XML generation (for Breathe)
mkdir -p docs/build/tmp_breathe
python scripts/generate_breathe_friendly_general_doc.py
rm -rf docs/build/xml/
# Ugly hack to workaround a bug of Doxygen 1.8.17 that erroneously detect proj_network_get_header_value_cbk_type/ as a variable
sed "s/const char\* (\*proj_network_get_header_value_cbk_type/CONST_CHAR\* (\*proj_network_get_header_value_cbk_type/" < src/proj.h > docs/build/tmp_breathe/proj.h
(cat Doxyfile; printf "GENERATE_HTML=NO\nGENERATE_XML=YES\nINPUT= src/iso19111 include/proj docs/build/tmp_breathe/proj.h src/filemanager.cpp src/networkfilemanager.cpp docs/build/tmp_breathe/general_doc.dox.reworked.h") | doxygen - > docs/build/tmp_breathe/docs_log.txt 2>&1
if grep -i warning docs/build/tmp_breathe/docs_log.txt; then
echo "Doxygen warnings found" && cat docs/build/tmp_breathe/docs_log.txt && /bin/false;
(cat Doxyfile; printf "GENERATE_HTML=NO\nGENERATE_XML=YES\nINPUT= src/iso19111 src/iso19111/operation include/proj src/proj.h src/filemanager.cpp src/networkfilemanager.cpp src/general_doc.dox") | doxygen - > docs/build/docs_log.txt 2>&1
if grep -i warning docs/build/docs_log.txt; then
echo "Doxygen warnings found" && cat docs/build/docs_log.txt && /bin/false;
else
echo "No Doxygen warnings found";
fi
for i in ${TOPDIR}/docs/build/xml/*; do
# Fix Breathe error on Doxygen XML
# Type must be either just a name or a typedef-like declaration.
# If just a name:
# Invalid definition: Expected end of definition. [error at 32]
# osgeo::proj::common::MeasurePtr = typedef std::shared_ptr<Measure>
sed "s/ = typedef /=/g" < $i > $i.tmp;
mv $i.tmp $i
done
# There is a confusion for Breathe between PROJStringFormatter::Convention and WKTFormatter:Convention
sed "s/Convention/Convention_/g" < ${TOPDIR}/docs/build/xml/classosgeo_1_1proj_1_1io_1_1WKTFormatter.xml | sed "s/WKT2_2018/_WKT2_2018/g" | sed "s/WKT2_2019/_WKT2_2019/g" | sed "s/WKT2_2015/_WKT2_2015/g" | sed "s/WKT1_GDAL/_WKT1_GDAL/g" | sed "s/WKT1_ESRI/_WKT1_ESRI/g" > ${TOPDIR}/docs/build/xml/classosgeo_1_1proj_1_1io_1_1WKTFormatter.xml.tmp
mv ${TOPDIR}/docs/build/xml/classosgeo_1_1proj_1_1io_1_1WKTFormatter.xml.tmp ${TOPDIR}/docs/build/xml/classosgeo_1_1proj_1_1io_1_1WKTFormatter.xml
# Ugly hack to workaround a bug of Doxygen 1.8.17 that erroneously detect proj_network_get_header_value_cbk_type/ as a variable
sed "s/CONST_CHAR/const char/" < ${TOPDIR}/docs/build/xml/proj_8h.xml > ${TOPDIR}/docs/build/xml/proj_8h.xml.tmp
mv ${TOPDIR}/docs/build/xml/proj_8h.xml.tmp ${TOPDIR}/docs/build/xml/proj_8h.xml
# Hack for Breathe 4.17.0 issue that is confused by osgeo::proj::common::UnitOfMeasure::Type::NONE (enumeration value of Type) and osgeo::proj::common::UnitOfMeasure::NONE (member value), whereas 4.16.0 works fine.
# Filed as https://github.com/michaeljones/breathe/issues/518
sed "s/ <name>NONE<\/name>/ <name>Type::NONE<\/name>/" < ${TOPDIR}/docs/build/xml/classosgeo_1_1proj_1_1common_1_1UnitOfMeasure.xml > ${TOPDIR}/docs/build/xml/classosgeo_1_1proj_1_1common_1_1UnitOfMeasure.xml.tmp
@@ -1,130 +0,0 @@
#!/usr/bin/env python
###############################################################################
# $Id$
#
# Project: PROJ
# Purpose: Rework general_doc.dox in a Breathe friendly (hacky) way
# Author: Even Rouault <even.rouault at spatialys.com>
#
###############################################################################
# Copyright (c) 2018, Even Rouault <even.rouault at spatialys.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
###############################################################################
import os
# HACK HACK HACK
# Transform a .dox with section, subsection, etc.. in fake namespaces
# since Breathe cannot handle such sections and references to them
script_dir_name = os.path.dirname(os.path.realpath(__file__))
general_doc_dox = os.path.join(os.path.dirname(
script_dir_name), 'src', 'general_doc.dox')
general_doc_dox_reworked_h = os.path.join(os.path.dirname(
script_dir_name), 'docs/build/tmp_breathe', 'general_doc.dox.reworked.h')
out = open(general_doc_dox_reworked_h, 'wt')
class Section:
def __init__(self):
self.name = None
self.title = None
self.content = ''
self.children = []
pass
def serialize(self, out):
out.write("/** \\brief %s\n" % self.title)
out.write("\n")
out.write("%s\n" % self.content)
out.write("*/\n")
out.write("namespace %s {\n" % self.name)
out.write("}\n")
for child in self.children:
child.serialize(out)
stack = []
current = None
for line in open(general_doc_dox, 'rt').readlines():
line = line.strip()
if line == '/*!' or line == '*/':
continue
if line.startswith('\page'):
tokens = line.split(' ')
new = Section()
new.name = tokens[1]
new.title = ' '.join(tokens[2:])
current = new
stack.append(new)
continue
if line.startswith('\section'):
stack = stack[0:1]
current = stack[-1]
tokens = line.split(' ')
new = Section()
new.name = tokens[1]
new.title = ' '.join(tokens[2:])
current.children.append(new)
current = new
stack.append(new)
continue
if line.startswith('\subsection'):
stack = stack[0:2]
current = stack[-1]
tokens = line.split(' ')
new = Section()
new.name = tokens[1]
new.title = ' '.join(tokens[2:])
current.children.append(new)
current = new
stack.append(new)
continue
if line.startswith('\subsubsection'):
stack = stack[0:3]
current = stack[-1]
tokens = line.split(' ')
new = Section()
new.name = tokens[1]
new.title = ' '.join(tokens[2:])
current.children.append(new)
current = new
stack.append(new)
continue
if current:
current.content += line + '\n'
for child in stack[0].children:
child.serialize(out)
+4 -1
View File
@@ -16,7 +16,10 @@ esac
TOPDIR="$SCRIPT_DIR/.."
for i in "$TOPDIR"/include/proj/*.hpp "$TOPDIR"/include/proj/internal/*.hpp \
"$TOPDIR"/src/iso19111/*.cpp "$TOPDIR"/test/unit/*.cpp \
"$TOPDIR"/src/iso19111/*.cpp \
"$TOPDIR"/src/iso19111/operation/*.cpp \
"$TOPDIR"/src/iso19111/operation/*.hpp \
"$TOPDIR"/test/unit/*.cpp \
"$TOPDIR"/src/apps/projinfo.cpp "$TOPDIR"/src/apps/projsync.cpp \
"$TOPDIR"/src/tracing.cpp "$TOPDIR"/src/grids.hpp "$TOPDIR"/src/grids.cpp \
"$TOPDIR"/src/filemanager.hpp "$TOPDIR"/src/filemanager.cpp \
+18 -2
View File
@@ -52,7 +52,7 @@ geodtest_LDADD = libproj.la
lib_LTLIBRARIES = libproj.la
libproj_la_LDFLAGS = -no-undefined -version-info 21:0:2
libproj_la_LDFLAGS = -no-undefined -version-info 21:1:2
libproj_la_LIBADD = @SQLITE3_LIBS@ @TIFF_LIBS@ @CURL_LIBS@
libproj_la_SOURCES = \
@@ -65,7 +65,23 @@ libproj_la_SOURCES = \
iso19111/crs.cpp \
iso19111/datum.cpp \
iso19111/coordinatesystem.cpp \
iso19111/coordinateoperation.cpp \
iso19111/operation/concatenatedoperation.cpp \
iso19111/operation/coordinateoperation_internal.hpp \
iso19111/operation/coordinateoperation_private.hpp \
iso19111/operation/coordinateoperationfactory.cpp \
iso19111/operation/conversion.cpp \
iso19111/operation/esriparammappings.hpp \
iso19111/operation/esriparammappings.cpp \
iso19111/operation/operationmethod_private.hpp \
iso19111/operation/oputils.hpp \
iso19111/operation/oputils.cpp \
iso19111/operation/parammappings.hpp \
iso19111/operation/parammappings.cpp \
iso19111/operation/projbasedoperation.cpp \
iso19111/operation/singleoperation.cpp \
iso19111/operation/transformation.cpp \
iso19111/operation/vectorofvaluesparams.hpp \
iso19111/operation/vectorofvaluesparams.cpp \
iso19111/io.cpp \
iso19111/internal.cpp \
iso19111/factory.cpp \
+15 -3
View File
@@ -385,12 +385,22 @@ int main(int argc, char **argv) {
colmax = MAX(colmax, columns_xyzt[i]);
comment = column(buf, colmax+1);
}
/* remove the line feed from comment, as logger() above, invoked
by print() below (output), will add one */
size_t len = strlen(comment);
if (len >= 1)
comment[len - 1] = '\0';
comment_delimiter = (comment && *comment) ? whitespace : blank_comment;
/* Time to print the result */
if (proj_angular_output (P, direction)) {
point.lpzt.lam = proj_todeg (point.lpzt.lam);
point.lpzt.phi = proj_todeg (point.lpzt.phi);
/* use same arguments to printf format string for both radians and
degrees; convert radians to degrees before printing */
if (proj_angular_output (P, direction) ||
proj_degree_output (P, direction)) {
if (proj_angular_output (P, direction)) {
point.lpzt.lam = proj_todeg (point.lpzt.lam);
point.lpzt.phi = proj_todeg (point.lpzt.phi);
}
print (PJ_LOG_NONE, "%14.*f %14.*f %12.*f %12.4f%s%s",
decimals_angles, point.xyzt.x,
decimals_angles, point.xyzt.y,
@@ -405,6 +415,8 @@ int main(int argc, char **argv) {
decimals_distances, point.xyzt.z,
point.xyzt.t, comment_delimiter, comment
);
if( fout == stdout )
fflush(stdout);
}
proj_destroy(P);
+1
View File
@@ -217,6 +217,7 @@ static void process(FILE *fid)
printf("%s", s);
else
printf("\n");
fflush(stdout);
}
}
+1
View File
@@ -124,6 +124,7 @@ process(FILE *fid) {
(void)fputs(rtodms(pline, al21, 0, 0), stdout);
}
(void)fputs(s, stdout);
fflush(stdout);
}
}
+3
View File
@@ -171,6 +171,7 @@ static void process(FILE *fid) {
(void)fputs("\t<* * * * * *>", stdout);
}
(void)fputs(bin_in ? "\n" : s, stdout);
fflush(stdout);
}
}
@@ -286,6 +287,8 @@ static void vprocess(FILE *fid) {
(void)fputs(proj_rtodms(pline, facs.meridian_convergence, 0, 0), stdout);
(void)printf(" [ %.8f ]\n", facs.meridian_convergence * RAD_TO_DEG);
(void)printf("Max-min (Tissot axis a-b) scale error: %.5f %.5f\n\n", facs.tissot_semimajor, facs.tissot_semiminor);
fflush(stdout);
}
}
+14 -4
View File
@@ -689,6 +689,7 @@ static void outputOperations(
std::vector<CoordinateOperationNNPtr> list;
size_t spatialCriterionPartialIntersectionResultCount = 0;
bool spatialCriterionPartialIntersectionMoreRelevant = false;
try {
auto authFactory =
dbContext
@@ -714,10 +715,15 @@ static void outputOperations(
ctxt->setSpatialCriterion(
CoordinateOperationContext::SpatialCriterion::
PARTIAL_INTERSECTION);
spatialCriterionPartialIntersectionResultCount =
CoordinateOperationFactory::create()
->createOperations(nnSourceCRS, nnTargetCRS, ctxt)
.size();
auto list2 =
CoordinateOperationFactory::create()->createOperations(
nnSourceCRS, nnTargetCRS, ctxt);
spatialCriterionPartialIntersectionResultCount = list2.size();
if (spatialCriterionPartialIntersectionResultCount == 1 &&
list.size() == 1 &&
list2[0]->nameStr() != list[0]->nameStr()) {
spatialCriterionPartialIntersectionMoreRelevant = true;
}
} catch (const std::exception &) {
}
}
@@ -736,6 +742,10 @@ static void outputOperations(
"more results ("
<< spatialCriterionPartialIntersectionResultCount << ")"
<< std::endl;
} else if (spatialCriterionPartialIntersectionMoreRelevant) {
std::cout << "Note: using '--spatial-test intersects' would bring "
"more relevant results."
<< std::endl;
}
if (summary) {
for (const auto &op : list) {
+4
View File
@@ -15,3 +15,7 @@ install(TARGETS binprojinfo
if(MSVC AND BUILD_SHARED_LIBS)
target_compile_definitions(binprojinfo PRIVATE PROJ_MSVC_DLL_IMPORT=1)
endif()
if(CURL_ENABLED)
target_compile_definitions(binprojinfo PRIVATE -DCURL_ENABLED)
endif()
+33 -8
View File
@@ -1418,6 +1418,13 @@ const char *proj_get_id_code(const PJ *obj, int index) {
* variants, for WKT1_GDAL for ProjectedCRS with easting/northing ordering
* (otherwise stripped), but not for WKT1_ESRI. Setting to YES will output
* them unconditionally, and to NO will omit them unconditionally.</li>
* <li>STRICT=YES/NO. Default is YES. If NO, a Geographic 3D CRS can be for
* example exported as WKT1_GDAL with 3 axes, whereas this is normally not
* allowed.</li>
* <li>ALLOW_ELLIPSOIDAL_HEIGHT_AS_VERTICAL_CRS=YES/NO. Default is NO. If set
* to YES and type == PJ_WKT1_GDAL, a Geographic 3D CRS or a Projected 3D CRS
* will be exported as a compound CRS whose vertical part represents an
* ellipsoidal height (for example for use with LAS 1.4 WKT1).</li>
* </ul>
* @return a string, or NULL in case of error.
*/
@@ -1468,6 +1475,11 @@ const char *proj_as_wkt(PJ_CONTEXT *ctx, const PJ *obj, PJ_WKT_TYPE type,
}
} else if ((value = getOptionValue(*iter, "STRICT="))) {
formatter->setStrict(ci_equal(value, "YES"));
} else if ((value = getOptionValue(
*iter,
"ALLOW_ELLIPSOIDAL_HEIGHT_AS_VERTICAL_CRS="))) {
formatter->setAllowEllipsoidalHeightAsVerticalCRS(
ci_equal(value, "YES"));
} else {
std::string msg("Unknown option :");
msg += *iter;
@@ -2049,6 +2061,8 @@ PJ *proj_get_ellipsoid(PJ_CONTEXT *ctx, const PJ *obj) {
// ---------------------------------------------------------------------------
/** \brief Get the horizontal datum from a CRS
*
* This function may return a Datum or DatumEnsemble object.
*
* The returned object must be unreferenced with proj_destroy() after
* use.
@@ -4438,8 +4452,9 @@ PJ *proj_create_cartesian_2D_cs(PJ_CONTEXT *ctx, PJ_CARTESIAN_CS_2D_TYPE type,
*
* @param ctx PROJ context, or NULL for default context
* @param type Coordinate system type.
* @param unit_name Unit name.
* @param unit_conv_factor Unit conversion factor to SI.
* @param unit_name Name of the angular units. Or NULL for Degree
* @param unit_conv_factor Conversion factor from the angular unit to radian.
* Or 0 for Degree if unit_name == NULL. Otherwise should be not NULL
*
* @return Object that must be unreferenced with
* proj_destroy(), or NULL in case of error.
@@ -4478,13 +4493,17 @@ PJ *proj_create_ellipsoidal_2D_cs(PJ_CONTEXT *ctx,
*
* @param ctx PROJ context, or NULL for default context
* @param type Coordinate system type.
* @param horizontal_angular_unit_name Horizontal angular unit name.
* @param horizontal_angular_unit_conv_factor Horizontal angular unit conversion
* factor to SI.
* @param vertical_linear_unit_name Vertical linear unit name.
* @param horizontal_angular_unit_name Name of the angular units. Or NULL for
* Degree.
* @param horizontal_angular_unit_conv_factor Conversion factor from the angular
* unit to radian. Or 0 for Degree if horizontal_angular_unit_name == NULL.
* Otherwise should be not NULL
* @param vertical_linear_unit_name Vertical linear unit name. Or NULL for
* Metre.
* @param vertical_linear_unit_conv_factor Vertical linear unit conversion
* factor to SI.
*
* factor to metre. Or 0 for Metre if vertical_linear_unit_name == NULL.
* Otherwise should be not NULL
* @return Object that must be unreferenced with
* proj_destroy(), or NULL in case of error.
* @since 6.3
@@ -7986,6 +8005,9 @@ double proj_coordoperation_get_accuracy(PJ_CONTEXT *ctx,
// ---------------------------------------------------------------------------
/** \brief Returns the datum of a SingleCRS.
*
* If that function returns NULL, @see proj_crs_get_datum_ensemble() to
* potentially get a DatumEnsemble instead.
*
* The returned object must be unreferenced with proj_destroy() after
* use.
@@ -8017,6 +8039,9 @@ PJ *proj_crs_get_datum(PJ_CONTEXT *ctx, const PJ *crs) {
// ---------------------------------------------------------------------------
/** \brief Returns the datum ensemble of a SingleCRS.
*
* If that function returns NULL, @see proj_crs_get_datum() to
* potentially get a Datum instead.
*
* The returned object must be unreferenced with proj_destroy() after
* use.
File diff suppressed because it is too large Load Diff
+89 -11
View File
@@ -533,8 +533,12 @@ CRSNNPtr CRS::createBoundCRSToWGS84IfPossible(
auto authFactory = io::AuthorityFactory::create(
NN_NO_CHECK(dbContext),
authority == "any" ? std::string() : authority);
metadata::ExtentPtr extentResolved(extent);
if (!extent) {
getResolvedCRS(thisAsCRS, authFactory, extentResolved);
}
auto ctxt = operation::CoordinateOperationContext::create(
authFactory, extent, 0.0);
authFactory, extentResolved, 0.0);
ctxt->setAllowUseIntermediateCRS(allowIntermediateCRSUse);
// ctxt->setSpatialCriterion(
// operation::CoordinateOperationContext::SpatialCriterion::PARTIAL_INTERSECTION);
@@ -1616,6 +1620,34 @@ static bool exportAsESRIWktCompoundCRSWithEllipsoidalHeight(
vertCRSList.front()->_exportToWKT(formatter);
return true;
}
// ---------------------------------------------------------------------------
// Try to format a Geographic/ProjectedCRS 3D CRS as a
// GEOGCS[]/PROJCS[],VERTCS["Ellipsoid (metre)",DATUM["Ellipsoid",2002],...]
static bool exportAsWKT1CompoundCRSWithEllipsoidalHeight(
const CRSNNPtr &base2DCRS,
const cs::CoordinateSystemAxisNNPtr &verticalAxis,
io::WKTFormatter *formatter) {
std::string verticalCRSName = "Ellipsoid (";
verticalCRSName += verticalAxis->unit().name();
verticalCRSName += ')';
auto vertDatum = datum::VerticalReferenceFrame::create(
util::PropertyMap()
.set(common::IdentifiedObject::NAME_KEY, "Ellipsoid")
.set("VERT_DATUM_TYPE", "2002"));
auto vertCRS = VerticalCRS::create(
util::PropertyMap().set(common::IdentifiedObject::NAME_KEY,
verticalCRSName),
vertDatum.as_nullable(), nullptr,
cs::VerticalCS::create(util::PropertyMap(), verticalAxis));
formatter->startNode(io::WKTConstants::COMPD_CS, false);
formatter->addQuotedString(base2DCRS->nameStr() + " + " + verticalCRSName);
base2DCRS->_exportToWKT(formatter);
vertCRS->_exportToWKT(formatter);
formatter->endNode();
return true;
}
//! @endcond
// ---------------------------------------------------------------------------
@@ -1683,6 +1715,13 @@ void GeodeticCRS::_exportToWKT(io::WKTFormatter *formatter) const {
return;
}
if (formatter->isAllowedEllipsoidalHeightAsVerticalCRS()) {
if (exportAsWKT1CompoundCRSWithEllipsoidalHeight(
geogCRS2D, axisList[2], formatter)) {
return;
}
}
io::FormattingException::Throw(
"WKT1 does not support Geographic 3D CRS.");
}
@@ -1920,13 +1959,21 @@ getStandardCriterion(util::IComparable::Criterion criterion) {
//! @cond Doxygen_Suppress
bool GeodeticCRS::_isEquivalentTo(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const {
if (other == nullptr || !util::isOfExactType<GeodeticCRS>(*other)) {
return false;
}
return _isEquivalentToNoTypeCheck(other, criterion, dbContext);
}
bool GeodeticCRS::_isEquivalentToNoTypeCheck(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const {
const auto standardCriterion = getStandardCriterion(criterion);
auto otherGeodCRS = dynamic_cast<const GeodeticCRS *>(other);
// TODO test velocityModel
return otherGeodCRS != nullptr &&
SingleCRS::baseIsEquivalentTo(other, standardCriterion, dbContext);
return SingleCRS::baseIsEquivalentTo(other, standardCriterion, dbContext);
}
//! @endcond
@@ -2482,12 +2529,13 @@ bool GeographicCRS::is2DPartOf3D(util::nn<const GeographicCRS *> other,
bool GeographicCRS::_isEquivalentTo(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const {
auto otherGeogCRS = dynamic_cast<const GeographicCRS *>(other);
if (otherGeogCRS == nullptr) {
if (other == nullptr || !util::isOfExactType<GeographicCRS>(*other)) {
return false;
}
const auto standardCriterion = getStandardCriterion(criterion);
if (GeodeticCRS::_isEquivalentTo(other, standardCriterion, dbContext)) {
if (GeodeticCRS::_isEquivalentToNoTypeCheck(other, standardCriterion,
dbContext)) {
return true;
}
if (criterion !=
@@ -2506,7 +2554,29 @@ bool GeographicCRS::_isEquivalentTo(
cs::EllipsoidalCS::AxisOrder::LONG_EAST_LAT_NORTH
? cs::EllipsoidalCS::createLatitudeLongitude(unit)
: cs::EllipsoidalCS::createLongitudeLatitude(unit))
->GeodeticCRS::_isEquivalentTo(other, standardCriterion, dbContext);
->GeodeticCRS::_isEquivalentToNoTypeCheck(other, standardCriterion,
dbContext);
}
if (axisOrder ==
cs::EllipsoidalCS::AxisOrder::LONG_EAST_LAT_NORTH_HEIGHT_UP ||
axisOrder ==
cs::EllipsoidalCS::AxisOrder::LAT_NORTH_LONG_EAST_HEIGHT_UP) {
const auto &angularUnit = coordinateSystem()->axisList()[0]->unit();
const auto &linearUnit = coordinateSystem()->axisList()[2]->unit();
return GeographicCRS::create(
util::PropertyMap().set(common::IdentifiedObject::NAME_KEY,
nameStr()),
datum(), datumEnsemble(),
axisOrder == cs::EllipsoidalCS::AxisOrder::
LONG_EAST_LAT_NORTH_HEIGHT_UP
? cs::EllipsoidalCS::
createLatitudeLongitudeEllipsoidalHeight(
angularUnit, linearUnit)
: cs::EllipsoidalCS::
createLongitudeLatitudeEllipsoidalHeight(
angularUnit, linearUnit))
->GeodeticCRS::_isEquivalentToNoTypeCheck(other, standardCriterion,
dbContext);
}
return false;
}
@@ -3605,6 +3675,14 @@ void ProjectedCRS::_exportToWKT(io::WKTFormatter *formatter) const {
return;
}
if (!formatter->useESRIDialect() &&
formatter->isAllowedEllipsoidalHeightAsVerticalCRS()) {
if (exportAsWKT1CompoundCRSWithEllipsoidalHeight(
projCRS2D, axisList[2], formatter)) {
return;
}
}
io::FormattingException::Throw(
"Projected 3D CRS can only be exported since WKT2:2019");
}
@@ -3885,8 +3963,7 @@ ProjectedCRS::create(const util::PropertyMap &properties,
bool ProjectedCRS::_isEquivalentTo(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const {
auto otherProjCRS = dynamic_cast<const ProjectedCRS *>(other);
return otherProjCRS != nullptr &&
return other != nullptr && util::isOfExactType<ProjectedCRS>(*other) &&
DerivedCRS::_isEquivalentTo(other, criterion, dbContext);
}
@@ -5111,7 +5188,8 @@ BoundCRSNNPtr BoundCRS::createFromNadgrids(const CRSNNPtr &baseCRSIn,
" (with Greenwich prime meridian)"),
sourceGeographicCRS->datumNonNull(nullptr)->ellipsoid(),
util::optional<std::string>(), datum::PrimeMeridian::GREENWICH),
sourceGeographicCRS->coordinateSystem());
cs::EllipsoidalCS::createLatitudeLongitude(
common::UnitOfMeasure::DEGREE));
}
std::string transformationName = transformationSourceCRS->nameStr();
transformationName += " to WGS84";
+17
View File
@@ -352,6 +352,23 @@ void PrimeMeridian::_exportToWKT(
if (!(isWKT2 && formatter->primeMeridianOmittedIfGreenwich() &&
l_name == "Greenwich")) {
formatter->startNode(io::WKTConstants::PRIMEM, !identifiers().empty());
if (formatter->useESRIDialect()) {
bool aliasFound = false;
const auto &dbContext = formatter->databaseContext();
if (dbContext) {
auto l_alias = dbContext->getAliasFromOfficialName(
l_name, "prime_meridian", "ESRI");
if (!l_alias.empty()) {
l_name = l_alias;
aliasFound = true;
}
}
if (!aliasFound) {
l_name = io::WKTFormatter::morphNameToESRI(l_name);
}
}
formatter->addQuotedString(l_name);
const auto &l_long = longitude();
if (formatter->primeMeridianInDegree()) {
+97 -2
View File
@@ -39,12 +39,14 @@
#include "proj/metadata.hpp"
#include "proj/util.hpp"
#include "proj/internal/coordinateoperation_internal.hpp"
#include "proj/internal/internal.hpp"
#include "proj/internal/io_internal.hpp"
#include "proj/internal/lru_cache.hpp"
#include "proj/internal/tracing.hpp"
#include "operation/coordinateoperation_internal.hpp"
#include "operation/parammappings.hpp"
#include "sqlite3_utils.hpp"
#include <cmath>
@@ -94,6 +96,12 @@ namespace io {
#define GEOG_3D_SINGLE_QUOTED "'geographic 3D'"
#define GEOCENTRIC_SINGLE_QUOTED "'geocentric'"
// See data/sql/metadata.sql for the semantics of those constants
constexpr int DATABASE_LAYOUT_VERSION_MAJOR = 1;
// If the code depends on the new additions, then DATABASE_LAYOUT_VERSION_MINOR
// must be incremented.
constexpr int DATABASE_LAYOUT_VERSION_MINOR = 0;
// ---------------------------------------------------------------------------
struct SQLValues {
@@ -270,6 +278,8 @@ struct DatabaseContext::Private {
lru11::Cache<std::string, std::list<std::string>> cacheAliasNames_{
CACHE_SIZE};
void checkDatabaseLayout();
static void insertIntoCache(LRUCacheOfObjects &cache,
const std::string &code,
const util::BaseObjectPtr &obj);
@@ -548,6 +558,61 @@ void DatabaseContext::Private::open(const std::string &databasePath,
// ---------------------------------------------------------------------------
void DatabaseContext::Private::checkDatabaseLayout() {
auto res = run("SELECT key, value FROM metadata WHERE key IN "
"('DATABASE.LAYOUT.VERSION.MAJOR', "
"'DATABASE.LAYOUT.VERSION.MINOR')");
if (res.size() != 2) {
// The database layout of PROJ 7.2 that shipped with EPSG v10.003 is
// at the time of writing still compatible of the one we support.
static_assert(
// cppcheck-suppress knownConditionTrueFalse
DATABASE_LAYOUT_VERSION_MAJOR == 1 &&
// cppcheck-suppress knownConditionTrueFalse
DATABASE_LAYOUT_VERSION_MINOR == 0,
"remove that assertion and below lines next time we upgrade "
"database structure");
res = run("SELECT 1 FROM metadata WHERE key = 'EPSG.VERSION' AND "
"value = 'v10.003'");
if (!res.empty()) {
return;
}
throw FactoryException(
databasePath_ +
" lacks DATABASE.LAYOUT.VERSION.MAJOR / "
"DATABASE.LAYOUT.VERSION.MINOR "
"metadata. It comes from another PROJ installation.");
}
int nMajor = 0;
int nMinor = 0;
for (const auto &row : res) {
if (row[0] == "DATABASE.LAYOUT.VERSION.MAJOR") {
nMajor = atoi(row[1].c_str());
} else if (row[0] == "DATABASE.LAYOUT.VERSION.MINOR") {
nMinor = atoi(row[1].c_str());
}
}
if (nMajor != DATABASE_LAYOUT_VERSION_MAJOR) {
throw FactoryException(databasePath_ +
" contains DATABASE.LAYOUT.VERSION.MAJOR = " +
toString(nMajor) + " whereas " +
toString(DATABASE_LAYOUT_VERSION_MAJOR) +
" is expected. "
"It comes from another PROJ installation.");
}
if (nMinor < DATABASE_LAYOUT_VERSION_MINOR) {
throw FactoryException(databasePath_ +
" contains DATABASE.LAYOUT.VERSION.MINOR = " +
toString(nMinor) + " whereas a number >= " +
toString(DATABASE_LAYOUT_VERSION_MINOR) +
" is expected. "
"It comes from another PROJ installation.");
}
}
// ---------------------------------------------------------------------------
void DatabaseContext::Private::setHandle(sqlite3 *sqlite_handle) {
assert(sqlite_handle);
@@ -865,6 +930,7 @@ DatabaseContext::create(const std::string &databasePath,
if (!auxiliaryDatabasePaths.empty()) {
dbCtx->getPrivate()->attachExtraDatabases(auxiliaryDatabasePaths);
}
dbCtx->getPrivate()->checkDatabaseLayout();
return dbCtx;
}
@@ -6019,6 +6085,8 @@ AuthorityFactory::createObjectsFromNameEx(
auto sqlRes = d->run(sql, params);
bool isFirst = true;
bool firstIsDeprecated = false;
bool foundExactMatch = false;
std::size_t hashCodeFirstMatch = 0;
for (const auto &row : sqlRes) {
const auto &name = row[3];
if (approximateMatch) {
@@ -6082,11 +6150,38 @@ AuthorityFactory::createObjectsFromNameEx(
}
throw std::runtime_error("Unsupported table_name");
};
res.emplace_back(PairObjectName(getObject(table_name, code), name));
const auto obj = getObject(table_name, code);
if (metadata::Identifier::canonicalizeName(obj->nameStr()) ==
canonicalizedSearchedName) {
foundExactMatch = true;
}
const auto objPtr = obj.get();
if (res.empty()) {
hashCodeFirstMatch = typeid(*objPtr).hash_code();
} else if (hashCodeFirstMatch != typeid(*objPtr).hash_code()) {
hashCodeFirstMatch = 0;
}
res.emplace_back(PairObjectName(obj, name));
if (limitResultCount > 0 && res.size() == limitResultCount) {
break;
}
}
// If we found a name that is an exact match, and all objects have the
// same type, and we are not in approximate mode, only keep the objet(s)
// with the exact name match.
if (foundExactMatch && hashCodeFirstMatch != 0 && !approximateMatch) {
std::list<PairObjectName> resTmp;
for (const auto &pair : res) {
if (metadata::Identifier::canonicalizeName(
pair.first->nameStr()) == canonicalizedSearchedName) {
resTmp.emplace_back(pair);
}
}
res = std::move(resTmp);
}
}
auto sortLambda = [](const PairObjectName &a, const PairObjectName &b) {
+185 -21
View File
@@ -53,7 +53,11 @@
#include "proj/metadata.hpp"
#include "proj/util.hpp"
#include "proj/internal/coordinateoperation_internal.hpp"
#include "operation/coordinateoperation_internal.hpp"
#include "operation/esriparammappings.hpp"
#include "operation/oputils.hpp"
#include "operation/parammappings.hpp"
#include "proj/internal/coordinatesystem_internal.hpp"
#include "proj/internal/internal.hpp"
#include "proj/internal/io_internal.hpp"
@@ -140,6 +144,7 @@ struct WKTFormatter::Private {
bool primeMeridianInDegree_ = false;
bool use2019Keywords_ = false;
bool useESRIDialect_ = false;
bool allowEllipsoidalHeightAsVerticalCRS_ = false;
OutputAxisRule outputAxis_ = WKTFormatter::OutputAxisRule::YES;
};
Params params_{};
@@ -251,6 +256,8 @@ WKTFormatter::setOutputAxis(OutputAxisRule outputAxisIn) noexcept {
*
* The default is strict mode, in which case a FormattingException can be
* thrown.
* In non-strict mode, a Geographic 3D CRS can be for example exported as
* WKT1_GDAL with 3 axes, whereas this is normally not allowed.
*/
WKTFormatter &WKTFormatter::setStrict(bool strictIn) noexcept {
d->params_.strict_ = strictIn;
@@ -264,6 +271,32 @@ bool WKTFormatter::isStrict() const noexcept { return d->params_.strict_; }
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
/** \brief Set whether the formatter should export, in WKT1, a Geographic or
* Projected 3D CRS as a compound CRS whose vertical part represents an
* ellipsoidal height.
*/
WKTFormatter &
WKTFormatter::setAllowEllipsoidalHeightAsVerticalCRS(bool allow) noexcept {
d->params_.allowEllipsoidalHeightAsVerticalCRS_ = allow;
return *this;
}
// ---------------------------------------------------------------------------
/** \brief Return whether the formatter should export, in WKT1, a Geographic or
* Projected 3D CRS as a compound CRS whose vertical part represents an
* ellipsoidal height.
*/
bool WKTFormatter::isAllowedEllipsoidalHeightAsVerticalCRS() const noexcept {
return d->params_.allowEllipsoidalHeightAsVerticalCRS_;
}
//! @endcond
// ---------------------------------------------------------------------------
/** Returns the WKT string from the formatter. */
const std::string &WKTFormatter::toString() const {
if (d->indentLevel_ > 0 || d->level_ > 0) {
@@ -1979,14 +2012,80 @@ PrimeMeridianNNPtr WKTParser::Private::buildPrimeMeridian(
try {
double angleValue = asDouble(children[1]);
// Correct for GDAL WKT1 departure
// Correct for GDAL WKT1 and WKT1-ESRI departure
if (name == "Paris" && std::fabs(angleValue - 2.33722917) < 1e-8 &&
unit == UnitOfMeasure::GRAD) {
unit._isEquivalentTo(UnitOfMeasure::GRAD,
util::IComparable::Criterion::EQUIVALENT)) {
angleValue = 2.5969213;
} else {
static const struct {
const char *name;
int deg;
int min;
double sec;
} primeMeridiansDMS[] = {
{"Lisbon", -9, 7, 54.862}, {"Bogota", -74, 4, 51.3},
{"Madrid", -3, 41, 14.55}, {"Rome", 12, 27, 8.4},
{"Bern", 7, 26, 22.5}, {"Jakarta", 106, 48, 27.79},
{"Ferro", -17, 40, 0}, {"Brussels", 4, 22, 4.71},
{"Stockholm", 18, 3, 29.8}, {"Athens", 23, 42, 58.815},
{"Oslo", 10, 43, 22.5}, {"Paris RGS", 2, 20, 13.95},
{"Paris_RGS", 2, 20, 13.95}};
// Current epsg.org output may use the EPSG:9110 "sexagesimal DMS"
// unit and a DD.MMSSsss value, but this will likely be changed to
// use decimal degree.
// Or WKT1 may for example use the Paris RGS decimal degree value
// but with a GEOGCS with UNIT["Grad"]
for (const auto &pmDef : primeMeridiansDMS) {
if (name == pmDef.name) {
double dmsAsDecimalValue =
(pmDef.deg >= 0 ? 1 : -1) *
(std::abs(pmDef.deg) + pmDef.min / 100. +
pmDef.sec / 10000.);
double dmsAsDecimalDegreeValue =
(pmDef.deg >= 0 ? 1 : -1) *
(std::abs(pmDef.deg) + pmDef.min / 60. +
pmDef.sec / 3600.);
if (std::fabs(angleValue - dmsAsDecimalValue) < 1e-8 ||
std::fabs(angleValue - dmsAsDecimalDegreeValue) <
1e-8) {
angleValue = dmsAsDecimalDegreeValue;
unit = UnitOfMeasure::DEGREE;
}
break;
}
}
}
auto &properties = buildProperties(node);
if (dbContext_ && esriStyle_) {
std::string outTableName;
std::string codeFromAlias;
std::string authNameFromAlias;
auto authFactory = AuthorityFactory::create(NN_NO_CHECK(dbContext_),
std::string());
auto officialName = authFactory->getOfficialNameFromAlias(
name, "prime_meridian", "ESRI", false, outTableName,
authNameFromAlias, codeFromAlias);
if (!officialName.empty()) {
properties.set(IdentifiedObject::NAME_KEY, officialName);
if (!authNameFromAlias.empty()) {
auto identifiers = ArrayOfBaseObject::create();
identifiers->add(Identifier::create(
codeFromAlias,
PropertyMap()
.set(Identifier::CODESPACE_KEY, authNameFromAlias)
.set(Identifier::AUTHORITY_KEY,
authNameFromAlias)));
properties.set(IdentifiedObject::IDENTIFIERS_KEY,
identifiers);
}
}
}
Angle angle(angleValue, unit);
return PrimeMeridian::create(buildProperties(node), angle);
return PrimeMeridian::create(properties, angle);
} catch (const std::exception &e) {
throw buildRethrow(__FUNCTION__, e);
}
@@ -2098,9 +2197,15 @@ GeodeticReferenceFrameNNPtr WKTParser::Private::buildGeodeticReferenceFrame(
return false;
};
if (name == "WGS_1984") {
// Remap GDAL WGS_1984 to EPSG v9 "World Geodetic System 1984" official
// name.
// Also remap EPSG v10 datum ensemble names to non-ensemble EPSG v9
if (name == "WGS_1984" || name == "World Geodetic System 1984 ensemble") {
properties.set(IdentifiedObject::NAME_KEY,
GeodeticReferenceFrame::EPSG_6326->nameStr());
} else if (name == "European Terrestrial Reference System 1989 ensemble") {
properties.set(IdentifiedObject::NAME_KEY,
"European Terrestrial Reference System 1989");
} else if (starts_with(name, "D_")) {
esriStyle_ = true;
const char *tableNameForAlias = nullptr;
@@ -2734,6 +2839,9 @@ WKTParser::Private::buildGeodeticCRS(const WKTNodeNNPtr &node) {
throw ParsingException("Missing DATUM or ENSEMBLE node");
}
// Do that now so that esriStyle_ can be set before buildPrimeMeridian()
auto props = buildProperties(node);
auto &dynamicNode = nodeP->lookForChild(WKTConstants::DYNAMIC);
auto &csNode = nodeP->lookForChild(WKTConstants::CS_);
@@ -2771,7 +2879,6 @@ WKTParser::Private::buildGeodeticCRS(const WKTNodeNNPtr &node) {
angularUnit = primeMeridian->longitude().unit();
}
auto props = buildProperties(node);
addExtensionProj4ToProp(nodeP, props);
// No explicit AXIS node ? (WKT1)
@@ -2790,6 +2897,32 @@ WKTParser::Private::buildGeodeticCRS(const WKTNodeNNPtr &node) {
.as_nullable()
: nullptr;
auto cs = buildCS(csNode, node, angularUnit);
// If there's no CS[] node, typically for a BASEGEODCRS of a projected CRS,
// in a few rare cases, this might be a Geocentric CRS, and thus a
// Cartesian CS, and not the ellipsoidalCS we assumed above. The only way
// to figure that is to resolve the CRS from its code...
if (isNull(csNode) && dbContext_ &&
ci_equal(nodeName, WKTConstants::BASEGEODCRS)) {
const auto &nodeChildren = nodeP->children();
for (const auto &subNode : nodeChildren) {
const auto &subNodeName(subNode->GP()->value());
if (ci_equal(subNodeName, WKTConstants::ID) ||
ci_equal(subNodeName, WKTConstants::AUTHORITY)) {
auto id = buildId(subNode, true, false);
if (id) {
try {
auto authFactory = AuthorityFactory::create(
NN_NO_CHECK(dbContext_), *id->codeSpace());
auto dbCRS = authFactory->createGeodeticCRS(id->code());
cs = dbCRS->coordinateSystem();
} catch (const util::Exception &) {
}
}
}
}
}
auto ellipsoidalCS = nn_dynamic_pointer_cast<EllipsoidalCS>(cs);
if (ellipsoidalCS) {
if (ci_equal(nodeName, WKTConstants::GEOCCS)) {
@@ -2940,7 +3073,8 @@ UnitOfMeasure WKTParser::Private::guessUnitForParameter(
const UnitOfMeasure &defaultAngularUnit) {
UnitOfMeasure unit;
// scale must be first because of 'Scale factor on pseudo standard parallel'
if (ci_find(paramName, "scale") != std::string::npos) {
if (ci_find(paramName, "scale") != std::string::npos ||
ci_find(paramName, "scaling factor") != std::string::npos) {
unit = UnitOfMeasure::SCALE_UNITY;
} else if (ci_find(paramName, "latitude") != std::string::npos ||
ci_find(paramName, "longitude") != std::string::npos ||
@@ -3872,8 +4006,16 @@ WKTParser::Private::buildProjectedCRS(const WKTNodeNNPtr &node) {
return createPseudoMercator(props, NN_NO_CHECK(cartesianCS));
}
auto linearUnit = buildUnitInSubNode(node, UnitOfMeasure::Type::LINEAR);
auto angularUnit = baseGeodCRS->coordinateSystem()->axisList()[0]->unit();
// For WKT2, if there is no explicit parameter unit, use metre for linear
// units and degree for angular units
auto linearUnit =
!isNull(conversionNode)
? UnitOfMeasure::METRE
: buildUnitInSubNode(node, UnitOfMeasure::Type::LINEAR);
auto angularUnit =
!isNull(conversionNode)
? UnitOfMeasure::DEGREE
: baseGeodCRS->coordinateSystem()->axisList()[0]->unit();
auto conversion =
!isNull(conversionNode)
@@ -4097,7 +4239,8 @@ createBoundCRSSourceTransformationCRS(const crs::CRSPtr &sourceCRS,
sourceGeographicCRS->datum()->ellipsoid(),
util::optional<std::string>(),
datum::PrimeMeridian::GREENWICH),
sourceGeographicCRS->coordinateSystem())
cs::EllipsoidalCS::createLatitudeLongitude(
common::UnitOfMeasure::DEGREE))
.as_nullable();
}
} else {
@@ -4941,6 +5084,10 @@ class JSONParser {
TransformationNNPtr buildTransformation(const json &j);
ConcatenatedOperationNNPtr buildConcatenatedOperation(const json &j);
void buildGeodeticDatumOrDatumEnsemble(const json &j,
GeodeticReferenceFramePtr &datum,
DatumEnsemblePtr &datumEnsemble);
static util::optional<std::string> getAnchor(const json &j) {
util::optional<std::string> anchor;
if (j.contains("anchor")) {
@@ -5400,9 +5547,9 @@ BaseObjectNNPtr JSONParser::create(const json &j)
// ---------------------------------------------------------------------------
GeographicCRSNNPtr JSONParser::buildGeographicCRS(const json &j) {
GeodeticReferenceFramePtr datum;
DatumEnsemblePtr datumEnsemble;
void JSONParser::buildGeodeticDatumOrDatumEnsemble(
const json &j, GeodeticReferenceFramePtr &datum,
DatumEnsemblePtr &datumEnsemble) {
if (j.contains("datum")) {
auto datumJ = getObject(j, "datum");
datum = util::nn_dynamic_pointer_cast<GeodeticReferenceFrame>(
@@ -5415,6 +5562,14 @@ GeographicCRSNNPtr JSONParser::buildGeographicCRS(const json &j) {
datumEnsemble =
buildDatumEnsemble(getObject(j, "datum_ensemble")).as_nullable();
}
}
// ---------------------------------------------------------------------------
GeographicCRSNNPtr JSONParser::buildGeographicCRS(const json &j) {
GeodeticReferenceFramePtr datum;
DatumEnsemblePtr datumEnsemble;
buildGeodeticDatumOrDatumEnsemble(j, datum, datumEnsemble);
auto csJ = getObject(j, "coordinate_system");
auto ellipsoidalCS =
util::nn_dynamic_pointer_cast<EllipsoidalCS>(buildCS(csJ));
@@ -5428,12 +5583,9 @@ GeographicCRSNNPtr JSONParser::buildGeographicCRS(const json &j) {
// ---------------------------------------------------------------------------
GeodeticCRSNNPtr JSONParser::buildGeodeticCRS(const json &j) {
auto datumJ = getObject(j, "datum");
if (getType(datumJ) != "GeodeticReferenceFrame") {
throw ParsingException("Unsupported type for datum.");
}
auto datum = buildGeodeticReferenceFrame(datumJ);
GeodeticReferenceFramePtr datum;
DatumEnsemblePtr datumEnsemble;
buildGeodeticDatumOrDatumEnsemble(j, datum, datumEnsemble);
auto csJ = getObject(j, "coordinate_system");
auto cs = buildCS(csJ);
auto props = buildProperties(j);
@@ -5468,7 +5620,13 @@ GeodeticCRSNNPtr JSONParser::buildGeodeticCRS(const json &j) {
// ---------------------------------------------------------------------------
ProjectedCRSNNPtr JSONParser::buildProjectedCRS(const json &j) {
auto baseCRS = buildGeographicCRS(getObject(j, "base_crs"));
auto jBaseCRS = getObject(j, "base_crs");
auto jBaseCS = getObject(jBaseCRS, "coordinate_system");
auto baseCS = buildCS(jBaseCS);
auto baseCRS = dynamic_cast<EllipsoidalCS *>(baseCS.get()) != nullptr
? util::nn_static_pointer_cast<GeodeticCRS>(
buildGeographicCRS(jBaseCRS))
: buildGeodeticCRS(jBaseCRS);
auto csJ = getObject(j, "coordinate_system");
auto cartesianCS = util::nn_dynamic_pointer_cast<CartesianCS>(buildCS(csJ));
if (!cartesianCS) {
@@ -5975,6 +6133,12 @@ static BaseObjectNNPtr createFromUserInput(const std::string &text,
const DatabaseContextPtr &dbContext,
bool usePROJ4InitRules,
PJ_CONTEXT *ctx) {
std::size_t idxFirstCharNotSpace = text.find_first_not_of(" \t\r\n");
if (idxFirstCharNotSpace > 0 && idxFirstCharNotSpace != std::string::npos) {
return createFromUserInput(text.substr(idxFirstCharNotSpace), dbContext,
usePROJ4InitRules, ctx);
}
if (!text.empty() && text[0] == '{') {
json j;
try {
@@ -9460,8 +9624,8 @@ CRSNNPtr PROJStringParser::Private::buildProjectedCRS(
std::string methodName = "PROJ " + step.name;
for (const auto &param : step.paramValues) {
if (is_in_stringlist(param.key,
"wktext,no_defs,datum,ellps,a,b,R,towgs84,"
"nadgrids,geoidgrids,"
"wktext,no_defs,datum,ellps,a,b,R,f,rf,"
"towgs84,nadgrids,geoidgrids,"
"units,to_meter,vunits,vto_meter,type")) {
continue;
}
@@ -0,0 +1,710 @@
/******************************************************************************
*
* Project: PROJ
* Purpose: ISO19111:2019 implementation
* Author: Even Rouault <even dot rouault at spatialys dot com>
*
******************************************************************************
* Copyright (c) 2018, Even Rouault <even dot rouault at spatialys dot com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#ifndef FROM_PROJ_CPP
#define FROM_PROJ_CPP
#endif
#include "proj/common.hpp"
#include "proj/coordinateoperation.hpp"
#include "proj/crs.hpp"
#include "proj/io.hpp"
#include "proj/metadata.hpp"
#include "proj/util.hpp"
#include "proj/internal/internal.hpp"
#include "proj/internal/io_internal.hpp"
#include "coordinateoperation_internal.hpp"
#include "oputils.hpp"
// PROJ include order is sensitive
// clang-format off
#include "proj.h"
#include "proj_internal.h" // M_PI
// clang-format on
#include "proj_json_streaming_writer.hpp"
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstring>
#include <memory>
#include <set>
#include <string>
#include <vector>
using namespace NS_PROJ::internal;
// ---------------------------------------------------------------------------
NS_PROJ_START
namespace operation {
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
struct ConcatenatedOperation::Private {
std::vector<CoordinateOperationNNPtr> operations_{};
bool computedName_ = false;
explicit Private(const std::vector<CoordinateOperationNNPtr> &operationsIn)
: operations_(operationsIn) {}
Private(const Private &) = default;
};
//! @endcond
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
ConcatenatedOperation::~ConcatenatedOperation() = default;
//! @endcond
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
ConcatenatedOperation::ConcatenatedOperation(const ConcatenatedOperation &other)
: CoordinateOperation(other),
d(internal::make_unique<Private>(*(other.d))) {}
//! @endcond
// ---------------------------------------------------------------------------
ConcatenatedOperation::ConcatenatedOperation(
const std::vector<CoordinateOperationNNPtr> &operationsIn)
: CoordinateOperation(), d(internal::make_unique<Private>(operationsIn)) {}
// ---------------------------------------------------------------------------
/** \brief Return the operation steps of the concatenated operation.
*
* @return the operation steps.
*/
const std::vector<CoordinateOperationNNPtr> &
ConcatenatedOperation::operations() const {
return d->operations_;
}
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
static bool compareStepCRS(const crs::CRS *a, const crs::CRS *b) {
const auto &aIds = a->identifiers();
const auto &bIds = b->identifiers();
if (aIds.size() == 1 && bIds.size() == 1 &&
aIds[0]->code() == bIds[0]->code() &&
*aIds[0]->codeSpace() == *bIds[0]->codeSpace()) {
return true;
}
return a->_isEquivalentTo(b, util::IComparable::Criterion::EQUIVALENT);
}
//! @endcond
// ---------------------------------------------------------------------------
/** \brief Instantiate a ConcatenatedOperation
*
* @param properties See \ref general_properties. At minimum the name should
* be
* defined.
* @param operationsIn Vector of the CoordinateOperation steps.
* @param accuracies Vector of positional accuracy (might be empty).
* @return new Transformation.
* @throws InvalidOperation
*/
ConcatenatedOperationNNPtr ConcatenatedOperation::create(
const util::PropertyMap &properties,
const std::vector<CoordinateOperationNNPtr> &operationsIn,
const std::vector<metadata::PositionalAccuracyNNPtr>
&accuracies) // throw InvalidOperation
{
if (operationsIn.size() < 2) {
throw InvalidOperation(
"ConcatenatedOperation must have at least 2 operations");
}
crs::CRSPtr lastTargetCRS;
crs::CRSPtr interpolationCRS;
bool interpolationCRSValid = true;
for (size_t i = 0; i < operationsIn.size(); i++) {
auto l_sourceCRS = operationsIn[i]->sourceCRS();
auto l_targetCRS = operationsIn[i]->targetCRS();
if (interpolationCRSValid) {
auto subOpInterpCRS = operationsIn[i]->interpolationCRS();
if (interpolationCRS == nullptr)
interpolationCRS = subOpInterpCRS;
else if (subOpInterpCRS == nullptr ||
!(subOpInterpCRS->isEquivalentTo(
interpolationCRS.get(),
util::IComparable::Criterion::EQUIVALENT))) {
interpolationCRS = nullptr;
interpolationCRSValid = false;
}
}
if (l_sourceCRS == nullptr || l_targetCRS == nullptr) {
throw InvalidOperation("At least one of the operation lacks a "
"source and/or target CRS");
}
if (i >= 1) {
if (!compareStepCRS(l_sourceCRS.get(), lastTargetCRS.get())) {
#ifdef DEBUG_CONCATENATED_OPERATION
std::cerr << "Step " << i - 1 << ": "
<< operationsIn[i - 1]->nameStr() << std::endl;
std::cerr << "Step " << i << ": " << operationsIn[i]->nameStr()
<< std::endl;
{
auto f(io::WKTFormatter::create(
io::WKTFormatter::Convention::WKT2_2019));
std::cerr << "Source CRS of step " << i << ":" << std::endl;
std::cerr << l_sourceCRS->exportToWKT(f.get()) << std::endl;
}
{
auto f(io::WKTFormatter::create(
io::WKTFormatter::Convention::WKT2_2019));
std::cerr << "Target CRS of step " << i - 1 << ":"
<< std::endl;
std::cerr << lastTargetCRS->exportToWKT(f.get())
<< std::endl;
}
#endif
throw InvalidOperation(
"Inconsistent chaining of CRS in operations");
}
}
lastTargetCRS = l_targetCRS;
}
auto op = ConcatenatedOperation::nn_make_shared<ConcatenatedOperation>(
operationsIn);
op->assignSelf(op);
op->setProperties(properties);
op->setCRSs(NN_NO_CHECK(operationsIn[0]->sourceCRS()),
NN_NO_CHECK(operationsIn.back()->targetCRS()),
interpolationCRS);
op->setAccuracies(accuracies);
#ifdef DEBUG_CONCATENATED_OPERATION
{
auto f(
io::WKTFormatter::create(io::WKTFormatter::Convention::WKT2_2019));
std::cerr << "ConcatenatedOperation::create()" << std::endl;
std::cerr << op->exportToWKT(f.get()) << std::endl;
}
#endif
return op;
}
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
// ---------------------------------------------------------------------------
void ConcatenatedOperation::fixStepsDirection(
const crs::CRSNNPtr &concatOpSourceCRS,
const crs::CRSNNPtr &concatOpTargetCRS,
std::vector<CoordinateOperationNNPtr> &operationsInOut) {
// Set of heuristics to assign CRS to steps, and possibly reverse them.
const auto isGeographic = [](const crs::CRS *crs) -> bool {
return dynamic_cast<const crs::GeographicCRS *>(crs) != nullptr;
};
const auto isGeocentric = [](const crs::CRS *crs) -> bool {
auto geodCRS = dynamic_cast<const crs::GeodeticCRS *>(crs);
if (geodCRS && geodCRS->coordinateSystem()->axisList().size() == 3)
return true;
return false;
};
for (size_t i = 0; i < operationsInOut.size(); ++i) {
auto &op = operationsInOut[i];
auto l_sourceCRS = op->sourceCRS();
auto l_targetCRS = op->targetCRS();
auto conv = dynamic_cast<const Conversion *>(op.get());
if (conv && i == 0 && !l_sourceCRS && !l_targetCRS) {
auto derivedCRS =
dynamic_cast<const crs::DerivedCRS *>(concatOpSourceCRS.get());
if (derivedCRS) {
if (i + 1 < operationsInOut.size()) {
// use the sourceCRS of the next operation as our target CRS
l_targetCRS = operationsInOut[i + 1]->sourceCRS();
// except if it looks like the next operation should
// actually be reversed !!!
if (l_targetCRS &&
!compareStepCRS(l_targetCRS.get(),
derivedCRS->baseCRS().get()) &&
operationsInOut[i + 1]->targetCRS() &&
compareStepCRS(
operationsInOut[i + 1]->targetCRS().get(),
derivedCRS->baseCRS().get())) {
l_targetCRS = operationsInOut[i + 1]->targetCRS();
}
}
if (!l_targetCRS) {
l_targetCRS = derivedCRS->baseCRS().as_nullable();
}
auto invConv =
util::nn_dynamic_pointer_cast<InverseConversion>(op);
auto nn_targetCRS = NN_NO_CHECK(l_targetCRS);
if (invConv) {
invConv->inverse()->setCRSs(nn_targetCRS, concatOpSourceCRS,
nullptr);
op->setCRSs(concatOpSourceCRS, nn_targetCRS, nullptr);
} else {
op->setCRSs(nn_targetCRS, concatOpSourceCRS, nullptr);
op = op->inverse();
}
} else if (i + 1 < operationsInOut.size()) {
/* coverity[copy_paste_error] */
l_targetCRS = operationsInOut[i + 1]->sourceCRS();
if (l_targetCRS) {
op->setCRSs(concatOpSourceCRS, NN_NO_CHECK(l_targetCRS),
nullptr);
}
}
} else if (conv && i + 1 == operationsInOut.size() && !l_sourceCRS &&
!l_targetCRS) {
auto derivedCRS =
dynamic_cast<const crs::DerivedCRS *>(concatOpTargetCRS.get());
if (derivedCRS) {
if (i >= 1) {
// use the sourceCRS of the previous operation as our source
// CRS
l_sourceCRS = operationsInOut[i - 1]->targetCRS();
// except if it looks like the previous operation should
// actually be reversed !!!
if (l_sourceCRS &&
!compareStepCRS(l_sourceCRS.get(),
derivedCRS->baseCRS().get()) &&
operationsInOut[i - 1]->sourceCRS() &&
compareStepCRS(
operationsInOut[i - 1]->sourceCRS().get(),
derivedCRS->baseCRS().get())) {
l_targetCRS = operationsInOut[i - 1]->sourceCRS();
}
}
if (!l_sourceCRS) {
l_sourceCRS = derivedCRS->baseCRS().as_nullable();
}
op->setCRSs(NN_NO_CHECK(l_sourceCRS), concatOpTargetCRS,
nullptr);
} else if (i >= 1) {
l_sourceCRS = operationsInOut[i - 1]->targetCRS();
if (l_sourceCRS) {
derivedCRS = dynamic_cast<const crs::DerivedCRS *>(
l_sourceCRS.get());
if (conv->isEquivalentTo(
derivedCRS->derivingConversion().get(),
util::IComparable::Criterion::EQUIVALENT)) {
op->setCRSs(concatOpTargetCRS, NN_NO_CHECK(l_sourceCRS),
nullptr);
op = op->inverse();
}
op->setCRSs(NN_NO_CHECK(l_sourceCRS), concatOpTargetCRS,
nullptr);
}
}
} else if (conv && i > 0 && i < operationsInOut.size() - 1) {
// For an intermediate conversion, use the target CRS of the
// previous step and the source CRS of the next step
l_sourceCRS = operationsInOut[i - 1]->targetCRS();
l_targetCRS = operationsInOut[i + 1]->sourceCRS();
if (l_sourceCRS && l_targetCRS) {
op->setCRSs(NN_NO_CHECK(l_sourceCRS), NN_NO_CHECK(l_targetCRS),
nullptr);
}
} else if (!conv && l_sourceCRS && l_targetCRS) {
// Transformations might be mentioned in their forward directions,
// whereas we should instead use the reverse path.
auto prevOpTarget = (i == 0) ? concatOpSourceCRS.as_nullable()
: operationsInOut[i - 1]->targetCRS();
if (compareStepCRS(l_sourceCRS.get(), prevOpTarget.get())) {
// do nothing
} else if (compareStepCRS(l_targetCRS.get(), prevOpTarget.get())) {
op = op->inverse();
}
// Below is needed for EPSG:9103 which chains NAD83(2011) geographic
// 2D with NAD83(2011) geocentric
else if (l_sourceCRS->nameStr() == prevOpTarget->nameStr() &&
((isGeographic(l_sourceCRS.get()) &&
isGeocentric(prevOpTarget.get())) ||
(isGeocentric(l_sourceCRS.get()) &&
isGeographic(prevOpTarget.get())))) {
auto newOp(Conversion::createGeographicGeocentric(
NN_NO_CHECK(prevOpTarget), NN_NO_CHECK(l_sourceCRS)));
operationsInOut.insert(operationsInOut.begin() + i, newOp);
} else if (l_targetCRS->nameStr() == prevOpTarget->nameStr() &&
((isGeographic(l_targetCRS.get()) &&
isGeocentric(prevOpTarget.get())) ||
(isGeocentric(l_targetCRS.get()) &&
isGeographic(prevOpTarget.get())))) {
auto newOp(Conversion::createGeographicGeocentric(
NN_NO_CHECK(prevOpTarget), NN_NO_CHECK(l_targetCRS)));
operationsInOut.insert(operationsInOut.begin() + i, newOp);
}
}
}
if (!operationsInOut.empty()) {
auto l_sourceCRS = operationsInOut.front()->sourceCRS();
if (l_sourceCRS &&
!compareStepCRS(l_sourceCRS.get(), concatOpSourceCRS.get())) {
throw InvalidOperation("The source CRS of the first step of "
"concatenated operation is not the same "
"as the source CRS of the concatenated "
"operation itself");
}
auto l_targetCRS = operationsInOut.back()->targetCRS();
if (l_targetCRS &&
!compareStepCRS(l_targetCRS.get(), concatOpTargetCRS.get())) {
if (l_targetCRS->nameStr() == concatOpTargetCRS->nameStr() &&
((isGeographic(l_targetCRS.get()) &&
isGeocentric(concatOpTargetCRS.get())) ||
(isGeocentric(l_targetCRS.get()) &&
isGeographic(concatOpTargetCRS.get())))) {
auto newOp(Conversion::createGeographicGeocentric(
NN_NO_CHECK(l_targetCRS), concatOpTargetCRS));
operationsInOut.push_back(newOp);
} else {
throw InvalidOperation("The target CRS of the last step of "
"concatenated operation is not the same "
"as the target CRS of the concatenated "
"operation itself");
}
}
}
}
//! @endcond
// ---------------------------------------------------------------------------
/** \brief Instantiate a ConcatenatedOperation, or return a single
* coordinate
* operation.
*
* This computes its accuracy from the sum of its member operations, its
* extent
*
* @param operationsIn Vector of the CoordinateOperation steps.
* @param checkExtent Whether we should check the non-emptyness of the
* intersection
* of the extents of the operations
* @throws InvalidOperation
*/
CoordinateOperationNNPtr ConcatenatedOperation::createComputeMetadata(
const std::vector<CoordinateOperationNNPtr> &operationsIn,
bool checkExtent) // throw InvalidOperation
{
util::PropertyMap properties;
if (operationsIn.size() == 1) {
return operationsIn[0];
}
std::vector<CoordinateOperationNNPtr> flattenOps;
bool hasBallparkTransformation = false;
for (const auto &subOp : operationsIn) {
hasBallparkTransformation |= subOp->hasBallparkTransformation();
auto subOpConcat =
dynamic_cast<const ConcatenatedOperation *>(subOp.get());
if (subOpConcat) {
auto subOps = subOpConcat->operations();
for (const auto &subSubOp : subOps) {
flattenOps.emplace_back(subSubOp);
}
} else {
flattenOps.emplace_back(subOp);
}
}
// Remove consecutive inverse operations
if (flattenOps.size() > 2) {
std::vector<size_t> indices;
for (size_t i = 0; i < flattenOps.size(); ++i)
indices.push_back(i);
while (true) {
bool bHasChanged = false;
for (size_t i = 0; i + 1 < indices.size(); ++i) {
if (flattenOps[indices[i]]->_isEquivalentTo(
flattenOps[indices[i + 1]]->inverse().get(),
util::IComparable::Criterion::EQUIVALENT) &&
flattenOps[indices[i]]->sourceCRS()->_isEquivalentTo(
flattenOps[indices[i + 1]]->targetCRS().get(),
util::IComparable::Criterion::EQUIVALENT)) {
indices.erase(indices.begin() + i, indices.begin() + i + 2);
bHasChanged = true;
break;
}
}
// We bail out if indices.size() == 2, because potentially
// the last 2 remaining ones could auto-cancel, and we would have
// to have a special case for that (and this happens in practice).
if (!bHasChanged || indices.size() <= 2)
break;
}
if (indices.size() < flattenOps.size()) {
std::vector<CoordinateOperationNNPtr> flattenOpsNew;
for (size_t i = 0; i < indices.size(); ++i) {
flattenOpsNew.emplace_back(flattenOps[indices[i]]);
}
flattenOps = std::move(flattenOpsNew);
}
}
if (flattenOps.size() == 1) {
return flattenOps[0];
}
properties.set(common::IdentifiedObject::NAME_KEY,
computeConcatenatedName(flattenOps));
bool emptyIntersection = false;
auto extent = getExtent(flattenOps, false, emptyIntersection);
if (checkExtent && emptyIntersection) {
std::string msg(
"empty intersection of area of validity of concatenated "
"operations");
throw InvalidOperationEmptyIntersection(msg);
}
if (extent) {
properties.set(common::ObjectUsage::DOMAIN_OF_VALIDITY_KEY,
NN_NO_CHECK(extent));
}
std::vector<metadata::PositionalAccuracyNNPtr> accuracies;
const double accuracy = getAccuracy(flattenOps);
if (accuracy >= 0.0) {
accuracies.emplace_back(
metadata::PositionalAccuracy::create(toString(accuracy)));
}
auto op = create(properties, flattenOps, accuracies);
op->setHasBallparkTransformation(hasBallparkTransformation);
op->d->computedName_ = true;
return op;
}
// ---------------------------------------------------------------------------
CoordinateOperationNNPtr ConcatenatedOperation::inverse() const {
std::vector<CoordinateOperationNNPtr> inversedOperations;
auto l_operations = operations();
inversedOperations.reserve(l_operations.size());
for (const auto &operation : l_operations) {
inversedOperations.emplace_back(operation->inverse());
}
std::reverse(inversedOperations.begin(), inversedOperations.end());
auto properties = createPropertiesForInverse(this, false, false);
if (d->computedName_) {
properties.set(common::IdentifiedObject::NAME_KEY,
computeConcatenatedName(inversedOperations));
}
auto op =
create(properties, inversedOperations, coordinateOperationAccuracies());
op->d->computedName_ = d->computedName_;
op->setHasBallparkTransformation(hasBallparkTransformation());
return op;
}
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
void ConcatenatedOperation::_exportToWKT(io::WKTFormatter *formatter) const {
const bool isWKT2 = formatter->version() == io::WKTFormatter::Version::WKT2;
if (!isWKT2 || !formatter->use2019Keywords()) {
throw io::FormattingException(
"Transformation can only be exported to WKT2:2019");
}
formatter->startNode(io::WKTConstants::CONCATENATEDOPERATION,
!identifiers().empty());
formatter->addQuotedString(nameStr());
if (formatter->use2019Keywords()) {
const auto &version = operationVersion();
if (version.has_value()) {
formatter->startNode(io::WKTConstants::VERSION, false);
formatter->addQuotedString(*version);
formatter->endNode();
}
}
exportSourceCRSAndTargetCRSToWKT(this, formatter);
const bool canExportOperationId =
!(formatter->idOnTopLevelOnly() && formatter->topLevelHasId());
const bool hasDomains = !domains().empty();
if (hasDomains) {
formatter->pushDisableUsage();
}
for (const auto &operation : operations()) {
formatter->startNode(io::WKTConstants::STEP, false);
if (canExportOperationId && !operation->identifiers().empty()) {
// fake that top node has no id, so that the operation id is
// considered
formatter->pushHasId(false);
operation->_exportToWKT(formatter);
formatter->popHasId();
} else {
operation->_exportToWKT(formatter);
}
formatter->endNode();
}
if (hasDomains) {
formatter->popDisableUsage();
}
ObjectUsage::baseExportToWKT(formatter);
formatter->endNode();
}
//! @endcond
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
void ConcatenatedOperation::_exportToJSON(
io::JSONFormatter *formatter) const // throw(FormattingException)
{
auto writer = formatter->writer();
auto objectContext(formatter->MakeObjectContext("ConcatenatedOperation",
!identifiers().empty()));
writer->AddObjKey("name");
auto l_name = nameStr();
if (l_name.empty()) {
writer->Add("unnamed");
} else {
writer->Add(l_name);
}
writer->AddObjKey("source_crs");
formatter->setAllowIDInImmediateChild();
sourceCRS()->_exportToJSON(formatter);
writer->AddObjKey("target_crs");
formatter->setAllowIDInImmediateChild();
targetCRS()->_exportToJSON(formatter);
writer->AddObjKey("steps");
{
auto parametersContext(writer->MakeArrayContext(false));
for (const auto &operation : operations()) {
formatter->setAllowIDInImmediateChild();
operation->_exportToJSON(formatter);
}
}
ObjectUsage::baseExportToJSON(formatter);
}
//! @endcond
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
CoordinateOperationNNPtr ConcatenatedOperation::_shallowClone() const {
auto op =
ConcatenatedOperation::nn_make_shared<ConcatenatedOperation>(*this);
std::vector<CoordinateOperationNNPtr> ops;
for (const auto &subOp : d->operations_) {
ops.emplace_back(subOp->shallowClone());
}
op->d->operations_ = ops;
op->assignSelf(op);
op->setCRSs(this, false);
return util::nn_static_pointer_cast<CoordinateOperation>(op);
}
//! @endcond
// ---------------------------------------------------------------------------
void ConcatenatedOperation::_exportToPROJString(
io::PROJStringFormatter *formatter) const // throw(FormattingException)
{
for (const auto &operation : operations()) {
operation->_exportToPROJString(formatter);
}
}
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
bool ConcatenatedOperation::_isEquivalentTo(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const {
auto otherCO = dynamic_cast<const ConcatenatedOperation *>(other);
if (otherCO == nullptr ||
(criterion == util::IComparable::Criterion::STRICT &&
!ObjectUsage::_isEquivalentTo(other, criterion, dbContext))) {
return false;
}
const auto &steps = operations();
const auto &otherSteps = otherCO->operations();
if (steps.size() != otherSteps.size()) {
return false;
}
for (size_t i = 0; i < steps.size(); i++) {
if (!steps[i]->_isEquivalentTo(otherSteps[i].get(), criterion,
dbContext)) {
return false;
}
}
return true;
}
//! @endcond
// ---------------------------------------------------------------------------
std::set<GridDescription> ConcatenatedOperation::gridsNeeded(
const io::DatabaseContextPtr &databaseContext,
bool considerKnownGridsAsAvailable) const {
std::set<GridDescription> res;
for (const auto &operation : operations()) {
const auto l_gridsNeeded = operation->gridsNeeded(
databaseContext, considerKnownGridsAsAvailable);
for (const auto &gridDesc : l_gridsNeeded) {
res.insert(gridDesc);
}
}
return res;
}
// ---------------------------------------------------------------------------
} // namespace operation
NS_PROJ_END
File diff suppressed because it is too large Load Diff
@@ -43,53 +43,6 @@ NS_PROJ_START
namespace operation {
struct ParamMapping {
const char *wkt2_name;
const int epsg_code;
const char *wkt1_name;
const common::UnitOfMeasure::Type unit_type;
const char *proj_name;
};
struct MethodMapping {
const char *wkt2_name;
const int epsg_code;
const char *wkt1_name;
const char *proj_name_main;
const char *proj_name_aux;
const ParamMapping *const *params;
};
const MethodMapping *getMapping(int epsg_code) noexcept;
const MethodMapping *getMappingFromWKT1(const std::string &wkt1_name) noexcept;
const MethodMapping *getMapping(const char *wkt2_name) noexcept;
const MethodMapping *getMapping(const OperationMethod *method) noexcept;
std::vector<const MethodMapping *>
getMappingsFromPROJName(const std::string &projName);
const ParamMapping *getMappingFromWKT1(const MethodMapping *mapping,
const std::string &wkt1_name);
bool areEquivalentParameters(const std::string &a, const std::string &b);
// ---------------------------------------------------------------------------
struct ESRIParamMapping {
const char *esri_name;
const char *wkt2_name;
int epsg_code;
const char *fixed_value;
bool is_fixed_value;
};
struct ESRIMethodMapping {
const char *esri_name;
const char *wkt2_name;
int epsg_code;
const ESRIParamMapping *const params;
};
std::vector<const ESRIMethodMapping *>
getMappingsFromESRI(const std::string &esri_name);
// ---------------------------------------------------------------------------
bool isAxisOrderReversal(int methodEPSGCode);
@@ -303,6 +256,15 @@ class PROJBasedOperation : public SingleOperation {
bool inverse_ = false;
};
// ---------------------------------------------------------------------------
class InvalidOperationEmptyIntersection : public InvalidOperation {
public:
explicit InvalidOperationEmptyIntersection(const std::string &message);
InvalidOperationEmptyIntersection(
const InvalidOperationEmptyIntersection &other);
~InvalidOperationEmptyIntersection() override;
};
} // namespace operation
NS_PROJ_END
@@ -0,0 +1,88 @@
/******************************************************************************
*
* Project: PROJ
* Purpose: ISO19111:2019 implementation
* Author: Even Rouault <even dot rouault at spatialys dot com>
*
******************************************************************************
* Copyright (c) 2018, Even Rouault <even dot rouault at spatialys dot com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#ifndef COORDINATEROPERATION_PRIVATE_HPP
#define COORDINATEROPERATION_PRIVATE_HPP
#include "proj/coordinateoperation.hpp"
#include "proj/util.hpp"
// ---------------------------------------------------------------------------
NS_PROJ_START
namespace operation {
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
struct CoordinateOperation::Private {
util::optional<std::string> operationVersion_{};
std::vector<metadata::PositionalAccuracyNNPtr>
coordinateOperationAccuracies_{};
std::weak_ptr<crs::CRS> sourceCRSWeak_{};
std::weak_ptr<crs::CRS> targetCRSWeak_{};
crs::CRSPtr interpolationCRS_{};
util::optional<common::DataEpoch> sourceCoordinateEpoch_{};
util::optional<common::DataEpoch> targetCoordinateEpoch_{};
bool hasBallparkTransformation_ = false;
bool use3DHelmert_ = false;
// do not set this for a ProjectedCRS.definingConversion
struct CRSStrongRef {
crs::CRSNNPtr sourceCRS_;
crs::CRSNNPtr targetCRS_;
CRSStrongRef(const crs::CRSNNPtr &sourceCRSIn,
const crs::CRSNNPtr &targetCRSIn)
: sourceCRS_(sourceCRSIn), targetCRS_(targetCRSIn) {}
};
std::unique_ptr<CRSStrongRef> strongRef_{};
Private() = default;
Private(const Private &other)
: operationVersion_(other.operationVersion_),
coordinateOperationAccuracies_(other.coordinateOperationAccuracies_),
sourceCRSWeak_(other.sourceCRSWeak_),
targetCRSWeak_(other.targetCRSWeak_),
interpolationCRS_(other.interpolationCRS_),
sourceCoordinateEpoch_(other.sourceCoordinateEpoch_),
targetCoordinateEpoch_(other.targetCoordinateEpoch_),
hasBallparkTransformation_(other.hasBallparkTransformation_),
strongRef_(other.strongRef_ ? internal::make_unique<CRSStrongRef>(
*(other.strongRef_))
: nullptr) {}
Private &operator=(const Private &) = delete;
};
//! @endcond
// ---------------------------------------------------------------------------
} // namespace operation
NS_PROJ_END
#endif // COORDINATEROPERATION_PRIVATE_HPP
File diff suppressed because it is too large Load Diff
@@ -29,26 +29,24 @@
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#ifndef FROM_COORDINATE_OPERATION_CPP
#error This file should only be included from coordinateoperation.cpp
#ifndef FROM_PROJ_CPP
#define FROM_PROJ_CPP
#endif
#ifndef ESRI_PROJECTION_MAPPINGS_HH_INCLUDED
#define ESRI_PROJECTION_MAPPINGS_HH_INCLUDED
#include "esriparammappings.hpp"
#include "proj_constants.h"
#include "coordinateoperation_internal.hpp"
#include "proj/internal/internal.hpp"
NS_PROJ_START
using namespace internal;
namespace operation {
//! @cond Doxygen_Suppress
// ---------------------------------------------------------------------------
// anonymous namespace
namespace {
using namespace ::NS_PROJ;
using namespace ::NS_PROJ::operation;
static const ESRIParamMapping paramsESRI_Plate_Carree[] = {
const ESRIParamMapping paramsESRI_Plate_Carree[] = {
{"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING,
EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_FALSE_NORTHING,
@@ -57,7 +55,7 @@ static const ESRIParamMapping paramsESRI_Plate_Carree[] = {
EPSG_CODE_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
static const ESRIParamMapping paramsESRI_Equidistant_Cylindrical[] = {
const ESRIParamMapping paramsESRI_Equidistant_Cylindrical[] = {
{"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING,
EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_FALSE_NORTHING,
@@ -88,7 +86,7 @@ static const ESRIParamMapping paramsESRI_Mercator[] = {
EPSG_CODE_PARAMETER_LATITUDE_1ST_STD_PARALLEL, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
static const ESRIParamMapping paramsESRI_Gauss_Kruger[] = {
const ESRIParamMapping paramsESRI_Gauss_Kruger[] = {
{"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING,
EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_FALSE_NORTHING,
@@ -101,7 +99,7 @@ static const ESRIParamMapping paramsESRI_Gauss_Kruger[] = {
EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
static const ESRIParamMapping paramsESRI_Transverse_Mercator[] = {
const ESRIParamMapping paramsESRI_Transverse_Mercator[] = {
{"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING,
EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_FALSE_NORTHING,
@@ -492,7 +490,7 @@ static const ESRIParamMapping
EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
static const ESRIParamMapping
const ESRIParamMapping
paramsESRI_Hotine_Oblique_Mercator_Azimuth_Natural_Origin[] = {
{"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING,
EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false},
@@ -508,21 +506,20 @@ static const ESRIParamMapping
EPSG_CODE_PARAMETER_LATITUDE_PROJECTION_CENTRE, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
static const ESRIParamMapping
paramsESRI_Hotine_Oblique_Mercator_Azimuth_Center[] = {
{"False_Easting", EPSG_NAME_PARAMETER_EASTING_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_EASTING_PROJECTION_CENTRE, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_NORTHING_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_NORTHING_PROJECTION_CENTRE, "0.0", false},
{"Scale_Factor", EPSG_NAME_PARAMETER_SCALE_FACTOR_INITIAL_LINE,
EPSG_CODE_PARAMETER_SCALE_FACTOR_INITIAL_LINE, "0.0", false},
{"Azimuth", EPSG_NAME_PARAMETER_AZIMUTH_INITIAL_LINE,
EPSG_CODE_PARAMETER_AZIMUTH_INITIAL_LINE, "0.0", false},
{"Longitude_Of_Center", EPSG_NAME_PARAMETER_LONGITUDE_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_LONGITUDE_PROJECTION_CENTRE, "0.0", false},
{"Latitude_Of_Center", EPSG_NAME_PARAMETER_LATITUDE_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_LATITUDE_PROJECTION_CENTRE, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
const ESRIParamMapping paramsESRI_Hotine_Oblique_Mercator_Azimuth_Center[] = {
{"False_Easting", EPSG_NAME_PARAMETER_EASTING_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_EASTING_PROJECTION_CENTRE, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_NORTHING_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_NORTHING_PROJECTION_CENTRE, "0.0", false},
{"Scale_Factor", EPSG_NAME_PARAMETER_SCALE_FACTOR_INITIAL_LINE,
EPSG_CODE_PARAMETER_SCALE_FACTOR_INITIAL_LINE, "0.0", false},
{"Azimuth", EPSG_NAME_PARAMETER_AZIMUTH_INITIAL_LINE,
EPSG_CODE_PARAMETER_AZIMUTH_INITIAL_LINE, "0.0", false},
{"Longitude_Of_Center", EPSG_NAME_PARAMETER_LONGITUDE_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_LONGITUDE_PROJECTION_CENTRE, "0.0", false},
{"Latitude_Of_Center", EPSG_NAME_PARAMETER_LATITUDE_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_LATITUDE_PROJECTION_CENTRE, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
static const ESRIParamMapping paramsESRI_Double_Stereographic[] = {
{"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING,
@@ -706,29 +703,11 @@ static const ESRIParamMapping paramsESRI_Stereographic_South_Pole[] = {
EPSG_CODE_PARAMETER_LATITUDE_STD_PARALLEL, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
static const ESRIParamMapping
paramsESRI_Rectified_Skew_Orthomorphic_Natural_Origin[] = {
{"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING,
EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_FALSE_NORTHING,
EPSG_CODE_PARAMETER_FALSE_NORTHING, "0.0", false},
{"Scale_Factor", EPSG_NAME_PARAMETER_SCALE_FACTOR_INITIAL_LINE,
EPSG_CODE_PARAMETER_SCALE_FACTOR_INITIAL_LINE, "0.0", false},
{"Azimuth", EPSG_NAME_PARAMETER_AZIMUTH_INITIAL_LINE,
EPSG_CODE_PARAMETER_AZIMUTH_INITIAL_LINE, "0.0", false},
{"Longitude_Of_Center", EPSG_NAME_PARAMETER_LONGITUDE_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_LONGITUDE_PROJECTION_CENTRE, "0.0", false},
{"Latitude_Of_Center", EPSG_NAME_PARAMETER_LATITUDE_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_LATITUDE_PROJECTION_CENTRE, "0.0", false},
{"XY_Plane_Rotation", EPSG_NAME_PARAMETER_ANGLE_RECTIFIED_TO_SKEW_GRID,
EPSG_CODE_PARAMETER_ANGLE_RECTIFIED_TO_SKEW_GRID, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
static const ESRIParamMapping paramsESRI_Rectified_Skew_Orthomorphic_Center[] =
{{"False_Easting", EPSG_NAME_PARAMETER_EASTING_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_EASTING_PROJECTION_CENTRE, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_NORTHING_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_NORTHING_PROJECTION_CENTRE, "0.0", false},
const ESRIParamMapping paramsESRI_Rectified_Skew_Orthomorphic_Natural_Origin[] =
{{"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING,
EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_FALSE_NORTHING,
EPSG_CODE_PARAMETER_FALSE_NORTHING, "0.0", false},
{"Scale_Factor", EPSG_NAME_PARAMETER_SCALE_FACTOR_INITIAL_LINE,
EPSG_CODE_PARAMETER_SCALE_FACTOR_INITIAL_LINE, "0.0", false},
{"Azimuth", EPSG_NAME_PARAMETER_AZIMUTH_INITIAL_LINE,
@@ -741,6 +720,23 @@ static const ESRIParamMapping paramsESRI_Rectified_Skew_Orthomorphic_Center[] =
EPSG_CODE_PARAMETER_ANGLE_RECTIFIED_TO_SKEW_GRID, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
const ESRIParamMapping paramsESRI_Rectified_Skew_Orthomorphic_Center[] = {
{"False_Easting", EPSG_NAME_PARAMETER_EASTING_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_EASTING_PROJECTION_CENTRE, "0.0", false},
{"False_Northing", EPSG_NAME_PARAMETER_NORTHING_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_NORTHING_PROJECTION_CENTRE, "0.0", false},
{"Scale_Factor", EPSG_NAME_PARAMETER_SCALE_FACTOR_INITIAL_LINE,
EPSG_CODE_PARAMETER_SCALE_FACTOR_INITIAL_LINE, "0.0", false},
{"Azimuth", EPSG_NAME_PARAMETER_AZIMUTH_INITIAL_LINE,
EPSG_CODE_PARAMETER_AZIMUTH_INITIAL_LINE, "0.0", false},
{"Longitude_Of_Center", EPSG_NAME_PARAMETER_LONGITUDE_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_LONGITUDE_PROJECTION_CENTRE, "0.0", false},
{"Latitude_Of_Center", EPSG_NAME_PARAMETER_LATITUDE_PROJECTION_CENTRE,
EPSG_CODE_PARAMETER_LATITUDE_PROJECTION_CENTRE, "0.0", false},
{"XY_Plane_Rotation", EPSG_NAME_PARAMETER_ANGLE_RECTIFIED_TO_SKEW_GRID,
EPSG_CODE_PARAMETER_ANGLE_RECTIFIED_TO_SKEW_GRID, "0.0", false},
{nullptr, nullptr, 0, "0.0", false}};
static const ESRIParamMapping paramsESRI_Goode_Homolosine_alt1[] = {
{"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING,
EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false},
@@ -1101,8 +1097,27 @@ static const ESRIMethodMapping esriMappings[] = {
// ---------------------------------------------------------------------------
} // namespace {
const ESRIMethodMapping *getEsriMappings(size_t &nElts) {
nElts = sizeof(esriMappings) / sizeof(esriMappings[0]);
return esriMappings;
}
// ---------------------------------------------------------------------------
std::vector<const ESRIMethodMapping *>
getMappingsFromESRI(const std::string &esri_name) {
std::vector<const ESRIMethodMapping *> res;
for (const auto &mapping : esriMappings) {
if (ci_equal(esri_name, mapping.esri_name)) {
res.push_back(&mapping);
}
}
return res;
}
//! @endcond
#endif // ESRI_PROJECTION_MAPPINGS_HH_INCLUDED
// ---------------------------------------------------------------------------
} // namespace operation
NS_PROJ_END

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