Compare commits

..
110 Commits
Author SHA1 Message Date
Mike Taves 445ad0cb9c ReadTheDocs: fix branch ref, improve skipping pattern [ci skip] 2023-01-25 23:01:39 +13:00
Mike Taves 3298856adb ReadTheDocs: update output directory for artefacts, other updates 2023-01-25 14:37:33 +13:00
Mike Taves 41011f93be DOC: add TOC to PDF contents, use 1-column index to prevent overprinting (#3475) 2023-01-13 14:49:35 +13:00
Mike Taves af6eaeaa89 Implement ReadTheDocs for 9.0, disable other CI workflows (#3554) 2023-01-13 13:29:05 +13:00
Kristian Evers ba7fd762e3 Stop building website from 9.0 branch 2022-09-01 16:42:56 +02:00
Michael Sumner 0ba73a9143 Update ellipsoids.rst: typo (#3275) 2022-08-03 13:39:40 +12:00
Even Rouault fcb192be03 Merge pull request #3259 from agiudiceandrea/patch-1
Doc: update OSGeo4W installation instructions for Windows
2022-07-13 18:16:21 +02:00
Andrea Giudiceandrea 8d3951faf9 Doc: update OSGeo4W installation instructions 2022-07-13 16:30:43 +02:00
Even Rouault 764e4fa0e0 Merge pull request #3245 from OSGeo/revert-3092-backport-3081-to-9.0
Revert "[Backport 9.0] Use CMAKE_INSTALL_MANDIR to override default"
2022-07-02 16:28:04 +02:00
Mike Taves 5b605e70fd Revert "Use CMAKE_INSTALL_MANDIR to override default (#3081) (#3092)"
This reverts commit 840a723c99.
2022-07-02 19:40:54 +12:00
github-actions[bot]andEven Rouault 7524cb6978 Merge pull request #3243 from visr/patch-1 (#3244)
Julia package renamed from Proj4.jl to Proj.jl

Co-authored-by: Even Rouault <even.rouault@spatialys.com>
2022-07-02 12:34:34 +12:00
Even Rouault 2a62943a6b Doc: fix news.rst 2022-06-19 15:53:57 +02:00
Kristian Evers f60fd03744 Update website for 9.0.1 release 2022-06-15 16:33:25 +02:00
Mike Taves d6990e9574 Fix typo in NEWS: Greenwhich->Greenwich 2022-06-09 16:21:57 +12:00
Kristian Evers a2d3c39661 Merge pull request #3225 from sebastic/soversion
Revert SOVERSION back to 25.
2022-06-08 19:15:35 +02:00
Bas Couwenberg 544eb6bba2 Revert SOVERSION back to 25. 2022-06-08 18:37:26 +02:00
Kristian Evers 0b2d36424c Update PROJ-data version in database 2022-06-07 21:28:46 +02:00
Kristian Evers 1ce7daee0c Update NEWS for 9.0.1 2022-06-07 21:02:34 +02:00
Kristian Evers 30ca9f9470 Update man-pages from Sphinx-docs 2022-06-07 21:01:38 +02:00
Kristian Evers cf1c627dc7 Update ABI and API numbers for 9.0.1 release 2022-06-07 20:39:44 +02:00
Even Rouault 81a726c880 Merge pull request #3224 from OSGeo/backport-3222-to-9.0
[Backport 9.0] Doc: fix build issue with Sphinx 5.0
2022-06-05 21:52:18 +02:00
Even Rouault cbac7de90a Merge pull request #3222 from rouault/sphinx_5_compat
Doc: fix build issue with Sphinx 5.0
2022-06-05 19:42:45 +00:00
Even Rouault 641e1082bc Merge pull request #3223 from OSGeo/backport-3221-to-9.0
[Backport 9.0] PROJJSON parser: do not error out if a datum ensemble member is unknown in the database
2022-06-05 21:38:08 +02:00
Even Rouault 6c0ca060cd Merge pull request #3221 from rouault/projjson_unknown_member
PROJJSON parser: do not error out if a datum ensemble member is unknown in the database
2022-06-05 18:14:10 +00:00
Even Rouault 6833956600 Merge pull request #3218 from OSGeo/backport-3214-to-9.0
[Backport 9.0] PROJJSON spec: mention the intentional lack of axis order member
2022-06-02 19:45:13 +02:00
Even Rouault c90d44ae4f Merge pull request #3214 from rouault/projjson_no_order
PROJJSON spec: mention the intentional lack of axis order member
2022-06-01 12:40:26 +00:00
Even Rouault bcab1d5cd6 Merge pull request #3213 from OSGeo/rouault-patch-1
projjson.rst: formatting fix
2022-05-27 15:37:26 +02:00
Even Rouault 99ffd3c609 projjson.rst: formatting fix 2022-05-26 22:50:55 +02:00
Even Rouault 63ad2e73be Merge pull request #3212 from OSGeo/backport-3211-to-9.0
[Backport 9.0] WKT import: correctly deal with absence of Latitude_Of_Origin parameter in WKT1 ESRI with Stereographic projection (fixes #3210)
2022-05-24 11:50:37 +02:00
Even Rouault 39cd88063a Merge pull request #3211 from rouault/fix_3210
WKT import: correctly deal with absence of Latitude_Of_Origin parameter in WKT1 ESRI with Stereographic projection (fixes #3210)
2022-05-23 22:17:35 +00:00
Even Rouault 3a7bdcb28d Merge pull request #3208 from OSGeo/backport-3207-to-9.0
[Backport 9.0] Database: update to EPSG 10.064
2022-05-19 23:49:47 +02:00
Even Rouault a3286f4f46 Merge pull request #3207 from rouault/epsg_10_064
Database: update to EPSG 10.064
2022-05-19 09:25:53 +00:00
Even Rouault a0977a3e9a Merge pull request #3205 from OSGeo/backport-3204-to-9.0
[Backport 9.0] projjson.rst: formatting fix
2022-05-16 22:02:03 +02:00
Even Rouault 667d31ec19 Merge pull request #3204 from OSGeo/rouault-patch-1
projjson.rst: formatting fix
2022-05-16 19:56:16 +00:00
Even Rouault 6da2e58806 docs/source/conf.py: update github_version 2022-05-16 21:40:08 +02:00
Even Rouault 3a223d9ce5 Merge pull request #3203 from OSGeo/backport-3202-to-9.0
[Backport 9.0] Identifier::isEquivalentName(): fix when ending by ' + ' which could …
2022-05-16 19:23:47 +02:00
Even Rouault 31631f17d9 Merge pull request #3202 from rouault/fix_ossfuzz_47475
Identifier::isEquivalentName(): fix when ending by ' + ' which could …
2022-05-16 16:54:38 +00:00
Even Rouault c58e68d28f Merge pull request #3199 from OSGeo/backport-3193-to-9.0
[Backport 9.0] createOperations(): fix/improve result of 'BD72 + Ostend height ' to 'WGS84+EGM96 height' (fixes #3191)
2022-05-13 22:01:30 +02:00
Even Rouault 3c5ef75881 Merge pull request #3193 from rouault/fix_3191
createOperations(): fix/improve result of 'BD72 + Ostend height ' to 'WGS84+EGM96 height' (fixes #3191)
2022-05-13 19:48:34 +00:00
Even Rouault 5f7e401ed2 Merge pull request #3198 from OSGeo/backport-3190-to-9.0
[Backport 9.0] Doc: enhance PROJJSON specification
2022-05-13 21:21:37 +02:00
Even Rouault 346f669ec6 Doc: enhance PROJJSON specification (#3190) 2022-05-13 13:14:00 +00:00
Even Rouault fbeb21b7fc Merge pull request #3196 from OSGeo/backport-3195-to-9.0
[Backport 9.0] Doc: mentions that Winkel Tripel has inverse method (fixes #3179)
2022-05-13 15:12:05 +02:00
Even Rouault fa3b9cbcc8 Merge pull request #3195 from rouault/fix_3179
Doc: mentions that Winkel Tripel has inverse method (fixes #3179)
2022-05-13 09:21:06 +00:00
Even Rouault a8b6143574 Merge pull request #3189 from OSGeo/backport-3188-to-9.0
[Backport 9.0] WKT import: deal with Projected CRS that is a mix of WKT1:GDAL / WKT1:ESRI (fixes #3186)
2022-05-10 22:01:12 +02:00
Even Rouault be05f52fa4 Merge pull request #3188 from rouault/fix_3186
WKT import: deal with Projected CRS that is a mix of WKT1:GDAL / WKT1:ESRI (fixes #3186)
2022-05-10 13:36:50 +00:00
Even Rouault 6c622c65cc Merge pull request #3187 from OSGeo/backport-3184-to-9.0
[Backport 9.0] Database: update to EPSG 10.063
2022-05-10 13:01:03 +02:00
Even Rouault c3748bfce0 Merge pull request #3184 from rouault/epsg_10_063
Database: update to EPSG 10.063
2022-05-10 10:05:49 +00:00
Even Rouault 717f3cbee5 Merge pull request #3185 from OSGeo/backport-3172-to-9.0
[Backport 9.0] Fix cmake CURL dependency, update appveyor - vcpkg interaction
2022-05-10 12:04:32 +02:00
Even Rouault 1f266f3af5 Merge pull request #3172 from dg0yt/appveyor-vcpkg
Fix cmake CURL dependency, update appveyor - vcpkg interaction
2022-05-08 22:22:53 +00:00
github-actions[bot]andEven Rouault a0c7555248 Merge pull request #3181 from rouault/fix_doc_build (#3182)
CI: fix doc_build job

Co-authored-by: Even Rouault <even.rouault@spatialys.com>
2022-05-05 11:30:19 +12:00
Even Rouault 9d4aa1fbd3 Merge pull request #3167 from OSGeo/backport-3166-to-9.0
[Backport 9.0] Database: update to EPSG v10.059
2022-04-17 03:00:59 +02:00
Even Rouault 0e740ae58f Merge pull request #3166 from rouault/epsg_10_059
Database: update to EPSG v10.059
2022-04-16 23:05:41 +00:00
Even Rouault 7ab1fb7f4e Merge pull request #3163 from OSGeo/backport-3153-to-9.0
[Backport 9.0] createOperations(): fix some complex cases involving TOWGS84 and CompoundCRS
2022-04-11 23:27:11 +02:00
Even Rouault d89cb819cb Merge pull request #3153 from rouault/fix_3152
createOperations(): fix some complex cases involving TOWGS84 and CompoundCRS
2022-04-11 10:53:49 +00:00
Even Rouault 187108b6ed Merge pull request #3160 from OSGeo/backport-3158-to-9.0
[Backport 9.0] createBoundCRSToWGS84IfPossible(): improve selection logic to generate +towgs84= taking into account extent
2022-04-08 11:53:31 +02:00
Even Rouault 39397ed58d Merge pull request #3159 from OSGeo/backport-3157-to-9.0
[Backport 9.0] ITRF2014: fix ITRF2014:ITRF88,ITRF94 and ITRF96 definitions
2022-04-08 11:53:20 +02:00
Even Rouault 1bdeb239b7 Merge pull request #3158 from rouault/improve_proj4_towgs84
createBoundCRSToWGS84IfPossible(): improve selection logic to generate +towgs84= taking into account extent
2022-04-07 21:21:20 +00:00
Even Rouault 50fa033374 Merge pull request #3157 from rouault/fix_3156
ITRF2014: fix ITRF2014:ITRF88,ITRF94 and ITRF96 definitions
2022-04-07 21:15:06 +00:00
Even Rouault 43581d5bcf Merge pull request #3155 from OSGeo/backport-3154-to-9.0
[Backport 9.0] Database: add OGC:CRS84h (WGS 84 longitude-latitude-height)
2022-04-05 15:06:37 +02:00
Even Rouault cbab506524 Merge pull request #3154 from rouault/OGC_CRS84h
Database: add OGC:CRS84h (WGS 84 longitude-latitude-height)
2022-04-05 10:39:46 +00:00
Even Rouault 12266b5f68 Merge pull request #3151 from OSGeo/backport-3147-to-9.0
[Backport 9.0] createOperations(): fix CompoundCRS[BoundCRS[ProjectedCRS],BoundCRS[VerticalCRS]] to Geog3DCrs
2022-03-30 20:40:20 +02:00
Even Rouault c1c8074782 Merge pull request #3147 from rouault/fix_compoundCRS_with_bound_of_projected_and_bound_of_vertical_to_geog3D
createOperations(): fix CompoundCRS[BoundCRS[ProjectedCRS],BoundCRS[VerticalCRS]] to Geog3DCrs
2022-03-30 07:22:41 +00:00
Even Rouault 9bee7f5f40 Merge pull request #3149 from OSGeo/backport-3134-to-9.0
[Backport 9.0] Deal with PARAMETER["EPSG code for Interpolation CRS",crs_code]
2022-03-29 11:51:24 +02:00
Even Rouault 9a6d8b93e8 Merge pull request #3148 from OSGeo/backport-3128-to-9.0
[Backport 9.0] Database: update to EPSG v10.057
2022-03-29 11:51:12 +02:00
Even Rouault fde9135980 Merge pull request #3134 from rouault/parameter_epsg_code_interpolation_crs
Deal with PARAMETER["EPSG code for Interpolation CRS",crs_code]
2022-03-28 22:47:13 +00:00
Even Rouault dc2c7a3f96 Merge pull request #3128 from rouault/epsg_10_057
Database: update to EPSG v10.057
2022-03-28 22:46:39 +00:00
Kristian Evers 325595e176 Merge pull request #3145 from OSGeo/backport-3144-to-9.0
[Backport 9.0] Improve documentation plotting of interrupted projections.
2022-03-28 22:06:12 +02:00
erykoff 9928f83afb Improve documentation plotting of interrupted projections. (#3144)
Improves the documentation plotting code by adding checks for interrupted lines and graticules. This does not replace the continental outlines with filled continents because that is a harder job. A number of plots has been improved and included in the docs.

Also fixes a typo on the ob_tran plot so that it now renders as intended according to the description paragraph as an oblique Mollweide rather than oblique Miller Cylindrical, which is neither a common nor attractive projection.
2022-03-28 14:54:42 +00:00
Kristian Evers 7b6c7f2333 Merge pull request #3142 from OSGeo/backport-3136-to-9.0
[Backport 9.0] Use Mambaforge variant instead of Miniconda
2022-03-27 12:15:33 +02:00
Even Rouault 45c927dd33 Merge pull request #3136 from mwtoews/use-mambaforge
Use Mambaforge variant instead of Miniconda
2022-03-27 00:18:17 +00:00
Kristian Evers 2425d786be Merge pull request #3141 from OSGeo/backport-3137-to-9.0
[Backport 9.0] Fix build issue for ARM64 when using MSVC
2022-03-26 07:25:16 +01:00
Kristian Evers dc4d82b243 Merge pull request #3140 from OSGeo/backport-3132-to-9.0
[Backport 9.0] Steps with omit_inv are not considered when checking if inverse pipeline operation is possible
2022-03-26 07:25:01 +01:00
Even Rouault 1aaa174e5f Merge pull request #3137 from anthony-linaro/master
Fix build issue for ARM64 when using MSVC
2022-03-26 00:31:52 +00:00
Oskari Timperi 369ce8d40e Steps with omit_inv are not considered when checking if inverse pipeline operation is possible (#3132) 2022-03-25 23:53:19 +00:00
Even Rouault 992fcc8dbb Merge pull request #3129 from OSGeo/backport-3125-to-9.0
[Backport 9.0] Fix datum names when importing from PROJ4 crs strings (affects some transformations using geoidgrids)
2022-03-25 23:50:15 +01:00
github-actions[bot]andEven Rouault 6686cc0ccc Merge pull request #3130 from Biswa96/cmake-mingw (#3135)
cmake: Follow unix-like install directories in mingw

Co-authored-by: Even Rouault <even.rouault@spatialys.com>
2022-03-25 13:12:24 +13:00
Even Rouault 9579231d96 Merge pull request #3125 from rouault/import_proj4_datum_names
Fix datum names when importing from PROJ4 crs strings (affects some transformations using geoidgrids)
2022-03-22 19:51:42 +00:00
Even Rouault 5d3b2a94c6 Merge pull request #3124 from OSGeo/backport-3123-to-9.0
[Backport 9.0] createOperations(): fix transformation involving CompoundCRS, ToWGS84 and PROJ4_GRIDS
2022-03-19 18:10:53 +01:00
Even Rouault 940186f7af Merge pull request #3123 from rouault/fix_compound_crs_nad83_csrs
createOperations(): fix transformation involving CompoundCRS, ToWGS84 and PROJ4_GRIDS
2022-03-19 11:20:54 +00:00
Even Rouault 0dbff99390 SingleCRS::baseIsEquivalentTo(): fix potential crash that is triggered by fdf5111a9a changes 2022-03-18 22:22:15 +01:00
Even Rouault afb279808b Merge pull request #3120 from OSGeo/backport-3118-to-9.0
[Backport 9.0] Fix comparison of GeodeticRefrenceFrame vs DynamicGeodeticReferenceFrame
2022-03-16 21:09:11 +01:00
Even Rouault 9296f97e45 Merge pull request #3118 from rouault/dynamic_datum_isequivalentto
Fix comparison of GeodeticRefrenceFrame vs DynamicGeodeticReferenceFrame
2022-03-16 13:01:01 +00:00
Even Rouault cd8609b915 Merge pull request #3116 from OSGeo/backport-3115-to-9.0
[Backport 9.0] DOC: Add missing lat_0 parameter to gnomonic documentation.
2022-03-16 00:21:10 +01:00
Even Rouault a2d45bb42c Merge pull request #3110 from OSGeo/backport-3108-to-9.0
[Backport 9.0] createOperations(): fix issue in transformation northing,easting projected CRS -> +proj=longlat +lon_wrap (fixes #3095)
2022-03-16 00:21:00 +01:00
Kristian Evers 8f614bb9e4 Merge pull request #3117 from OSGeo/backport-3111-to-9.0
[Backport 9.0] unitconvert: round to nearest date when converting to yyyymmdd.
2022-03-15 08:52:43 +01:00
Kristian Evers ac069da7de Merge pull request #3111 from direvus/1483-round-to-date
unitconvert: round to nearest date when converting to yyyymmdd.
2022-03-14 20:01:55 +00:00
Kristian Evers b7bd426c2f Merge pull request #3115 from erykoff/fix-gnom-doc
DOC: Add missing lat_0 parameter to gnomonic documentation.
2022-03-14 19:45:28 +00:00
Kristian Evers fb4f815a09 Merge pull request #3113 from OSGeo/backport-3112-to-9.0
[Backport 9.0] DOCS: add missing functions from filemanager.cpp
2022-03-11 10:26:36 +01:00
Kristian Evers 9b35b53275 Merge pull request #3112 from direvus/2540-doxygen-missing-funcs
DOCS: add missing functions from filemanager.cpp
2022-03-11 07:39:27 +00:00
Even Rouault efc958e953 Merge pull request #3108 from rouault/fix_3095
createOperations(): fix issue in transformation northing,easting projected CRS -> +proj=longlat +lon_wrap (fixes #3095)
2022-03-10 09:49:04 +00:00
Even Rouault d54cc9e447 Merge pull request #3109 from OSGeo/backport-3099-to-9.0
[Backport 9.0] CMake: fix installation of proj.pc on Windows (fixes #3078)
2022-03-10 10:48:50 +01:00
Even Rouault 3f772a73e7 Merge pull request #3099 from rouault/fix_3078
CMake: fix installation of proj.pc on Windows (fixes #3078)
2022-03-09 21:34:27 +00:00
Even Rouault 10aa25d5ad Merge pull request #3107 from OSGeo/backport-3106-to-9.0
[Backport 9.0] nkg.gie: update results due to https://github.com/OSGeo/PROJ-data/pull/79
2022-03-09 21:42:44 +01:00
Even Rouault e082c6f1ef Merge pull request #3106 from rouault/update_nkg_gie
nkg.gie: update results due to https://github.com/OSGeo/PROJ-data/pull/79
2022-03-09 18:07:27 +00:00
Even Rouault b68b8cd1b8 Merge pull request #3105 from OSGeo/backport-3102-to-9.0
[Backport 9.0] Fix issues with WKT of concatenated operations (#3076)
2022-03-09 17:02:22 +01:00
Even Rouault 860d790457 Merge pull request #3102 from rouault/fix_3076
Fix issues with WKT of concatenated operations (#3076)
2022-03-09 14:45:25 +00:00
Even Rouault 5399a95d96 Merge pull request #3104 from OSGeo/backport-3103-to-9.0
[Backport 9.0] Database: update to EPSG v10.055
2022-03-09 15:45:07 +01:00
Even Rouault 494b47737a Merge pull request #3103 from rouault/epsg_10_055
Database: update to EPSG v10.055
2022-03-09 14:18:05 +00:00
Even Rouault 7779e87663 Merge pull request #3101 from OSGeo/backport-3098-to-9.0
[Backport 9.0] Fix issue when transforming from/to BoundCRS of 3D CRS with non-Green…
2022-03-09 14:25:35 +01:00
Even Rouault ec4b1747f7 Merge pull request #3098 from rouault/fix_gdal_5408
Fix issue when transforming from/to BoundCRS of 3D CRS with non-Green…
2022-03-09 10:35:59 +00:00
Even Rouault 2f782f927c Merge pull request #3097 from OSGeo/backport-3093-to-9.0
[Backport 9.0] DOC: improve CMake integration example; remove CMake <3 detail
2022-03-08 23:18:01 +01:00
Mike Taves 7fd9e4ae21 DOC: improve CMake integration example; remove CMake <3 detail (#3093) 2022-03-08 20:12:35 +00:00
github-actions[bot]andEven Rouault 2bc292b0c2 Merge pull request #3087 from mwtoews/cmake-list-remove-item-fix (#3096)
CMake: handle potentially undefined value in list function

Co-authored-by: Even Rouault <even.rouault@spatialys.com>
2022-03-09 06:12:42 +13:00
github-actions[bot]andMike Taves 840a723c99 Use CMAKE_INSTALL_MANDIR to override default (#3081) (#3092)
Co-authored-by: Mike Taves <mwtoews@gmail.com>
2022-03-08 00:47:01 +13:00
Even Rouault de35615650 Merge pull request #3091 from OSGeo/backport-3089-to-9.0
[Backport 9.0] Fix wrong results with SQLite 3.38.0 (fixes #3077)
2022-03-06 17:54:30 +01:00
Even Rouault 486da786ac Merge pull request #3089 from rouault/fix_3077
Fix wrong results with SQLite 3.38.0 (fixes #3077)
2022-03-06 10:50:33 +00:00
Kristian Evers 8ea73006ce Merge pull request #3090 from OSGeo/backport-3082-to-9.0
[Backport 9.0] Increase MAX_ITER so Mollweide forward projection works near the poles.
2022-03-06 10:06:34 +01:00
erykoff 8a88101fe5 Increase MAX_ITER so Mollweide forward projection works near the poles. (#3082) 2022-03-05 15:21:36 +00:00
github-actions[bot]andMike Taves c34b0ac71b CI: use ctest --output-on-failure option (#3084) (#3086)
Co-authored-by: Mike Taves <mwtoews@gmail.com>
2022-03-05 00:06:47 +13:00
Kristian Evers 9e1f83617c docs: fix syntax errors on news site 2022-03-02 19:28:13 +01:00
853 changed files with 55180 additions and 130507 deletions
-2
View File
@@ -1,2 +0,0 @@
BasedOnStyle: llvm
IndentWidth: 4
-2
View File
@@ -1,2 +0,0 @@
# Auto-generated file.
src/proj_symbol_rename.h
-2
View File
@@ -1,2 +0,0 @@
f090353792c0530a7aa5d02e44ad9b236986757b
aa818d6772887453432ce607410b784ff56308a1
+8 -19
View File
@@ -6,37 +6,26 @@ labels: bug
<!-- Please search existing issues to avoid creating duplicates. -->
#### AI usage
- [ ] AI (Copilot or something similar) supported the creation f this ticket. See our [policy about AI tool use](https://proj.org/community/ai_tool_policy.html). Use of AI tools *must* be indicated.
- [ ] This ticket has been (mostly) written by myself (human), and is aimed at being read by humans. We *do* not accept AI generated wall-of-text
#### Example of problem
Demonstrate the problem you have found, either by using PROJ tools like
`cs2cs`, `cct` or `projinfo` **or** add a code snippet that highlights the
problem using the PROJ C/C++ API.
A "Minimal, Complete and Verifiable Example" will make it much easier for
maintainers to help you: <http://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports>
Demonstrate the problem you have found, either by using PROJ tools like `cs2cs`, `cct` or `projinfo` **or** add a code snippet that highlights the problem using the PROJ C/C++ API.
A "Minimal, Complete and Verifiable Example" will make it much easier for maintainers to help you:
http://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports
```c
# Your code here
```
#### Problem description
[this should explain **why** the current behavior is a problem and why the
expected output is a better solution.]
[this should explain **why** the current behavior is a problem and why the expected output is a better solution.]
#### Expected Output
#### Environment Information
- PROJ version (`proj`)
- Operation System Information
#### Environment Information
- PROJ version (`proj`)
- Operation System Information
#### Installation method
- conda, apt-get, from source, etc...
- conda, apt-get, from source, etc...
+4 -5
View File
@@ -1,7 +1,6 @@
<!-- Feel free to remove check-list items aren't relevant to your change -->
- [ ] AI (Copilot or something similar) supported my development of this PR. See our [policy about AI tool use](https://proj.org/community/ai_tool_policy.html). Use of AI tools *must* be indicated.
- [ ] Closes #xxxx
- [ ] Tests added
- [ ] Added clear title that can be used to generate release notes
- [ ] Fully documented, including updating `docs/source/*.rst` for new API
- [ ] Closes #xxxx
- [ ] Tests added
- [ ] Added clear title that can be used to generate release notes
- [ ] Fully documented, including updating `docs/source/*.rst` for new API
-12
View File
@@ -1,12 +0,0 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
cooldown:
default-days: 7
groups:
all-actions:
patterns:
- "*"
+18
View File
@@ -0,0 +1,18 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
- bug
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
-47
View File
@@ -1,47 +0,0 @@
name: Update Stable Tag
on:
push:
branches:
- '**' # Matches all branches, but we later filter on the one matching the STABLE_BRANCH repository variable
permissions:
contents: read
jobs:
update-stable-tag:
runs-on: ubuntu-latest
if: github.repository == 'OSGeo/PROJ'
permissions:
contents: write
steps:
- name: Check branch match
id: check_branch
env:
STABLE_BRANCH: ${{ vars.STABLE_BRANCH }} # Repository variable
run: |
echo "Push detected on branch $GITHUB_REF"
if [[ "${GITHUB_REF#refs/heads/}" != "${STABLE_BRANCH}" ]]; then
echo "This workflow only runs for branch $STABLE_BRANCH. Skipping further steps."
echo "run=false" >> $GITHUB_OUTPUT
else
echo "run=true" >> $GITHUB_OUTPUT
fi
- name: Checkout code
if: steps.check_branch.outputs.run == 'true'
uses: actions/checkout@v7.0.1
- name: Tag
if: steps.check_branch.outputs.run == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git config --global user.email "PROJ-bot@example.com"
git config --global user.name "PROJ-bot"
touch .dummy-file
git add .dummy-file
# Do that so that stable doesn't have the same git sha as the stable branch, so ReadTheDocs triggers a build
git commit -a -m "Add .dummy-file"
git checkout -b stable
git push -f origin stable
-36
View File
@@ -1,36 +0,0 @@
name: CIFuzz
on:
pull_request:
paths-ignore:
- 'docs/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
Fuzzing:
runs-on: ubuntu-latest
steps:
- name: Build Fuzzers
id: build
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
with:
oss-fuzz-project-name: 'proj4'
dry-run: false
- name: Run Fuzzers
uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
with:
oss-fuzz-project-name: 'proj4'
fuzz-seconds: 600
dry-run: false
- name: Upload Crash
uses: actions/upload-artifact@v7
if: failure() && steps.build.outcome == 'success'
with:
name: artifacts
path: ./out/artifacts
-57
View File
@@ -1,57 +0,0 @@
name: Clang Linux
on:
push:
paths-ignore:
- 'docs/**'
pull_request:
paths-ignore:
- 'docs/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
clang_linux:
runs-on: ubuntu-latest
env:
PROJ_CMAKE_BUILD_OPTIONS: ${{ matrix.PROJ_CMAKE_BUILD_OPTIONS }}
strategy:
fail-fast: false
matrix:
include:
- name: Regular
id: regular
PROJ_CMAKE_BUILD_OPTIONS: ""
- name: EMBED_RESOURCE_FILES
id: EMBED_RESOURCE_FILES
PROJ_CMAKE_BUILD_OPTIONS: "-DEMBED_RESOURCE_FILES=ON"
- name: Without TIFF
id: without_tiff
PROJ_CMAKE_BUILD_OPTIONS: "-DENABLE_TIFF=OFF"
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
- name: Cache
uses: actions/cache@v6.1.0
id: cache
with:
path: |
${{ github.workspace }}/ccache.tar.gz
key: ${{ runner.os }}-cache-clang-${{ matrix.id }}-${{ github.run_id }}
restore-keys: ${{ runner.os }}-cache-clang-${{ matrix.id }}-
- name: Run
run: docker run -e PROJ_GITHUB_SHA=${{ github.sha }} -e CI -e TRAVIS_BUILD_DIR="$PWD" -e PROJ_CMAKE_BUILD_OPTIONS="$PROJ_CMAKE_BUILD_OPTIONS" -e WORK_DIR="$PWD" -e TRAVIS_OS_NAME=linux -e BUILD_NAME=linux_clang -v $PWD:$PWD ubuntu:24.04 $PWD/ci/clang_linux/start.sh
@@ -1,28 +0,0 @@
name: Clang Static Analyzer
on:
push:
paths-ignore:
- 'docs/**'
pull_request:
paths-ignore:
- 'docs/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
clang_static_analyzer:
runs-on: ubuntu-24.04
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
- name: Run
run: ci/clang_static_analyzer/start.sh
-100
View File
@@ -1,100 +0,0 @@
name: Code Checks
on:
push:
paths-ignore:
- 'docs/**'
pull_request:
paths-ignore:
- 'docs/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
cppcheck_2204:
runs-on: ubuntu-22.04
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
- name: Install Requirements
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends cppcheck
- name: Run cppcheck test
run: ./scripts/cppcheck.sh
cppcheck_master:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
- name: Install Requirements
run: |
sudo apt update
sudo apt install -y --no-install-recommends git cmake g++ make
- name: Build cppcheck
run: |
git clone https://github.com/danmar/cppcheck
cd cppcheck
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install
cd ../..
- name: Run cppcheck test (on push events)
if: ${{ github.event_name == 'push' }}
run: |
./scripts/cppcheck.sh
- name: Run cppcheck test, but ignore failures (on pull request)
if: ${{ github.event_name == 'pull_request' }}
run: |
# Do not fail the job. This is just used as a tool to monitor how we are regarding recent cppcheck
./scripts/cppcheck.sh || /bin/true
code_quality_checks:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
- name: Detect missing includes
run: ./scripts/detect_missing_include.sh
other_checks:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
- name: Install Requirements
run: |
sudo apt-get install -y --no-install-recommends python3-pip
sudo apt-get remove -y python3-jsonschema
sudo pip3 install --break-system-packages cffconvert
- name: Validate citation file
run: |
cffconvert --validate
cffconvert -f bibtex
cffconvert -f apalike
linting:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/setup-python@v7
- uses: pre-commit/action@v3.0.1
-104
View File
@@ -1,104 +0,0 @@
name: "CodeQL"
on:
push:
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
analyze:
name: Analyze
# Runner size impacts CodeQL analysis time. To learn more, please see:
# - https://gh.io/recommended-hardware-resources-for-running-codeql
# - https://gh.io/supported-runners-and-hardware-resources
# - https://gh.io/using-larger-runners
# Consider using larger runners for possible analysis time improvements.
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'c-cpp' ]
# CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ]
# Use only 'java-kotlin' to analyze code written in Java, Kotlin or both
# Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v7.0.1
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v4.37.8
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
config: |
query-filters:
- exclude:
id: cpp/non-https-url
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y ccache cmake g++ sqlite3 libsqlite3-dev libtiff-dev libcurl4-openssl-dev
# cache the .ccache directory
# key it on the runner os, build type, deps, and arch
# It's especially important to include arch in the key because we
# may get runtime errors with -mavx2 from objects built on a
# different architecture.
- name: Restore build cache
if: matrix.language == 'c-cpp'
id: restore-cache
uses: actions/cache/restore@v6.1.0
with:
path: ${{ github.workspace }}/.ccache
key: ${{ matrix.id }}-${{ steps.get-arch.outputs.arch }}-${{ github.ref_name }}-${{ github.run_id }}
restore-keys: |
${{ matrix.id }}-${{ steps.get-arch.outputs.arch }}-${{ github.ref_name }}
${{ matrix.id }}-${{ steps.get-arch.outputs.arch }}
- name: Configure ccache
if: matrix.language == 'c-cpp'
run: |
echo CCACHE_BASEDIR=${{ github.workspace }} >> ${GITHUB_ENV}
echo CCACHE_DIR=${{ github.workspace }}/.ccache >> ${GITHUB_ENV}
echo CCACHE_MAXSIZE=250M >> ${GITHUB_ENV}
ccache -z
- name: Build
if: matrix.language == 'c-cpp'
run: |
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_CCACHE=YES
make -j$(nproc)
- name: Summarize ccache
if: matrix.language == 'c-cpp'
run: |
ccache -s
- name: Save build cache
if: matrix.language == 'c-cpp'
uses: actions/cache/save@v6.1.0
with:
path: ${{ github.workspace }}/.ccache
key: ${{ steps.restore-cache.outputs.cache-primary-key }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4.37.8
with:
category: "/language:${{matrix.language}}"
-57
View File
@@ -1,57 +0,0 @@
name: Conda
on:
push:
paths-ignore:
- 'docs/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
conda:
name: Conda ${{ matrix.platform }}
if: github.repository == 'OSGeo/PROJ'
runs-on: ${{ matrix.platform }}
strategy:
fail-fast: true
matrix:
# macos-15-intel: Intel
# macos-14: arm64
platform: ['ubuntu-latest','windows-latest','macos-15-intel','macos-14']
env:
GHA_CI_PLATFORM: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v7.0.1
- uses: conda-incubator/setup-miniconda@v4
with:
miniforge-version: latest
use-mamba: true
channels: conda-forge
auto-update-conda: true
- name: Setup
shell: bash -l {0}
run: |
source ./ci/conda/setup.sh
- name: Build
shell: bash -l {0}
run: |
source ../ci/conda/compile.sh
working-directory: ./proj.4-feedstock
- uses: actions/upload-artifact@v7
with:
name: ${{ matrix.platform }}-conda-package
path: ./proj.4-feedstock/packages/
-59
View File
@@ -1,59 +0,0 @@
name: Docs
on:
push:
branches-ignore:
- 'backport**'
- 'dependabot**'
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
docs:
name: Documentation checks
runs-on: ubuntu-latest
strategy:
fail-fast: true
container: ghcr.io/osgeo/proj-docs
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v4.1.7
- name: Update sphinx-rtd-theme
shell: bash -l {0}
run: |
pip install -U "sphinx-rtd-theme>=3.0.0"
- name: Print versions
shell: bash -l {0}
run: |
python3 --version
sphinx-build --version
python3 -m pip list --not-required --format=columns
- name: Lint .rst files
shell: bash -l {0}
run: |
set -eu
if find . -name '*.rst' | xargs grep -P '\t'; then echo 'Tabs are bad, please use four spaces in .rst files.'; false; fi
if find . -name '*.rst' | xargs grep "\.\.versionadded"; then echo 'Wrong annotation. Should be .. versionadded'; false; fi
if find . -name '*.rst' | xargs grep "\.\.note"; then echo 'Wrong annotation. Should be .. note'; false; fi
if find . -name '*.rst' | xargs grep "\.\.warning"; then echo 'Wrong annotation. Should be .. warning'; false; fi
if find . -name '*.rst' | xargs grep "\.\.codeblock"; then echo 'Wrong annotation. Should be .. codeblock'; false; fi
working-directory: ./docs
- name: Doxygen
shell: bash -l {0}
run: |
make .doxygen_up_to_date
working-directory: ./docs
- name: Spelling
shell: bash -l {0}
run: |
make spelling SPHINXOPTS=-W
working-directory: ./docs
-244
View File
@@ -1,244 +0,0 @@
name: Docker
on:
push:
paths-ignore:
- 'docs/**'
branches-ignore: ["dependabot/**"]
tags:
- '*'
pull_request:
paths-ignore:
- 'docs/**'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
# adapted from https://raw.githubusercontent.com/stefanprodan/podinfo/master/.github/workflows/release.yml
#
jobs:
containers:
name: ${{ matrix.container }} Container - ${{ matrix.runner }}
strategy:
matrix:
container: ["proj"]
runner: [ubuntu-24.04, ubuntu-24.04-arm]
dockerfile: ["./Dockerfile"]
include:
- container: "proj-docs"
dockerfile: "./docs/docbuild/Dockerfile"
runner: "ubuntu-24.04"
runs-on: ${{ matrix.runner }}
permissions:
contents: read
packages: write
attestations: write
id-token: write
env:
# Only push proj-docs package for master
PUSH_PACKAGES: ${{ github.repository_owner == 'OSGeo' && github.event_name != 'pull_request' && (matrix.container == 'proj' || (matrix.container == 'proj-docs' && github.ref_name == 'master')) }}
CONTAINER: ${{ matrix.container }}
steps:
- uses: actions/checkout@v7.0.1
- name: Lint
id: lint
run: |
echo "are we pushing packages" ${{ env.PUSH_PACKAGES }}
echo "event_name" ${{ github.event_name }}
echo "ref" ${{ github.ref }}
- name: Set up Docker
uses: docker/setup-docker-action@v5.4.0
with:
daemon-config: |
{
"debug": false,
"features": {
"containerd-snapshotter": true
}
}
- name: Setup Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v4
with:
version: latest
- name: Login to GitHub Container Registry
if: env.PUSH_PACKAGES == 'true'
uses: docker/login-action@v4.6.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Login to Docker Hub
if: env.PUSH_PACKAGES == 'true'
uses: docker/login-action@v4.6.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract container metadata
id: meta
uses: docker/metadata-action@v6
with:
images: |
ghcr.io/osgeo/${{ matrix.container }}
docker.io/osgeo/${{ matrix.container }}
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
env:
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index
- name: Prepare
id: prep
run: |
VERSION=sha-${GITHUB_SHA::8}
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF/refs\/tags\//}
# 9.8.0-x --> 9.8.0
VERSION=$(echo $VERSION | sed "s/-.*//" )
fi
echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT
runner=${{ matrix.runner }}
if [[ "$runner" == *"-arm" ]]; then
ARCH=arm64
else
ARCH=amd64
fi
echo "ARCH=$ARCH" >> $GITHUB_OUTPUT
- name: Build docs image
uses: docker/build-push-action@v7.3.0
if: matrix.container == 'proj-docs'
with:
push: ${{ env.PUSH_PACKAGES == 'true' }}
builder: ${{ steps.buildx.outputs.name }}
context: .
file: ${{ matrix.dockerfile }}
platforms: linux/amd64
tags: |
docker.io/osgeo/${{ matrix.container }}:${{ steps.prep.outputs.VERSION }}
docker.io/osgeo/${{ matrix.container }}:latest
ghcr.io/osgeo/${{ matrix.container }}:${{ steps.prep.outputs.VERSION }}
ghcr.io/osgeo/${{ matrix.container }}:latest
labels: |
org.opencontainers.image.title=${{ github.event.repository.name }}
org.opencontainers.image.description=${{ github.event.repository.description }}
org.opencontainers.image.source=${{ github.event.repository.html_url }}
org.opencontainers.image.url=${{ github.event.repository.html_url }}
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.version=${{ steps.prep.outputs.VERSION }}
org.opencontainers.image.created=${{ steps.prep.outputs.BUILD_DATE }}
- name: Prepare tags
id: prep_tags
run: |
TAGS="docker.io/osgeo/${{ matrix.container }}:${{ steps.prep.outputs.VERSION }}-${{ steps.prep.outputs.ARCH }}
ghcr.io/osgeo/${{ matrix.container }}:${{ steps.prep.outputs.VERSION }}-${{ steps.prep.outputs.ARCH }}"
if [ "${GITHUB_REF}" = "refs/heads/master" ]; then
TAGS="$TAGS
docker.io/osgeo/${{ matrix.container }}:latest-${{ steps.prep.outputs.ARCH }}
ghcr.io/osgeo/${{ matrix.container }}:latest-${{ steps.prep.outputs.ARCH }}"
fi
echo "tags<<EOF" >> $GITHUB_OUTPUT
echo "$TAGS" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Build image
uses: docker/build-push-action@v7.3.0
id: push
if: matrix.container == 'proj'
with:
push: ${{ env.PUSH_PACKAGES == 'true' }}
builder: ${{ steps.buildx.outputs.name }}
context: .
file: ${{ matrix.dockerfile }}
build-args: |
PROJ_GITHUB_SHA=${{ github.sha }}
platforms: linux/${{ steps.prep.outputs.ARCH }}
tags: ${{ steps.prep_tags.outputs.tags }}
labels: |
org.opencontainers.image.title=${{ github.event.repository.name }}
org.opencontainers.image.description=${{ github.event.repository.description }}
org.opencontainers.image.source=${{ github.event.repository.html_url }}
org.opencontainers.image.url=${{ github.event.repository.html_url }}
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.version=${{ steps.prep.outputs.VERSION }}
org.opencontainers.image.created=${{ steps.prep.outputs.BUILD_DATE }}
- name: Generate artifact attestation
if: ${{ env.PUSH_PACKAGES == 'true' && matrix.container == 'proj' }}
uses: actions/attest-build-provenance@v4.2.2
with:
subject-name: ghcr.io/osgeo/proj
subject-digest: ${{ steps.push.outputs.digest }}
push-to-registry: ${{ env.PUSH_PACKAGES == 'true' }}
create-manifest:
permissions:
contents: read
packages: write
attestations: write
id-token: write
runs-on: ubuntu-latest
env:
PUSH_PACKAGES: ${{ github.repository_owner == 'OSGeo' && github.event_name != 'pull_request' }}
needs: containers
steps:
- name: Login to GitHub Container Registry
uses: docker/login-action@v4.6.0
if: env.PUSH_PACKAGES == 'true'
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v4.6.0
if: env.PUSH_PACKAGES == 'true'
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Prepare
id: prep
run: |
VERSION=sha-${GITHUB_SHA::8}
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF/refs\/tags\//}
# 9.8.0-x --> 9.8.0
VERSION=$(echo $VERSION | sed "s/-.*//" )
fi
echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT
- name: Create and push multi-platform manifest
if: env.PUSH_PACKAGES == 'true'
run: |
docker buildx imagetools create \
-t ghcr.io/osgeo/proj:${{ steps.prep.outputs.VERSION }} \
ghcr.io/osgeo/proj:${{ steps.prep.outputs.VERSION }}-amd64 \
ghcr.io/osgeo/proj:${{ steps.prep.outputs.VERSION }}-arm64
docker buildx imagetools create \
-t osgeo/proj:${{ steps.prep.outputs.VERSION }} \
osgeo/proj:${{ steps.prep.outputs.VERSION }}-amd64 \
osgeo/proj:${{ steps.prep.outputs.VERSION }}-arm64
if [ "${GITHUB_REF}" = "refs/heads/master" ]; then
docker buildx imagetools create \
-t ghcr.io/osgeo/proj:latest \
ghcr.io/osgeo/proj:latest-amd64 \
ghcr.io/osgeo/proj:latest-arm64
docker buildx imagetools create \
-t osgeo/proj:latest \
osgeo/proj:latest-amd64 \
osgeo/proj:latest-arm64
fi
-90
View File
@@ -1,90 +0,0 @@
name: Emscripten
on:
push:
paths-ignore:
- 'docs/**'
pull_request:
paths-ignore:
- 'docs/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
emscripten:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
- name: Build docker
run: docker build -t proj-emscripten-builder ci/emscripten/
- name: Artifacts folder
run: mkdir -p "$PWD"/wasm_out
- name: Run docker build
run: |
docker run --user $(id -u):$(id -g) --rm \
-e PROJ_GITHUB_SHA=${{ github.sha }} \
-v "$PWD":/build/proj_src \
-v "$PWD"/wasm_out:/build/install \
proj-emscripten-builder
- name: Upload artifacts
uses: actions/upload-artifact@v7
with:
name: proj-js-wasm
retention-days: 90
path: wasm_out/projModule.*
- name: Copy for tests
run: |
mkdir -p "$PWD"/out_node
cp wasm_out/projModule.* out_node
cp ci/emscripten/proj.ems.tests.js out_node
- name: Run docker tests
run: |
docker run --user $(id -u):$(id -g) --rm \
-v "$PWD"/out_node:/opt/node/tests \
node:24-alpine \
node /opt/node/tests/proj.ems.tests.js
- name: Deploy ssh key (wasm_proj)
if: ${{ github.event_name == 'push' && github.ref_name == 'master' && github.repository == 'OSGeo/PROJ' }}
shell: bash -l {0}
env:
WASM_PROJ_DEPLOY_SSH_KEY: ${{ secrets.WASM_PROJ_DEPLOY_SSH_KEY }} # zizmor: ignore[secrets-outside-env]
run: |
mkdir $HOME/.ssh && echo "${WASM_PROJ_DEPLOY_SSH_KEY}" > $HOME/.ssh/id_rsa
chmod 700 $HOME/.ssh && chmod 600 $HOME/.ssh/id_rsa
ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts
eval `ssh-agent -s`
ssh-add $HOME/.ssh/id_rsa
- name: Deploy to wasm-proj/master pages
if: ${{ github.event_name == 'push' && github.ref_name == 'master' && github.repository == 'OSGeo/PROJ' }}
shell: bash -l {0}
run: |
set -x
set -e
git clone -b pages git@github.com:jjimenezshaw/wasm-proj.git wasm_proj_pages
cp wasm_out/projModule.* wasm_proj_pages/master/wasm/
cd wasm_proj_pages
git config user.email "proj-master-updater@example.com"
git config user.name "Automatic PROJ updater"
git remote -v
git rev-parse --abbrev-ref HEAD
git add -A
git commit -m "Update wasm with OSGeo/PROJ commit $GITHUB_SHA"
git push -f origin pages
-37
View File
@@ -1,37 +0,0 @@
name: Fedora Rawhide
on:
push:
paths-ignore:
- 'docs/**'
pull_request:
paths-ignore:
- 'docs/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
fedora_rawhide:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
- name: Cache
uses: actions/cache@v6.1.0
id: cache
with:
path: |
${{ github.workspace }}/ccache.tar.gz
key: ${{ runner.os }}-cache-fedora_rawhide-${{ github.run_id }}
restore-keys: ${{ runner.os }}-cache-fedora_rawhide-
- name: Run
run: docker run -e PROJ_GITHUB_SHA=${{ github.sha }} -e CI -e WORK_DIR="$PWD" -v $PWD:$PWD fedora:rawhide $PWD/ci/fedora_rawhide/start.sh
-64
View File
@@ -1,64 +0,0 @@
name: MacOS build
on:
push:
paths-ignore:
- 'docs/**'
pull_request:
paths-ignore:
- 'docs/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
macos_build:
strategy:
fail-fast: true
matrix:
include:
- platform: "macos-15-intel"
architecture: "x64"
# macOS-14 is a M1 ARM64 MacOS runner: https://github.blog/changelog/2024-01-30-github-actions-introducing-the-new-m1-macos-runner-available-to-open-source/
- platform: "macOS-14"
architecture: "arm64"
runs-on: ${{ matrix.platform }}
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
- uses: actions/checkout@v7.0.1
- uses: mamba-org/setup-micromamba@v3
with:
init-shell: bash
environment-file: ci/mac/environment.yml
- name: Cache
uses: actions/cache@v6.1.0
id: cache
with:
path: ${{ github.workspace }}/.ccache
key: ${{ runner.os }}-cache-mac-${{ matrix.architecture }}-${{ github.run_id }}
restore-keys: ${{ runner.os }}-cache-mac-${{ matrix.architecture }}-
- name: Install Requirements
shell: bash -l {0}
run: |
source ci/mac/before_install.sh
- name: Build
shell: bash -l {0}
run: |
export TRAVIS_BUILD_DIR=$PWD
source ci/mac/install.sh
env:
CCACHE_DIR: ${{ github.workspace }}/.ccache
TRAVIS_OS_NAME: osx
BUILD_NAME: osx
-37
View File
@@ -1,37 +0,0 @@
name: mingw_w64 build
on:
push:
paths-ignore:
- 'docs/**'
pull_request:
paths-ignore:
- 'docs/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
mingw_w64_build:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
- name: Cache
uses: actions/cache@v6.1.0
id: cache
with:
path: |
${{ github.workspace }}/ccache.tar.gz
key: ${{ runner.os }}-cache-mingw_w64-${{ github.run_id }}
restore-keys: ${{ runner.os }}-cache-mingw_w64-
- name: Build
run: docker run -e PROJ_GITHUB_SHA=${{ github.sha }} -e CI -e TRAVIS_OS_NAME=linux -e BUILD_NAME=mingw_w64 -e WORK_DIR="$PWD" -v $PWD:$PWD ubuntu:22.04 $PWD/ci/mingw_w64/start.sh
-93
View File
@@ -1,93 +0,0 @@
name: Handle stale issues
on:
schedule:
- cron: "30 2 * * *"
permissions:
contents: read
jobs:
stale:
permissions:
issues: write # for actions/stale to close stale issues
pull-requests: write # for actions/stale to close stale PRs
if: github.repository_owner == 'osgeo'
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v11.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-pr-message: >
The PROJ project highly values your contribution and would love to see
this work merged!
Unfortunately this PR has not had any activity in the last two months and
is being automatically marked as "stale".
If you think this pull request should be merged, please check
- that all unit tests are passing
- that all comments by reviewers have been addressed
- that there is enough information for reviewers, in particular
- link to any issues which this pull request fixes
- add a description of workflows which this pull request fixes
- add terminal output examples if applicable
- that you have written unit tests where possible
In case you should have any uncertainty, please leave a comment and we will
be happy to help you proceed with this pull request.
If there is no further activity on this pull request, it will be closed in a
week.
close-pr-message: >
While we hate to see this happen, this PR has been automatically closed because
it has not had any activity in the last 2 months. If this pull request should be
reconsidered, please follow the guidelines in the previous comment and reopen
this pull request. Or, if you have any further questions, just ask! We love to
help, and if there's anything the PROJ project can do to help push this PR forward
please let us know how we can assist.
stale-pr-label: 'stale'
exempt-pr-labels: 'pinned'
days-before-pr-stale: 60
days-before-pr-close: 7
stale-issue-message: >
The PROJ project highly values your report and would love to see it addressed.
However, this issue has been left in feedback mode for the last two months and is
being automatically marked as "stale".
If you would like to continue with this issue, please provide any missing information
or answer any open questions. If you could resolve the issue yourself meanwhile,
please leave a note for future readers with the same problem and close the issue.
In case you should have any uncertainty, please leave a comment and we will be
happy to help you proceed with this issue.
If there is no further activity on this issue, it will be closed in a week.
close-issue-message: >
While we hate to see this happen, this issue has been automatically closed because
it has not had any activity in the last two months despite being marked as feedback.
If this issue should be reconsidered, please follow the guidelines in the previous
comment and reopen this issue.
Or, if you have any further questions, there are also
[further support channels](https://proj.org/community/channels.html)
that can help you.
stale-issue-label: 'stale'
only-issue-labels: 'feedback'
days-before-issue-stale: 60
days-before-issue-close: 7
operations-per-run: 1000
+1 -1
View File
@@ -54,7 +54,7 @@ CTestTestfile.cmake
cmake_install.cmake
cmake/project-config*.cmake
install_manifest.txt
/CMakeUserPresets.json
/googletest*
# / (base)
/*.manifest
-30
View File
@@ -1,30 +0,0 @@
Aaron Puchert <aaron.puchert@sap.com> <aaronpuchert@alice-dsl.net>
Alan D. Snow <alansnow21@gmail.com>
Alan D. Snow <alansnow21@gmail.com> <alan.snow@pioneer.com>
Ben Boeckel <ben.boeckel@kitware.com> <mathstuf@users.noreply.github.com>
Bojan Šavrič <bsavric@esri.com>
Brendan Jurd <direvus@gmail.com> <brendan.jurd@geoplex.com.au>
Charles Karney <charles@karney.com>
Charles Karney <charles@karney.com> <charles.karney@sri.com>
Charles Karney <charles@karney.com> <ckarney@karney.com>
dalia2 <dalia@lmi.is> <57895979+dalia2@users.noreply.github.com>
Eli Rykoff <erykoff@stanford.edu>
Even Rouault <even.rouault@spatialys.com> <even.rouault@mines-paris.org>
George Ouzounoudis <geothrock@gmail.com>
Jeff McKenna <jeffmckenna@gmail.com>
Jeff McKenna <jeffmckenna@gmail.com> <jmckenna@gatewaygeomatics.com>
Jürnjakob Dugge <juernjakob@gmail.com>
Jürnjakob Dugge <juernjakob@gmail.com> <jdugge@users.noreply.github.com>
Kurt Schwehr <schwehr@google.com> <schwehr@gmail.com>
Martin Desruisseaux <martin.desruisseaux@geomatys.com> <martin.desruisseaux@geomatys.fr>
Mateusz Łoskot <mateusz@loskot.net>
Mike Taves <mwtoews@gmail.com>
Olli Räisä <olli.raisa@trimble.com>
Sebastian Val <Sebastian.Val@jpl.nasa.gov> <sval-dev@users.noreply.github.com>
Sveinung Himle <himsve@kartverket.no>
Sveinung Himle <himsve@kartverket.no> <56073535+himsve@users.noreply.github.com>
Sveinung Himle <himsve@kartverket.no> <Sveinung.Himle@kartverket.no>
Thomas Knudsen <thokn@sdfe.dk>
Thomas Knudsen <thokn@sdfe.dk> <busstoptaktik@users.noreply.github.com>
Thomas Knudsen <thokn@sdfe.dk> <knudsen.thomas@gmail.com>
Thomas Knudsen <thokn@sdfe.dk> <lastname DOT firstname AT gmail DOT com>
-26
View File
@@ -1,26 +0,0 @@
# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md
# Heading style
MD003:
style: "atx"
# Unordered list indentation
MD007:
indent: 2
# Line length
MD013: false
# line_length: 100
# Multiple headings with the same content
MD024:
siblings_only: true
# Multiple top-level headings in the same document
MD025: false
# First line in a file should be a top-level heading
MD041: false
# Required heading structure
MD043: true
-23
View File
@@ -1,23 +0,0 @@
repos:
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: 'v15.0.4'
hooks:
- id: clang-format
exclude: >
(?x)^(
data/|
schemas/|
docs/|
include/proj/nn.hpp|
include/proj/internal/lru_cache.hpp|
include/proj/internal/vendor/nlohmann/json.hpp|
src/wkt1_generated_parser.c|
src/wkt1_generated_parser.h|
src/wkt2_generated_parser.c|
src/wkt2_generated_parser.h|
src/geodesic.c|
src/geodesic.h|
src/proj_symbol_rename.h|
src/tests/geodtest.c|
src/tests/geodsigntest.c
)
+13 -2
View File
@@ -12,7 +12,18 @@ build:
jobs:
post_checkout:
- (git --no-pager log --pretty="tformat:%s -- %b" -1 | paste -s -d " " | grep -viqP "skip ci|ci skip") || exit 183
# 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/9.0 -- docs/ .readthedocs.yaml;
then
exit 183;
fi
- (git --no-pager log --pretty="tformat:%s -- %b" -1 | grep -viqP "skip ci|ci skip") || exit 183
pre_build:
- ./docs/rtd/pre_build.sh
- ./scripts/doxygen.sh
@@ -30,8 +41,8 @@ build:
- libcurl4-openssl-dev
formats:
- htmlzip
- pdf
- epub
conda:
environment: docs/environment.yml
+79
View File
@@ -0,0 +1,79 @@
{
"creators": [
{
"affiliation": "United States Geological Survey",
"name": "Evenden, Gerald I."
},
{
"affiliation": "Spatialys",
"name": "Rouault, Even",
"orcid": "0000-0002-5068-0476"
},
{
"affiliation": "Planet Labs Inc",
"name": "Warmerdam, Frank"
},
{
"affiliation": "Danish Agency for Data Supply and Efficiency",
"name": "Evers, Kristian",
"orcid": "0000-0002-1310-4576"
},
{
"affiliation": "Danish Agency for Data Supply and Efficiency",
"name": "Knudsen, Thomas"
},
{
"affiliation": "Hobu Inc",
"name": "Butler, Howard",
"orcid": "0000-0002-5340-1380"
},
{
"affiliation": "GNS Science",
"name": "Taves, Mike",
"orcid": "0000-0003-3657-7963"
},
{
"affiliation": "Google Inc",
"name": "Schwehr, Kurt",
"orcid": "0000-0002-5624-8190"
},
{
"name": "Sales de Andrade, Elliott",
"orcid": "0000-0001-7310-8942"
},
{
"affiliation": "SRI International",
"name": "Karney, Charles",
"orcid": "0000-0002-5006-5836"
},
{
"name": "Couwenberg, Sebastiaan"
},
{
"affiliation": "North Road",
"name": "Dawson, Nyall",
"orcid": "0000-0001-9812-7584"
},
{
"affiliation": "Corteva",
"name": "Snow, Alan D.",
"orcid": "0000-0002-7333-3100"
},
{
"name": "Jimenez Shaw, Javier"
}
],
"description": "PROJ is a generic coordinate transformation software that transforms geospatial coordinates from one coordinate reference system (CRS) to another. This includes cartographic projections as well as geodetic transformations.",
"keywords": [
"PROJ",
"geodesy",
"cartography",
"coordinates",
"projections",
"conversion"
],
"license": {
"id": "MIT"
},
"title": "PROJ"
}
+42
View File
@@ -0,0 +1,42 @@
--------------------------------------------------------------------------------
Authors
--------------------------------------------------------------------------------
Original Author
................................................................................
Gerald Evenden (1935-2016)
Maintainer(s)
................................................................................
Kristian Evers <kreve@sdfe.dk>
Even Rouault <even.rouault@spatialys.com>
Project Steering Committee
--------------------------------------------------------------------------------
Process and membership can be found at:
https://proj.org/community/rfc/rfc-1.html
Chair
................................................................................
Kristian Evers <kreve@sdfe.dk>
Members
................................................................................
Frank Warmerdam <warmerdam@pobox.com>
Howard Butler <howard@hobu.co>
Charles Karney <charles.karney@sri.com>
Thomas Knudsen <thokn@sdfe.dk>
Even Rouault <even.rouault@spatialys.com>
Kurt Schwehr <schwehr@gmail.com>
Contributors
--------------------------------------------------------------------------------
The full list of contributors can be found on GitHub
https://github.com/OSGeo/PROJ/graphs/contributors
-33
View File
@@ -1,33 +0,0 @@
# Authors
## Original Author
- Gerald Evenden (1935-2016)
## Maintainers
- Kristian Evers <kreve@sdfi.dk>
- Even Rouault <even.rouault@spatialys.com>
## Project Steering Committee
Process and membership can be found at:
<https://proj.org/community/rfc/rfc-1.html>
Chair:
- Kristian Evers <kreve@sdfi.dk>
Members:
- Frank Warmerdam <warmerdam@pobox.com>
- Howard Butler <howard@hobu.co>
- Charles Karney <charles.karney@sri.com>
- Thomas Knudsen <thokn@sdfi.dk>
- Even Rouault <even.rouault@spatialys.com>
- Kurt Schwehr <schwehr@gmail.com>
## Contributors
The full list of contributors can be found on GitHub
<https://github.com/OSGeo/PROJ/graphs/contributors>
+2 -2
View File
@@ -1,6 +1,6 @@
To cite PROJ in publications use:
PROJ contributors (2026). PROJ coordinate transformation software
PROJ contributors (2022). PROJ coordinate transformation software
library. Open Source Geospatial Foundation. URL https://proj.org/.
DOI: 10.5281/zenodo.5884394
@@ -12,7 +12,7 @@ A BibTeX entry for LaTeX users is
title = {{PROJ} coordinate transformation software library},
author = {{PROJ contributors}},
organization = {Open Source Geospatial Foundation},
year = {2026},
year = {2022},
url = {https://proj.org/},
doi = {10.5281/zenodo.5884394},
}
-70
View File
@@ -1,70 +0,0 @@
cff-version: 1.2.0
message: Please cite this software using these metadata or in the CITATION file.
type: software
title: PROJ
version: 9.9.0
date-released: 2026-09-15
doi: 10.5281/zenodo.5884394
abstract: PROJ is a generic coordinate transformation software that transforms
geospatial coordinates from one coordinate reference system (CRS) to another.
This includes cartographic projections as well as geodetic transformations.
url: https://proj.org
repository-code: https://github.com/OSGeo/PROJ/
license: MIT
authors:
- given-names: Gerald I.
family-names: Evenden
affiliation: United States Geological Survey
- given-names: Even
family-names: Rouault
affiliation: Spatialys
orcid: https://orcid.org/0000-0002-5068-0476
- given-names: Frank
family-names: Warmerdam
affiliation: Planet Labs Inc
- given-names: Kristian
family-names: Evers
affiliation: Danish Agency for Climate Data
orcid: https://orcid.org/0000-0002-1310-4576
- given-names: Thomas
family-names: Knudsen
affiliation: Danish Agency for Climate Data
- given-names: Howard
family-names: Butler
affiliation: Hobu Inc
orcid: https://orcid.org/0000-0002-5340-1380
- given-names: Mike W.
family-names: Taves
affiliation: Earth Sciences New Zealand
orcid: https://orcid.org/0000-0003-3657-7963
- given-names: Kurt
family-names: Schwehr
affiliation: Google Inc
orcid: https://orcid.org/0000-0002-5624-8190
- given-names: Elliott
family-names: Sales de Andrade
orcid: https://orcid.org/0000-0001-7310-8942
- given-names: Charles
family-names: Karney
affiliation: SRI International
orcid: https://orcid.org/0000-0002-5006-5836
- given-names: Sebastiaan
family-names: Couwenberg
- given-names: Nyall
family-names: Dawson
affiliation: North Road
orcid: https://orcid.org/0000-0001-9812-7584
- given-names: Alan D.
family-names: Snow
affiliation: Corteva
orcid: https://orcid.org/0000-0002-7333-3100
- given-names: Javier
family-names: Jimenez Shaw
orcid: https://orcid.org/0000-0002-7227-9173
keywords:
- PROJ
- geodesy
- cartography
- coordinates
- projections
- conversion
+115 -268
View File
@@ -9,7 +9,7 @@
################################################################################
# General settings
################################################################################
cmake_minimum_required(VERSION 3.22.1)
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(PROJ
DESCRIPTION "PROJ coordinate transformation software library"
@@ -19,25 +19,23 @@ project(PROJ
# Only interpret if() arguments as variables or keywords when unquoted
cmake_policy(SET CMP0054 NEW)
include(CheckCXXCompilerFlag)
# Set C++ version
# Make CMAKE_CXX_STANDARD available as cache option overridable by user
set(CMAKE_CXX_STANDARD 17
CACHE STRING "C++ standard version to use (default is 17)")
message(CHECK_START "Requiring C++${CMAKE_CXX_STANDARD}")
set(CMAKE_CXX_STANDARD 11
CACHE STRING "C++ standard version to use (default is 11)")
message(STATUS "Requiring C++${CMAKE_CXX_STANDARD}")
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
message(CHECK_PASS "done")
message(STATUS "Requiring C++${CMAKE_CXX_STANDARD} - done")
# Set C99 version
# Make CMAKE_C_STANDARD available as cache option overridable by user
set(CMAKE_C_STANDARD 99
CACHE STRING "C standard version to use (default is 99)")
message(CHECK_START "Requiring C${CMAKE_C_STANDARD}")
message(STATUS "Requiring C${CMAKE_C_STANDARD}")
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
message(CHECK_PASS "done")
message(STATUS "Requiring C${CMAKE_C_STANDARD} - done")
# Set global -fvisibility=hidden
set(CMAKE_C_VISIBILITY_PRESET hidden)
@@ -46,62 +44,27 @@ set(CMAKE_CXX_VISIBILITY_PRESET hidden)
# Set warnings as variables, then store as cache options
set(PROJ_common_WARN_FLAGS # common only to GNU/Clang C/C++
-Wall
-Wdate-time
-Werror=format-security
-Werror=vla
-Wextra
-Wformat
-Wimplicit-fallthrough
-Wmissing-declarations
-Wshadow
-Wswitch
-Wshadow
-Wunused-parameter
-Wmissing-declarations
-Wformat
-Wformat-security
)
if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
set(PROJ_common_WARN_FLAGS ${PROJ_common_WARN_FLAGS}
-Wduplicated-cond
-Wduplicated-branches
-Wlogical-op
)
set(PROJ_C_WARN_FLAGS ${PROJ_common_WARN_FLAGS}
-Wmissing-prototypes
)
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8)
set(PROJ_CXX_WARN_FLAGS ${PROJ_common_WARN_FLAGS} -Wextra-semi)
endif()
set(PROJ_CXX_WARN_FLAGS ${PROJ_common_WARN_FLAGS}
-Weffc++
# -Wold-style-cast
-Woverloaded-virtual
-Wzero-as-null-pointer-constant
)
set(PROJ_CXX_WARN_FLAGS ${PROJ_common_WARN_FLAGS})
elseif("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
set(PROJ_common_WARN_FLAGS ${PROJ_common_WARN_FLAGS}
-Wcomma
-Wdeprecated
-Wdocumentation -Wno-documentation-deprecated-sync
-Wfloat-conversion
-Wlogical-op-parentheses
)
# Not sure about the minimum version, but clang 12 complains about \file, @cond Doxygen_Suppress, etc.
if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_GREATER_EQUAL 18.0.0)
set(PROJ_common_WARN_FLAGS ${PROJ_common_WARN_FLAGS} -Wdocumentation-unknown-command)
endif()
set(PROJ_C_WARN_FLAGS ${PROJ_common_WARN_FLAGS}
-Wmissing-prototypes
-Wfloat-conversion
-Wc11-extensions
)
set(PROJ_CXX_WARN_FLAGS ${PROJ_common_WARN_FLAGS}
-Weffc++
-Wextra-semi
# -Wold-style-cast
-Woverloaded-virtual
-Wshorten-64-to-32
-Wunused-private-field
-Wzero-as-null-pointer-constant
-Wweak-vtables
-Wfloat-conversion
)
elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
add_definitions(/D_CRT_SECURE_NO_WARNINGS) # Eliminate deprecation warnings
@@ -129,23 +92,9 @@ endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
# Intel CXX compiler based on clang defaults to -ffast-math, which
# breaks std::isinf(), std::isnan(), etc.
string(APPEND CMAKE_C_FLAGS " -fno-fast-math")
string(APPEND CMAKE_CXX_FLAGS " -fno-fast-math")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND
CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13 AND
CMAKE_SIZEOF_VOID_P EQUAL 4)
# GCC 13 and later changed their C++ excess precision support, which impacts
# 32-bit builds. This restores the previous behavior.
string(APPEND CMAKE_CXX_FLAGS " -fexcess-precision=fast")
endif()
# Add other supported compiler flags
if(("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") OR ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang"))
check_cxx_compiler_flag(-Wdeprecated-copy-dtor HAVE_DEP_COPY_DTOR_FLAG)
if(HAVE_DEP_COPY_DTOR_FLAG)
set(PROJ_CXX_WARN_FLAGS ${PROJ_CXX_WARN_FLAGS} -Wdeprecated-copy-dtor)
endif()
endif()
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -fno-fast-math)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fno-fast-math)
endif ()
set(PROJ_C_WARN_FLAGS "${PROJ_C_WARN_FLAGS}"
CACHE STRING "C flags used to compile PROJ targets")
@@ -166,7 +115,7 @@ message(STATUS "Configuring PROJ:")
#PROJ version information
################################################################################
include(ProjVersion)
proj_version(MAJOR 9 MINOR 9 PATCH 0)
proj_version(MAJOR 9 MINOR 0 PATCH 1)
set(PROJ_SOVERSION 25)
set(PROJ_BUILD_VERSION "${PROJ_SOVERSION}.${PROJ_VERSION}")
@@ -179,13 +128,6 @@ include(ProjConfig)
include(ProjMac)
include(policies)
##############################################
### SWITCH BETWEEN STATIC OR SHARED LIBRARY###
##############################################
# default config is shared
option(BUILD_SHARED_LIBS "Build PROJ library shared." ON)
################################################################################
# Check for nlohmann_json
################################################################################
@@ -234,19 +176,15 @@ if(NOT EXE_SQLITE3)
message(SEND_ERROR "sqlite3 binary not found!")
endif()
# Deprecated variables since PROJ 9.4.0
if(DEFINED SQLITE3_INCLUDE_DIR)
message(DEPRECATION "Use SQLite3_INCLUDE_DIR instead of SQLITE3_INCLUDE_DIR")
set(SQLite3_INCLUDE_DIR ${SQLITE3_INCLUDE_DIR})
endif()
if(DEFINED SQLITE3_LIBRARY)
message(DEPRECATION "Use SQLite3_LIBRARY instead of SQLITE3_LIBRARY")
set(SQLite3_LIBRARY ${SQLITE3_LIBRARY})
find_package(Sqlite3 REQUIRED)
if(NOT SQLITE3_FOUND)
message(SEND_ERROR "sqlite3 dependency not found!")
endif()
find_package(SQLite3 3.11 REQUIRED)
if(NOT TARGET SQLite3::SQLite3) # CMake < 4.3
add_library(SQLite3::SQLite3 ALIAS SQLite::SQLite3)
# Would build and run with older versions, but with horrible performance
# See https://github.com/OSGeo/PROJ/issues/1718
if("${SQLITE3_VERSION}" VERSION_LESS "3.11")
message(SEND_ERROR "sqlite3 >= 3.11 required!")
endif()
################################################################################
@@ -280,40 +218,16 @@ if(ENABLE_CURL)
find_package(CURL REQUIRED)
if(CURL_FOUND)
set(CURL_ENABLED TRUE)
# Curl SSL options are described in
# https://curl.se/libcurl/c/CURLOPT_SSL_OPTIONS.html
#set(CURLSSLOPT_NO_REVOKE 2)
#set(SSL_OPTIONS ${CURLSSLOPT_NO_REVOKE})
#add_compile_definitions(SSL_OPTIONS=${SSL_OPTIONS})
else()
message(SEND_ERROR "curl dependency not found!")
endif()
endif()
################################################################################
# Check for Emscripten fetch
################################################################################
option(ENABLE_EMSCRIPTEN_FETCH "Enable Emscripten fetch support" OFF)
set(EMSCRIPTEN_FETCH_ENABLED FALSE)
if(ENABLE_EMSCRIPTEN_FETCH)
set(EMSCRIPTEN_FETCH_ENABLED TRUE)
endif()
################################################################################
option(EMBED_PROJ_DATA_PATH "Whether the PROJ_DATA path should be embedded" ON)
if(DEFINED PROJ_LIB_ENV_VAR_TRIED_LAST)
set(PROJ_DATA_ENV_VAR_TRIED_LAST ${PROJ_LIB_ENV_VAR_TRIED_LAST})
message(WARNING "PROJ_LIB_ENV_VAR_TRIED_LAST option has been renamed to PROJ_DATA_ENV_VAR_TRIED_LAST. PROJ_LIB_ENV_VAR_TRIED_LAST is still working for now, but may be completely replaced by PROJ_DATA_ENV_VAR_TRIED_LAST in a future release")
else()
option(PROJ_DATA_ENV_VAR_TRIED_LAST "Whether the PROJ_DATA environment variable should be tried after the hardcoded location" OFF)
endif()
if(PROJ_DATA_ENV_VAR_TRIED_LAST)
add_definitions(-DPROJ_DATA_ENV_VAR_TRIED_LAST)
option(PROJ_LIB_ENV_VAR_TRIED_LAST "Whether the PROJ_LIB environment variable should be tried after the hardcoded location" OFF)
if(PROJ_LIB_ENV_VAR_TRIED_LAST)
add_definitions(-DPROJ_LIB_ENV_VAR_TRIED_LAST)
endif()
################################################################################
@@ -321,9 +235,30 @@ endif()
################################################################################
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads)
include(CheckCSourceCompiles)
if(MSVC)
set(CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} /WX /W4")
else()
set(CMAKE_REQUIRED_LIBRARIES m)
set(CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} -Werror -Wall")
endif()
if(Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
set(CMAKE_REQUIRED_LIBRARIES
"${CMAKE_REQUIRED_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}")
check_c_source_compiles("
#include <pthread.h>
int main(int argc, char* argv[]) {
(void)PTHREAD_MUTEX_RECURSIVE;
(void)argv;
return argc;
}
" HAVE_PTHREAD_MUTEX_RECURSIVE_DEFN)
if(HAVE_PTHREAD_MUTEX_RECURSIVE_DEFN)
add_definitions(-DHAVE_PTHREAD_MUTEX_RECURSIVE=1)
endif()
endif()
# Set a default build type for single-configuration cmake generators if
@@ -351,93 +286,33 @@ link_directories(${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
# Installation
################################################################################
include(ProjInstallPath)
# By default GNUInstallDirs will use the upper case project name
# for CMAKE_INSTALL_DOCDIR, resulting in something like share/doc/PROJ
# instead of share/doc/proj which historically have been the path used
# by the project.
# Here force the use of a lower case project name and reset after
# GNUInstallDirs has done its thing
set(PROJECT_NAME_ORIGINAL "${PROJECT_NAME}")
string(TOLOWER "${PROJECT_NAME}" PROJECT_NAME)
include(GNUInstallDirs)
set(PROJECT_NAME "${PROJECT_NAME_ORIGINAL}")
set(BINDIR "${DEFAULT_BINDIR}"
CACHE PATH "The directory to install binaries into.")
set(LIBDIR "${DEFAULT_LIBDIR}"
CACHE PATH "The directory to install libraries into.")
set(DATADIR "${DEFAULT_DATADIR}"
CACHE PATH "The directory to install data files into.")
set(DOCDIR "${DEFAULT_DOCDIR}"
CACHE PATH "The directory to install doc files into.")
set(INCLUDEDIR "${DEFAULT_INCLUDEDIR}"
CACHE PATH "The directory to install includes into.")
set(CMAKECONFIGDIR "${DEFAULT_CMAKEDIR}"
CACHE PATH "Parent of the directory to install cmake config files into.")
################################################################################
# Tests
################################################################################
include(CTest)
option(BUILD_TESTING "Build the testing tree." ON)
if(BUILD_TESTING)
enable_testing()
include(ProjTest)
else()
message(STATUS "Testing disabled")
endif()
################################################################################
# Whether we should embed resources
################################################################################
include(CheckCSourceCompiles)
function (is_sharp_embed_available res)
if (NOT EMSCRIPTEN AND
((CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 15.0) OR
(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.0)))
set(TEST_SHARP_EMBED
"static const unsigned char embedded[] = {\n#embed __FILE__\n};\nint main() { (void)embedded; return 0;}"
)
set(CMAKE_C_STANDARD_BACKUP "${CMAKE_C_STANDARD}")
set(CMAKE_C_STANDARD "23")
check_c_source_compiles("${TEST_SHARP_EMBED}" _TEST_SHARP_EMBED)
set(CMAKE_C_STANDARD "${CMAKE_C_STANDARD_BACKUP}")
if (_TEST_SHARP_EMBED)
set(${res} ON PARENT_SCOPE)
else()
set(${res} OFF PARENT_SCOPE)
endif()
else()
set(${res} OFF PARENT_SCOPE)
endif()
endfunction()
is_sharp_embed_available(IS_SHARP_EMBED_AVAILABLE_RES)
if (NOT DEFINED BUILD_SHARED_LIBS)
message(FATAL_ERROR "BUILD_SHARED_LIBS should be set")
endif()
if (NOT BUILD_SHARED_LIBS)
set(DEFAULT_EMBED_RESOURCE_FILES ON)
else()
set(DEFAULT_EMBED_RESOURCE_FILES OFF)
endif()
option(EMBED_RESOURCE_FILES "Whether resource files (limited to proj.db) should be embedded into the PROJ library" ${DEFAULT_EMBED_RESOURCE_FILES})
option(USE_ONLY_EMBEDDED_RESOURCE_FILES "Whether embedded resource files (limited to proj.db) should be used (should nominally be used together with EMBED_RESOURCE_FILES=ON, otherwise this will result in non-functional builds)" OFF)
if (USE_ONLY_EMBEDDED_RESOURCE_FILES AND NOT EMBED_RESOURCE_FILES)
message(WARNING "USE_ONLY_EMBEDDED_RESOURCE_FILES=ON set but EMBED_RESOURCE_FILES=OFF: some drivers will lack required resource files")
endif()
################################################################################
# Build configured components
################################################################################
set(PROJ_DICTIONARY
world
other.extra
nad27
GL27
nad83
nad.lst
CH
ITRF2000
ITRF2008
ITRF2014
ITRF2020
)
include_directories(${PROJ_SOURCE_DIR}/src)
add_subdirectory(data)
@@ -449,39 +324,9 @@ if(BUILD_TESTING)
add_subdirectory(test)
endif()
option(BUILD_EXAMPLES "Whether to build example programs" OFF)
if(BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
add_subdirectory(scripts)
set(docfiles COPYING NEWS.md AUTHORS.md)
set(docfiles COPYING NEWS AUTHORS)
install(FILES ${docfiles}
DESTINATION ${CMAKE_INSTALL_DOCDIR})
################################################################################
# Build debug symbols
################################################################################
option(EXPORT_PDB "Export PDB file" OFF)
if (WIN32 AND EXPORT_PDB)
target_compile_options(proj PRIVATE /Zi /Zf)
target_link_options(proj PRIVATE /DEBUG /OPT:REF /OPT:ICF)
if(BUILD_SHARED_LIBS)
set(pdbFile $<TARGET_PDB_FILE:proj>)
else()
set(pdbDirFullPath ${CMAKE_BINARY_DIR}/lib)
set_target_properties(proj
PROPERTIES
COMPILE_PDB_OUTPUT_DIRECTORY ${pdbDirFullPath}
COMPILE_PDB_NAME proj)
set(pdbFile ${pdbDirFullPath}/proj.pdb)
endif()
install(FILES ${pdbFile} DESTINATION lib)
endif()
DESTINATION "${DOCDIR}")
################################################################################
# pkg-config support
@@ -490,59 +335,61 @@ configure_proj_pc()
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/proj.pc
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
DESTINATION ${LIBDIR}/pkgconfig)
################################################################################
# "make dist" workalike
################################################################################
if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set(CPACK_SOURCE_GENERATOR "TGZ;ZIP")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "proj-${PROJ_VERSION}")
set(CPACK_PACKAGE_VENDOR "OSGeo")
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJ_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJ_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJ_VERSION_PATCH})
set(CPACK_VERBATIM_VARIABLES TRUE)
set(CPACK_SOURCE_IGNORE_FILES
/\\..* # any file/directory starting with .
/.*\\.yml
/.*\\.gz
/.*\\.zip
/.*build.*/
\\.deps
/autogen\\.sh
/autom4te\\.cache
/ci/
/CODE_OF_CONDUCT.md
/CONTRIBUTING.md
/disabled_workflows/
/Dockerfile
/docs/
/Doxyfile
/HOWTO-RELEASE.md
/m4/lt*
/m4/libtool*
/media/
/schemas/
/test/fuzzers/
/test/gigs/.*gie\\.failing
/test/postinstall/
/travis/
${PROJECT_BINARY_DIR}
set(CPACK_SOURCE_GENERATOR "TGZ;ZIP")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "proj-${PROJ_VERSION}")
set(CPACK_PACKAGE_VENDOR "OSGeo")
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJ_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJ_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJ_VERSION_PATCH})
set(CPACK_VERBATIM_VARIABLES TRUE)
set(CPACK_SOURCE_IGNORE_FILES
/\\..* # any file/directory starting with .
/.*\\.yml
/.*\\.gz
/.*\\.zip
/.*build.*/
\\.deps
/autogen\\.sh
/autom4te\\.cache
/CODE_OF_CONDUCT.md
/CONTRIBUTING.md
/Dockerfile
/docs/
/Doxyfile
/examples/
/HOWTO-RELEASE
/m4/lt*
/m4/libtool*
/media/
/schemas/
/scripts/
/test/fuzzers/
/test/gigs/.*gie\\.failing
/test/postinstall/
/travis/
${PROJECT_BINARY_DIR}
)
include(CPack)
# Simplify README.md to README
add_custom_target(README
COMMAND ${CMAKE_COMMAND}
-D PROJ_SOURCE_DIR=${PROJ_SOURCE_DIR}
-P ${PROJ_SOURCE_DIR}/cmake/ProjReadme.cmake
)
get_property(_is_multi_config_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(NOT _is_multi_config_generator)
add_custom_target(dist
COMMAND ${CMAKE_MAKE_PROGRAM} package_source
DEPENDS README
)
include(CPack)
get_property(_is_multi_config_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(NOT _is_multi_config_generator)
add_custom_target(dist
COMMAND ${CMAKE_MAKE_PROGRAM} package_source
)
message(STATUS "PROJ: Configured 'dist' target")
endif()
configure_file(cmake/uninstall.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/proj_uninstall.cmake @ONLY)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/proj_uninstall.cmake)
message(STATUS "PROJ: Configured 'dist' target")
endif()
message(STATUS "EMBED_RESOURCE_FILES=${EMBED_RESOURCE_FILES}")
+6 -5
View File
@@ -55,7 +55,7 @@ a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at <kristianevers@gmail.com>. All
reported by contacting the project team at [kristianevers@gmail.com](mailto:kristianevers@gmail.com). All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
@@ -68,9 +68,10 @@ members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>
For answers to common questions about this code of conduct, see
<https://www.contributor-covenant.org/faq>
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
+7 -7
View File
@@ -3,7 +3,7 @@
PROJ has a wide and varied user base. Some are highly skilled geodesists with a deep
knowledge of map projections and reference systems, some are GIS software developers
and others are GIS users. All users, regardless of the profession or skill level,
have the ability to contribute to PROJ. Here are a few suggestions on how:
has the ability to contribute to PROJ. Here's a few suggestion on how:
* Help PROJ-users that is less experienced than yourself.
* Write a bug report
@@ -18,7 +18,6 @@ account. Familiarity with [issues](https://guides.github.com/features/issues/) a
the [GitHub Flow](https://guides.github.com/introduction/flow/) is an advantage.
## Help a fellow PROJ user
The main forum for support for PROJ is the mailing list. You can subscribe to
the mailing list [here](http://lists.osgeo.org/mailman/listinfo/proj) and read
the archive [here](http://lists.osgeo.org/pipermail/proj/).
@@ -77,12 +76,12 @@ on GitHub.
If you intend to document one of PROJ's supported projections please use the
[Mercator projection](https://proj.org/operations/projections/merc.html) as a template.
## Code contributions
See [Code Contributions](https://proj.org/community/code_contributions.html)
### Legalese
#### Legalese
Committers are the front line gatekeepers to keep the code base clear of improperly contributed code.
It is important to the PROJ users, developers and the OSGeo foundation to avoid contributing any
code to the project without it being clearly licensed under the project license.
@@ -123,6 +122,7 @@ improperly contributing code to the source repository:
* If there is uncertainty about whether a change is proper to contribute to the code base, please
seek more information from the project steering committee, or the foundation legal counsel.
## Additional Resources
* [General GitHub documentation](https://help.github.com/)
@@ -130,6 +130,6 @@ improperly contributing code to the source repository:
## Acknowledgements
The [code contribution](#Code Contributions) section of this CONTRIBUTING file is inspired by
[PDAL's](https://github.com/PDAL/PDAL/blob/master/CONTRIBUTING.md) and the [legalese](#legalese)
section is modified from [GDAL committer guidelines](https://trac.osgeo.org/gdal/wiki/rfc3_commiters)
The _code contribution_ section of this CONTRIBUTING file is inspired by
[PDAL's](https://github.com/PDAL/PDAL/blob/master/CONTRIBUTING.md) and the _legalese_ section is
modified from [GDAL committer guidelines](https://trac.osgeo.org/gdal/wiki/rfc3_commiters)
+6 -6
View File
@@ -40,7 +40,7 @@
2015-07-27 Even Rouault <even.rouault@spatialys.com>
* : Remove setlocale() use in pj_init_ctx(), and replace uses of atof() &
strtod() by their locale safe variants pj_atof() and pj_strtod().
Proj versions from now advertise #define PJ_LOCALE_SAFE 1 in proj_api.h
Proj versions from now advertize #define PJ_LOCALE_SAFE 1 in proj_api.h
and export pj_atof() & pj_strtod() (#226)
2015-06-01 Charles Karney <https://github.com/cffk>
@@ -1491,7 +1491,7 @@ Rel. 4.4.4 2001/09/15
2001-05-14 Frank Warmerdam <warmerdam@pobox.com>
* upgraded config.sub and config.guess as per debian bug report 97374.
* upraded config.sub and config.guess as per debian bug report 97374.
Rel. 4.4.3 2001/04/20
-------------------------------------------------------------------------
@@ -1714,7 +1714,7 @@ Rel. 4.3.1 94/2/16 Base-line
-------------------------------------------------------------------------
94/6/2
Transverse Mercator, spherical inverse fixed. Misplaced parenthesis.
Transverse Mercator, spherical inverse fixed. Misplaced parenthsis.
94/10/5
Dropped dependency on FILENAME_MAX---too poorly defined in both
@@ -1756,14 +1756,14 @@ Rel. 4.3 94/2/16 Base-line
Added SPECIAL entry to conics Lambert, Albers and Equidistant.
Corrected nad/install.in test so as to only look for conus.lla.Z
as test for installation of NADCON datum matrices.
as test for installation of NADCON datum matricies.
94/3/19
Problems with MAPGEN's mapdef choking on call to proj. Fixed
with PROJ.4.3-patch-01.
94/3/22
Bump mode of handling memory allocation for 2D arrays, so that
Bumb mode of handling memory allocation for 2D arrays, so that
execution of -L may not work on some systems. Interim corrections
distributed with PROJ.4.3-patch-02.
@@ -1937,7 +1937,7 @@ Rel. 4.1.1 93/3/26 Base-line
pj_strerrno prototype added to projects.h
DOS option in strtod.c for MS C's lack of standard macros in headers.
DOS option in strtod.c for MS C's lack of standard macros in neaders.
Rel. 4.1 93/3/8 Base-line --- @(#)CHANGE-LOG 4.14 95/09/23 GIE REL
-------------------------------------------------------------------------
+29 -24
View File
@@ -1,47 +1,52 @@
##
# OSGeo/PROJ
FROM ubuntu:24.04 AS builder
FROM ubuntu:20.04 as builder
LABEL maintainer="Howard Butler <howard@hobu.co>"
MAINTAINER Howard Butler <howard@hobu.co>
ARG DESTDIR="/build"
ARG PROJ_GITHUB_SHA
# Setup build env
RUN apt-get update \
RUN apt-get update -y \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --fix-missing --no-install-recommends \
software-properties-common build-essential ca-certificates \
cmake wget unzip \
zlib1g-dev libsqlite3-dev sqlite3 libcurl4-gnutls-dev \
libtiff-dev \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
software-properties-common build-essential ca-certificates \
cmake wget unzip \
zlib1g-dev libsqlite3-dev sqlite3 libcurl4-gnutls-dev \
libtiff5-dev
COPY . /PROJ
RUN cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -S /PROJ -B _build
RUN cmake --build _build -j $(nproc)
RUN cmake --install _build
RUN rm -rfv _build
RUN cd /PROJ \
&& mkdir build \
&& cd build \
&& cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF \
&& make -j$(nproc) \
&& make install
FROM ubuntu:24.04 AS runner
FROM ubuntu:20.04 as runner
RUN date
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
libsqlite3-0 libtiff6 libcurl4 libcurl3-gnutls \
wget ca-certificates \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
RUN apt-get update; \
DEBIAN_FRONTEND=noninteractive apt-get install -y \
libsqlite3-0 libtiff5 libcurl4 libcurl3-gnutls \
wget ca-certificates
# Put this first as this is rarely changing
WORKDIR /usr/share/proj
RUN wget --no-verbose --mirror https://cdn.proj.org/ || true
RUN cd cdn.proj.org && rm -fv *.js *.css *.html favicon* && mv * .. && cd .. && rmdir cdn.proj.org
WORKDIR /
RUN \
mkdir -p /usr/share/proj; \
wget --no-verbose --mirror https://cdn.proj.org/; \
rm -f cdn.proj.org/*.js; \
rm -f cdn.proj.org/*.css; \
mv cdn.proj.org/* /usr/share/proj/; \
rmdir cdn.proj.org
COPY --from=builder /build/usr/share/proj/ /usr/share/proj/
COPY --from=builder /build/usr/include/ /usr/include/
COPY --from=builder /build/usr/bin/ /usr/bin/
COPY --from=builder /build/usr/lib/ /usr/lib/
+51 -3
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 src/iso19111/operation include/proj src/proj.h src/proj_experimental.h src/general_doc.dox src/filemanager.cpp src/networkfilemanager.cpp src/coordinates.cpp src/trans_bounds.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 src/4D_api.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
@@ -1161,6 +1161,15 @@ HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
# to YES can help to show when doxygen was last run and thus if the
# documentation is up to date.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_TIMESTAMP = NO
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the
# page has loaded.
@@ -1431,6 +1440,17 @@ EXT_LINKS_IN_WINDOW = NO
FORMULA_FONTSIZE = 10
# Use the FORMULA_TRANPARENT tag to determine whether or not the images
# generated for formulas are transparent PNGs. Transparent PNGs are not
# supported properly for IE 6.0, but are supported on all modern browsers.
#
# Note that when changing this option you need to delete any form_*.png files in
# the HTML output directory before the changes have effect.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
FORMULA_TRANSPARENT = YES
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
# http://www.mathjax.org) which uses client side Javascript for the rendering
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
@@ -2010,8 +2030,7 @@ PREDEFINED = DOXYGEN_ENABLED \
PROJ_OPAQUE_PRIVATE_DATA= \
PROJ_PRIVATE=private \
PROJ_PURE_DECL= \
noexceptoverride="noexcept override" \
PROJ_NO_RETURN=
noexceptoverride="noexcept override"
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
@@ -2131,6 +2150,23 @@ HAVE_DOT = YES
DOT_NUM_THREADS = 0
# When you want a differently looking font in the dot files that doxygen
# generates you can specify the font name using DOT_FONTNAME. You need to make
# sure dot is able to find the font, which can be done by putting it in a
# standard location or by setting the DOTFONTPATH environment variable or by
# setting DOT_FONTPATH to the directory containing the font.
# The default value is: Helvetica.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTNAME = Helvetica
# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
# dot graphs.
# Minimum value: 4, maximum value: 24, default value: 10.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTSIZE = 10
# By default doxygen will tell dot to use the default font as specified with
# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
# the path where dot can find it using this tag.
@@ -2340,6 +2376,18 @@ DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
# background. This is disabled by default, because dot on Windows does not seem
# to support this out of the box.
#
# Warning: Depending on the platform used, enabling this option may lead to
# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
# read).
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_TRANSPARENT = NO
# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+96 -75
View File
@@ -1,4 +1,5 @@
# Preparing a PROJ Release
Preparing a PROJ Release
===============================================================================
Preparing a PROJ release is a three-step process. Before the actual release is
published we want to issue one or more release candidates to ensure that the
@@ -9,7 +10,8 @@ released code and code still in development.
The three phases are described below.
## 1 Release candidate
1 Release candidate
===============================================================================
At least one release candidate is necessary before the final release is
published. In case more than one release candidate is needed most steps below
@@ -25,64 +27,79 @@ When a release candidate has not prompted any request for changes in 48 hours,
a motion for promotion to final release should be issued on the PROJ mailing
list. The PROJ PSC guidelines describes the rules for passing a motion.
### 1.1 Update ABI version numbers
1.1 Update ABI version numbers:
-------------------------------------------------------------------------------
In case of a un-planned maintenance release, make sure that version numbers are
properly updated: see 3.1
For each release version, increment PROJ_SOVERSION in CMakeLists.txt if the
ABI is not backwards compatible, i.e. any interfaces have been removed, or
For each release version, increment PROJ_SOVERSION in CMakeLists.txt if the
ABI is not backwards compatible, i.e. any interfaces have been removed, or
changed since the last release. See also:
<https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B>
https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B
*Commit the changes to master.*
### 1.2 Update man pages
1.2 Update man pages
-------------------------------------------------------------------------------
Man pages are (mostly) automatically generated from the Sphinx docs. Follow
these steps:
- Temporarily update `version` and `data_version` in `docs/source/conf.py`
- run `scripts/update_man.sh`
- Revert version number in `docs/source/conf.py`
- Temporarily update `version` and `data_version` in `docs/source/conf.py`
- run `scripts/update_man.sh`
- Revert version number in `docs/source/conf.py`
The `update_man.sh` script builds the man pages and commits the update man pages
to master.
### 1.3 Write release notes
Update `NEWS.md` with descriptions of the changes since the last release.
1.3 Write release notes
-------------------------------------------------------------------------------
Update `NEWS` with descriptions of the changes since the last release.
Hopefully issues and pull requests that go into the new release have been
properly tagged with the milestone for the current release.
`scripts/releasenotes.py` can be used to create a first draft of the release
notes.
End the section by thanking the authors that contributed to the release. Get a
sorted list of contributors in descending order of activity:
```
git shortlog -sn x.y.z..HEAD | tac | awk '{$1=""; print $0}'
```
where `x.y.z` is the tag of the previous release. You may need to edit the list
slightly since not all authors has properly configured their names in git.
*Commit the changes to master.*
### 1.4 Update `CITATION.cff` and `CITATION`
Update the "version" and "date-released" fields in `CITATION.cff`. The
"doi" does not need to be updated.
1.4 Update `CITATION`
-------------------------------------------------------------------------------
If needed, update the two instances of year in `CITATION`.
If needed, update the year in `CITATION`.
*Commit the changes to master.*
### 1.5 Update `PROJ_DATA.VERSION`
1.5 Update `PROJ_DATA.VERSION`
-------------------------------------------------------------------------------
If the database references data from an updated PROJ-data package, update
`PROJ_DATA.VERSION` in `data/sql/metadata.sql`.
*Commit the changes to master.*
### 1.6 Create maintenance branch
1.6 Create maintenance branch
-------------------------------------------------------------------------------
*Skip this step if you are preparing a patch release or RC2 and later.*
Create the branch:
```sh
```
git branch x.y
```
@@ -92,12 +109,14 @@ subsequently cherry-picked to the maintenance branch.
*Push branch upstream.*
### 1.7 Prepare and upload archives
1.7 Prepare and upload archives
-------------------------------------------------------------------------------
Checkout the GitHub repo to an isolated local directory to package files only
tracked in git. Then, run CMake and build source distributions:
```sh
```
BRANCH_NAME=master
git clone --depth 1 --branch $BRANCH_NAME \
https://github.com/OSGeo/PROJ.git PROJ-$BRANCH_NAME
@@ -109,7 +128,7 @@ cmake --build . --target dist
Rename the archives and generate MD5 sum files:
```sh
```
mv proj-x.y.z.tar.gz proj-x.y.zRCn.tar.gz
mv proj-x.y.z.zip proj-x.y.zRCn.zip
md5 proj-x.y.zRCn.tar.gz > proj-x.y.zRCn.tar.gz.md5
@@ -118,112 +137,114 @@ md5 proj-x.y.zRCn.zip > proj-x.y.zRCn.zip.md5
Upload to the OSGeo download server:
```sh
scp proj-x.y.zRCn.* warmerdam@upload.osgeo.org:/osgeo/download/proj
```
scp proj-x.y.zRCn.* warmerdam@download.osgeo.org:/osgeo/download/proj
```
Adjust version numbers and usernames accordingly.
### 1.8 Announce the release candidate
1.8 Announce the release candidate
-------------------------------------------------------------------------------
Announce the release candidate on the PROJ mailing list.
### 1.9 Promotion to final release
1.9 Promotion to final release
-------------------------------------------------------------------------------
When you are confident that the latest release candidate is ready for promotion
to final release a motion for promotion should be issued on the PROJ mailing
list. Allow for a minimum of 48 hours for voting time.
## 2 Final release
2 Final release
===============================================================================
Barring a successful promotion process we can proceed with the final release.
### 2.1 Prepare and upload archives
2.1 Prepare and upload archives
-------------------------------------------------------------------------------
See step 1.6 above. Do not rename the archives with RC postfixes.
2.2 Update website
------------------------------------------------------------------------------
### 2.2 Update the STABLE_BRANCH repository variable
- Add the release notes from `NEWS` to `docs/source/news.rst`
Go to https://github.com/OSGeo/PROJ/settings/variables/actions/STABLE_BRANCH
and update the value to be x.y
These vim substitutions are helpfull when converting NEWS to rst:
### 2.3 Update website
:s!(\#\(\d\{4}\))!(`\#\1 <https://github.com/OSGeo/PROJ/issues/\1>`_)!
:s/^o/*/
- Add the release notes from `NEWS.md` to `docs/source/news.rst`
- Update download links in `docs/source/download.rst`
- Update `$TRAVIS_BRANCH` in `travis\after_success.sh` to new maintenance
branch.
These vim substitutions are helpful when converting NEWS.md to rst:
```sh
:s!(\#\(\d\{4}\))!(`\#\1 <https://github.com/OSGeo/PROJ/issues/\1>`_)!
```
- Update download links in `docs/source/download.rst`
*Commit the changes to master and cherry-pick into maintenance branch.*
When pushed upstream the website will be update to the current version.
### 2.4 Tag the release
2.3 Tag the release
-------------------------------------------------------------------------------
Tag the release with:
```sh
```
git tag -a -m "Create tag x.y.z" x.y.z
git push --tags
```
### 2.5 Check the GitHub Zeonodo integration
Go to https://zenodo.org/account/settings/github/ and check that the OSGeo/PROJ
repository is ON so that the creation of the GitHub release triggers the
creation of a corresponding Zenodo record.
### 2.6 Prepare the release on GitHub
2.4 Prepare the release on GitHub
-------------------------------------------------------------------------------
When the new tag is pushed upstream GitHub picks up that a new release has been
issued. Update the new release on <https://github.com/OSGeo/PROJ/releases> with
the release notes from `NEWS.md` and add the prepared source distribution archives
issued. Update the new release on https://github.com/OSGeo/PROJ/releases with
the release notes from `NEWS` and add the prepared source distribution archives
to the release (otherwise GitHub will just package the entire repository - we
don't want that).
### 2.7 Announce the new release
2.5 Announce the new release
-------------------------------------------------------------------------------
The release should be announced on PROJ and MetaCRS mailing lists. Additionally
the release announcement should be sent to <news_item@osgeo.org> which will add
the release announcement should be sent to news_item@osgeo.org which will add
the announcement to osgeo.org and other OSGeo communication channels.
Make some noise on relevant social media.
Make some noise on Twitter and other relevant social media.
## 3 Post final release
### 3.1 Update version numbers
3 Post final release
===============================================================================
3.1 Update version numbers
-------------------------------------------------------------------------------
PROJ uses [semantic versioning](http://semver.org/). Depending on the changes
in the release will be either a major, minor or patch release. Update the
version numbers in the files.
- src/proj.h: Update PROJ_VERSION_MAJOR, PROJ_VERSION_MINOR and
PROJ_VERSION_PATCH.
- src/release.cpp: Update date to the scheduled release date.
- CMakeLists.txt: Update proj_version()
- docs/source/conf.py: Update version number
- src/proj.h: Update PROJ_VERSION_MAJOR, PROJ_VERSION_MINOR and
PROJ_VERSION_PATCH.
- src/release.cpp: Update date to the scheduled release date.
- CMakeLists.txt: Update proj_version()
- docs/source/conf.py: Update version number
*Commit changes. Either to master or maintenance branch depending on the nature
of the release.*
### 3.2 Documentation
3.2 Disable website deployment when releasing a new non-bugfix version
-------------------------------------------------------------------------------
Edit the Sphinx configuration docs/source/conf.py with these changes:
If the previous active version was, let's say, 6.1 and the new version is, let's say, 6.2,
then checkout 6.1 branch, and in travis/after_success.sh, remove the code
that causes commits to 6.1 to cause a website refresh, that is remove the
code under `if test "$TRAVIS_SECURE_ENV_VARS" = "true" -a "$TRAVIS_BRANCH" = "6.1"; then`.
- Set "version" to the major project version, e.g. "9.2"
- Set "release" to the full project version, e.g. "9.2.1"
- Set "data_version" to the PROJ-data version
- Set "today_date = date(Y, M, D)" using the release date
- set "github_version" to the maintenance branch label, e.g. "9.2"
HTML and PDF documentation is built using ReadTheDocs, which supports multiple
versions. Versions are based on branch labels, e.g. "9.2". To modify settings,
registered users must first log in. To add a version, go to
<https://readthedocs.org/projects/osgeo-proj/versions/> and click "Activate"
next to the maintenance branch label.
Also edit docs/source/conf.py to change the active branch for documentation
in the `github_version` variable.
+175 -9
View File
@@ -1,16 +1,182 @@
Basic Installation
==================
These are generic installation instructions. See details online at
https://proj.org/install.html
These are generic installation instructions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, a file
`config.cache' that saves the results of its tests to speed up
reconfiguring, and a file `config.log' containing compiler output
(useful mainly for debugging `configure').
PROJ can be built using a modern C/C++ compiler with CMake. From the source
directory, use the following commands to configure, build and install PROJ:
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If at some point `config.cache'
contains results you don't want to keep, you may remove or edit it.
mkdir build
cd build
cmake ..
cmake --build .
cmake --build . --target install
The file `configure.in' is used to create `configure' by a program
called `autoconf'. You only need `configure.in' if you want to change
it or regenerate `configure' using a newer version of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're
using `csh' on an old version of System V, you might need to type
`sh ./configure' instead to prevent `csh' from trying to execute
`configure' itself.
Running `configure' takes awhile. While running, it prints some
messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package.
4. Type `make install' to install the programs and any data files and
documentation.
5. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. You can give `configure'
initial values for variables by setting them in the environment. Using
a Bourne-compatible shell, you can do that on the command line like
this:
CC=c99 CFLAGS=-O2 LIBS=-lposix ./configure
Or on systems that have the `env' program, you can do it like this:
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not supports the `VPATH'
variable, you have to compile the package for one architecture at a time
in the source code directory. After you have installed the package for
one architecture, use `make distclean' before reconfiguring for another
architecture.
Installation Names
==================
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PATH'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
give `configure' the option `--exec-prefix=PATH', the package will use
PATH as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=PATH' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
=================
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
==========================
There may be some features `configure' can not figure out
automatically, but needs to determine by the type of host the package
will run on. Usually `configure' can figure that out, but if it prints
a message saying it can not guess the host type, give it the
`--host=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name with three fields:
CPU-COMPANY-SYSTEM
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the host type.
If you are building compiler tools for cross-compiling, you can also
use the `--target=TYPE' option to select the type of system they will
produce code for and the `--build=TYPE' option to select the type of
system on which you are compiling the package.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Operation Controls
==================
`configure' recognizes the following options to control how it
operates.
`--cache-file=FILE'
Use and save the results of the tests in FILE instead of
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
debugging `configure'.
`--help'
Print a summary of the options to `configure', and exit.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--version'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`configure' also accepts some other, not widely useful, options.
+2594
View File
File diff suppressed because it is too large Load Diff
-3464
View File
File diff suppressed because it is too large Load Diff
+13 -9
View File
@@ -1,11 +1,15 @@
# PROJ
[![Travis Status](https://travis-ci.com/OSGeo/PROJ.svg?branch=master)](https://travis-ci.com/OSGeo/PROJ)
[![AppVeyor Status](https://ci.appveyor.com/api/projects/status/github/OSGeo/PROJ?branch=master&svg=true)](https://ci.appveyor.com/project/OSGeo/PROJ?branch=master)
[![Docker build Status](https://img.shields.io/docker/cloud/build/osgeo/proj)](https://hub.docker.com/r/osgeo/proj/builds)
[![Coveralls Status](https://coveralls.io/repos/github/OSGeo/PROJ/badge.svg?branch=master)](https://coveralls.io/github/OSGeo/PROJ?branch=master)
[![CodeQL](https://github.com/OSGeo/PROJ/actions/workflows/codeql.yml/badge.svg)](https://github.com/OSGeo/PROJ/actions/workflows/codeql.yml)
[![Gitter](https://badges.gitter.im/OSGeo/proj.4.svg)](https://gitter.im/OSGeo/proj.4)
[![Mailing List](https://img.shields.io/badge/PROJ-mailing%20list-4eb899.svg)](http://lists.osgeo.org/mailman/listinfo/proj)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v1.4%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md)
[![Release](https://img.shields.io/github/v/release/OSGeo/PROJ)](https://github.com/OSGeo/PROJ/releases)
<!-- [![Cirrus Status](https://img.shields.io/cirrus/github/OSGeo/PROJ)](https://cirrus-ci.com/github/OSGeo/PROJ/master) -->
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.5884394.svg)](https://doi.org/10.5281/zenodo.5884394)
PROJ is a generic coordinate transformation software, that transforms
@@ -14,13 +18,13 @@ This includes cartographic projections as well as geodetic transformations.
For more information on the PROJ project please see the web page at:
<https://proj.org/>
https://proj.org/
The PROJ mailing list can be found at:
<https://lists.osgeo.org/mailman/listinfo/proj/>
https://lists.osgeo.org/mailman/listinfo/proj/
See the NEWS.md file for changes between versions.
See the NEWS file for changes between versions.
The following command line utilities are included in the PROJ package:
@@ -67,11 +71,11 @@ be changed to a different directory. On Windows you have to define
As an alternative to installing the data package on the local system,
the resource files can be retrieved on-the-fly from the
[PROJ CDN](https://cdn.proj.org/).
A [network-enabled](https://proj.org/usage/network.html) PROJ build, will
automatically fetch resource files that are not present locally from the CDN.
[PROJ CDN](https://cdn.proj.org/). A [network-enabled](https://proj.org/usage/network.html) PROJ build, will
automatically fetch resource files that are not present locally from the
CDN.
## Citing PROJ in publications
See [CITATION](CITATION)
-34
View File
@@ -1,34 +0,0 @@
#!/bin/sh
set -e
CLANG_VERSION=20
apt-get update -y
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
autoconf automake libtool make cmake ccache pkg-config sqlite3 tar zip curl ca-certificates jq \
python3-pytest python3-ruamel.yaml python3-jsonschema \
python3-clang-$CLANG_VERSION clang-$CLANG_VERSION libclang-rt-$CLANG_VERSION-dev \
libsqlite3-dev libgtest-dev \
libtiff-dev libwebp-dev libzstd-dev \
libcurl4-openssl-dev libnghttp2-dev libidn2-dev librtmp-dev libssh-dev \
libpsl-dev libssl-dev libkrb5-dev comerr-dev libldap2-dev libbrotli-dev \
nlohmann-json3-dev libgtest-dev
cd "$WORK_DIR"
if test -f "$WORK_DIR/ccache.tar.gz"; then
echo "Restoring ccache..."
(cd $HOME && tar xzf "$WORK_DIR/ccache.tar.gz")
else
mkdir -p $HOME/.ccache
fi
ccache -M 500M
# -fno-use-cxa-atexit is needed to build with -coverage
CC="clang-$CLANG_VERSION" CXX="clang++-$CLANG_VERSION" CFLAGS="-fsanitize=address -fno-use-cxa-atexit" CXXFLAGS="-fsanitize=address -fno-use-cxa-atexit" LDFLAGS="-fsanitize=address" ./ci/install.sh
echo "Saving ccache..."
rm -f "$WORK_DIR/ccache.tar.gz"
(cd $HOME && tar czf "$WORK_DIR/ccache.tar.gz" .ccache)
-30
View File
@@ -1,30 +0,0 @@
#!/bin/bash
mkdir packages
CONDA_PLAT=""
if grep -q "windows" <<< "$GHA_CI_PLATFORM"; then
CONDA_PLAT="win"
ARCH="64"
fi
if grep -q "ubuntu" <<< "$GHA_CI_PLATFORM"; then
CONDA_PLAT="linux"
ARCH="64"
fi
if grep -q "macos-14" <<< "$GHA_CI_PLATFORM"; then
CONDA_PLAT="osx"
ARCH="arm64"
elif grep -q "macos-15-intel" <<< "$GHA_CI_PLATFORM"; then
CONDA_PLAT="osx"
ARCH="64"
fi
rattler-build build \
--recipe-dir recipe \
--output-dir packages \
--variant-config ".ci_support/${CONDA_PLAT}_${ARCH}_.yaml"
conda install -c ./packages proj
#projinfo -s NAD27 -t EPSG:4269 --area "USA - Missouri"
-14
View File
@@ -1,14 +0,0 @@
#!/bin/bash
conda update -n base -c defaults conda -y
conda install rattler-build ninja compilers yq -y
pwd
ls
git clone https://github.com/conda-forge/proj.4-feedstock.git
cd proj.4-feedstock
yq -y -i '.source = {"path": "../../../PROJ"} | .build.number = 2112' recipe/recipe.yaml
ls recipe
-25
View File
@@ -1,25 +0,0 @@
# Use the official Emscripten SDK image.
FROM emscripten/emsdk:4.0.5
# Set non-interactive frontend for package installations
ENV DEBIAN_FRONTEND="noninteractive"
# --- Install System Dependencies ---
RUN apt-get update && \
apt-get install -y \
sqlite3 \
ninja-build && \
# Clean up apt cache to reduce image size
rm -rf /var/lib/apt/lists/*
ENV BUILD_DIR="/build"
RUN mkdir -p ${BUILD_DIR}
RUN chmod ugo+rwx ${BUILD_DIR}
# Copy the build script into the container
COPY build_wasm.sh /scripts/build_wasm.sh
RUN chmod +x /scripts/build_wasm.sh
# Set the main command to execute the build script
WORKDIR /build
CMD ["/scripts/build_wasm.sh"]
-365
View File
@@ -1,365 +0,0 @@
#!/bin/bash
###############################################################################
# $Id$
#
# Project: PROJ
# Purpose: Build with emscripten compiler
# Author: Javier Jimenez Shaw
#
###############################################################################
# Copyright (c) 2025 Javier Jimenez Shaw
###############################################################################
# Exit immediately if a command exits with a non-zero status.
set -e
# --- Configuration Variables ---
# Use environment variables from Dockerfile or runtime.
PROJ_REPO=${PROJ_REPO:-https://github.com/OSGeo/PROJ.git}
INSTALL_DIR=${INSTALL_DIR:-/build/install}
BUILD_DIR=${BUILD_DIR:-/build}
PROJ_SRC_DIR="${BUILD_DIR}/proj_src"
PROJ_BUILD_WASM_DIR="${BUILD_DIR}/proj_build_wasm"
DEPS_SRC_DIR="${BUILD_DIR}/deps_src"
TEMP_BUILD_DIR="${BUILD_DIR}/temp_build"
# Clean build directories to ensure a fresh build
rm -rf ${TEMP_BUILD_DIR}
# We keep DEPS_SRC_DIR to cache downloads
mkdir -p ${PROJ_SRC_DIR}
mkdir -p ${DEPS_SRC_DIR}
mkdir -p ${TEMP_BUILD_DIR}
# Emscripten flags for Pthreads (multithreading support for synchronous emscripten_fetch)
# and some other.
EM_PTHREADS_FLAGS="-pthread -matomics -mbulk-memory -fexceptions"
# --- Utility Functions ---
function log_step {
echo ""
echo "--- $1 ---"
echo ""
}
function configure_cmake {
# Use emcmake wrapper to correctly configure the toolchain
emcmake cmake "$@" \
-G Ninja \
-D CMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
-D CMAKE_BUILD_TYPE=Release \
-D BUILD_SHARED_LIBS=OFF \
-D CMAKE_C_FLAGS="${EM_PTHREADS_FLAGS}" \
-D CMAKE_CXX_FLAGS="${EM_PTHREADS_FLAGS}" \
-D CMAKE_FIND_ROOT_PATH="${INSTALL_DIR}" \
-D CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \
-D CMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-D CMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY
}
function build_and_install {
cmake --build . --parallel $(nproc)
cmake --install .
}
# --- Preparation ---
log_step "1. Setting up Environment and Directories"
if [ "${FORCE_REBUILD}" = "1" ]; then
echo "!!! FORCE_REBUILD is set. Existing libraries will be ignored and rebuilt. !!!"
rm -rf "${INSTALL_DIR}"/*
fi
if [ -f "${PROJ_SRC_DIR}/CMakeLists.txt" ]; then
echo "Using content from ${PROJ_SRC_DIR} to build PROJ"
elif [ -n "${PROJ_TAG}" ]; then
echo "Using PROJ from ${PROJ_REPO} : ${PROJ_TAG}"
else
echo "Please set PROJ_TAG env variable, or populate ${PROJ_SRC_DIR}"
exit 1
fi
echo "Installation target: ${INSTALL_DIR}"
# --- 2. Build and Install Zlib (Dependency) ---
log_step "2. Building and Installing Zlib"
if [ "${FORCE_REBUILD}" != "1" ] && [ -f "${INSTALL_DIR}/lib/libz.a" ] && [ -f "${INSTALL_DIR}/include/zlib.h" ]; then
echo "Zlib library and header already installed. Skipping."
else
ZLIB_DIR="${DEPS_SRC_DIR}/zlib-1.3.1"
cd ${DEPS_SRC_DIR}
if [ ! -f "v1.3.1.zip" ]; then
wget -nc "https://github.com/madler/zlib/archive/refs/tags/v1.3.1.zip"
fi
unzip -qo v1.3.1.zip
cd ${ZLIB_DIR}
# Zlib defines both SHARED and STATIC targets with the same output name (libz.a)
# on Emscripten, causing Ninja errors.
# Fixed in https://github.com/madler/zlib/commit/b3907c2cd99908259c71fab6754f88e25d370fed
# Instead of renaming, we simply remove the SHARED target definitions entirely.
sed -i '/add_library(zlib SHARED/d' CMakeLists.txt
sed -i '/target_include_directories(zlib /d' CMakeLists.txt
sed -i '/set_target_properties(zlib /d' CMakeLists.txt
sed -i 's/install(TARGETS zlib zlibstatic/install(TARGETS zlibstatic/g' CMakeLists.txt
rm -rf build_wasm
mkdir -p build_wasm
cd build_wasm
configure_cmake .. -DZLIB_BUILD_EXAMPLES=OFF
build_and_install
# Handle case where Zlib installs as libzlibstatic.a instead of libz.a
if [ -f "${INSTALL_DIR}/lib/libzlibstatic.a" ]; then
echo "Detected libzlibstatic.a, copying to libz.a..."
cp "${INSTALL_DIR}/lib/libzlibstatic.a" "${INSTALL_DIR}/lib/libz.a"
fi
fi
# --- 3. Build and Install LibTIFF (Dependency) ---
log_step "3. Building and Installing LibTIFF"
if [ "${FORCE_REBUILD}" != "1" ] && [ -f "${INSTALL_DIR}/lib/libtiff.a" ] && [ -f "${INSTALL_DIR}/include/tiff.h" ]; then
echo "LibTIFF library and header already installed. Skipping."
else
TIFF_VERSION="4.7.0"
TIFF_DIR="${DEPS_SRC_DIR}/tiff-${TIFF_VERSION}"
cd ${DEPS_SRC_DIR}
if [ ! -f "tiff-${TIFF_VERSION}.tar.gz" ]; then
wget -nc "https://download.osgeo.org/libtiff/tiff-${TIFF_VERSION}.tar.gz"
fi
tar -xzf tiff-${TIFF_VERSION}.tar.gz
cd ${TIFF_DIR}
rm -rf build_wasm
mkdir -p build_wasm
cd build_wasm
# Configure minimal LibTIFF: No JPEG, No LZMA, No WebP, No ZSTD.
# Only Zlib support enabled.
configure_cmake .. \
-D tiff-tools=OFF \
-D tiff-tests=OFF \
-D tiff-contrib=OFF \
-D tiff-docs=OFF \
-D jpeg=OFF \
-D zlib=ON \
-D lzma=OFF \
-D zstd=OFF \
-D webp=OFF \
-D jbig=OFF \
-D CMAKE_PREFIX_PATH="${INSTALL_DIR}"
build_and_install
fi
# --- 4. Build and Install SQLite3 (Dependency) ---
log_step "4. Building and Installing SQLite3"
# Check if both the library AND the header exist before skipping
if [ "${FORCE_REBUILD}" != "1" ] && [ -f "${INSTALL_DIR}/lib/libsqlite3.a" ] && [ -f "${INSTALL_DIR}/include/sqlite3.h" ]; then
echo "SQLite3 static library and header already found. Skipping build."
else
SQLITE_VERSION="3440200"
SQLITE_AMALGAMATION_DIR="${DEPS_SRC_DIR}/sqlite3_amalgamation"
mkdir -p ${SQLITE_AMALGAMATION_DIR}
cd ${SQLITE_AMALGAMATION_DIR}
if [ ! -f "sqlite-amalgamation-${SQLITE_VERSION}.zip" ]; then
wget "https://sqlite.org/2023/sqlite-amalgamation-${SQLITE_VERSION}.zip"
fi
unzip -qo sqlite-amalgamation-${SQLITE_VERSION}.zip
# Move files to the parent directory for a flat structure
mv sqlite-amalgamation-${SQLITE_VERSION}/* .
rmdir sqlite-amalgamation-${SQLITE_VERSION}
# Step 4a: Compile SQLite3 to an object file (.o)
emcc sqlite3.c \
-o ${TEMP_BUILD_DIR}/sqlite3.o \
-c \
-O3 \
-DSQLITE_THREADSAFE=1 \
-D_REENTRANT \
${EM_PTHREADS_FLAGS}
# Step 4b: Create the static library archive (.a) from the object file
emmake ar rcs ${INSTALL_DIR}/lib/libsqlite3.a ${TEMP_BUILD_DIR}/sqlite3.o
# Copy the header to the install directory
mkdir -p ${INSTALL_DIR}/include
# Force copy to overwrite any broken symlinks from previous runs
rm -f ${INSTALL_DIR}/include/sqlite3.h
cp ${SQLITE_AMALGAMATION_DIR}/sqlite3.h ${INSTALL_DIR}/include/sqlite3.h
fi
# --- 5. Download PROJ Source if needed ---
log_step "5. Downloading PROJ Source"
if [ ! -f "${PROJ_SRC_DIR}/CMakeLists.txt" ]; then
git clone --depth 1 --branch ${PROJ_TAG} ${PROJ_REPO} ${PROJ_SRC_DIR}
fi
cd ${PROJ_SRC_DIR}
# --- 6. Build and Install PROJ ---
# This step uses the NATIVE sqlite3 binary (from the Docker image)
# to generate proj.db, which is then embedded into libproj.a.
log_step "6. Building and Installing PROJ"
if [ "${FORCE_REBUILD}" != "1" ] && [ -f "${INSTALL_DIR}/lib/libproj.a" ]; then
echo "PROJ already built. Skipping."
else
# If forcing a rebuild, clean the PROJ build directory too to be safe
if [ "${FORCE_REBUILD}" = "1" ]; then
echo "Cleaning PROJ build directory due to FORCE_REBUILD..."
rm -rf ${PROJ_BUILD_WASM_DIR}
fi
mkdir -p ${PROJ_BUILD_WASM_DIR}
cd ${PROJ_BUILD_WASM_DIR}
# Configure PROJ
configure_cmake ${PROJ_SRC_DIR} \
-D BUILD_TESTING=OFF \
-D BUILD_APPS=OFF \
-D ENABLE_TIFF=ON \
-D ENABLE_CURL=OFF \
-D ENABLE_EMSCRIPTEN_FETCH=ON \
-D EXE_SQLITE3=/usr/bin/sqlite3 \
-D SQLite3_INCLUDE_DIR="${INSTALL_DIR}/include" \
-D SQLite3_LIBRARY="${INSTALL_DIR}/lib/libsqlite3.a" \
-D TIFF_INCLUDE_DIR="${INSTALL_DIR}/include" \
-D TIFF_LIBRARY_RELEASE="${INSTALL_DIR}/lib/libtiff.a"
build_and_install
fi
# --- 6.5 Create C Wrappers ---
# Helper functions to extract some info from PROJ in C and C++
log_step "6.5 Creating C Wrapper Functions"
WRAPPER_FILE="${TEMP_BUILD_DIR}/proj_wrappers.cpp"
WRAPPER_OBJ_FILE="${TEMP_BUILD_DIR}/proj_wrappers.o"
DDD=`date +"%Y-%m-%dT%H:%M:%S%z" -u`
cat << EOF > ${WRAPPER_FILE}
#include "proj.h"
#include "math.h"
#include "projapps_lib.h"
#include <emscripten/bind.h>
#include <emscripten/val.h>
#include <vector>
#include <string>
void trampoline(PJ_PROJINFO_LOG_LEVEL level, const char *msg, void *user_data) {
if (!user_data) return;
const emscripten::val* js_callback = reinterpret_cast<const emscripten::val*>(user_data);
(*js_callback)(level, std::string(msg));
}
int projinfo_wrapper(uintptr_t ctx_ptr, emscripten::val jsArgs, emscripten::val jsCallback) {
std::vector<std::string> args = emscripten::vecFromJSArray<std::string>(jsArgs);
std::vector<char*> argv;
for (auto& s : args) {
argv.push_back(&s[0]);
}
PJ_CONTEXT *ctx = reinterpret_cast<PJ_CONTEXT *>(ctx_ptr);
return projinfo(ctx, args.size(), argv.data(), &trampoline, &jsCallback);
}
EMSCRIPTEN_BINDINGS(proj_module) {
emscripten::value_object<PJ_INFO>("PJ_INFO")
.field("major", &PJ_INFO::major)
.field("minor", &PJ_INFO::minor)
.field("patch", &PJ_INFO::patch)
.field("release", std::function<std::string(const PJ_INFO&)>([](const PJ_INFO& i) {
return std::string(i.release); }),
std::function<void(PJ_INFO&, std::string)>([](PJ_INFO& i, std::string v) {}))
.field("version", std::function<std::string(const PJ_INFO&)>([](const PJ_INFO& i) {
return std::string(i.version); }),
std::function<void(PJ_INFO&, std::string)>([](PJ_INFO& i, std::string v) {}));
emscripten::function("proj_info_ems", &proj_info);
emscripten::enum_<PJ_PROJINFO_LOG_LEVEL>("PJ_PROJINFO_LOG_LEVEL")
.value("INFO", PJ_PROJINFO_LOG_LEVEL_INFO)
.value("WARN", PJ_PROJINFO_LOG_LEVEL_WARN)
.value("ERR", PJ_PROJINFO_LOG_LEVEL_ERR);
emscripten::function("projinfo_ems", &projinfo_wrapper, emscripten::allow_raw_pointers());
}
extern "C" {
const char* get_compilation_date() {
return "$DDD" ;
}
int get_ptr_size() {
return sizeof(void*);
}
}
EOF
# Compile the wrapper into an object file
emcc ${WRAPPER_FILE} \
-c \
-o ${WRAPPER_OBJ_FILE} \
-I ${INSTALL_DIR}/include \
${EM_PTHREADS_FLAGS}
# --- 7. Final WASM Module Generation ---
# Link all the static libraries and the wrapper object file
# into the final JS/WASM module and expose functions.
log_step "7. Generating Final WASM Module (projModule.js + .wasm)"
FINAL_LIBS="${INSTALL_DIR}/lib/libproj.a \
${INSTALL_DIR}/lib/libsqlite3.a \
${INSTALL_DIR}/lib/libtiff.a \
${INSTALL_DIR}/lib/libz.a \
${WRAPPER_OBJ_FILE}"
# include all exported symbols
echo -e "_malloc\n_free\n_get_compilation_date\n_get_ptr_size" > ${INSTALL_DIR}/exported_symbols.txt
grep "^proj_\|^geod_" ${PROJ_SRC_DIR}/scripts/reference_exported_symbols.txt | grep -v "(" | sed 's/^/_/' >> ${INSTALL_DIR}/exported_symbols.txt
head ${INSTALL_DIR}/exported_symbols.txt
emcc -v ${FINAL_LIBS} \
-o ${INSTALL_DIR}/projModule.js \
-O3 \
-lembind \
-s STACK_OVERFLOW_CHECK=1 \
-s STACK_SIZE=5MB \
-s NO_DISABLE_EXCEPTION_CATCHING \
-s FETCH=1 \
-s USE_PTHREADS=1 \
-s FETCH_SUPPORT_INDEXEDDB=0 \
-s WASM=1 \
-s MODULARIZE=1 \
-s EXPORT_NAME="'ProjModuleFactory'" \
-s FORCE_FILESYSTEM=1 \
-s ALLOW_MEMORY_GROWTH=1 \
-s EXPORTED_RUNTIME_METHODS="[ccall, cwrap, FS, HEAP8, HEAP16, HEAP32, HEAPF64, lengthBytesUTF8, stringToUTF8, stringToNewUTF8, UTF8ToString, getValue, setValue]" \
-s EXPORTED_FUNCTIONS=@${INSTALL_DIR}/exported_symbols.txt \
${EM_PTHREADS_FLAGS}
log_step "BUILD SUCCESSFUL!"
echo "ls -l ${INSTALL_DIR}"
ls -l ${INSTALL_DIR}
echo "Artifacts are installed in ${INSTALL_DIR}"
-252
View File
@@ -1,252 +0,0 @@
const assert = require("node:assert/strict");
const ProjModuleFactory = require("./projModule.js");
// Small class to help to manage memory.
class Keeper {
constructor(proj, debug = false) {
if (!proj) {
throw new Error("proj cannot be empty in class Keeper");
}
this.proj = proj;
this.debug = debug;
this.to_free = [];
this.to_destroy = [];
};
add(ptr, proj_destroy = true) {
if (proj_destroy) {
if (this.debug)
console.debug("add destroy", ptr);
this.to_destroy.push(ptr);
} else {
if (this.debug)
console.debug("add free", ptr);
this.to_free.push(ptr);
}
return ptr;
};
call(name, ...args) {
const ptr = this.proj[name](...args);
return this.add(ptr, true);
}
malloc(ptrSize) {
const ptr = this.proj._malloc(ptrSize);
return this.add(ptr, false);
};
string(str) {
const ptr = this.proj.stringToNewUTF8(str);
return this.add(ptr, false);
};
destroy() {
this.to_destroy.reverse();
for (const p of this.to_destroy) {
if (this.debug)
console.debug("call destroy", p);
this.proj._proj_destroy(p);
}
this.to_destroy = [];
this.to_free.reverse();
for (const p of this.to_free) {
if (this.debug)
console.debug("call free", p);
this.proj._free(p);
}
this.to_free = [];
};
};
const tests = {
test_proj_info : (proj) => {
const r = proj.proj_info_ems();
const compilation_date =
proj.UTF8ToString(proj._get_compilation_date());
// Print it for visual inspection
console.log(r);
console.log(compilation_date);
assert(compilation_date.length > 5);
assert(r.major >= 9);
if (r.major === 9) {
assert(r.minor >= 8);
}
assert(typeof r.minor === "number")
assert(typeof r.patch === "number")
const rel = `${r.major}.${r.minor}.${r.patch}`;
assert(r.release.includes(rel));
assert(r.version.includes(rel));
},
test_projinfo : (proj) => {
function get_projinfo(args) {
let msg = "";
const myCallback = (level, message) => { msg += message; };
const rc = proj.projinfo_ems(0, args, myCallback);
return [ rc, msg ];
} {
let [rc, msg] = get_projinfo([ "EPSG:32633", "-o", "WKT1:GDAL" ]);
assert.equal(rc, 0);
assert.ok(msg.includes('PROJCS["WGS 84 / UTM zone 33N"'));
assert.ok(msg.includes('AUTHORITY["EPSG","32633"]'));
} {let [rc, msg] = get_projinfo([ "EPSG:32633", "-o", "invalid" ]);
assert.equal(rc, 1);
assert.ok(msg.includes('Unrecognized value '));} {
let [rc, msg] = get_projinfo(
[ "EPSG:4326", "EPSG:32633", "-o", "proj", "--single-line" ]);
assert.equal(rc, 0);
assert.ok(msg.includes('Candidate operations'));
assert.ok(
msg.includes(('+proj=pipeline +step +proj=axisswap +order=2,1 ',
'+step +proj=unitconvert +xy_in=deg +xy_out=rad ',
'+step +proj=utm +zone=33 +ellps=WGS84')));
}
},
test_convert : (proj) => {
let ctx = proj._proj_context_create();
if (ctx === 0) {
throw new Error("proj_context_create returned NULL");
}
const sourceCRS = proj.stringToNewUTF8("EPSG:4326");
const targetCRS = proj.stringToNewUTF8("EPSG:32633");
const P = proj._proj_create_crs_to_crs(ctx, sourceCRS, targetCRS, 0);
if (P === 0) {
throw new Error("proj_create_crs_to_crs returned NULL.");
}
// PJ_COORD is 4 doubles: (x, y, z, t) or (lon, lat, z, t)
// We need 4 * 8 = 32 bytes of memory
let coordPtr = proj._malloc(32);
const coordView = new Float64Array(proj.HEAPF64.buffer, coordPtr, 4);
coordView[0] = 52;
coordView[1] = 13.5;
coordView[2] = 0;
coordView[3] = Infinity; // HUGE_VAL
let res = proj._proj_trans_array(P, 1, 1, coordPtr);
if (res != 0) {
let msgPtr = proj._proj_context_errno_string(ctx, res);
let msg = proj.UTF8ToString(msgPtr);
throw new Error(`_proj_trans_array error ${msg}`);
}
assert(Math.abs(coordView[0] - 397027.0183) < 1e-3);
assert(Math.abs(coordView[1] - 5762100.4897) < 1e-3);
proj._free(coordPtr);
proj._proj_destroy(P);
proj._free(sourceCRS);
proj._free(targetCRS);
proj._proj_destroy(ctx);
},
test_axes : (proj) => {
let ctx = proj._proj_context_create();
if (ctx === 0) {
throw new Error("proj_context_create returned NULL");
}
function get_str(ptr) {
const strPtr = proj.getValue(ptr, 'i32'); // It's a pointer (i32)
const str = proj.UTF8ToString(strPtr);
return str;
}
function get_axes(crs) {
let keep = new Keeper(proj);
try {
// TODO support compound CRS
const ptrSize = proj._get_ptr_size();
assert.ok(ptrSize == 4 || ptrSize == 8);
const doubleSize = 8; // Doubles are 8 bytes
const sourceCRS = keep.string(crs);
const P_crs = keep.call("_proj_create", ctx, sourceCRS);
const P_cs =
keep.add(proj._proj_crs_get_coordinate_system(ctx, P_crs));
const axis_count = proj._proj_cs_get_axis_count(ctx, P_cs);
const outNamePtr = keep.malloc(ptrSize);
const outAbbrevPtr = keep.malloc(ptrSize);
const outDirectionPtr = keep.malloc(ptrSize);
const outConvFactorPtr = keep.malloc(doubleSize);
const outUnitPtr = keep.malloc(ptrSize);
res = {
name : [],
abbr : [],
direction : [],
conv_factor : [],
unit : []
};
for (let i = 0; i < axis_count; i++) {
const r = proj._proj_cs_get_axis_info(
ctx, P_cs, i, outNamePtr, outAbbrevPtr, outDirectionPtr,
outConvFactorPtr, outUnitPtr, 0, 0);
if (r != 1) {
throw new Error("error calling proj_cs_get_axis_info");
}
res.name.push(get_str(outNamePtr));
res.abbr.push(get_str(outAbbrevPtr));
res.direction.push(get_str(outDirectionPtr));
res.conv_factor.push(
proj.getValue(outConvFactorPtr, 'double'));
res.unit.push(get_str(outUnitPtr));
}
} finally {
keep.destroy();
}
return res;
}
const ax4326 = get_axes("EPSG:4326");
assert.deepEqual(ax4326, {
name : [ 'Geodetic latitude', 'Geodetic longitude' ],
abbr : [ 'Lat', 'Lon' ],
direction : [ 'north', 'east' ],
conv_factor : [ 0.017453292519943295, 0.017453292519943295 ],
unit : [ 'degree', 'degree' ]
});
const ax25833 = get_axes("EPSG:25833");
assert.deepEqual(ax25833, {
name : [ 'Easting', 'Northing' ],
abbr : [ 'E', 'N' ],
direction : [ 'east', 'north' ],
conv_factor : [ 1, 1 ],
unit : [ 'metre', 'metre' ]
});
const ax3855 = get_axes("EPSG:3855");
assert.deepEqual(ax3855, {
name : [ 'Gravity-related height' ],
abbr : [ 'H' ],
direction : [ 'up' ],
conv_factor : [ 1 ],
unit : [ 'metre' ]
});
proj._proj_destroy(ctx);
}
};
if (typeof ProjModuleFactory === 'undefined') {
console.error(
"'ProjModuleFactory' is not defined. Have you loaded projModule.js.");
process.exit(1);
} else {
ProjModuleFactory()
.then(module => {
proj = module;
console.log("Starting tests");
let counter = 0;
for (let test of Object.keys(tests)) {
console.log(`+++++ Running test "${test}"`)
tests[test](proj);
counter++;
};
console.log(`Number of tests run: ${counter}`)
process.exit(0);
})
.catch(err => {
console.error(`Tests failed: ${err}`);
process.exit(1);
});
}
-62
View File
@@ -1,62 +0,0 @@
#!/bin/bash
set -e
dnf install -y cmake clang ccache ninja-build sqlite-devel libtiff-devel libcurl-devel diffutils wget
# For this build, install nlohmann-json so that the "use external"
# branch is tested; the other builds use the vendored copy.
dnf install -y nlohmann-json-devel
cd "$WORK_DIR"
if test -f "$WORK_DIR/ccache.tar.gz"; then
echo "Restoring ccache..."
(cd $HOME && tar xzf "$WORK_DIR/ccache.tar.gz")
fi
export CCACHE_CPP2=yes
ccache -M 500M
ccache -s
mkdir build
cd build
echo "Build with -DEMBED_RESOURCE_FILES=ON"
CC=clang CXX=clang++ cmake .. \
-DEMBED_RESOURCE_FILES=ON -DUSE_CCACHE=ON -DPROJ_DB_CACHE_DIR=$HOME/.ccache ..
make -j$(nproc)
ctest -j$(nproc)
# Try EMBED_RESOURCE_DIRECTORY option
wget https://raw.githubusercontent.com/OSGeo/PROJ-data/refs/heads/master/us_nga/us_nga_egm96_15.tif
wget https://cdn.proj.org/fi_nls_ykj_etrs35fin.gpkg
mkdir grids
mv us_nga_egm96_15.tif grids
mv fi_nls_ykj_etrs35fin.gpkg grids
echo "Build with -DEMBED_RESOURCE_FILES=ON -DEMBED_RESOURCE_DIRECTORY=$PWD/grids"
CC=clang CXX=clang++ cmake .. -DEMBED_RESOURCE_DIRECTORY=$PWD/grids
make -j$(nproc)
rm -rf data
echo 49 2 0 | bin/cs2cs "WGS84 + EGM96 height" EPSG:4979
echo 49 2 0 | bin/cs2cs "WGS84 + EGM96 height" EPSG:4979 | grep 44.643 >/dev/null || (echo "Expected 49dN 2dE 44.643 as a result" && /bin/false)
echo 0 0 0 | bin/cct +init=ITRF2000:ITRF96
echo 0 0 0 | bin/cct +init=ITRF2000:ITRF96 | grep 0.0067 >/dev/null || (echo "Expected 0.0067 0.0061 -0.0185 as a result" && /bin/false)
echo 3432087 6995748 0 | bin/cct +proj=tinshift +file=fi_nls_ykj_etrs35fin.gpkg
echo 3432087 6995748 0 | bin/cct +proj=tinshift +file=fi_nls_ykj_etrs35fin.gpkg | grep 431943.0905 >/dev/null || (echo "Expected 431943.0905 6992816.7826 0 as a result" && /bin/false)
echo "Build with -DEMBED_RESOURCE_FILES=ON -DEMBED_RESOURCE_DIRECTORY=$PWD/grids -DUSE_ONLY_EMBEDDED_RESOURCE_FILES=ON"
CC=clang CXX=clang++ cmake .. -DEMBED_RESOURCE_DIRECTORY=$PWD/grids -DUSE_ONLY_EMBEDDED_RESOURCE_FILES=ON
make -j$(nproc)
rm -rf data
echo 49 2 0 | bin/cs2cs "WGS84 + EGM96 height" EPSG:4979
echo 49 2 0 | bin/cs2cs "WGS84 + EGM96 height" EPSG:4979 | grep 44.643 >/dev/null || (echo "Expected 49dN 2dE 44.643 as a result" && /bin/false)
echo 0 0 0 | bin/cct +init=ITRF2000:ITRF96
echo 0 0 0 | bin/cct +init=ITRF2000:ITRF96 | grep 0.0067 >/dev/null || (echo "Expected 0.0067 0.0061 -0.0185 as a result" && /bin/false)
cd ..
ccache -s
echo "Saving ccache..."
rm -f "$WORK_DIR/ccache.tar.gz"
(cd $HOME && tar czf "$WORK_DIR/ccache.tar.gz" .cache)
-52
View File
@@ -1,52 +0,0 @@
#!/bin/bash
set -e
export TRAVIS_OS_NAME=linux
export BUILD_NAME=linux_gcc_32bit
export TRAVIS_BUILD_DIR="$WORK_DIR"
GCC_VERSION=13
ARCH=i386
dpkg --add-architecture i386
apt-get update -y
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends -o APT::Immediate-Configure=0 \
autoconf automake libtool make cmake ccache pkg-config sqlite3 tar zip curl ca-certificates jq \
python3-pytest python3-ruamel.yaml python3-jsonschema \
gcc-$GCC_VERSION-multilib g++-$GCC_VERSION-multilib g++-$GCC_VERSION \
libsqlite3-dev:$ARCH libgtest-dev:$ARCH \
libtiff-dev:$ARCH libwebp-dev:$ARCH libzstd-dev:$ARCH \
libcurl4-openssl-dev:$ARCH libnghttp2-dev:$ARCH libidn2-dev:$ARCH librtmp-dev:$ARCH libssh-dev:$ARCH \
libpsl-dev:$ARCH libssl-dev:$ARCH libkrb5-dev:$ARCH comerr-dev:$ARCH libldap2-dev:$ARCH libbrotli-dev:$ARCH
LIBDIR=/usr/lib/i386-linux-gnu
INCDIR=/usr/include/i386-linux-gnu
export CXXFLAGS="-m32 -D_GLIBCXX_ASSERTIONS"
export CFLAGS="-m32"
export TIFF_CFLAGS="-I$INCDIR"
export TIFF_LIBS="-L$LIBDIR -ltiff"
export SQLITE3_CFLAGS="-I$INCDIR"
export SQLITE3_LIBS="-L$LIBDIR -lsqlite3"
export PKG_CONFIG=i686-linux-gnu-pkg-config
cd "$WORK_DIR"
if test -f "$WORK_DIR/ccache.tar.gz"; then
echo "Restoring ccache..."
(cd $HOME && tar xzf "$WORK_DIR/ccache.tar.gz")
else
mkdir -p $HOME/.ccache
fi
ccache -M 500M
CC="gcc-$GCC_VERSION" CXX="g++-$GCC_VERSION" CMAKE_BUILD_TYPE=RelWithDebInfo ./ci/install.sh
echo "Saving ccache..."
rm -f "$WORK_DIR/ccache.tar.gz"
(cd $HOME && tar czf "$WORK_DIR/ccache.tar.gz" .ccache)
-6
View File
@@ -1,6 +0,0 @@
#!/bin/bash
set -e
# -fno-use-cxa-atexit is needed to build with -coverage
./ci/install.sh
-5
View File
@@ -1,5 +0,0 @@
#!/bin/bash
set -e
mamba install --yes --quiet --only-deps proj
-20
View File
@@ -1,20 +0,0 @@
name: proj
channels:
- conda-forge
dependencies:
- python=3.8
- conda
- mamba
- compilers
- compiler-rt
- ninja
- cmake
- pkg-config
- ccache
- autoconf
- automake
- m4
- jsonschema
- ruamel.yaml
- pytest
-7
View File
@@ -1,7 +0,0 @@
#!/bin/bash
set -e
ccache -M 200M
CC="clang" CXX="clang++" CMAKE_BUILD_TYPE=RelWithDebInfo ./ci/install.sh
+16 -18
View File
@@ -64,6 +64,9 @@ string (TOLOWER "${PROJECT_LEGACY_NAME}" PROJECT_LEGACY_LOWER)
#
# At some more distant date, the PROJ4::proj target will be retired.
#
# To support this change, the CACHE variables PROJ_CMAKE_SUBDIR (and
# CMAKECONFIGDIR) is now the "Parent of directory to install cmake
# config files into".
#
# All this messiness is confined to
#
@@ -82,20 +85,17 @@ else ()
set (MSVC_TOOLSET_VERSION 0)
set (MSVC_TOOLSET_MAJOR 0)
endif ()
# If this is a regular build (PROJECT_SOURCE_DIR == CMAKE_SOURCE_DIR), export legacy files by default
# Otherwise, this is embedded in another project, only export PROJ target
# cf https://github.com/OSGeo/gdal/issues/5646
string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}" DEFAULT_VAL)
option(INSTALL_LEGACY_CMAKE_FILES "Install PROJ4 legacy target CMake files" ${DEFAULT_VAL})
set(PROJECT_LIST ${PROJECT_NAME})
if (INSTALL_LEGACY_CMAKE_FILES)
set(PROJECT_LIST "${PROJECT_LIST}" "${PROJECT_LEGACY_NAME}")
if (CMAKE_CROSSCOMPILING)
# Ensure that all "true" (resp. "false") settings are represented by
# the same string.
set (CMAKE_CROSSCOMPILING_STR "ON")
else ()
set (CMAKE_CROSSCOMPILING_STR "OFF")
endif ()
foreach (PROJECT_VARIANT_NAME IN LISTS PROJECT_LIST)
foreach (PROJECT_VARIANT_NAME ${PROJECT_NAME} ${PROJECT_LEGACY_NAME})
string (TOLOWER "${PROJECT_VARIANT_NAME}" PROJECT_VARIANT_LOWER)
set (CMAKECONFIGSUBDIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_VARIANT_LOWER}")
set (CMAKECONFIGSUBDIR "${CMAKECONFIGDIR}/${PROJECT_VARIANT_LOWER}")
# proj-config.cmake for the install tree. It's installed in
# ${CMAKECONFIGSUBDIR} and @PROJECT_ROOT_DIR@ is the relative
# path to the root from there. (Note that the whole install tree can
@@ -120,11 +120,9 @@ foreach (PROJECT_VARIANT_NAME IN LISTS PROJECT_LIST)
NAMESPACE ${PROJECT_NAME}::
FILE ${PROJECT_NAME_LOWER}-targets.cmake
DESTINATION "${CMAKECONFIGSUBDIR}")
if (INSTALL_LEGACY_CMAKE_FILES)
install(EXPORT targets
NAMESPACE ${PROJECT_LEGACY_NAME}::
FILE ${PROJECT_LEGACY_LOWER}-targets.cmake
DESTINATION "${CMAKECONFIGSUBDIR}")
endif()
install(EXPORT targets
NAMESPACE ${PROJECT_LEGACY_NAME}::
FILE ${PROJECT_LEGACY_LOWER}-targets.cmake
DESTINATION "${CMAKECONFIGSUBDIR}")
endforeach ()
+7 -6
View File
@@ -7,6 +7,8 @@
# Add "include(Ccache)" to CMakeLists.txt and enable
# using the option -D USE_CCACHE=ON
cmake_minimum_required(VERSION 3.4)
option(USE_CCACHE
"Use ccache (or clcache for MSVC) to compile C/C++ objects" OFF)
@@ -40,12 +42,11 @@ exec \"${C_LAUNCHER}\" \"${CMAKE_C_COMPILER}\" \"$@\"
shift
exec \"${CXX_LAUNCHER}\" \"${CMAKE_CXX_COMPILER}\" \"$@\"
")
# Do equivalent of chmod a+rx
file(CHMOD "${CCACHE_LAUNCH_C}" "${CCACHE_LAUNCH_CXX}"
FILE_PERMISSIONS
OWNER_WRITE OWNER_READ OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
# Note: file(CHMOD) introduced in CMake 3.19
execute_process(
COMMAND chmod a+rx
"${CCACHE_LAUNCH_C}"
"${CCACHE_LAUNCH_CXX}"
)
# Set Xcode project attributes to route compilation and linking
# through the wrapper scripts
-99
View File
@@ -1,99 +0,0 @@
# Derived from https://gitlab.com/jhamberg/cmake-examples/-/blob/master/cmake/FileEmbed.cmake
# MIT licensed
# Copyright (c) 2022 Jonathan Hamberg
function(FileEmbedSetup)
if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/file_embed)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}file_embed)
endif ()
if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/file_embed/file_embed_empty.c)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/file_embed/file_embed_empty.c "")
endif ()
add_library(file_embed ${CMAKE_CURRENT_BINARY_DIR}/file_embed/file_embed_empty.c)
target_include_directories(file_embed PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/file_embed)
endfunction()
function(FileEmbedAdd file)
FileEmbedGenerate(${file} var)
target_sources(file_embed PUBLIC ${var})
add_custom_command(
OUTPUT ${var}
COMMAND ${CMAKE_COMMAND}
-DRUN_FILE_EMBED_GENERATE=1
"-DFILE_EMBED_GENERATE_PATH=${file}"
-P ${PROJECT_SOURCE_DIR}/cmake/FileEmbed.cmake
MAIN_DEPENDENCY ${file}
)
endfunction()
function(FileEmbedGenerate file generated_c)
get_filename_component(base_filename ${file} NAME)
set(output_filename "${base_filename}.c")
string(MAKE_C_IDENTIFIER ${base_filename} c_name)
file(READ ${file} content HEX)
string(LENGTH "${content}" size)
math(EXPR size_mult_16 "${size} - (${size} % 16)")
string(SUBSTRING "${content}" 0 ${size_mult_16} content_mult_16)
string(REGEX REPLACE
"([A-Fa-f0-9][A-Fa-f0-9])\
([A-Fa-f0-9][A-Fa-f0-9])\
([A-Fa-f0-9][A-Fa-f0-9])\
([A-Fa-f0-9][A-Fa-f0-9])\
([A-Fa-f0-9][A-Fa-f0-9])\
([A-Fa-f0-9][A-Fa-f0-9])\
([A-Fa-f0-9][A-Fa-f0-9])\
([A-Fa-f0-9][A-Fa-f0-9])"
"0x\\1,0x\\2,0x\\3,0x\\4,0x\\5,0x\\6,0x\\7,0x\\8,\n" SEPARATED_HEX "${content_mult_16}")
set(SEPARATED_HEX_REMAINDER "")
if (NOT ${size_mult_16} EQUAL ${size})
string(SUBSTRING "${content}" ${size_mult_16} 16 content_remainder)
string(REGEX REPLACE "([A-Fa-f0-9][A-Fa-f0-9])" "0x\\1," SEPARATED_HEX_REMAINDER "${content_remainder}")
endif()
set(output_c "${SEPARATED_HEX}${SEPARATED_HEX_REMAINDER}")
set(output_c "
#include \"${c_name}.h\"
const uint8_t ${c_name}_data[] = {
${output_c}
}\;
const unsigned ${c_name}_size = sizeof(${c_name}_data)\;
")
set(output_h "
#ifndef ${c_name}_H
#define ${c_name}_H
#include <stdint.h>
extern const uint8_t ${c_name}_data[]\;
extern const unsigned ${c_name}_size\;
#endif // ${c_name}_H
")
if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/file_embed)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}file_embed)
endif ()
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/file_embed/${c_name}.c
${output_c})
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/file_embed/${c_name}.h
${output_h})
set(${generated_c} ${CMAKE_CURRENT_BINARY_DIR}/file_embed/${c_name}.c PARENT_SCOPE)
endfunction()
if (RUN_FILE_EMBED_GENERATE)
FileEmbedGenerate(${FILE_EMBED_GENERATE_PATH} var)
endif ()
+80
View File
@@ -0,0 +1,80 @@
# Find Sqlite3
# ~~~~~~~~~~~~
# Copyright (c) 2007, Martin Dobias <wonder.sk at gmail.com>
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
#
# CMake module to search for Sqlite3 library
#
# If it's found it sets SQLITE3_FOUND to TRUE
# and following variables are set:
# SQLITE3_INCLUDE_DIR
# SQLITE3_LIBRARY
# SQLITE3_VERSION
# find_path and find_library normally search standard locations
# before the specified paths. To search non-standard paths first,
# FIND_* is invoked first with specified paths and NO_DEFAULT_PATH
# and then again with no specified paths to search the default
# locations. When an earlier FIND_* succeeds, subsequent FIND_*s
# searching for the same item do nothing.
# try to use framework on mac
# want clean framework path, not unix compatibility path
if(APPLE)
if(CMAKE_FIND_FRAMEWORK MATCHES "FIRST"
OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY"
OR NOT CMAKE_FIND_FRAMEWORK)
set(CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE)
set(CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE)
#find_path(SQLITE3_INCLUDE_DIR SQLite3/sqlite3.h)
find_library(SQLITE3_LIBRARY SQLite3)
if(SQLITE3_LIBRARY)
# find_path doesn't add "Headers" for a framework
set(SQLITE3_INCLUDE_DIR ${SQLITE3_LIBRARY}/Headers
CACHE PATH "Path to a file.")
endif()
set(CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE)
endif()
endif()
find_path(SQLITE3_INCLUDE_DIR sqlite3.h
"$ENV{LIB_DIR}/include"
"$ENV{LIB_DIR}/include/sqlite"
"$ENV{INCLUDE}"
)
find_library(SQLITE3_LIBRARY NAMES sqlite3_i sqlite3 PATHS
"$ENV{LIB_DIR}/lib"
"$ENV{LIB}/lib"
)
if(SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARY)
set(SQLITE3_FOUND TRUE)
endif()
# Extract version information from the header file
if(SQLITE3_INCLUDE_DIR)
file(STRINGS ${SQLITE3_INCLUDE_DIR}/sqlite3.h _ver_line
REGEX "^#define SQLITE_VERSION *\"[0-9]+\\.[0-9]+\\.[0-9]+\""
LIMIT_COUNT 1)
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+"
SQLITE3_VERSION "${_ver_line}")
unset(_ver_line)
endif()
if(SQLITE3_FOUND)
if(NOT SQLITE3_FIND_QUIETLY)
message(STATUS "Found Sqlite3: ${SQLITE3_LIBRARY}")
message(STATUS "Sqlite3 version: ${SQLITE3_VERSION}")
endif()
else()
if(SQLITE3_FIND_REQUIRED)
message(FATAL_ERROR "Could not find Sqlite3")
endif()
endif()
+13 -50
View File
@@ -10,6 +10,14 @@
include(CheckLibraryExists)
include(CheckFunctionExists)
# if C flags have -Werror, temporarily remove these while running some checks
string(FIND "${CMAKE_C_FLAGS}" "-Werror" FIND_WERROR)
if(FIND_WERROR GREATER_EQUAL 0)
string(REPLACE "-Werror" "" _tmp_CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
set(_prev_CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_C_FLAGS "${_tmp_CMAKE_C_FLAGS}")
endif()
# check needed include file
check_function_exists(localeconv HAVE_LOCALECONV)
check_function_exists(strerror HAVE_STRERROR)
@@ -18,6 +26,11 @@ if(NOT WIN32)
check_library_exists(m exp "" HAVE_LIBM)
endif()
# restore CMAKE_C_FLAGS as before
if(FIND_WERROR GREATER_EQUAL 0)
set(CMAKE_C_FLAGS "${_prev_CMAKE_C_FLAGS}")
endif()
set(PACKAGE "proj")
set(PACKAGE_BUGREPORT "https://github.com/OSGeo/PROJ/issues")
set(PACKAGE_NAME "PROJ")
@@ -36,54 +49,4 @@ if(EXISTS ${AUTOCONF_PROJ_CONFIG_H})
"before CMake's build.")
endif()
# Get the git hash to write it in the release message.
set(PROJ_GIT_HASH "")
if(DEFINED ENV{PROJ_GITHUB_SHA})
string(SUBSTRING "$ENV{PROJ_GITHUB_SHA}" 0 7 PROJ_GIT_HASH)
else()
find_package(Git QUIET)
if(Git_FOUND AND EXISTS "${PROJ_SOURCE_DIR}/.git")
# Get the short hash
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY "${PROJ_SOURCE_DIR}"
RESULT_VARIABLE GIT_REV_RESULT
OUTPUT_VARIABLE PROJ_GIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if(GIT_REV_RESULT EQUAL 0)
# Check if the working directory is dirty
execute_process(
COMMAND ${GIT_EXECUTABLE} status --porcelain --untracked-files=no
WORKING_DIRECTORY "${PROJ_SOURCE_DIR}"
RESULT_VARIABLE GIT_STATUS_RESULT
OUTPUT_VARIABLE GIT_STATUS_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
# If the command succeeds and outputs anything, the tree is dirty
if(GIT_STATUS_RESULT EQUAL 0 AND NOT GIT_STATUS_OUTPUT STREQUAL "")
string(APPEND PROJ_GIT_HASH "*")
endif()
else()
set(PROJ_GIT_HASH "")
endif()
endif()
endif()
if(PROJ_GIT_HASH)
add_compile_definitions(PROJ_GIT_HASH=\"${PROJ_GIT_HASH}\")
endif()
message(VERBOSE "PROJ_GIT_HASH=\"${PROJ_GIT_HASH}\"")
# Tell CMake to re-configure if the Git HEAD or index changes
if(Git_FOUND AND EXISTS "${PROJ_SOURCE_DIR}/.git")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
"${PROJ_SOURCE_DIR}/.git/HEAD" # for the hash
"${PROJ_SOURCE_DIR}/.git/index" # for the *
)
endif()
configure_file(cmake/proj_config.cmake.in src/proj_config.h)
+58
View File
@@ -18,3 +18,61 @@ if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX ${DEFAULT_PROJ_ROOT_DIR}
CACHE PATH "Proj install prefix" FORCE)
endif()
#TODO
# for data install testing the PROJ_LIB envVar
string(TOLOWER "${PROJECT_NAME}" PROJECT_NAME_LOWER)
if(UNIX OR MINGW)
include(GNUInstallDirs)
set(DEFAULT_BIN_SUBDIR ${CMAKE_INSTALL_BINDIR})
set(DEFAULT_LIB_SUBDIR ${CMAKE_INSTALL_LIBDIR})
set(DEFAULT_DATA_SUBDIR ${CMAKE_INSTALL_DATAROOTDIR}/proj)
set(DEFAULT_INCLUDE_SUBDIR ${CMAKE_INSTALL_INCLUDEDIR})
set(DEFAULT_DOC_SUBDIR share/doc/${PROJECT_NAME_LOWER})
set(DEFAULT_CMAKE_SUBDIR ${CMAKE_INSTALL_LIBDIR}/cmake)
else()
# Common locations for Unix and Mac OS X
set(DEFAULT_BIN_SUBDIR bin)
set(DEFAULT_LIB_SUBDIR lib)
set(DEFAULT_DATA_SUBDIR share/proj)
set(DEFAULT_DOC_SUBDIR doc/proj)
set(DEFAULT_INCLUDE_SUBDIR include)
set(DEFAULT_DOC_SUBDIR share/doc/proj)
set(DEFAULT_CMAKE_SUBDIR lib/cmake)
# Used for proj.pc
set(CMAKE_INSTALL_DATAROOTDIR share)
endif()
# Locations are changeable by user to customize layout of PROJ installation
# (default values are platform-specific)
set(PROJ_BIN_SUBDIR ${DEFAULT_BIN_SUBDIR} CACHE STRING
"Subdirectory where executables will be installed")
set(PROJ_LIB_SUBDIR ${DEFAULT_LIB_SUBDIR} CACHE STRING
"Subdirectory where libraries will be installed")
set(PROJ_INCLUDE_SUBDIR ${DEFAULT_INCLUDE_SUBDIR} CACHE STRING
"Subdirectory where header files will be installed")
set(PROJ_DATA_SUBDIR ${DEFAULT_DATA_SUBDIR} CACHE STRING
"Subdirectory where data will be installed")
set(PROJ_DOC_SUBDIR ${DEFAULT_DOC_SUBDIR} CACHE STRING
"Subdirectory where doc will be installed")
set(PROJ_CMAKE_SUBDIR ${DEFAULT_CMAKE_SUBDIR} CACHE STRING
"Parent of subdirectory where cmake proj-config file will be installed")
# Mark *DIR variables as advanced and dedicated to use by power-users only.
mark_as_advanced(
PROJ_ROOT_DIR
PROJ_BIN_SUBDIR
PROJ_LIB_SUBDIR
PROJ_INCLUDE_SUBDIR
PROJ_DATA_SUBDIR
PROJ_DOC_SUBDIR
PROJ_CMAKE_SUBDIR
)
set(DEFAULT_BINDIR "${PROJ_BIN_SUBDIR}")
set(DEFAULT_LIBDIR "${PROJ_LIB_SUBDIR}")
set(DEFAULT_DATADIR "${PROJ_DATA_SUBDIR}")
set(DEFAULT_DOCDIR "${PROJ_DOC_SUBDIR}")
set(DEFAULT_INCLUDEDIR "${PROJ_INCLUDE_SUBDIR}")
set(DEFAULT_CMAKEDIR "${PROJ_CMAKE_SUBDIR}")
+1 -3
View File
@@ -22,9 +22,7 @@ if(APPLE)
option(BUILD_FRAMEWORKS_AND_BUNDLE
"if set to ON, build a library framework and application bundle, \
otherwise install classical UNIX bin/lib" OFF)
if(BUILD_FRAMEWORKS_AND_BUNDLE)
set(CMAKE_INSTALL_BINDIR ${BUNDLEDIR})
endif()
set(DEFAULT_BINDIR ${BUNDLEDIR})
print_variable(BUNDLEDIR)
print_variable(PROJ_INSTALL_NAME_DIR)
print_variable(FRAMEWORKDIR)
+28
View File
@@ -0,0 +1,28 @@
#
# CMake script to modify README.md to create simpler README file
#
# This is equivalent to: fgrep -v "[!["
#
set(SourceFile "${PROJ_SOURCE_DIR}/README.md")
set(DestFile "${PROJ_SOURCE_DIR}/README")
# Below is based on https://stackoverflow.com/a/30227627
file(READ ${SourceFile} Contents)
# Set the variable "Esc" to the ASCII value 27 as a special escape value
string(ASCII 27 Esc)
# Turn the contents into a list of strings, each ending with Esc
string(REGEX REPLACE "\n" "${Esc};" ContentsAsList "${Contents}")
unset(ModifiedContents)
foreach(Line ${ContentsAsList})
if(NOT "${Line}" MATCHES "\\[!\\[")
# Swap the appended Esc character back out in favour of a line feed
string(REGEX REPLACE "${Esc}" "\n" Line ${Line})
set(ModifiedContents "${ModifiedContents}${Line}")
endif()
endforeach()
file(WRITE ${DestFile} ${ModifiedContents})
+16 -29
View File
@@ -1,41 +1,28 @@
#
# Add command-line interface tests
# add test with sh script
#
function(proj_test_set_properties TESTNAME)
set(_env "PROJ_SKIP_READ_USER_WRITABLE_DIRECTORY=YES"
"PROJ_DATA=${PROJ_BINARY_DIR}/data/for_tests")
if(TIFF_ENABLED)
set(_env ${_env} "TIFF_ENABLED=YES")
else()
set(_env ${_env} "TIFF_ENABLED=NO")
endif()
set_property(TEST ${TESTNAME}
PROPERTY ENVIRONMENT ${_env})
PROPERTY ENVIRONMENT
"PROJ_SKIP_READ_USER_WRITABLE_DIRECTORY=YES"
"PROJ_LIB=${PROJ_BINARY_DIR}/data/for_tests")
endfunction()
function(proj_add_test_script_sh SH_NAME EXE_PATH)
set(testname ${SH_NAME})
function(proj_add_test_script_sh SH_NAME BIN_USE)
if(UNIX)
get_filename_component(testname ${SH_NAME} NAME_WE)
add_test(NAME ${testname}
WORKING_DIRECTORY ${PROJ_BINARY_DIR}/test/cli
COMMAND bash ${PROJ_SOURCE_DIR}/test/cli/${SH_NAME} "${${EXE_PATH}}"
)
proj_test_set_properties(${testname})
add_test(NAME "${testname}"
WORKING_DIRECTORY ${PROJ_BINARY_DIR}/test/cli
COMMAND bash ${PROJ_SOURCE_DIR}/test/cli/${SH_NAME}
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${${BIN_USE}}
)
proj_test_set_properties(${testname})
endif()
endfunction()
function(proj_run_cli_test TESTFILE EXE_PATH)
set(testname ${TESTFILE})
add_test(NAME ${testname}
WORKING_DIRECTORY ${PROJ_BINARY_DIR}/test/cli
COMMAND ${Python_EXECUTABLE}
${PROJ_SOURCE_DIR}/test/cli/run_cli_test.py
--exe "${${EXE_PATH}}"
${PROJ_SOURCE_DIR}/test/cli/${TESTFILE}
)
proj_test_set_properties(${testname})
endfunction()
function(proj_add_gie_test TESTNAME TESTCASE)
@@ -68,6 +55,6 @@ function(proj_add_gie_network_dependent_test TESTNAME TESTCASE)
PROPERTY ENVIRONMENT
"PROJ_USER_WRITABLE_DIRECTORY=${PROJ_BINARY_DIR}/tmp_user_writable_dir"
"PROJ_NETWORK=ON"
"PROJ_DATA=${PROJ_BINARY_DIR}/data/for_tests")
"PROJ_LIB=${PROJ_BINARY_DIR}/data/for_tests")
endfunction()
+36 -16
View File
@@ -34,24 +34,45 @@ function(print_variable NAME)
message(STATUS "${NAME}${varpadding} = ${${NAME}}")
endfunction()
#
# Generates output name for given target depending on platform and version.
# For instance, on Windows, dynamic link libraries get ABI version suffix
# proj_X_Y.dll.
#
function(proj_target_output_name TARGET_NAME OUTPUT_NAME)
if(NOT DEFINED TARGET_NAME)
message(SEND_ERROR "Error, the variable TARGET_NAME is not defined!")
endif()
if(NOT DEFINED ${PROJECT_NAME}_VERSION)
message(SEND_ERROR
"Error, the variable ${${PROJECT_NAME}_VERSION} is not defined!")
endif()
# On Windows, ABI version is specified using binary file name suffix.
# On Unix, suffix is empty and SOVERSION is used instead.
if(WIN32)
string(LENGTH "${${PROJECT_NAME}_ABI_VERSION}" abilen)
if(abilen GREATER 0)
set(SUFFIX "_${${PROJECT_NAME}_ABI_VERSION}")
endif()
endif()
set(${OUTPUT_NAME} ${TARGET_NAME}${SUFFIX} PARENT_SCOPE)
endfunction()
#
# Configure a pkg-config file proj.pc
# See also ProjInstallPath.cmake
#
function(set_variable_from_rel_or_absolute_path var root rel_or_abs_path)
if(IS_ABSOLUTE "${rel_or_abs_path}")
set(${var} "${rel_or_abs_path}" PARENT_SCOPE)
else()
set(${var} "${root}/${rel_or_abs_path}" PARENT_SCOPE)
endif()
endfunction()
function(configure_proj_pc)
set(prefix ${CMAKE_INSTALL_PREFIX})
set_variable_from_rel_or_absolute_path("libdir" "$\{prefix\}" "${CMAKE_INSTALL_LIBDIR}")
set_variable_from_rel_or_absolute_path("includedir" "$\{prefix\}" "${CMAKE_INSTALL_INCLUDEDIR}")
set_variable_from_rel_or_absolute_path("datarootdir" "$\{prefix\}" "${CMAKE_INSTALL_DATAROOTDIR}")
set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "$\{prefix\}")
set(libdir "$\{exec_prefix\}/${PROJ_LIB_SUBDIR}")
set(includedir "$\{prefix\}/${PROJ_INCLUDE_SUBDIR}")
set(datarootdir "$\{prefix\}/${CMAKE_INSTALL_DATAROOTDIR}")
set(datadir "$\{datarootdir\}")
set(PACKAGE "proj")
set(VERSION ${PROJ_VERSION})
@@ -88,10 +109,9 @@ function(configure_proj_pc)
if(HAVE_LIBDL)
list(APPEND EXTRA_LIBS -ldl)
endif()
# Join lists with a space
list(JOIN EXTRA_LIBS " " EXTRA_LIBS)
list(JOIN EXTRA_REQUIRES " " EXTRA_REQUIRES)
# Join list with a space; list(JOIN) added CMake 3.12
string(REPLACE ";" " " EXTRA_LIBS "${EXTRA_LIBS}")
string(REPLACE ";" " " EXTRA_REQUIRES "${EXTRA_REQUIRES}")
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/proj.pc.in
+11
View File
@@ -37,5 +37,16 @@ macro(proj_version)
${${PROJECT_NAME}_VERSION_MINOR}.\
${${PROJECT_NAME}_VERSION_PATCH}")
# Set ABI version string used to name binary output
# On Windows, ABI version is specified using binary file name suffix.
if(WIN32)
set(${PROJECT_NAME}_ABI_VERSION
"${${PROJECT_NAME}_VERSION_MAJOR}_\
${${PROJECT_NAME}_VERSION_MINOR}")
endif()
print_variable(${PROJECT_NAME}_VERSION)
if(WIN32)
print_variable(${PROJECT_NAME}_ABI_VERSION)
endif()
endmacro()
+17
View File
@@ -14,6 +14,13 @@ if (MSVC)
# digit.
math (EXPR MSVC_TOOLSET_MAJOR "${MSVC_TOOLSET_VERSION}/10")
endif ()
if (CMAKE_CROSSCOMPILING)
# Ensure that all "true" (resp. "false") settings are represented by
# the same string.
set (CMAKE_CROSSCOMPILING_STR "ON")
else ()
set (CMAKE_CROSSCOMPILING_STR "OFF")
endif ()
if (NOT PACKAGE_FIND_NAME STREQUAL "@PROJECT_VARIANT_NAME@")
# Check package name (in particular, because of the way cmake finds
@@ -36,6 +43,16 @@ elseif (MSVC AND NOT (
# Reject if there's a mismatch in MSVC compiler versions
set (REASON "MSVC_TOOLSET_VERSION = @MSVC_TOOLSET_VERSION@")
set (PACKAGE_VERSION_UNSUITABLE TRUE)
elseif (NOT CMAKE_CROSSCOMPILING_STR STREQUAL "@CMAKE_CROSSCOMPILING_STR@")
# Reject if there's a mismatch in ${CMAKE_CROSSCOMPILING}
set (REASON "cross-compiling = @CMAKE_CROSSCOMPILING@")
set (PACKAGE_VERSION_UNSUITABLE TRUE)
elseif (CMAKE_CROSSCOMPILING AND
NOT (CMAKE_SYSTEM_NAME STREQUAL "@CMAKE_SYSTEM_NAME@" AND
CMAKE_SYSTEM_PROCESSOR STREQUAL "@CMAKE_SYSTEM_PROCESSOR@"))
# Reject if cross-compiling and there's a mismatch in the target system
set (REASON "target = @CMAKE_SYSTEM_NAME@-@CMAKE_SYSTEM_PROCESSOR@")
set (PACKAGE_VERSION_UNSUITABLE TRUE)
elseif (PACKAGE_FIND_VERSION)
if (PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)
set (PACKAGE_VERSION_EXACT TRUE)
+5 -40
View File
@@ -7,59 +7,24 @@
# @PROJECT_VARIANT_NAME@_LIBRARY_DIRS = /usr/local/lib
# @PROJECT_VARIANT_NAME@_BINARY_DIRS = /usr/local/bin
# @PROJECT_VARIANT_NAME@_VERSION = 4.9.1 (for example)
if(@PROJECT_VARIANT_NAME@ STREQUAL "PROJ4")
message(DEPRECATION "find_package(PROJ4) is deprecated and will be retired soon. Please use find_package(PROJ) instead.")
endif()
include(CMakeFindDependencyMacro)
# We cannot have a find_dependency() call between cmake_policy(PUSH)/cmake_policy(POP)
# because find_dependency() issues a return() on failure, which results in
# imbalanced push/pop
# Cf https://gitlab.kitware.com/cmake/cmake/-/issues/17612
cmake_policy(PUSH)
cmake_policy(SET CMP0012 NEW)
if("@ENABLE_TIFF@")
set(PROJ_CONFIG_FIND_TIFF_DEP ON)
endif()
if("@CURL_ENABLED@")
set(PROJ_CONFIG_FIND_CURL_DEP ON)
endif()
cmake_policy(POP)
find_dependency(SQLite3)
if(DEFINED PROJ_CONFIG_FIND_TIFF_DEP)
find_dependency(TIFF)
endif()
if(DEFINED PROJ_CONFIG_FIND_CURL_DEP)
if("@CURL_ENABLED@" STREQUAL "TRUE")
# Chainload CURL usage requirements
find_dependency(CURL)
endif()
function(set_variable_from_rel_or_absolute_path var root rel_or_abs_path)
if(IS_ABSOLUTE "${rel_or_abs_path}")
set(${var} "${rel_or_abs_path}" PARENT_SCOPE)
else()
set(${var} "${root}/${rel_or_abs_path}" PARENT_SCOPE)
endif()
endfunction()
# Tell the user project where to find our headers and libraries
get_filename_component (_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
get_filename_component (_ROOT "${_DIR}/@PROJECT_ROOT_DIR@" ABSOLUTE)
# Use _ROOT as prefix here for the possibility of relocation after installation.
set_variable_from_rel_or_absolute_path("@PROJECT_VARIANT_NAME@_INCLUDE_DIRS" "${_ROOT}" "@CMAKE_INSTALL_INCLUDEDIR@")
set_variable_from_rel_or_absolute_path("@PROJECT_VARIANT_NAME@_LIBRARY_DIRS" "${_ROOT}" "@CMAKE_INSTALL_LIBDIR@")
set_variable_from_rel_or_absolute_path("@PROJECT_VARIANT_NAME@_BINARY_DIRS" "${_ROOT}" "@CMAKE_INSTALL_BINDIR@")
set (@PROJECT_VARIANT_NAME@_INCLUDE_DIRS "${_ROOT}/@INCLUDEDIR@")
set (@PROJECT_VARIANT_NAME@_LIBRARY_DIRS "${_ROOT}/@LIBDIR@")
set (@PROJECT_VARIANT_NAME@_BINARY_DIRS "${_ROOT}/@BINDIR@")
set (@PROJECT_VARIANT_NAME@_LIBRARIES @PROJECT_VARIANT_NAME@::proj)
# Read in the exported definition of the library
include ("${_DIR}/@PROJECT_NAME_LOWER@-targets.cmake")
if (@INSTALL_LEGACY_CMAKE_FILES@)
include ("${_DIR}/@PROJECT_LEGACY_LOWER@-targets.cmake")
endif()
include ("${_DIR}/@PROJECT_LEGACY_LOWER@-targets.cmake")
unset (_ROOT)
unset (_DIR)
-65
View File
@@ -1,65 +0,0 @@
# install_manifest.txt is created in the top build tree, not the project one
if (NOT EXISTS "@CMAKE_BINARY_DIR@/install_manifest.txt")
message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_BINARY_DIR@/install_manifest.txt\"")
endif()
set(uninstall_file_list "@CMAKE_BINARY_DIR@/install_manifest.txt")
if(EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest_extra.txt")
list(APPEND uninstall_file_list "@CMAKE_CURRENT_BINARY_DIR@/install_manifest_extra.txt")
endif()
set(dir_list)
foreach (manifest_file IN ITEMS ${uninstall_file_list})
file(READ "${manifest_file}" files)
string(REGEX REPLACE "\n$" "" files "${files}")
string(REGEX REPLACE "\n" ";" files "${files}")
list(REVERSE files)
foreach (file ${files})
message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
if (IS_DIRECTORY "$ENV{DESTDIR}${file}")
list(APPEND dir_list "${file}")
elseif (EXISTS "$ENV{DESTDIR}${file}")
get_filename_component(dir "${file}" DIRECTORY)
list(APPEND dir_list "${dir}")
execute_process(
COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}"
OUTPUT_VARIABLE rm_out
RESULT_VARIABLE rm_retval
)
if(NOT ${rm_retval} EQUAL 0)
message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
endif (NOT ${rm_retval} EQUAL 0)
else ()
message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
endif ()
endforeach(file)
endforeach()
while(NOT "${dir_list}" STREQUAL "")
list(REMOVE_DUPLICATES dir_list)
set(new_dir_list)
foreach (file IN ITEMS ${dir_list})
if (IS_DIRECTORY "$ENV{DESTDIR}${file}" AND "${file}" MATCHES "@CMAKE_INSTALL_PREFIX@[/\\].+")
file(GLOB file_list "$ENV{DESTDIR}${file}/*")
list(LENGTH file_list file_list_len)
# Only remove empty directories
if(file_list_len EQUAL 0)
message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
execute_process(
COMMAND @CMAKE_COMMAND@ -E remove_directory "$ENV{DESTDIR}${file}"
OUTPUT_VARIABLE rm_out
RESULT_VARIABLE rm_retval
)
if(${rm_retval} EQUAL 0)
get_filename_component(upper_dir "${file}" DIRECTORY)
list(APPEND new_dir_list "${upper_dir}")
else()
message(STATUS "Problem when removing directory \"$ENV{DESTDIR}${file}\"")
endif()
endif()
endif()
endforeach()
set(dir_list "${new_dir_list}")
endwhile()
+2 -1
View File
@@ -3,7 +3,8 @@
# See: https://shop.swisstopo.admin.ch/en/products/geo_software/GIS_info
#
# You'll need to download the grids separately and put in a directory
# scanned by libproj.
# scanned by libproj. Directories may be added to the scan list through
# the PROJ_LIB environment variable
#
# Note that an independent effort was made to derive an usable grid
# from the CH1903->CH1903+ grid initially available from the Swisstopo
+21 -31
View File
@@ -2,19 +2,23 @@
# files containing dictionary of useful projection
#
set(PROJ_DB_CACHE_DIR "" CACHE PATH "Directory used to cache proj.db")
if(NOT IS_DIRECTORY ${PROJ_DB_CACHE_DIR})
if(NOT "${PROJ_DB_CACHE_DIR}" STREQUAL "")
message(WARNING
"PROJ_DB_CACHE_DIR (${PROJ_DB_CACHE_DIR}) not set to a directory")
set(PROJ_DB_CACHE_DIR "")
endif()
endif()
set(PROJ_INI
set(CONFIG_FILES
proj.ini
)
set(PROJ_DICTIONARY
world
other.extra
nad27
GL27
nad83
nad.lst
CH
ITRF2000
ITRF2008
ITRF2014
)
#
# gridshift file
#
@@ -25,21 +29,14 @@ set(GRIDSHIFT_FILES ${GSB_FILES} ${GTX_FILES})
file(GLOB SCHEMA_FILES *.json)
file(GLOB GEOTIFF_FILES *.tif)
set(ALL_SQL_IN "${CMAKE_CURRENT_BINARY_DIR}/all.sql.in")
set(PROJ_DB "${CMAKE_CURRENT_BINARY_DIR}/proj.db")
include(sql_filelist.cmake)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
"${CMAKE_CURRENT_LIST_DIR}/sql/proj.db.sql.expected.md5"
)
file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/sql/proj.db.sql.expected.md5" PROJ_DB_SQL_EXPECTED_MD5 LIMIT_COUNT 1)
add_custom_command(
OUTPUT ${PROJ_DB}
COMMAND ${CMAKE_COMMAND} -E remove -f ${PROJ_DB}
COMMAND ${CMAKE_COMMAND} "-DALL_SQL_IN=${ALL_SQL_IN}" "-DEXE_SQLITE3=${EXE_SQLITE3}" "-DPROJ_DB=${PROJ_DB}" "-DPROJ_VERSION=${PROJ_VERSION}" "-DPROJ_DB_CACHE_DIR=${PROJ_DB_CACHE_DIR}" "-DPROJ_DB_SQL_EXPECTED_MD5=${PROJ_DB_SQL_EXPECTED_MD5}" "-DDATA_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
COMMAND ${CMAKE_COMMAND} "-DALL_SQL_IN=${ALL_SQL_IN}" "-DEXE_SQLITE3=${EXE_SQLITE3}" "-DPROJ_DB=${PROJ_DB}" "-DPROJ_VERSION=${PROJ_VERSION}"
-P "${CMAKE_CURRENT_SOURCE_DIR}/generate_proj_db.cmake"
COMMAND ${CMAKE_COMMAND} -E copy ${PROJ_DB} ${CMAKE_CURRENT_BINARY_DIR}/for_tests
DEPENDS ${SQL_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/generate_proj_db.cmake"
@@ -51,7 +48,7 @@ add_custom_command(
add_custom_target(generate_proj_db ALL DEPENDS ${PROJ_DB})
if(NOT "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
foreach(FILE ${PROJ_INI} ${PROJ_DICTIONARY} ${GRIDSHIFT_FILES})
foreach(FILE ${CONFIG_FILES} ${PROJ_DICTIONARY} ${GRIDSHIFT_FILES})
configure_file(${FILE} ${FILE} COPYONLY)
endforeach()
endif()
@@ -69,7 +66,7 @@ set(DATA_FOR_TESTS
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/for_tests)
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/for_tests/tests)
foreach(FILE ${DATA_FOR_TESTS} ${PROJ_INI})
foreach(FILE ${DATA_FOR_TESTS} ${CONFIG_FILES})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${CMAKE_CURRENT_BINARY_DIR}/for_tests/${FILE} COPYONLY)
endforeach()
@@ -92,24 +89,17 @@ endforeach()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/egm96_15_downsampled.gtx ${CMAKE_CURRENT_BINARY_DIR}/for_tests/egm96_15.gtx COPYONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/ntv2_0_downsampled.gsb ${CMAKE_CURRENT_BINARY_DIR}/for_tests/ntv2_0.gsb COPYONLY)
# test_cs2cs_datumfile has a special case
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/for_tests/dir with space")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/conus "${CMAKE_CURRENT_BINARY_DIR}/for_tests/dir with space/myconus" COPYONLY)
#
#install
#
set(ALL_DATA_FILE
${CONFIG_FILES}
${PROJ_DICTIONARY}
${GRIDSHIFT_FILES}
${PROJ_DB}
${SCHEMA_FILES}
${GEOTIFF_FILES}
)
if (NOT USE_ONLY_EMBEDDED_RESOURCE_FILES)
list(APPEND ALL_DATA_FILE ${PROJ_INI} ${PROJ_DB} ${PROJ_DICTIONARY})
endif()
install(
FILES ${ALL_DATA_FILE}
DESTINATION ${CMAKE_INSTALL_DATADIR}/proj
DESTINATION ${DATADIR}
)
+2 -2
View File
@@ -42,7 +42,7 @@
<CARB> +proj=helmert +drx=0.000049 +dry=-0.001088 +drz=0.000664 +convention=position_vector
<EURA> +proj=helmert +drx=-0.000083 +dry=-0.000534 +drz=0.000750 +convention=position_vector
<EURA> +proj=helmert +drx=-0.000083 +dry=0.000534 +drz=0.000750 +convention=position_vector
<INDI> +proj=helmert +drx=0.001232 +dry=0.000303 +drz=0.001540 +convention=position_vector
@@ -75,7 +75,7 @@
<CARB_T> +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.000049 +dry=-0.001088 +drz=0.000664 +convention=position_vector
<EURA_T> +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000083 +dry=-0.000534 +drz=0.000750 +convention=position_vector
<EURA_T> +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000083 +dry=0.000534 +drz=0.000750 +convention=position_vector
<INDI_T> +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.001232 +dry=0.000303 +drz=0.001540 +convention=position_vector
+1 -1
View File
@@ -7,7 +7,7 @@
<ITRF2000> +proj=helmert +x=0.0007 +y=0.0012 +z=-0.0261 +s=0.00212 +dx=0.0001 +dy=0.0001 +dz=-0.0019 +ds=0.00011 +t_epoch=2010.0 +convention=position_vector
<ITRF97> +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +s=0.0038 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector
<ITRF97> +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +d=0.0038 +rz=0.00026 +dx0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector
<ITRF96> +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +s=0.0038 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector
-91
View File
@@ -1,91 +0,0 @@
# ITRF2020 params are in mm/year, PJ_helmert uses m/year
# Generated with generate_itrf2020.py from EPSG database
<ITRF2014> +proj=helmert +x=-0.0014 +y=-0.0009 +z=0.0014 +s=-0.00042 +dy=-0.0001 +dz=0.0002 +t_epoch=2015 +convention=position_vector
<ITRF2008> +proj=helmert +x=0.0002 +y=0.001 +z=0.0033 +s=-0.00029 +dy=-0.0001 +dz=0.0001 +ds=3e-05 +t_epoch=2015 +convention=position_vector
<ITRF2005> +proj=helmert +x=0.0027 +y=0.0001 +z=-0.0014 +s=0.00065 +dx=0.0003 +dy=-0.0001 +dz=0.0001 +ds=3e-05 +t_epoch=2015 +convention=position_vector
<ITRF2000> +proj=helmert +x=-0.0002 +y=0.0008 +z=-0.0342 +s=0.00225 +dx=0.0001 +dz=-0.0017 +ds=0.00011 +t_epoch=2015 +convention=position_vector
<ITRF97> +proj=helmert +x=0.0065 +y=-0.0039 +z=-0.0779 +rz=0.00036 +s=0.00398 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector
<ITRF96> +proj=helmert +x=0.0065 +y=-0.0039 +z=-0.0779 +rz=0.00036 +s=0.00398 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector
<ITRF94> +proj=helmert +x=0.0065 +y=-0.0039 +z=-0.0779 +rz=0.00036 +s=0.00398 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector
<ITRF93> +proj=helmert +x=-0.0658 +y=0.0019 +z=-0.0713 +rx=-0.00336 +ry=-0.00433 +rz=0.00075 +s=0.00447 +dx=-0.0028 +dy=-0.0002 +dz=-0.0023 +drx=-0.00011 +dry=-0.00019 +drz=7e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector
<ITRF92> +proj=helmert +x=0.0145 +y=-0.0019 +z=-0.0859 +rz=0.00036 +s=0.00327 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector
<ITRF91> +proj=helmert +x=0.0265 +y=0.0121 +z=-0.0919 +rz=0.00036 +s=0.00467 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector
<ITRF90> +proj=helmert +x=0.0245 +y=0.0081 +z=-0.1079 +rz=0.00036 +s=0.00497 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector
<ITRF89> +proj=helmert +x=0.0295 +y=0.0321 +z=-0.1459 +rz=0.00036 +s=0.00837 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector
<ITRF88> +proj=helmert +x=0.0245 +y=-0.0039 +z=-0.1699 +rx=0.0001 +rz=0.00036 +s=0.01147 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector
# ITRF2020 Plate Motion Model parameters
#
# As described in https://agupubs.onlinelibrary.wiley.com/doi/full/10.1029/2023GL106373
# (and also in https://itrf.ign.fr/docs/solutions/itrf2020/ITRF2020-PMM.dat, but with
# different units)
<AMUR> +proj=helmert +drx=-0.000131 +dry=-0.000551 +drz=0.000837 +convention=position_vector
<ANTA> +proj=helmert +drx=-0.000269 +dry=-0.000312 +drz=0.000678 +convention=position_vector
<ARAB> +proj=helmert +drx=0.001129 +dry=-0.000146 +drz=0.001438 +convention=position_vector
<AUST> +proj=helmert +drx=0.001487 +dry=0.001175 +drz=0.001223 +convention=position_vector
<CARB> +proj=helmert +drx=0.000207 +dry=-0.001422 +drz=0.000726 +convention=position_vector
<EURA> +proj=helmert +drx=-0.000085 +dry=-0.000519 +drz=0.000753 +convention=position_vector
<INDI> +proj=helmert +drx=0.001137 +dry=0.000013 +drz=0.001444 +convention=position_vector
<NAZC> +proj=helmert +drx=-0.000327 +dry=-0.001561 +drz=0.001605 +convention=position_vector
<NOAM> +proj=helmert +drx=0.000045 +dry=-0.000666 +drz=-0.000098 +convention=position_vector
<NUBI> +proj=helmert +drx=0.000090 +dry=-0.000585 +drz=0.000717 +convention=position_vector
<PCFC> +proj=helmert +drx=-0.000404 +dry=0.001021 +drz=-0.002154 +convention=position_vector
<SOAM> +proj=helmert +drx=-0.000261 +dry=-0.000282 +drz=-0.000157 +convention=position_vector
<SOMA> +proj=helmert +drx=-0.000081 +dry=-0.000719 +drz=0.000864 +convention=position_vector
# Plate names suffixed by _T (for Translation) that includes the translation
# rates +dx=0.00037 +dy=0.00035 +dz=0.00074 given by Table 2 of the ITRF2020 plate motion model
# paper
<AMUR_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000131 +dry=-0.000551 +drz=0.000837 +convention=position_vector
<ANTA_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000269 +dry=-0.000312 +drz=0.000678 +convention=position_vector
<ARAB_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.001129 +dry=-0.000146 +drz=0.001438 +convention=position_vector
<AUST_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.001487 +dry=0.001175 +drz=0.001223 +convention=position_vector
<CARB_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.000207 +dry=-0.001422 +drz=0.000726 +convention=position_vector
<EURA_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000085 +dry=-0.000519 +drz=0.000753 +convention=position_vector
<INDI_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.001137 +dry=0.000013 +drz=0.001444 +convention=position_vector
<NAZC_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000327 +dry=-0.001561 +drz=0.001605 +convention=position_vector
<NOAM_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.000045 +dry=-0.000666 +drz=-0.000098 +convention=position_vector
<NUBI_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.000090 +dry=-0.000585 +drz=0.000717 +convention=position_vector
<PCFC_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000404 +dry=0.001021 +drz=-0.002154 +convention=position_vector
<SOAM_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000261 +dry=-0.000282 +drz=-0.000157 +convention=position_vector
<SOMA_T> +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000081 +dry=-0.000719 +drz=0.000864 +convention=position_vector
+14 -72
View File
@@ -3,79 +3,21 @@ function(cat IN_FILE OUT_FILE)
file(APPEND ${OUT_FILE} "${CONTENTS}")
endfunction()
# Generates a all.sql.in file from all the individual .sql files, taking
# into account if extra validation checks must be done before inserting data
# records
function(generate_all_sql_in ALL_SQL_IN_FILENAME EXTRA_VALIDATION OUT_MD5)
set(PROJ_DB_EXTRA_VALIDATION ${EXTRA_VALIDATION})
file(WRITE "${ALL_SQL_IN_FILENAME}" "")
include(sql_filelist.cmake)
foreach(SQL_FILE ${SQL_FILES})
cat(${SQL_FILE} "${ALL_SQL_IN_FILENAME}")
endforeach()
file(WRITE "${ALL_SQL_IN}" "")
include(sql_filelist.cmake)
foreach(SQL_FILE ${SQL_FILES})
cat(${SQL_FILE} "${ALL_SQL_IN}")
endforeach()
# Compute the MD5 before any records in the metadata table, to avoid
# refreshing the MD5 if we bump PROJ_VERSION or PROJ_DATA.VERSION
file(READ ${ALL_SQL_IN_FILENAME} CONTENTS)
string(REGEX REPLACE "INSERT INTO \\\"metadata\\\"[^\n]*\n?" "" CONTENTS_WITHOUT_METADATA "${CONTENTS}")
string(MD5 OUT_MD5_LOCAL "${CONTENTS_WITHOUT_METADATA}")
set(${OUT_MD5} "${OUT_MD5_LOCAL}" PARENT_SCOPE)
# Do ${PROJ_VERSION} substitution
file(READ ${ALL_SQL_IN} CONTENTS)
string(REPLACE "\${PROJ_VERSION}" "${PROJ_VERSION}" CONTENTS_MOD "${CONTENTS}")
file(WRITE "${ALL_SQL_IN}" "${CONTENTS_MOD}")
# Do ${PROJ_VERSION} substitution
string(REPLACE "\${PROJ_VERSION}" "${PROJ_VERSION}" CONTENTS_MOD "${CONTENTS}")
file(WRITE "${ALL_SQL_IN_FILENAME}" "${CONTENTS_MOD}")
endfunction()
execute_process(COMMAND "${EXE_SQLITE3}" "${PROJ_DB}"
INPUT_FILE "${ALL_SQL_IN}"
RESULT_VARIABLE STATUS)
generate_all_sql_in("${ALL_SQL_IN}" OFF PROJ_DB_SQL_MD5)
file(WRITE "${DATA_BINARY_DIR}/PROJ_DB_SQL_MD5.h" "const char* PROJ_DB_SQL_MD5=\"${PROJ_DB_SQL_MD5}\";\n")
if (NOT "${PROJ_DB_SQL_MD5}" STREQUAL "${PROJ_DB_SQL_EXPECTED_MD5}")
message(WARNING "all.sql.in content has changed. Running extra validation checks when building proj.db...")
set(ALL_SQL_IN_EXTRA_VALIDATION "${ALL_SQL_IN}.extra_validation")
generate_all_sql_in("${ALL_SQL_IN_EXTRA_VALIDATION}" ON PROJ_DB_SQL_EXTRA_VALIDATION_MD5)
set(PROJ_DB_EXTRA_VALIDATION_FILENAME "${PROJ_DB}.extra_validation")
file(REMOVE "${PROJ_DB_EXTRA_VALIDATION_FILENAME}")
execute_process(COMMAND "${EXE_SQLITE3}" "${PROJ_DB_EXTRA_VALIDATION_FILENAME}"
INPUT_FILE "${ALL_SQL_IN_EXTRA_VALIDATION}"
RESULT_VARIABLE STATUS)
if(STATUS AND NOT STATUS EQUAL 0)
message(FATAL_ERROR "Build of proj.db from ${ALL_SQL_IN_EXTRA_VALIDATION} failed")
else()
message(FATAL_ERROR "Database is valid; please update data/sql/proj.db.sql.expected.md5 with ${PROJ_DB_SQL_MD5}")
endif()
endif()
set(generate_proj_db ON)
if(IS_DIRECTORY ${PROJ_DB_CACHE_DIR})
set(USE_PROJ_DB_CACHE_DIR TRUE)
set(PROJ_DB_SQL_MD5_FILE "${PROJ_DB_CACHE_DIR}/proj.db.sql.md5")
if(EXISTS "${PROJ_DB_SQL_MD5_FILE}")
file(STRINGS "${PROJ_DB_SQL_MD5_FILE}" CACHED_PROJ_DB_SQL_MD5 LIMIT_COUNT 1)
endif()
file(MD5 "${ALL_SQL_IN}" PROJ_DB_SQL_MD5)
set(CACHED_PROJ_DB "${PROJ_DB_CACHE_DIR}/proj.db")
if("${PROJ_DB_SQL_MD5}" STREQUAL "${CACHED_PROJ_DB_SQL_MD5}" AND EXISTS "${CACHED_PROJ_DB}")
message(STATUS "Reusing cached proj.db from ${PROJ_DB_CACHE_DIR}")
get_filename_component(PROJ_DB_DIR "${PROJ_DB}" DIRECTORY)
file(COPY "${CACHED_PROJ_DB}" DESTINATION "${PROJ_DB_DIR}")
file(TOUCH "${PROJ_DB}")
set(generate_proj_db OFF)
endif()
endif()
if (generate_proj_db)
execute_process(COMMAND "${EXE_SQLITE3}" "${PROJ_DB}"
INPUT_FILE "${ALL_SQL_IN}"
RESULT_VARIABLE STATUS)
if(STATUS AND NOT STATUS EQUAL 0)
message(FATAL_ERROR "Build of proj.db failed")
elseif(USE_PROJ_DB_CACHE_DIR)
message(STATUS "Saving cache: ${CACHED_PROJ_DB}")
file(COPY "${PROJ_DB}" DESTINATION "${PROJ_DB_CACHE_DIR}")
file(WRITE "${PROJ_DB_SQL_MD5_FILE}" "${PROJ_DB_SQL_MD5}\n")
endif()
if(STATUS AND NOT STATUS EQUAL 0)
message(FATAL_ERROR "SQLite3 failed")
endif()
+2 -32
View File
@@ -4,52 +4,22 @@
; Network capabilities disabled by default.
; Can be overridden with the PROJ_NETWORK=ON environment variable.
; Cf https://proj.org/en/latest/usage/network.html
; Valid values = on, off
network = off
; network = on
; Endpoint of the Content Delivery Network where remote resources might
; be accessed. Only used if network access is allowed (cf above "network"
; option)
; Can be overridden with the PROJ_NETWORK_ENDPOINT environment variable.
cdn_endpoint = https://cdn.proj.org
; Whether to enable a cache of remote resources that are accessed, on the
; local file system
; Valid values = on, off
cache_enabled = on
; Size of the cache in megabytes
cache_size_MB = 300
; Time-to-live delay in seconds before already accessed remote resources are
; accessed again to check if they have been updated.
cache_ttl_sec = 86400
; Can be set to on so that by default the lack of a known resource files needed
; for the best transformation PROJ would normally use causes an error, or off
; to accept missing resource files without errors or warnings.
; This default value itself is overridden by the PROJ_ONLY_BEST_DEFAULT environment
; variable if set, and then by the ONLY_BEST setting that can be
; passed to the proj_create_crs_to_crs() method, or with the --only-best
; option of the cs2cs program.
; (added in PROJ 9.2)
; Valid values = on, off
only_best_default = off
; Filename of the Certificate Authority (CA) bundle.
; Can be overridden with the PROJ_CURL_CA_BUNDLE / CURL_CA_BUNDLE environment variable.
; Can be overriden with the PROJ_CURL_CA_BUNDLE / CURL_CA_BUNDLE environment variable.
; (added in PROJ 9.0)
; ca_bundle_path = /path/to/cabundle.pem
; When this is set to on, the operating systems native CA store will be used for certificate verification
; If you set this option to on and also set ca_bundle_path then during verification those certificates are
; searched in addition to the native CA store.
; (added in PROJ 9.6)
; Valid values = on, off
;native_ca = on
; Transverse Mercator (and UTM) default algorithm: auto, evenden_snyder or poder_engsager
; * evenden_snyder is the fastest, but less accurate far from central meridian
; * poder_engsager is slower, but more accurate far from central meridian
+20 -192
View File
@@ -1,8 +1,8 @@
{
"$id": "https://proj.org/schemas/v0.7/projjson.schema.json",
"$id": "https://proj.org/schemas/v0.4/projjson.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for PROJJSON (v0.7)",
"$comment": "This document is copyright Even Rouault and PROJ contributors, 2019-2023, and subject to the MIT license. This file exists both in data/ and in schemas/vXXX/. Keep both in sync. And if changing the value of $id, change PROJJSON_DEFAULT_VERSION accordingly in io.cpp",
"description": "Schema for PROJJSON (v0.4)",
"$comment": "This file exists both in data/ and in schemas/vXXX/. Keep both in sync. And if changing the value of $id, change PROJJSON_CURRENT_VERSION accordingly in io.cpp",
"oneOf": [
{ "$ref": "#/definitions/crs" },
@@ -11,8 +11,7 @@
{ "$ref": "#/definitions/ellipsoid" },
{ "$ref": "#/definitions/prime_meridian" },
{ "$ref": "#/definitions/single_operation" },
{ "$ref": "#/definitions/concatenated_operation" },
{ "$ref": "#/definitions/coordinate_metadata" }
{ "$ref": "#/definitions/concatenated_operation" }
],
"definitions": {
@@ -23,10 +22,6 @@
"$schema" : { "type": "string" },
"type": { "type": "string", "enum": ["AbridgedTransformation"] },
"name": { "type": "string" },
"source_crs": {
"$ref": "#/definitions/crs",
"$comment": "Only present when the source_crs of the bound_crs does not match the source_crs of the AbridgedTransformation. No equivalent in WKT"
},
"method": { "$ref": "#/definitions/method" },
"parameters": {
"type": "array",
@@ -90,11 +85,7 @@
"future",
"past",
"unspecified" ] },
"meridian": { "$ref": "#/definitions/meridian" },
"unit": { "$ref": "#/definitions/unit" },
"minimum_value": { "type": "number" },
"maximum_value": { "type": "number" },
"range_meaning": { "type": "string", "enum": [ "exact", "wraparound"] },
"id": { "$ref": "#/definitions/id" },
"ids": { "$ref": "#/definitions/ids" }
},
@@ -131,8 +122,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -155,8 +144,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -177,13 +164,10 @@
"type": "array",
"items": { "$ref": "#/definitions/single_operation" }
},
"accuracy": { "type": "string" },
"$schema" : {},
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -213,18 +197,6 @@
"additionalProperties": false
},
"coordinate_metadata": {
"type": "object",
"properties": {
"$schema" : { "type": "string" },
"type": { "type": "string", "enum": ["CoordinateMetadata"] },
"crs": { "$ref": "#/definitions/crs" },
"coordinateEpoch": { "type": "number" }
},
"required" : [ "crs" ],
"additionalProperties": false
},
"coordinate_system": {
"type": "object",
"properties": {
@@ -238,7 +210,6 @@
"vertical",
"ordinal",
"parametric",
"affine",
"TemporalDateTime",
"TemporalCount",
"TemporalMeasure"] },
@@ -321,17 +292,6 @@
"additionalProperties": false
},
"deformation_model": {
"description": "Association to a PointMotionOperation",
"type": "object",
"properties": {
"name": { "type": "string" },
"id": { "$ref": "#/definitions/id" }
},
"required" : [ "name" ],
"additionalProperties": false
},
"derived_engineering_crs": {
"type": "object",
"allOf": [{ "$ref": "#/definitions/object_usage" }],
@@ -346,8 +306,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -371,8 +329,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -395,8 +351,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -419,8 +373,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -443,8 +395,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -467,8 +417,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -479,21 +427,19 @@
"dynamic_geodetic_reference_frame": {
"type": "object",
"allOf": [{ "$ref": "#/definitions/object_usage" }],
"allOf": [{ "$ref": "#/definitions/geodetic_reference_frame" }],
"properties": {
"type": { "type": "string", "enum": ["DynamicGeodeticReferenceFrame"] },
"name": {},
"anchor": {},
"anchor_epoch": {},
"ellipsoid": {},
"prime_meridian": {},
"frame_reference_epoch": { "type": "number" },
"deformation_model": { "type": "string" },
"$schema" : {},
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -504,19 +450,17 @@
"dynamic_vertical_reference_frame": {
"type": "object",
"allOf": [{ "$ref": "#/definitions/object_usage" }],
"allOf": [{ "$ref": "#/definitions/vertical_reference_frame" }],
"properties": {
"type": { "type": "string", "enum": ["DynamicVerticalReferenceFrame"] },
"name": {},
"anchor": {},
"anchor_epoch": {},
"frame_reference_epoch": { "type": "number" },
"deformation_model": { "type": "string" },
"$schema" : {},
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -584,8 +528,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -605,8 +547,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -628,16 +568,10 @@
},
"datum_ensemble": { "$ref": "#/definitions/datum_ensemble" },
"coordinate_system": { "$ref": "#/definitions/coordinate_system" },
"deformation_models": {
"type": "array",
"items": { "$ref": "#/definitions/deformation_model" }
},
"$schema" : {},
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -658,15 +592,12 @@
"type": { "type": "string", "enum": ["GeodeticReferenceFrame"] },
"name": { "type": "string" },
"anchor": { "type": "string" },
"anchor_epoch": { "type": "number" },
"ellipsoid": { "$ref": "#/definitions/ellipsoid" },
"prime_meridian": { "$ref": "#/definitions/prime_meridian" },
"$schema" : {},
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -675,17 +606,6 @@
"additionalProperties": false
},
"geoid_model": {
"type": "object",
"properties": {
"name": { "type": "string" },
"interpolation_crs": { "$ref": "#/definitions/crs" },
"id": { "$ref": "#/definitions/id" }
},
"required" : [ "name" ],
"additionalProperties": false
},
"id": {
"type": "object",
"properties": {
@@ -748,22 +668,6 @@
]
},
"meridian": {
"type": "object",
"properties": {
"$schema" : { "type": "string" },
"type": { "type": "string", "enum": ["Meridian"] },
"longitude": { "$ref": "#/definitions/value_in_degree_or_value_and_unit" },
"id": { "$ref": "#/definitions/id" },
"ids": { "$ref": "#/definitions/ids" }
},
"required" : [ "longitude" ],
"allOf": [
{ "$ref": "#/definitions/id_ids_mutually_exclusive" }
],
"additionalProperties": false
},
"object_usage": {
"anyOf": [
{
@@ -773,8 +677,6 @@
"scope": { "type": "string" },
"area": { "type": "string" },
"bbox": { "$ref": "#/definitions/bbox" },
"vertical_extent": { "$ref": "#/definitions/vertical_extent" },
"temporal_extent": { "$ref": "#/definitions/temporal_extent" },
"remarks": { "type": "string" },
"id": { "$ref": "#/definitions/id" },
"ids": { "$ref": "#/definitions/ids" }
@@ -834,8 +736,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -855,8 +755,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -865,34 +763,6 @@
"additionalProperties": false
},
"point_motion_operation": {
"$comment": "Not implemented in PROJ (at least as of PROJ 9.1)",
"type": "object",
"allOf": [{ "$ref": "#/definitions/object_usage" }],
"properties": {
"type": { "type": "string", "enum": ["PointMotionOperation"] },
"name": { "type": "string" },
"source_crs": { "$ref": "#/definitions/crs" },
"method": { "$ref": "#/definitions/method" },
"parameters": {
"type": "array",
"items": { "$ref": "#/definitions/parameter_value" }
},
"accuracy": { "type": "string" },
"$schema" : {},
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
},
"required" : [ "name", "source_crs", "method", "parameters" ],
"additionalProperties": false
},
"prime_meridian": {
"type": "object",
"properties": {
@@ -913,8 +783,7 @@
"single_operation": {
"oneOf": [
{ "$ref": "#/definitions/conversion" },
{ "$ref": "#/definitions/transformation" },
{ "$ref": "#/definitions/point_motion_operation" }
{ "$ref": "#/definitions/transformation" }
]
},
@@ -932,8 +801,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -954,8 +821,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -976,8 +841,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -986,16 +849,6 @@
"additionalProperties": false
},
"temporal_extent": {
"type": "object",
"properties": {
"start": { "type": "string" },
"end": { "type": "string" }
},
"required" : [ "start", "end" ],
"additionalProperties": false
},
"transformation": {
"type": "object",
"allOf": [{ "$ref": "#/definitions/object_usage" }],
@@ -1015,8 +868,6 @@
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -1058,9 +909,7 @@
"properties": {
"scope": { "type": "string" },
"area": { "type": "string" },
"bbox": { "$ref": "#/definitions/bbox" },
"vertical_extent": { "$ref": "#/definitions/vertical_extent" },
"temporal_extent": { "$ref": "#/definitions/temporal_extent" }
"bbox": { "$ref": "#/definitions/bbox" }
},
"additionalProperties": false
}
@@ -1103,21 +952,20 @@
},
"datum_ensemble": { "$ref": "#/definitions/datum_ensemble" },
"coordinate_system": { "$ref": "#/definitions/coordinate_system" },
"geoid_model": { "$ref": "#/definitions/geoid_model" },
"geoid_models": {
"type": "array",
"items": { "$ref": "#/definitions/geoid_model" }
},
"deformation_models": {
"type": "array",
"items": { "$ref": "#/definitions/deformation_model" }
"geoid_model": {
"type": "object",
"properties": {
"name": { "type": "string" },
"interpolation_crs": { "$ref": "#/definitions/crs" },
"id": { "$ref": "#/definitions/id" }
},
"required" : [ "name" ],
"additionalProperties": false
},
"$schema" : {},
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
@@ -1126,28 +974,11 @@
"description": "One and only one of datum and datum_ensemble must be provided",
"allOf": [
{ "$ref": "#/definitions/object_usage" },
{ "$ref": "#/definitions/one_and_only_one_of_datum_or_datum_ensemble" },
{
"not": {
"type": "object",
"required": [ "geoid_model", "geoid_models" ]
}
}
{ "$ref": "#/definitions/one_and_only_one_of_datum_or_datum_ensemble" }
],
"additionalProperties": false
},
"vertical_extent": {
"type": "object",
"properties": {
"minimum": { "type": "number" },
"maximum": { "type": "number" },
"unit": { "$ref": "#/definitions/unit" }
},
"required" : [ "minimum", "maximum" ],
"additionalProperties": false
},
"vertical_reference_frame": {
"type": "object",
"allOf": [{ "$ref": "#/definitions/object_usage" }],
@@ -1155,13 +986,10 @@
"type": { "type": "string", "enum": ["VerticalReferenceFrame"] },
"name": { "type": "string" },
"anchor": { "type": "string" },
"anchor_epoch": { "type": "number" },
"$schema" : {},
"scope": {},
"area": {},
"bbox": {},
"vertical_extent": {},
"temporal_extent": {},
"usages": {},
"remarks": {},
"id": {}, "ids": {}
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

-60
View File
@@ -1,60 +0,0 @@
# Directory data/sql
- [proj.db.sql.expected.md5](proj.db.sql.expected.md5): The MD5 hash of all the sql files,
used to determine if the database has been updated and if extra validation is necessary.
## Simplified UML diagram of database classes
- [diagram.xmi](diagram.xmi): to be opened with Umbrello
- CRS related tables: ![CRS related tables](CRS.png)
- Transformation related tables: ![Transformation related tables](Transformations.png)
## Hand generated files
- [proj_db_table_defs.sql](proj_db_table_defs.sql): Database structure: CREATE TABLE / CREATE VIEW / CREATE TRIGGER.
- [metadata.sql](metadata.sql): key/value content of the metadata table.
- [begin.sql](begin.sql): Technical prologue for all concatenated files.
- [commit.sql](commit.sql): Epilogue for all concatenated files. Include consistency checks.
- [customizations_early.sql](customizations_early.sql): Customizations to be applied before EPSG generated tables.
- [customizations.sql](customizations.sql): Customizations to be applied after all geodetic registries.
- [grid_alternatives.sql](grid_alternatives.sql): Link official EPSG grid names to PROJ ones.
- [grid_transformation_custom.sql](grid_transformation_custom.sql): PROJ specific entries in grid_transformation table.
- [other_transformation_custom.sql](other_transformation_custom.sql): PROJ specific entries in other_transformation table.
## Files generated from EPSG dataset by [build_db.py](https://github.com/OSGeo/PROJ/blob/master/scripts/build_db.py)
- [alias_name.sql](alias_name.sql)
- [axis.sql](axis.sql)
- [compound_crs.sql](compound_crs.sql)
- [concatenated_operation.sql](concatenated_operation.sql)
- [concatenated_operation_step.sql](concatenated_operation_step.sql)
- [conversion.sql](conversion.sql)
- [conversion_triggers.sql](conversion_triggers.sql)
- [coordinate_system.sql](coordinate_system.sql)
- [deprecation.sql](deprecation.sql)
- [ellipsoid.sql](ellipsoid.sql)
- [extent.sql](extent.sql)
- [geodetic_crs.sql](geodetic_crs.sql)
- [geodetic_datum_ensemble_member.sql](geodetic_datum_ensemble_member.sql)
- [geodetic_datum.sql](geodetic_datum.sql)
- [grid_alternatives_generated_noaa.sql](grid_alternatives_generated_noaa.sql)
- [grid_transformation.sql](grid_transformation.sql)
- [helmert_transformation.sql](helmert_transformation.sql)
- [other_transformation.sql](other_transformation.sql)
- [prime_meridian.sql](prime_meridian.sql)
- [projected_crs.sql](projected_crs.sql)
- [scope.sql](scope.sql)
- [supersession.sql](supersession.sql)
- [unit_of_measure.sql](unit_of_measure.sql)
- [vertical_crs.sql](vertical_crs.sql)
- [vertical_datum_ensemble_member.sql](vertical_datum_ensemble_member.sql)
- [vertical_datum.sql](vertical_datum.sql)
## Other registries
- [esri.sql](esri.sql): ESRI registry. Generated by [build_db_from_esri.py](https://github.com/OSGeo/PROJ/blob/master/scripts/build_db_from_esri.py)
- [ignf.sql](ignf.sql): IGN France registry. Generated by [build_db_create_ignf_from_xml.py](https://github.com/OSGeo/PROJ/blob/master/scripts/build_db_create_ignf_from_xml.py)
- [iau.sql](iau.sql): IAU 2015 registry. Generated by [build_db_from_iau.py](https://github.com/OSGeo/PROJ/blob/master/scripts/build_db_from_iau.py)
- [versioned_auth_name_mapping.sql](versioned_auth_name_mapping.sql): used for the IAU:2015 / IAU alias
- [nkg.sql](nkg.sql): Nordic Geodetic Commission registry. Hand-written
- [nkg_post_customizations.sql](nkg_post_customizations.sql): Registration of NKG in authority_to_authority_preference table
Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

+432 -1411
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-3
View File
@@ -1,3 +0,0 @@
ANALYZE;
VACUUM;
+4 -8
View File
@@ -52,10 +52,6 @@ INSERT INTO "axis" VALUES('EPSG','1042','Local northing','n','north','EPSG','104
INSERT INTO "axis" VALUES('EPSG','1043','Local easting','e','east','EPSG','1047',2,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','1049','Local northing','n','north','EPSG','1048',1,'EPSG','9002');
INSERT INTO "axis" VALUES('EPSG','1050','Local easting','e','east','EPSG','1048',2,'EPSG','9002');
INSERT INTO "axis" VALUES('EPSG','32933','Northing','N','north','EPSG','1053',1,'EPSG','9003');
INSERT INTO "axis" VALUES('EPSG','32934','Easting','E','east','EPSG','1053',2,'EPSG','9003');
INSERT INTO "axis" VALUES('EPSG','32935','Easting','x','east','EPSG','1054',1,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','32936','Northing','y','north','EPSG','1054',2,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','1','Easting','E','east','EPSG','4400',1,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','2','Northing','N','north','EPSG','4400',2,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','3','Easting','E','east','EPSG','4401',1,'EPSG','9062');
@@ -175,6 +171,10 @@ INSERT INTO "axis" VALUES('EPSG','180','Northing','X','north','EPSG','4533',1,'E
INSERT INTO "axis" VALUES('EPSG','179','Easting','Y','east','EPSG','4533',2,'EPSG','9098');
INSERT INTO "axis" VALUES('EPSG','183','Northing','none','north','EPSG','4534',1,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','184','Easting','none','east','EPSG','4534',2,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','63','Geodetic latitude','Lat','north','EPSG','6405',1,'EPSG','9102');
INSERT INTO "axis" VALUES('EPSG','64','Geodetic longitude','Long','east','EPSG','6405',2,'EPSG','9102');
INSERT INTO "axis" VALUES('EPSG','65','Geodetic latitude','Lat','north','EPSG','6406',1,'EPSG','9116');
INSERT INTO "axis" VALUES('EPSG','66','Geodetic longitude','Long','east','EPSG','6406',2,'EPSG','9116');
INSERT INTO "axis" VALUES('EPSG','115','Geocentric X','X','geocentricX','EPSG','6500',1,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','116','Geocentric Y','Y','geocentricY','EPSG','6500',2,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','117','Geocentric Z','Z','geocentricZ','EPSG','6500',3,'EPSG','9001');
@@ -219,10 +219,6 @@ INSERT INTO "axis" VALUES('EPSG','59','Geodetic longitude','Lon','east','EPSG','
INSERT INTO "axis" VALUES('EPSG','32879','Spherical latitude','lat','north','EPSG','6404',1,'EPSG','9122');
INSERT INTO "axis" VALUES('EPSG','32880','Spherical longitude','lon','east','EPSG','6404',2,'EPSG','9122');
INSERT INTO "axis" VALUES('EPSG','32881','Geocentric radius','R','up','EPSG','6404',3,'EPSG','9001');
INSERT INTO "axis" VALUES('EPSG','63','Geodetic latitude','Lat','north','EPSG','6405',1,'EPSG','9102');
INSERT INTO "axis" VALUES('EPSG','64','Geodetic longitude','Long','east','EPSG','6405',2,'EPSG','9102');
INSERT INTO "axis" VALUES('EPSG','65','Geodetic latitude','Lat','north','EPSG','6406',1,'EPSG','9116');
INSERT INTO "axis" VALUES('EPSG','66','Geodetic longitude','Long','east','EPSG','6406',2,'EPSG','9116');
INSERT INTO "axis" VALUES('EPSG','67','Geodetic latitude','Lat','north','EPSG','6407',1,'EPSG','9117');
INSERT INTO "axis" VALUES('EPSG','68','Geodetic longitude','Long','east','EPSG','6407',2,'EPSG','9117');
INSERT INTO "axis" VALUES('EPSG','69','Geodetic latitude','Lat','north','EPSG','6408',1,'EPSG','9115');
+293 -47
View File
@@ -1,50 +1,3 @@
-- Remove duplicated entries between source=EPSG and source=EPSG_OLD, as some
-- aliases get sometimes removed in a version and are re-added in a later one.
DELETE FROM alias_name WHERE (table_name, auth_name, code, alt_name) IN
(SELECT table_name, auth_name, code, alt_name FROM
(SELECT count(*) AS count, table_name, auth_name, code, alt_name FROM alias_name
WHERE source in ('EPSG', 'EPSG_OLD')
GROUP BY table_name, auth_name, code, alt_name) x WHERE count > 1) AND source = 'EPSG_OLD';
-- Remove useless entries, i.e. where the official name matches the alias...
DELETE FROM alias_name WHERE (table_name, auth_name, code, alt_name, source) IN
(SELECT a.table_name, a.auth_name, a.code, a.alt_name, a.source
FROM geodetic_datum d JOIN alias_name a WHERE
a.table_name = 'geodetic_datum' AND a.auth_name = d.auth_name AND
a.code = d.code AND d.name = a.alt_name AND a.source != 'ESRI');
DELETE FROM alias_name WHERE (table_name, auth_name, code, alt_name, source) IN
(SELECT a.table_name, a.auth_name, a.code, a.alt_name, a.source
FROM vertical_datum d JOIN alias_name a WHERE
a.table_name = 'vertical_datum' AND a.auth_name = d.auth_name AND
a.code = d.code AND d.name = a.alt_name);
DELETE FROM alias_name WHERE (table_name, auth_name, code, alt_name, source) IN
(SELECT a.table_name, a.auth_name, a.code, a.alt_name, a.source
FROM geodetic_crs c JOIN alias_name a WHERE
a.table_name = 'geodetic_crs' AND a.auth_name = c.auth_name AND
a.code = c.code AND c.name = a.alt_name AND a.source != 'ESRI');
DELETE FROM alias_name WHERE (table_name, auth_name, code, alt_name, source) IN
(SELECT a.table_name, a.auth_name, a.code, a.alt_name, a.source
FROM vertical_crs c JOIN alias_name a WHERE
a.table_name = 'vertical_crs' AND a.auth_name = c.auth_name AND
a.code = c.code AND c.name = a.alt_name);
DELETE FROM alias_name WHERE (table_name, auth_name, code, alt_name, source) IN
(SELECT a.table_name, a.auth_name, a.code, a.alt_name, a.source
FROM projected_crs c JOIN alias_name a WHERE
a.table_name = 'projected_crs' AND a.auth_name = c.auth_name AND
a.code = c.code AND c.name = a.alt_name);
DELETE FROM alias_name WHERE (table_name, auth_name, code, alt_name, source) IN
(SELECT a.table_name, a.auth_name, a.code, a.alt_name, a.source
FROM compound_crs c JOIN alias_name a WHERE
a.table_name = 'compound_crs' AND a.auth_name = c.auth_name AND
a.code = c.code AND c.name = a.alt_name);
COMMIT;
CREATE INDEX geodetic_crs_datum_idx ON geodetic_crs(datum_auth_name, datum_code);
@@ -58,3 +11,296 @@ CREATE INDEX concatenated_operation_idx ON concatenated_operation(source_crs_aut
-- We don't need to select by auth_name, code so nullify them to save space
UPDATE usage SET auth_name = NULL, code = NULL;
-- Final consistency checks
CREATE TABLE dummy(foo);
CREATE TRIGGER final_checks
BEFORE INSERT ON dummy
FOR EACH ROW BEGIN
-- check that view definitions have no error
SELECT RAISE(ABORT, 'corrupt definition of coordinate_operation_view')
WHERE (SELECT 1 FROM coordinate_operation_view LIMIT 1) = 0;
SELECT RAISE(ABORT, 'corrupt definition of crs_view')
WHERE (SELECT 1 FROM crs_view LIMIT 1) = 0;
SELECT RAISE(ABORT, 'corrupt definition of object_view')
WHERE (SELECT 1 FROM object_view LIMIT 1) = 0;
SELECT RAISE(ABORT, 'corrupt definition of authority_list')
WHERE (SELECT 1 FROM authority_list LIMIT 1) = 0;
-- check that a usage is registered for most objects where this is needed
SELECT RAISE(ABORT, 'One or several objects lack a corresponding record in the usage table')
WHERE EXISTS (
SELECT * FROM object_view o WHERE NOT EXISTS (
SELECT 1 FROM usage u WHERE
o.table_name = u.object_table_name AND
o.auth_name = u.object_auth_name AND
o.code = u.object_code)
AND o.table_name NOT IN ('unit_of_measure', 'axis',
'celestial_body', 'ellipsoid', 'prime_meridian', 'extent')
-- the IGNF registry lacks extent for the following objects
AND NOT (o.auth_name = 'IGNF' AND o.table_name IN ('geodetic_datum', 'vertical_datum', 'conversion'))
);
SELECT RAISE(ABORT, 'Geodetic datum ensemble defined, but no ensemble member')
WHERE EXISTS (
SELECT * FROM geodetic_datum d WHERE ensemble_accuracy IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM geodetic_datum_ensemble_member WHERE
d.auth_name = ensemble_auth_name AND d.code = ensemble_code)
);
SELECT RAISE(ABORT, 'Vertical datum ensemble defined, but no ensemble member')
WHERE EXISTS (
SELECT * FROM vertical_datum d WHERE ensemble_accuracy IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM vertical_datum_ensemble_member WHERE
d.auth_name = ensemble_auth_name AND d.code = ensemble_code)
);
SELECT RAISE(ABORT, 'PROJ defines an alias that exists in EPSG')
WHERE EXISTS (
SELECT * FROM (
SELECT count(*) AS count, table_name, auth_name, code, alt_name FROM alias_name
WHERE source in ('EPSG', 'PROJ')
AND NOT (source = 'PROJ' AND alt_name IN ('GGRS87', 'NAD27', 'NAD83'))
GROUP BY table_name, auth_name, code, alt_name) x WHERE count > 1
);
-- test to check that our custom grid transformation overrides are really needed
SELECT RAISE(ABORT, 'PROJ grid_transformation defined whereas EPSG has one')
WHERE EXISTS (SELECT 1 FROM grid_transformation g1
JOIN grid_transformation g2
ON g1.source_crs_auth_name = g2.source_crs_auth_name
AND g1.source_crs_code = g2.source_crs_code
AND g1.target_crs_auth_name = g2.target_crs_auth_name
AND g1.target_crs_code = g2.target_crs_code
WHERE g1.auth_name = 'PROJ' AND g1.code NOT LIKE '%_RESTRICTED_TO_VERTCRS%' AND g2.auth_name = 'EPSG')
OR EXISTS (SELECT 1 FROM grid_transformation g1
JOIN grid_transformation g2
ON g1.source_crs_auth_name = g2.target_crs_auth_name
AND g1.source_crs_code = g2.target_crs_code
AND g1.target_crs_auth_name = g1.source_crs_auth_name
AND g1.target_crs_code = g1.source_crs_code
WHERE g1.auth_name = 'PROJ' AND g1.code NOT LIKE '%_RESTRICTED_TO_VERTCRS%' AND g2.auth_name = 'EPSG');
SELECT RAISE(ABORT, 'Arg! there is now a EPSG:102100 object. Hack in createFromUserInput() will no longer work')
WHERE EXISTS(SELECT 1 FROM crs_view WHERE auth_name = 'EPSG' AND code = '102100');
-- check coordinate_operation_view "foreign keys"
SELECT RAISE(ABORT, 'One coordinate_operation has a broken source_crs link')
WHERE EXISTS (SELECT * FROM coordinate_operation_view cov WHERE
cov.source_crs_auth_name || cov.source_crs_code NOT IN
(SELECT auth_name || code FROM crs_view));
SELECT RAISE(ABORT, 'One coordinate_operation has a broken target_crs link')
WHERE EXISTS (SELECT * FROM coordinate_operation_view cov WHERE
cov.target_crs_auth_name || cov.target_crs_code NOT IN
(SELECT auth_name || code FROM crs_view));
-- check that grids with NTv2 method are properly registered
SELECT RAISE(ABORT, 'One grid_transformation with NTv2 has not its source_crs in geodetic_crs table with type = ''geographic 2D''')
WHERE EXISTS (SELECT * FROM grid_transformation g WHERE
g.method_name = 'NTv2' AND
g.source_crs_auth_name || g.source_crs_code NOT IN
(SELECT auth_name || code FROM geodetic_crs
WHERE type = 'geographic 2D'));
SELECT RAISE(ABORT, 'One grid_transformation with NTv2 has not its target_crs in geodetic_crs table with type = ''geographic 2D''')
WHERE EXISTS (SELECT * FROM grid_transformation g WHERE
g.method_name = 'NTv2' AND
g.target_crs_auth_name || g.target_crs_code NOT IN
(SELECT auth_name || code FROM geodetic_crs
WHERE type = 'geographic 2D'));
-- check that grids with Geographic3D to GravityRelatedHeight method are properly registered
SELECT RAISE(ABORT, 'One grid_transformation with Geographic3D to GravityRelatedHeight has not its target_crs in vertical_crs table')
WHERE EXISTS (SELECT * FROM grid_transformation g WHERE
g.deprecated = 0 AND
g.method_name LIKE 'Geographic3D to GravityRelatedHeight%' AND
g.target_crs_auth_name || g.target_crs_code NOT IN
(SELECT auth_name || code FROM vertical_crs));
SELECT RAISE(ABORT, 'One grid_transformation with Geographic3D to GravityRelatedHeight or Geog3D to Geog2D+XXX has not its source_crs in geodetic_crs table with type = ''geographic 3D''')
WHERE EXISTS (SELECT * FROM grid_transformation g WHERE
g.deprecated = 0 AND
(g.method_name LIKE 'Geographic3D to %' OR g.method_name LIKE 'Geog3D to %') AND
g.source_crs_auth_name || g.source_crs_code NOT IN
(SELECT auth_name || code FROM geodetic_crs
WHERE type = 'geographic 3D'));
-- check that grids with 'Vertical Offset by Grid Interpolation' methods are properly registered
SELECT RAISE(ABORT, 'One grid_transformation with Vertical Offset by Grid Interpolation has not its source_crs in vertical_crs table')
WHERE EXISTS (SELECT * FROM grid_transformation g WHERE
g.method_name LIKE 'Vertical Offset by Grid Interpolation%' AND
g.source_crs_auth_name || g.source_crs_code NOT IN
(SELECT auth_name || code FROM vertical_crs));
SELECT RAISE(ABORT, 'One grid_transformation with Vertical Offset by Grid Interpolation has not its target_crs in vertical_crs table')
WHERE EXISTS (SELECT * FROM grid_transformation g WHERE
g.method_name LIKE 'Vertical Offset by Grid Interpolation%' AND
g.target_crs_auth_name || g.target_crs_code NOT IN
(SELECT auth_name || code FROM vertical_crs));
-- check that Helmert transformations have source and target of the same nature (the fkey already checks they are geodetic_crs)
SELECT RAISE(ABORT, 'One helmert_transformation has a source CRS of a different nature than its target CRS')
WHERE EXISTS (SELECT helmert_transformation.auth_name,
helmert_transformation.code,
helmert_transformation.name,
crs1.type AS crs1_type,
crs2.type AS crs2_type
FROM helmert_transformation
JOIN geodetic_crs crs1 ON
crs1.auth_name = source_crs_auth_name AND crs1.code = source_crs_code
JOIN geodetic_crs crs2 ON
crs2.auth_name = target_crs_auth_name AND crs2.code = target_crs_code
WHERE helmert_transformation.deprecated = 0 AND crs1.type != crs2.type);
-- check that the method used by a Helmert transformation is consistent with the dimensionality of the CRS
SELECT RAISE(ABORT, 'The domain of the method of helmert_transformation is not consistent with the dimensionality of the CRS')
WHERE EXISTS (SELECT helmert_transformation.auth_name,
helmert_transformation.code,
helmert_transformation.name,
helmert_transformation.method_name,
crs.type AS crs_type
FROM helmert_transformation
JOIN geodetic_crs crs ON
crs.auth_name = source_crs_auth_name AND crs.code = source_crs_code
WHERE helmert_transformation.deprecated = 0 AND
((method_name LIKE '%geog2D domain%' AND crs.type != 'geographic 2D') OR
(method_name LIKE '%geog3D domain%' AND crs.type != 'geographic 3D') OR
(method_name LIKE '%geocentric domain%' AND crs.type != 'geocentric')));
-- check that a time-dependent Helmert transformation has its source or target CRS being dyanmic
SELECT RAISE(ABORT, 'A time-dependent Helmert transformations has its source and target CRS both non-dynamic')
WHERE EXISTS (SELECT helmert_transformation.auth_name,
helmert_transformation.code,
helmert_transformation.name
FROM helmert_transformation
JOIN geodetic_crs crs1 ON
crs1.auth_name = source_crs_auth_name AND crs1.code = source_crs_code
JOIN geodetic_crs crs2 ON
crs2.auth_name = target_crs_auth_name AND crs2.code = target_crs_code
JOIN geodetic_datum gd1 ON
gd1.auth_name = crs1.datum_auth_name AND gd1.code = crs1.datum_code
JOIN geodetic_datum gd2 ON
gd2.auth_name = crs2.datum_auth_name AND gd2.code = crs2.datum_code
WHERE helmert_transformation.deprecated = 0 AND
method_name LIKE 'Time-dependent%' AND
gd1.frame_reference_epoch IS NULL AND
gd2.frame_reference_epoch IS NULL);
-- check that transformations operations between vertical CRS are from/into a vertical CRS
SELECT RAISE(ABORT, 'A transformation operating on vertical CRS has a source CRS not being a vertical CRS')
WHERE EXISTS (SELECT other_transformation.auth_name,
other_transformation.code,
other_transformation.name
FROM other_transformation
LEFT JOIN vertical_crs crs ON
crs.auth_name = source_crs_auth_name AND crs.code = source_crs_code
WHERE other_transformation.deprecated = 0 AND
method_name IN ('Vertical Offset', 'Height Depth Reversal', 'Change of Vertical Unit') AND
crs.code IS NULL);
SELECT RAISE(ABORT, 'AA transformation operating on vertical CRS has a target CRS not being a vertical CRS')
WHERE EXISTS (SELECT other_transformation.auth_name,
other_transformation.code,
other_transformation.name
FROM other_transformation
LEFT JOIN vertical_crs crs ON
crs.auth_name = target_crs_auth_name AND crs.code = target_crs_code
WHERE other_transformation.deprecated = 0 AND
method_name IN ('Vertical Offset', 'Height Depth Reversal', 'Change of Vertical Unit') AND
crs.code IS NULL);
-- check that 'Geographic2D with Height Offsets' transformations have a compound CRS with a geog2D as source
SELECT RAISE(ABORT, 'A transformation Geographic2D with Height Offsets does not have a compound CRS with a geog2D as source')
WHERE EXISTS (SELECT other_transformation.auth_name,
other_transformation.code,
other_transformation.name
FROM other_transformation
LEFT JOIN compound_crs ccrs ON
ccrs.auth_name = source_crs_auth_name AND ccrs.code = source_crs_code
LEFT JOIN geodetic_crs gcrs ON
gcrs.auth_name = horiz_crs_auth_name AND gcrs.code = horiz_crs_code
WHERE other_transformation.deprecated = 0 AND
method_name = 'Geographic2D with Height Offsets' AND
(gcrs.code IS NULL OR gcrs.type != 'geographic 2D'));
SELECT RAISE(ABORT, 'A transformation Geographic2D with Height Offsets does not have a geographic 3D CRS as target')
WHERE EXISTS (SELECT other_transformation.auth_name,
other_transformation.code,
other_transformation.name
FROM other_transformation
LEFT JOIN geodetic_crs gcrs ON
gcrs.auth_name = target_crs_auth_name AND gcrs.code = target_crs_code
WHERE other_transformation.deprecated = 0 AND
method_name = 'Geographic2D with Height Offsets' AND
(gcrs.type IS NULL OR gcrs.type != 'geographic 3D'));
-- check that transformations intersect the area of use of their source/target CRS
-- EPSG, ESRI and IGNF have cases where this does not hold.
SELECT RAISE(ABORT, 'The area of use of at least one coordinate_operation does not intersect the one of its source CRS')
WHERE EXISTS (SELECT * FROM coordinate_operation_view v, crs_view c, usage vu, extent ve, usage cu, extent ce WHERE
v.deprecated = 0 AND
(v.table_name = 'grid_transformation' OR v.auth_name NOT IN ('EPSG', 'ESRI', 'IGNF')) AND
v.source_crs_auth_name = c.auth_name AND
v.source_crs_code = c.code AND
vu.object_table_name = v.table_name AND
vu.object_auth_name = v.auth_name AND
vu.object_code = v.code AND
vu.extent_auth_name = ve.auth_name AND
vu.extent_code = ve.code AND
cu.object_table_name = c.table_name AND
cu.object_auth_name = c.auth_name AND
cu.object_code = c.code AND
cu.extent_auth_name = ce.auth_name AND
cu.extent_code = ce.code AND
NOT ((ce.south_lat < ve.north_lat AND ve.south_lat < ce.north_lat) OR
(ce.west_lon < ce.east_lon AND ve.west_lon < ve.east_lon AND
NOT (ce.west_lon < ve.east_lon AND ve.west_lon < ce.east_lon))) );
SELECT RAISE(ABORT, 'The area of use of at least one coordinate_operation does not intersect the one of its target CRS')
WHERE EXISTS (SELECT * FROM coordinate_operation_view v, crs_view c, usage vu, extent ve, usage cu, extent ce WHERE
v.deprecated = 0 AND
((v.table_name = 'grid_transformation' AND NOT (v.auth_name = 'IGNF' AND v.code = 'TSG1185'))
OR v.auth_name NOT IN ('EPSG', 'ESRI', 'IGNF')) AND
v.target_crs_auth_name = c.auth_name AND
v.target_crs_code = c.code AND
vu.object_table_name = v.table_name AND
vu.object_auth_name = v.auth_name AND
vu.object_code = v.code AND
vu.extent_auth_name = ve.auth_name AND
vu.extent_code = ve.code AND
cu.object_table_name = c.table_name AND
cu.object_auth_name = c.auth_name AND
cu.object_code = c.code AND
cu.extent_auth_name = ce.auth_name AND
cu.extent_code = ce.code AND
NOT ((ce.south_lat < ve.north_lat AND ve.south_lat < ce.north_lat) OR
(ce.west_lon < ce.east_lon AND ve.west_lon < ve.east_lon AND
NOT (ce.west_lon < ve.east_lon AND ve.west_lon < ce.east_lon))) );
-- check geoid_model table
SELECT RAISE(ABORT, 'missing GEOID99 in geoid_model')
WHERE NOT EXISTS(SELECT 1 FROM geoid_model WHERE name = 'GEOID99');
SELECT RAISE(ABORT, 'missing GEOID03 in geoid_model')
WHERE NOT EXISTS(SELECT 1 FROM geoid_model WHERE name = 'GEOID03');
SELECT RAISE(ABORT, 'missing GEOID06 in geoid_model')
WHERE NOT EXISTS(SELECT 1 FROM geoid_model WHERE name = 'GEOID06');
SELECT RAISE(ABORT, 'missing GEOID09 in geoid_model')
WHERE NOT EXISTS(SELECT 1 FROM geoid_model WHERE name = 'GEOID09');
SELECT RAISE(ABORT, 'missing GEOID12A in geoid_model')
WHERE NOT EXISTS(SELECT 1 FROM geoid_model WHERE name = 'GEOID12A');
SELECT RAISE(ABORT, 'missing GEOID12B in geoid_model')
WHERE NOT EXISTS(SELECT 1 FROM geoid_model WHERE name = 'GEOID12B');
SELECT RAISE(ABORT, 'missing GEOID18 in geoid_model')
WHERE NOT EXISTS(SELECT 1 FROM geoid_model WHERE name = 'GEOID18');
-- check presence of au_ga_AUSGeoid98.tif
SELECT RAISE(ABORT, 'missing au_ga_AUSGeoid98.tif')
WHERE NOT EXISTS(SELECT 1 FROM grid_alternatives WHERE proj_grid_name = 'au_ga_AUSGeoid98.tif');
-- check PROJ.VERSION value
SELECT RAISE(ABORT, 'Value of PROJ.VERSION entry of metadata tables not substituted by actual value')
WHERE (SELECT 1 FROM metadata WHERE key = 'PROJ.VERSION' AND value LIKE '$%');
END;
INSERT INTO dummy DEFAULT VALUES;
DROP TRIGGER final_checks;
DROP TABLE dummy;
ANALYZE;
VACUUM;
+110 -506
View File
@@ -2,9 +2,9 @@
INSERT INTO "compound_crs" VALUES('EPSG','3901','KKJ / Finland Uniform Coordinate System + N60 height',NULL,'EPSG','2393','EPSG','5717',0);
INSERT INTO "usage" VALUES('EPSG','2881','compound_crs','EPSG','3901','EPSG','3333','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','3902','ETRS89-FIN [EUREF-FIN] / TM35FIN(N,E) + N60 height',NULL,'EPSG','5048','EPSG','5717',0);
INSERT INTO "compound_crs" VALUES('EPSG','3902','ETRS89 / TM35FIN(N,E) + N60 height',NULL,'EPSG','5048','EPSG','5717',0);
INSERT INTO "usage" VALUES('EPSG','2882','compound_crs','EPSG','3902','EPSG','3333','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','3903','ETRS89-FIN [EUREF-FIN] / TM35FIN(N,E) + N2000 height',NULL,'EPSG','5048','EPSG','3900',0);
INSERT INTO "compound_crs" VALUES('EPSG','3903','ETRS89 / TM35FIN(N,E) + N2000 height',NULL,'EPSG','5048','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','2883','compound_crs','EPSG','3903','EPSG','3333','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','4097','ETRS89 / DKTM1 + DVR90 height',NULL,'EPSG','4093','EPSG','5799',0);
INSERT INTO "usage" VALUES('EPSG','3001','compound_crs','EPSG','4097','EPSG','3631','EPSG','1029');
@@ -14,7 +14,7 @@ INSERT INTO "compound_crs" VALUES('EPSG','4099','ETRS89 / DKTM3 + DVR90 height',
INSERT INTO "usage" VALUES('EPSG','3003','compound_crs','EPSG','4099','EPSG','2532','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','4100','ETRS89 / DKTM4 + DVR90 height',NULL,'EPSG','4096','EPSG','5799',0);
INSERT INTO "usage" VALUES('EPSG','3004','compound_crs','EPSG','4100','EPSG','2533','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5318','ETRS89-FRO [2008] / Faroe TM + FVR09 height',NULL,'EPSG','5316','EPSG','5317',0);
INSERT INTO "compound_crs" VALUES('EPSG','5318','ETRS89 / Faroe TM + FVR09 height',NULL,'EPSG','5316','EPSG','5317',0);
INSERT INTO "usage" VALUES('EPSG','3925','compound_crs','EPSG','5318','EPSG','3248','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5498','NAD83 + NAVD88 height',NULL,'EPSG','4269','EPSG','5703',0);
INSERT INTO "usage" VALUES('EPSG','4003','compound_crs','EPSG','5498','EPSG','3664','EPSG','1142');
@@ -30,11 +30,11 @@ INSERT INTO "compound_crs" VALUES('EPSG','5556','ETRS89 / UTM zone 33N + DHHN92
INSERT INTO "usage" VALUES('EPSG','4034','compound_crs','EPSG','5556','EPSG','3879','EPSG','1190');
INSERT INTO "compound_crs" VALUES('EPSG','5598','FEH2010 / Fehmarnbelt TM + FCSVR10 height',NULL,'EPSG','5596','EPSG','5597',0);
INSERT INTO "usage" VALUES('EPSG','4068','compound_crs','EPSG','5598','EPSG','3890','EPSG','1139');
INSERT INTO "compound_crs" VALUES('EPSG','5628','ETRS89-SWE [SWEREF 99] + RH2000 height',NULL,'EPSG','4619','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5628','SWEREF99 + RH2000 height',NULL,'EPSG','4619','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4095','compound_crs','EPSG','5628','EPSG','3313','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5698','ETRS89-FRA [RGF93 v1] / Lambert-93 + NGF-IGN69 height',NULL,'EPSG','2154','EPSG','5720',0);
INSERT INTO "compound_crs" VALUES('EPSG','5698','RGF93 v1 / Lambert-93 + NGF-IGN69 height',NULL,'EPSG','2154','EPSG','5720',0);
INSERT INTO "usage" VALUES('EPSG','4141','compound_crs','EPSG','5698','EPSG','1326','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5699','ETRS89-FRA [RGF93 v1] / Lambert-93 + NGF-IGN78 height',NULL,'EPSG','2154','EPSG','5721',0);
INSERT INTO "compound_crs" VALUES('EPSG','5699','RGF93 v1 / Lambert-93 + NGF-IGN78 height',NULL,'EPSG','2154','EPSG','5721',0);
INSERT INTO "usage" VALUES('EPSG','4142','compound_crs','EPSG','5699','EPSG','1327','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5707','NTF (Paris) / Lambert zone I + NGF-IGN69 height',NULL,'EPSG','27571','EPSG','5720',0);
INSERT INTO "usage" VALUES('EPSG','4150','compound_crs','EPSG','5707','EPSG','1731','EPSG','1142');
@@ -48,169 +48,169 @@ INSERT INTO "compound_crs" VALUES('EPSG','5834','DB_REF / 3-degree Gauss-Kruger
INSERT INTO "usage" VALUES('EPSG','4272','compound_crs','EPSG','5834','EPSG','3996','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','5835','DB_REF / 3-degree Gauss-Kruger zone 5 (E-N) + DHHN92 height',NULL,'EPSG','5685','EPSG','5783',1);
INSERT INTO "usage" VALUES('EPSG','4273','compound_crs','EPSG','5835','EPSG','3998','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','5845','ETRS89-SWE [SWEREF 99] TM + RH2000 height',NULL,'EPSG','3006','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5845','SWEREF99 TM + RH2000 height',NULL,'EPSG','3006','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4280','compound_crs','EPSG','5845','EPSG','3313','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5846','ETRS89-SWE [SWEREF 99 12 00] + RH2000 height',NULL,'EPSG','3007','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5846','SWEREF99 12 00 + RH2000 height',NULL,'EPSG','3007','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4281','compound_crs','EPSG','5846','EPSG','2833','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5847','ETRS89-SWE [SWEREF 99 13 30] + RH2000 height',NULL,'EPSG','3008','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5847','SWEREF99 13 30 + RH2000 height',NULL,'EPSG','3008','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4282','compound_crs','EPSG','5847','EPSG','2834','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5848','ETRS89-SWE [SWEREF 99 15 00] + RH2000 height',NULL,'EPSG','3009','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5848','SWEREF99 15 00 + RH2000 height',NULL,'EPSG','3009','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4283','compound_crs','EPSG','5848','EPSG','2835','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5849','ETRS89-SWE [SWEREF 99 16 30] + RH2000 height',NULL,'EPSG','3010','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5849','SWEREF99 16 30 + RH2000 height',NULL,'EPSG','3010','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4284','compound_crs','EPSG','5849','EPSG','2836','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5850','ETRS89-SWE [SWEREF 99 18 00] + RH2000 height',NULL,'EPSG','3011','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5850','SWEREF99 18 00 + RH2000 height',NULL,'EPSG','3011','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4285','compound_crs','EPSG','5850','EPSG','2837','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5851','ETRS89-SWE [SWEREF 99 14 15] + RH2000 height',NULL,'EPSG','3012','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5851','SWEREF99 14 15 + RH2000 height',NULL,'EPSG','3012','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4286','compound_crs','EPSG','5851','EPSG','2838','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5852','ETRS89-SWE [SWEREF 99 15 45] + RH2000 height',NULL,'EPSG','3013','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5852','SWEREF99 15 45 + RH2000 height',NULL,'EPSG','3013','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4287','compound_crs','EPSG','5852','EPSG','2839','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5853','ETRS89-SWE [SWEREF 99 17 15] + RH2000 height',NULL,'EPSG','3014','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5853','SWEREF99 17 15 + RH2000 height',NULL,'EPSG','3014','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4288','compound_crs','EPSG','5853','EPSG','2840','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5854','ETRS89-SWE [SWEREF 99 18 45] + RH2000 height',NULL,'EPSG','3015','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5854','SWEREF99 18 45 + RH2000 height',NULL,'EPSG','3015','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4289','compound_crs','EPSG','5854','EPSG','2841','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5855','ETRS89-SWE [SWEREF 99 20 15] + RH2000 height',NULL,'EPSG','3016','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5855','SWEREF99 20 15 + RH2000 height',NULL,'EPSG','3016','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4290','compound_crs','EPSG','5855','EPSG','2842','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5856','ETRS89-SWE [SWEREF 99 21 45] + RH2000 height',NULL,'EPSG','3017','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5856','SWEREF99 21 45 + RH2000 height',NULL,'EPSG','3017','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4291','compound_crs','EPSG','5856','EPSG','2843','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5857','ETRS89-SWE [SWEREF 99 23 15] + RH2000 height',NULL,'EPSG','3018','EPSG','5613',0);
INSERT INTO "compound_crs" VALUES('EPSG','5857','SWEREF99 23 15 + RH2000 height',NULL,'EPSG','3018','EPSG','5613',0);
INSERT INTO "usage" VALUES('EPSG','4292','compound_crs','EPSG','5857','EPSG','2844','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','5942','ETRS89 + NN2000:2018 height',NULL,'EPSG','4258','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5942','ETRS89 + NN2000 height',NULL,'EPSG','4258','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4346','compound_crs','EPSG','5942','EPSG','1352','EPSG','1027');
INSERT INTO "compound_crs" VALUES('EPSG','5945','ETRS89-NOR [EUREF89] / NTM zone 5 + NN2000:2018 height',NULL,'EPSG','5105','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5945','ETRS89 / NTM zone 5 + NN2000 height',NULL,'EPSG','5105','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4347','compound_crs','EPSG','5945','EPSG','3636','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5946','ETRS89-NOR [EUREF89] / NTM zone 6 + NN2000:2018 height',NULL,'EPSG','5106','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5946','ETRS89 / NTM zone 6 + NN2000 height',NULL,'EPSG','5106','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4348','compound_crs','EPSG','5946','EPSG','3639','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5947','ETRS89-NOR [EUREF89] / NTM zone 7 + NN2000:2018 height',NULL,'EPSG','5107','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5947','ETRS89 / NTM zone 7 + NN2000 height',NULL,'EPSG','5107','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4349','compound_crs','EPSG','5947','EPSG','3647','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5948','ETRS89-NOR [EUREF89] / NTM zone 8 + NN2000:2018 height',NULL,'EPSG','5108','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5948','ETRS89 / NTM zone 8 + NN2000 height',NULL,'EPSG','5108','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4350','compound_crs','EPSG','5948','EPSG','3648','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5949','ETRS89-NOR [EUREF89] / NTM zone 9 + NN2000:2018 height',NULL,'EPSG','5109','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5949','ETRS89 / NTM zone 9 + NN2000 height',NULL,'EPSG','5109','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4351','compound_crs','EPSG','5949','EPSG','3649','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5950','ETRS89-NOR [EUREF89] / NTM zone 10 + NN2000:2018 height',NULL,'EPSG','5110','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5950','ETRS89 / NTM zone 10 + NN2000 height',NULL,'EPSG','5110','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4352','compound_crs','EPSG','5950','EPSG','3650','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5951','ETRS89-NOR [EUREF89] / NTM zone 11 + NN2000:2018 height',NULL,'EPSG','5111','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5951','ETRS89 / NTM zone 11 + NN2000 height',NULL,'EPSG','5111','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4353','compound_crs','EPSG','5951','EPSG','3651','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5952','ETRS89-NOR [EUREF89] / NTM zone 12 + NN2000:2018 height',NULL,'EPSG','5112','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5952','ETRS89 / NTM zone 12 + NN2000 height',NULL,'EPSG','5112','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4354','compound_crs','EPSG','5952','EPSG','3653','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5953','ETRS89-NOR [EUREF89] / NTM zone 13 + NN2000:2018 height',NULL,'EPSG','5113','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5953','ETRS89 / NTM zone 13 + NN2000 height',NULL,'EPSG','5113','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4355','compound_crs','EPSG','5953','EPSG','3654','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5954','ETRS89-NOR [EUREF89] / NTM zone 14 + NN2000:2018 height',NULL,'EPSG','5114','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5954','ETRS89 / NTM zone 14 + NN2000 height',NULL,'EPSG','5114','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4356','compound_crs','EPSG','5954','EPSG','3655','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5955','ETRS89-NOR [EUREF89] / NTM zone 15 + NN2000:2018 height',NULL,'EPSG','5115','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5955','ETRS89 / NTM zone 15 + NN2000 height',NULL,'EPSG','5115','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4357','compound_crs','EPSG','5955','EPSG','3656','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5956','ETRS89-NOR [EUREF89] / NTM zone 16 + NN2000:2018 height',NULL,'EPSG','5116','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5956','ETRS89 / NTM zone 16 + NN2000 height',NULL,'EPSG','5116','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4358','compound_crs','EPSG','5956','EPSG','3657','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5957','ETRS89-NOR [EUREF89] / NTM zone 17 + NN2000:2018 height',NULL,'EPSG','5117','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5957','ETRS89 / NTM zone 17 + NN2000 height',NULL,'EPSG','5117','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4359','compound_crs','EPSG','5957','EPSG','3658','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5958','ETRS89-NOR [EUREF89] / NTM zone 18 + NN2000:2018 height',NULL,'EPSG','5118','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5958','ETRS89 / NTM zone 18 + NN2000 height',NULL,'EPSG','5118','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4360','compound_crs','EPSG','5958','EPSG','3660','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5959','ETRS89-NOR [EUREF89] / NTM zone 19 + NN2000:2018 height',NULL,'EPSG','5119','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5959','ETRS89 / NTM zone 19 + NN2000 height',NULL,'EPSG','5119','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4361','compound_crs','EPSG','5959','EPSG','3661','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5960','ETRS89-NOR [EUREF89] / NTM zone 20 + NN2000:2018 height',NULL,'EPSG','5120','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5960','ETRS89 / NTM zone 20 + NN2000 height',NULL,'EPSG','5120','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4362','compound_crs','EPSG','5960','EPSG','3662','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5961','ETRS89-NOR [EUREF89] / NTM zone 21 + NN2000:2018 height',NULL,'EPSG','5121','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5961','ETRS89 / NTM zone 21 + NN2000 height',NULL,'EPSG','5121','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4363','compound_crs','EPSG','5961','EPSG','3663','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5962','ETRS89-NOR [EUREF89] / NTM zone 22 + NN2000:2018 height',NULL,'EPSG','5122','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5962','ETRS89 / NTM zone 22 + NN2000 height',NULL,'EPSG','5122','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4364','compound_crs','EPSG','5962','EPSG','3665','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5963','ETRS89-NOR [EUREF89] / NTM zone 23 + NN2000:2018 height',NULL,'EPSG','5123','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5963','ETRS89 / NTM zone 23 + NN2000 height',NULL,'EPSG','5123','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4365','compound_crs','EPSG','5963','EPSG','3667','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5964','ETRS89-NOR [EUREF89] / NTM zone 24 + NN2000:2018 height',NULL,'EPSG','5124','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5964','ETRS89 / NTM zone 24 + NN2000 height',NULL,'EPSG','5124','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4366','compound_crs','EPSG','5964','EPSG','3668','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5965','ETRS89-NOR [EUREF89] / NTM zone 25 + NN2000:2018 height',NULL,'EPSG','5125','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5965','ETRS89 / NTM zone 25 + NN2000 height',NULL,'EPSG','5125','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4367','compound_crs','EPSG','5965','EPSG','3669','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5966','ETRS89-NOR [EUREF89] / NTM zone 26 + NN2000:2018 height',NULL,'EPSG','5126','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5966','ETRS89 / NTM zone 26 + NN2000 height',NULL,'EPSG','5126','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4368','compound_crs','EPSG','5966','EPSG','3671','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5967','ETRS89-NOR [EUREF89] / NTM zone 27 + NN2000:2018 height',NULL,'EPSG','5127','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5967','ETRS89 / NTM zone 27 + NN2000 height',NULL,'EPSG','5127','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4369','compound_crs','EPSG','5967','EPSG','3672','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5968','ETRS89-NOR [EUREF89] / NTM zone 28 + NN2000:2018 height',NULL,'EPSG','5128','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5968','ETRS89 / NTM zone 28 + NN2000 height',NULL,'EPSG','5128','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4370','compound_crs','EPSG','5968','EPSG','3673','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5969','ETRS89-NOR [EUREF89] / NTM zone 29 + NN2000:2018 height',NULL,'EPSG','5129','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5969','ETRS89 / NTM zone 29 + NN2000 height',NULL,'EPSG','5129','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4371','compound_crs','EPSG','5969','EPSG','3674','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5970','ETRS89-NOR [EUREF89] / NTM zone 30 + NN2000:2018 height',NULL,'EPSG','5130','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5970','ETRS89 / NTM zone 30 + NN2000 height',NULL,'EPSG','5130','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4372','compound_crs','EPSG','5970','EPSG','3676','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','5971','ETRS89-NOR [EUREF89] / UTM zone 31N + NN2000:2018 height',NULL,'EPSG','11021','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5971','ETRS89 / UTM zone 31N + NN2000 height',NULL,'EPSG','25831','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4373','compound_crs','EPSG','5971','EPSG','3636','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','5972','ETRS89-NOR [EUREF89] / UTM zone 32N + NN2000:2018 height',NULL,'EPSG','11022','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5972','ETRS89 / UTM zone 32N + NN2000 height',NULL,'EPSG','25832','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4374','compound_crs','EPSG','5972','EPSG','4066','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','5973','ETRS89-NOR [EUREF89] / UTM zone 33N + NN2000:2018 height',NULL,'EPSG','11023','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5973','ETRS89 / UTM zone 33N + NN2000 height',NULL,'EPSG','25833','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4375','compound_crs','EPSG','5973','EPSG','4067','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','5974','ETRS89-NOR [EUREF89] / UTM zone 34N + NN2000:2018 height',NULL,'EPSG','11024','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5974','ETRS89 / UTM zone 34N + NN2000 height',NULL,'EPSG','25834','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4376','compound_crs','EPSG','5974','EPSG','4068','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','5975','ETRS89-NOR [EUREF89] / UTM zone 35N + NN2000:2018 height',NULL,'EPSG','11025','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5975','ETRS89 / UTM zone 35N + NN2000 height',NULL,'EPSG','25835','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4377','compound_crs','EPSG','5975','EPSG','4069','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','5976','ETRS89-NOR [EUREF89] / UTM zone 36N + NN2000:2018 height',NULL,'EPSG','11026','EPSG','5941',0);
INSERT INTO "compound_crs" VALUES('EPSG','5976','ETRS89 / UTM zone 36N + NN2000 height',NULL,'EPSG','25836','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','4378','compound_crs','EPSG','5976','EPSG','3676','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','6144','ETRS89 + NN54 height',NULL,'EPSG','4258','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4464','compound_crs','EPSG','6144','EPSG','1352','EPSG','1027');
INSERT INTO "compound_crs" VALUES('EPSG','6145','ETRS89-NOR [EUREF89] / NTM zone 5 + NN54 height',NULL,'EPSG','5105','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6145','ETRS89 / NTM zone 5 + NN54 height',NULL,'EPSG','5105','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4465','compound_crs','EPSG','6145','EPSG','3636','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6146','ETRS89-NOR [EUREF89] / NTM zone 6 + NN54 height',NULL,'EPSG','5106','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6146','ETRS89 / NTM zone 6 + NN54 height',NULL,'EPSG','5106','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4466','compound_crs','EPSG','6146','EPSG','3639','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6147','ETRS89-NOR [EUREF89] / NTM zone 7 + NN54 height',NULL,'EPSG','5107','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6147','ETRS89 / NTM zone 7 + NN54 height',NULL,'EPSG','5107','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4467','compound_crs','EPSG','6147','EPSG','3647','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6148','ETRS89-NOR [EUREF89] / NTM zone 8 + NN54 height',NULL,'EPSG','5108','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6148','ETRS89 / NTM zone 8 + NN54 height',NULL,'EPSG','5108','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4468','compound_crs','EPSG','6148','EPSG','3648','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6149','ETRS89-NOR [EUREF89] / NTM zone 9 + NN54 height',NULL,'EPSG','5109','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6149','ETRS89 / NTM zone 9 + NN54 height',NULL,'EPSG','5109','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4469','compound_crs','EPSG','6149','EPSG','3649','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6150','ETRS89-NOR [EUREF89] / NTM zone 10 + NN54 height',NULL,'EPSG','5110','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6150','ETRS89 / NTM zone 10 + NN54 height',NULL,'EPSG','5110','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4470','compound_crs','EPSG','6150','EPSG','3650','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6151','ETRS89-NOR [EUREF89] / NTM zone 11 + NN54 height',NULL,'EPSG','5111','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6151','ETRS89 / NTM zone 11 + NN54 height',NULL,'EPSG','5111','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4471','compound_crs','EPSG','6151','EPSG','3651','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6152','ETRS89-NOR [EUREF89] / NTM zone 12 + NN54 height',NULL,'EPSG','5112','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6152','ETRS89 / NTM zone 12 + NN54 height',NULL,'EPSG','5112','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4472','compound_crs','EPSG','6152','EPSG','3653','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6153','ETRS89-NOR [EUREF89] / NTM zone 13 + NN54 height',NULL,'EPSG','5113','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6153','ETRS89 / NTM zone 13 + NN54 height',NULL,'EPSG','5113','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4473','compound_crs','EPSG','6153','EPSG','3654','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6154','ETRS89-NOR [EUREF89] / NTM zone 14 + NN54 height',NULL,'EPSG','5114','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6154','ETRS89 / NTM zone 14 + NN54 height',NULL,'EPSG','5114','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4474','compound_crs','EPSG','6154','EPSG','3655','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6155','ETRS89-NOR [EUREF89] / NTM zone 15 + NN54 height',NULL,'EPSG','5115','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6155','ETRS89 / NTM zone 15 + NN54 height',NULL,'EPSG','5115','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4475','compound_crs','EPSG','6155','EPSG','3656','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6156','ETRS89-NOR [EUREF89] / NTM zone 16 + NN54 height',NULL,'EPSG','5116','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6156','ETRS89 / NTM zone 16 + NN54 height',NULL,'EPSG','5116','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4476','compound_crs','EPSG','6156','EPSG','3657','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6157','ETRS89-NOR [EUREF89] / NTM zone 17 + NN54 height',NULL,'EPSG','5117','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6157','ETRS89 / NTM zone 17 + NN54 height',NULL,'EPSG','5117','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4477','compound_crs','EPSG','6157','EPSG','3658','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6158','ETRS89-NOR [EUREF89] / NTM zone 18 + NN54 height',NULL,'EPSG','5118','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6158','ETRS89 / NTM zone 18 + NN54 height',NULL,'EPSG','5118','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4478','compound_crs','EPSG','6158','EPSG','3660','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6159','ETRS89-NOR [EUREF89] / NTM zone 19 + NN54 height',NULL,'EPSG','5119','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6159','ETRS89 / NTM zone 19 + NN54 height',NULL,'EPSG','5119','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4479','compound_crs','EPSG','6159','EPSG','3661','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6160','ETRS89-NOR [EUREF89] / NTM zone 20 + NN54 height',NULL,'EPSG','5120','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6160','ETRS89 / NTM zone 20 + NN54 height',NULL,'EPSG','5120','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4480','compound_crs','EPSG','6160','EPSG','3662','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6161','ETRS89-NOR [EUREF89] / NTM zone 21 + NN54 height',NULL,'EPSG','5121','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6161','ETRS89 / NTM zone 21 + NN54 height',NULL,'EPSG','5121','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4481','compound_crs','EPSG','6161','EPSG','3663','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6162','ETRS89-NOR [EUREF89] / NTM zone 22 + NN54 height',NULL,'EPSG','5122','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6162','ETRS89 / NTM zone 22 + NN54 height',NULL,'EPSG','5122','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4482','compound_crs','EPSG','6162','EPSG','3665','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6163','ETRS89-NOR [EUREF89] / NTM zone 23 + NN54 height',NULL,'EPSG','5123','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6163','ETRS89 / NTM zone 23 + NN54 height',NULL,'EPSG','5123','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4483','compound_crs','EPSG','6163','EPSG','3667','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6164','ETRS89-NOR [EUREF89] / NTM zone 24 + NN54 height',NULL,'EPSG','5124','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6164','ETRS89 / NTM zone 24 + NN54 height',NULL,'EPSG','5124','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4484','compound_crs','EPSG','6164','EPSG','3668','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6165','ETRS89-NOR [EUREF89] / NTM zone 25 + NN54 height',NULL,'EPSG','5125','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6165','ETRS89 / NTM zone 25 + NN54 height',NULL,'EPSG','5125','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4485','compound_crs','EPSG','6165','EPSG','3669','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6166','ETRS89-NOR [EUREF89] / NTM zone 26 + NN54 height',NULL,'EPSG','5126','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6166','ETRS89 / NTM zone 26 + NN54 height',NULL,'EPSG','5126','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4486','compound_crs','EPSG','6166','EPSG','3671','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6167','ETRS89-NOR [EUREF89] / NTM zone 27 + NN54 height',NULL,'EPSG','5127','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6167','ETRS89 / NTM zone 27 + NN54 height',NULL,'EPSG','5127','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4487','compound_crs','EPSG','6167','EPSG','3672','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6168','ETRS89-NOR [EUREF89] / NTM zone 28 + NN54 height',NULL,'EPSG','5128','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6168','ETRS89 / NTM zone 28 + NN54 height',NULL,'EPSG','5128','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4488','compound_crs','EPSG','6168','EPSG','3673','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6169','ETRS89-NOR [EUREF89] / NTM zone 29 + NN54 height',NULL,'EPSG','5129','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6169','ETRS89 / NTM zone 29 + NN54 height',NULL,'EPSG','5129','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4489','compound_crs','EPSG','6169','EPSG','3674','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6170','ETRS89-NOR [EUREF89] / NTM zone 30 + NN54 height',NULL,'EPSG','5130','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6170','ETRS89 / NTM zone 30 + NN54 height',NULL,'EPSG','5130','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4490','compound_crs','EPSG','6170','EPSG','3676','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','6171','ETRS89-NOR [EUREF89] / UTM zone 31N + NN54 height',NULL,'EPSG','11021','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6171','ETRS89 / UTM zone 31N + NN54 height',NULL,'EPSG','25831','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4491','compound_crs','EPSG','6171','EPSG','3636','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','6172','ETRS89-NOR [EUREF89] / UTM zone 32N + NN54 height',NULL,'EPSG','11022','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6172','ETRS89 / UTM zone 32N + NN54 height',NULL,'EPSG','25832','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4492','compound_crs','EPSG','6172','EPSG','4066','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','6173','ETRS89-NOR [EUREF89] / UTM zone 33N + NN54 height',NULL,'EPSG','11023','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6173','ETRS89 / UTM zone 33N + NN54 height',NULL,'EPSG','25833','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4493','compound_crs','EPSG','6173','EPSG','4067','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','6174','ETRS89-NOR [EUREF89] / UTM zone 34N + NN54 height',NULL,'EPSG','11024','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6174','ETRS89 / UTM zone 34N + NN54 height',NULL,'EPSG','25834','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4494','compound_crs','EPSG','6174','EPSG','4068','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','6175','ETRS89-NOR [EUREF89] / UTM zone 35N + NN54 height',NULL,'EPSG','11025','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6175','ETRS89 / UTM zone 35N + NN54 height',NULL,'EPSG','25835','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4495','compound_crs','EPSG','6175','EPSG','4069','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','6176','ETRS89-NOR [EUREF89] / UTM zone 36N + NN54 height',NULL,'EPSG','11026','EPSG','5776',0);
INSERT INTO "compound_crs" VALUES('EPSG','6176','ETRS89 / UTM zone 36N + NN54 height',NULL,'EPSG','25836','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','4496','compound_crs','EPSG','6176','EPSG','3676','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','6190','BD72 / Belgian Lambert 72 + Ostend height',NULL,'EPSG','31370','EPSG','5710',0);
INSERT INTO "usage" VALUES('EPSG','4507','compound_crs','EPSG','6190','EPSG','1347','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','6349','NAD83(2011) + NAVD88 height',NULL,'EPSG','6318','EPSG','5703',0);
INSERT INTO "usage" VALUES('EPSG','4583','compound_crs','EPSG','6349','EPSG','3664','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','6649','NAD83(CSRS) + CGVD2013(CGG2013) height',NULL,'EPSG','4617','EPSG','6647',0);
INSERT INTO "compound_crs" VALUES('EPSG','6649','NAD83(CSRS) + CGVD2013 height',NULL,'EPSG','4617','EPSG','6647',0);
INSERT INTO "usage" VALUES('EPSG','4868','compound_crs','EPSG','6649','EPSG','1061','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','6650','NAD83(CSRS) / UTM zone 7N + CGVD2013 height',NULL,'EPSG','3154','EPSG','6647',0);
INSERT INTO "usage" VALUES('EPSG','4869','compound_crs','EPSG','6650','EPSG','3409','EPSG','1142');
@@ -246,19 +246,19 @@ INSERT INTO "compound_crs" VALUES('EPSG','6665','NAD83(CSRS) / UTM zone 22N + CG
INSERT INTO "usage" VALUES('EPSG','4884','compound_crs','EPSG','6665','EPSG','2152','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','6696','JGD2000 + JGD2000 (vertical) height',NULL,'EPSG','4612','EPSG','6694',0);
INSERT INTO "usage" VALUES('EPSG','4915','compound_crs','EPSG','6696','EPSG','3263','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','6697','JGD2024 + JGD2011 (vertical) height',NULL,'EPSG','6668','EPSG','6695',0);
INSERT INTO "compound_crs" VALUES('EPSG','6697','JGD2011 + JGD2011 (vertical) height',NULL,'EPSG','6668','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','4916','compound_crs','EPSG','6697','EPSG','3263','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','6700','Tokyo + JSLD72 height',NULL,'EPSG','4301','EPSG','6693',0);
INSERT INTO "usage" VALUES('EPSG','4917','compound_crs','EPSG','6700','EPSG','4168','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','6871','WGS 84 / Pseudo-Mercator + EGM2008 geoid height',NULL,'EPSG','3857','EPSG','3855',1);
INSERT INTO "usage" VALUES('EPSG','5023','compound_crs','EPSG','6871','EPSG','1262','EPSG','1229');
INSERT INTO "compound_crs" VALUES('EPSG','6893','WGS 84 / World Mercator + EGM2008 height',NULL,'EPSG','3395','EPSG','3855',0);
INSERT INTO "usage" VALUES('EPSG','5036','compound_crs','EPSG','6893','EPSG','3391','EPSG','1229');
INSERT INTO "usage" VALUES('EPSG','5036','compound_crs','EPSG','6893','EPSG','1262','EPSG','1229');
INSERT INTO "compound_crs" VALUES('EPSG','6917','SVY21 + SHD height',NULL,'EPSG','4757','EPSG','6916',0);
INSERT INTO "usage" VALUES('EPSG','5040','compound_crs','EPSG','6917','EPSG','1210','EPSG','1144');
INSERT INTO "compound_crs" VALUES('EPSG','6927','SVY21 / Singapore TM + SHD height',NULL,'EPSG','3414','EPSG','6916',0);
INSERT INTO "usage" VALUES('EPSG','5045','compound_crs','EPSG','6927','EPSG','1210','EPSG','1144');
INSERT INTO "compound_crs" VALUES('EPSG','7400','NTF (Paris) + NGF-IGN69 height',NULL,'EPSG','4807','EPSG','5720',0);
INSERT INTO "compound_crs" VALUES('EPSG','7400','NTF (Paris) + NGF IGN69 height',NULL,'EPSG','4807','EPSG','5720',0);
INSERT INTO "usage" VALUES('EPSG','5265','compound_crs','EPSG','7400','EPSG','1326','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','7401','NTF (Paris) / France II + NGF Lallemand',NULL,'EPSG','27582','EPSG','5719',1);
INSERT INTO "usage" VALUES('EPSG','5266','compound_crs','EPSG','7401','EPSG','1326','EPSG','1142');
@@ -288,8 +288,8 @@ INSERT INTO "compound_crs" VALUES('EPSG','7413','NTF (Paris) / Lambert zone III
INSERT INTO "usage" VALUES('EPSG','5278','compound_crs','EPSG','7413','EPSG','1733','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','7414','Tokyo + JSLD69 height',NULL,'EPSG','4301','EPSG','5723',0);
INSERT INTO "usage" VALUES('EPSG','5279','compound_crs','EPSG','7414','EPSG','4166','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','7415','RD + NAP height',NULL,'EPSG','28992','EPSG','5709',0);
INSERT INTO "usage" VALUES('EPSG','5280','compound_crs','EPSG','7415','EPSG','1172','EPSG','1056');
INSERT INTO "compound_crs" VALUES('EPSG','7415','Amersfoort / RD New + NAP height',NULL,'EPSG','28992','EPSG','5709',0);
INSERT INTO "usage" VALUES('EPSG','5280','compound_crs','EPSG','7415','EPSG','1275','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','7416','ETRS89 / UTM zone 32N + DVR90 height',NULL,'EPSG','25832','EPSG','5799',0);
INSERT INTO "usage" VALUES('EPSG','5281','compound_crs','EPSG','7416','EPSG','3471','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','7417','ETRS89 / UTM zone 33N + DVR90 height',NULL,'EPSG','25833','EPSG','5799',0);
@@ -318,7 +318,7 @@ INSERT INTO "compound_crs" VALUES('EPSG','8350','GR96 + GVR2016 height',NULL,'EP
INSERT INTO "usage" VALUES('EPSG','5799','compound_crs','EPSG','8350','EPSG','4454','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','8360','ETRS89 + Baltic 1957 height',NULL,'EPSG','4258','EPSG','8357',0);
INSERT INTO "usage" VALUES('EPSG','5805','compound_crs','EPSG','8360','EPSG','1306','EPSG','1203');
INSERT INTO "compound_crs" VALUES('EPSG','8370','ETRS89-BEL [BEREF2002] / Belgian Lambert 2008 + Ostend height',NULL,'EPSG','3812','EPSG','5710',0);
INSERT INTO "compound_crs" VALUES('EPSG','8370','ETRS89 / Belgian Lambert 2008 + Ostend height',NULL,'EPSG','3812','EPSG','5710',0);
INSERT INTO "usage" VALUES('EPSG','5806','compound_crs','EPSG','8370','EPSG','1347','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','8700','NAD83 / Arizona East (ft) + NAVD88 height (ft)',NULL,'EPSG','2222','EPSG','8228',0);
INSERT INTO "usage" VALUES('EPSG','5879','compound_crs','EPSG','8700','EPSG','2167','EPSG','1142');
@@ -345,9 +345,9 @@ INSERT INTO "usage" VALUES('EPSG','5889','compound_crs','EPSG','8710','EPSG','22
INSERT INTO "compound_crs" VALUES('EPSG','8711','NAD83 / South Carolina (ft) + NAVD88 height (ft)',NULL,'EPSG','2273','EPSG','8228',0);
INSERT INTO "usage" VALUES('EPSG','5890','compound_crs','EPSG','8711','EPSG','1409','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','8712','NAD83 / Arkansas North (ftUS) + NAVD88 height (ftUS)',NULL,'EPSG','3433','EPSG','6360',0);
INSERT INTO "usage" VALUES('EPSG','5891','compound_crs','EPSG','8712','EPSG','4861','EPSG','1142');
INSERT INTO "usage" VALUES('EPSG','5891','compound_crs','EPSG','8712','EPSG','2169','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','8713','NAD83 / Arkansas South (ftUS) + NAVD88 height (ftUS)',NULL,'EPSG','3434','EPSG','6360',0);
INSERT INTO "usage" VALUES('EPSG','5892','compound_crs','EPSG','8713','EPSG','4862','EPSG','1142');
INSERT INTO "usage" VALUES('EPSG','5892','compound_crs','EPSG','8713','EPSG','2170','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','8714','NAD83 / California zone 1 (ftUS) + NAVD88 height (ftUS)',NULL,'EPSG','2225','EPSG','6360',0);
INSERT INTO "usage" VALUES('EPSG','5893','compound_crs','EPSG','8714','EPSG','2175','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','8715','NAD83 / California zone 2 (ftUS) + NAVD88 height (ftUS)',NULL,'EPSG','2226','EPSG','6360',0);
@@ -552,14 +552,14 @@ INSERT INTO "compound_crs" VALUES('EPSG','8814','NAD83 / Missouri Central + NAVD
INSERT INTO "usage" VALUES('EPSG','5993','compound_crs','EPSG','8814','EPSG','2218','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','8815','NAD83 / Missouri West + NAVD88 height',NULL,'EPSG','26998','EPSG','5703',0);
INSERT INTO "usage" VALUES('EPSG','5994','compound_crs','EPSG','8815','EPSG','2220','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','8912','CR-SIRGAS epoch 2014.59 / CRTM05 + DACR52 height',NULL,'EPSG','8908','EPSG','8911',0);
INSERT INTO "compound_crs" VALUES('EPSG','8912','CR-SIRGAS / CRTM05 + DACR52 height',NULL,'EPSG','8908','EPSG','8911',0);
INSERT INTO "usage" VALUES('EPSG','6028','compound_crs','EPSG','8912','EPSG','3232','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','9286','ETRS89 + NAP height',NULL,'EPSG','4258','EPSG','5709',0);
INSERT INTO "usage" VALUES('EPSG','14121','compound_crs','EPSG','9286','EPSG','1172','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9289','ETRS89 + LAT-NLD depth',NULL,'EPSG','4258','EPSG','9287',0);
INSERT INTO "usage" VALUES('EPSG','14124','compound_crs','EPSG','9289','EPSG','4859','EPSG','1198');
INSERT INTO "compound_crs" VALUES('EPSG','9290','ETRS89 + MSL-NLD depth',NULL,'EPSG','4258','EPSG','9288',0);
INSERT INTO "usage" VALUES('EPSG','14125','compound_crs','EPSG','9290','EPSG','4859','EPSG','1265');
INSERT INTO "compound_crs" VALUES('EPSG','9289','ETRS89 + LAT NL depth',NULL,'EPSG','4258','EPSG','9287',0);
INSERT INTO "usage" VALUES('EPSG','14124','compound_crs','EPSG','9289','EPSG','1630','EPSG','1198');
INSERT INTO "compound_crs" VALUES('EPSG','9290','ETRS89 + MSL NL depth',NULL,'EPSG','4258','EPSG','9288',0);
INSERT INTO "usage" VALUES('EPSG','14125','compound_crs','EPSG','9290','EPSG','1630','EPSG','1265');
INSERT INTO "compound_crs" VALUES('EPSG','9306','HS2 Survey Grid + HS2-VRF height',NULL,'EPSG','9300','EPSG','9303',0);
INSERT INTO "usage" VALUES('EPSG','14050','compound_crs','EPSG','9306','EPSG','4582','EPSG','1260');
INSERT INTO "compound_crs" VALUES('EPSG','9368','TPEN11 Grid + ODN height',NULL,'EPSG','9367','EPSG','5701',0);
@@ -617,7 +617,7 @@ INSERT INTO "usage" VALUES('EPSG','14273','compound_crs','EPSG','9506','EPSG','4
INSERT INTO "compound_crs" VALUES('EPSG','9507','ETRS89 + Ibiza height',NULL,'EPSG','4258','EPSG','9394',0);
INSERT INTO "usage" VALUES('EPSG','14276','compound_crs','EPSG','9507','EPSG','4604','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9508','ETRS89 + Mallorca height',NULL,'EPSG','4258','EPSG','9392',0);
INSERT INTO "usage" VALUES('EPSG','14440','compound_crs','EPSG','9508','EPSG','4602','EPSG','1026');
INSERT INTO "usage" VALUES('EPSG','14440','compound_crs','EPSG','9508','EPSG','4602','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','9509','ETRS89 + Menorca height',NULL,'EPSG','4258','EPSG','9393',0);
INSERT INTO "usage" VALUES('EPSG','14283','compound_crs','EPSG','9509','EPSG','4603','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9510','REGCAN95 + El Hierro height',NULL,'EPSG','4081','EPSG','9401',0);
@@ -651,14 +651,14 @@ INSERT INTO "usage" VALUES('EPSG','14356','compound_crs','EPSG','9523','EPSG','3
INSERT INTO "compound_crs" VALUES('EPSG','9524','NAD83(MA11) + GUVD04 height',NULL,'EPSG','6325','EPSG','6644',0);
INSERT INTO "usage" VALUES('EPSG','14364','compound_crs','EPSG','9524','EPSG','3255','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9525','NAD83(MA11) + NMVD03 height',NULL,'EPSG','6325','EPSG','6640',0);
INSERT INTO "usage" VALUES('EPSG','14367','compound_crs','EPSG','9525','EPSG','4171','EPSG','1026');
INSERT INTO "usage" VALUES('EPSG','14367','compound_crs','EPSG','9525','EPSG','4521','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9526','NAD83(PA11) + ASVD02 height',NULL,'EPSG','6322','EPSG','6643',0);
INSERT INTO "usage" VALUES('EPSG','14462','compound_crs','EPSG','9526','EPSG','2288','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9527','NZGD2000 + NZVD2009 height',NULL,'EPSG','4167','EPSG','4440',0);
INSERT INTO "usage" VALUES('EPSG','14377','compound_crs','EPSG','9527','EPSG','1175','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9528','NZGD2000 + NZVD2016 height',NULL,'EPSG','4167','EPSG','7839',0);
INSERT INTO "usage" VALUES('EPSG','14380','compound_crs','EPSG','9528','EPSG','1175','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9529','SRGI2013 + INAGeoid2020 v1 height',NULL,'EPSG','9470','EPSG','9471',0);
INSERT INTO "compound_crs" VALUES('EPSG','9529','SRGI2013 + INAGeoid2020 height',NULL,'EPSG','9470','EPSG','9471',0);
INSERT INTO "usage" VALUES('EPSG','14383','compound_crs','EPSG','9529','EPSG','1122','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9530','RGFG95 + NGG1977 height',NULL,'EPSG','4624','EPSG','5755',0);
INSERT INTO "usage" VALUES('EPSG','14420','compound_crs','EPSG','9530','EPSG','3146','EPSG','1026');
@@ -676,9 +676,9 @@ INSERT INTO "compound_crs" VALUES('EPSG','9536','RGAF09 + IGN 2008 LD height',NU
INSERT INTO "usage" VALUES('EPSG','14484','compound_crs','EPSG','9536','EPSG','2893','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9537','RGAF09 + Martinique 1987 height',NULL,'EPSG','5489','EPSG','5756',0);
INSERT INTO "usage" VALUES('EPSG','14486','compound_crs','EPSG','9537','EPSG','3276','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9538','ETRS89-FRA [RGF93 v2] + NGF-IGN69 height',NULL,'EPSG','9777','EPSG','5720',0);
INSERT INTO "compound_crs" VALUES('EPSG','9538','RGF93 v2 + NGF-IGN69 height',NULL,'EPSG','9777','EPSG','5720',0);
INSERT INTO "usage" VALUES('EPSG','14489','compound_crs','EPSG','9538','EPSG','1326','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9539','ETRS89-FRA [RGF93 v2] + NGF-IGN78 height',NULL,'EPSG','9777','EPSG','5721',0);
INSERT INTO "compound_crs" VALUES('EPSG','9539','RGF93 v2 + NGF-IGN78 height',NULL,'EPSG','9777','EPSG','5721',0);
INSERT INTO "usage" VALUES('EPSG','14490','compound_crs','EPSG','9539','EPSG','1327','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9540','RGNC91-93 + NGNC08 height',NULL,'EPSG','4749','EPSG','9351',0);
INSERT INTO "usage" VALUES('EPSG','14495','compound_crs','EPSG','9540','EPSG','3430','EPSG','1026');
@@ -688,11 +688,11 @@ INSERT INTO "compound_crs" VALUES('EPSG','9542','RRAF 1991 + IGN 2008 LD height'
INSERT INTO "usage" VALUES('EPSG','14501','compound_crs','EPSG','9542','EPSG','2893','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9543','ITRF2005 + SA LLD height',NULL,'EPSG','8998','EPSG','9279',0);
INSERT INTO "usage" VALUES('EPSG','14522','compound_crs','EPSG','9543','EPSG','3309','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9544','NAD83(CSRS)v6 + CGVD2013a(2010) height',NULL,'EPSG','8252','EPSG','9245',0);
INSERT INTO "compound_crs" VALUES('EPSG','9544','NAD83(CSRS)v6 + CGVD2013(CGG2013a) height',NULL,'EPSG','8252','EPSG','9245',0);
INSERT INTO "usage" VALUES('EPSG','14525','compound_crs','EPSG','9544','EPSG','1061','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9656','ETRS89-POL [PL-ETRF2000] + Baltic 1986 height',NULL,'EPSG','9702','EPSG','9650',0);
INSERT INTO "compound_crs" VALUES('EPSG','9656','ETRF2000-PL + Baltic 1986 height',NULL,'EPSG','9702','EPSG','9650',0);
INSERT INTO "usage" VALUES('EPSG','15108','compound_crs','EPSG','9656','EPSG','3293','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','9657','ETRS89-POL [PL-ETRF2000] + PL-EVRF2007 height',NULL,'EPSG','9702','EPSG','9651',0);
INSERT INTO "compound_crs" VALUES('EPSG','9657','ETRF2000-PL + EVRF2007-PL height',NULL,'EPSG','9702','EPSG','9651',0);
INSERT INTO "usage" VALUES('EPSG','15109','compound_crs','EPSG','9657','EPSG','3293','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','9705','WGS 84 + MSL height',NULL,'EPSG','4326','EPSG','5714',0);
INSERT INTO "usage" VALUES('EPSG','15089','compound_crs','EPSG','9705','EPSG','1262','EPSG','1026');
@@ -702,7 +702,7 @@ INSERT INTO "compound_crs" VALUES('EPSG','9711','NAD83(CSRS) / UTM zone 23N + CG
INSERT INTO "usage" VALUES('EPSG','15205','compound_crs','EPSG','9711','EPSG','2153','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','9714','NAD83(CSRS) / UTM zone 24N + CGVD2013 height',NULL,'EPSG','9713','EPSG','6647',0);
INSERT INTO "usage" VALUES('EPSG','15197','compound_crs','EPSG','9714','EPSG','4617','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','9715','NAD83(CSRS) / UTM zone 15N + CGVD2013a(2010) height',NULL,'EPSG','3159','EPSG','9245',0);
INSERT INTO "compound_crs" VALUES('EPSG','9715','NAD83(CSRS) / UTM zone 15N + CGVD2013a height',NULL,'EPSG','3159','EPSG','9245',0);
INSERT INTO "usage" VALUES('EPSG','15200','compound_crs','EPSG','9715','EPSG','3414','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','9723','ETRS89 + Genoa 1942 height',NULL,'EPSG','4258','EPSG','5214',0);
INSERT INTO "usage" VALUES('EPSG','15255','compound_crs','EPSG','9723','EPSG','3736','EPSG','1270');
@@ -716,7 +716,7 @@ INSERT INTO "compound_crs" VALUES('EPSG','9762','ECML14_NB Grid + ODN height',NU
INSERT INTO "usage" VALUES('EPSG','16499','compound_crs','EPSG','9762','EPSG','4621','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','9767','EWR2 Grid + ODN height',NULL,'EPSG','9766','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','16510','compound_crs','EPSG','9767','EPSG','4622','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','9785','ETRS89-FRA [RGF93 v2b] + NGF-IGN69 height',NULL,'EPSG','9782','EPSG','5720',0);
INSERT INTO "compound_crs" VALUES('EPSG','9785','RGF93 v2b + NGF-IGN69 height',NULL,'EPSG','9782','EPSG','5720',0);
INSERT INTO "usage" VALUES('EPSG','16594','compound_crs','EPSG','9785','EPSG','1326','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9870','MRH21 Grid + ODN height',NULL,'EPSG','9869','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','16942','compound_crs','EPSG','9870','EPSG','4652','EPSG','1141');
@@ -752,7 +752,7 @@ INSERT INTO "compound_crs" VALUES('EPSG','9935','DB_REF2016 zone 5',NULL,'EPSG',
INSERT INTO "usage" VALUES('EPSG','17296','compound_crs','EPSG','9935','EPSG','3998','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','9944','EBBWV14 Grid + ODN height',NULL,'EPSG','9943','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','17350','compound_crs','EPSG','9944','EPSG','4661','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','9948','ISN93 + ISH2004 height',NULL,'EPSG','4659','EPSG','8089',0);
INSERT INTO "compound_crs" VALUES('EPSG','9948','ISN93 + ISH2004 height ',NULL,'EPSG','4659','EPSG','8089',0);
INSERT INTO "usage" VALUES('EPSG','17415','compound_crs','EPSG','9948','EPSG','4662','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','9949','ISN2004 + ISH2004 height',NULL,'EPSG','5324','EPSG','8089',0);
INSERT INTO "usage" VALUES('EPSG','17390','compound_crs','EPSG','9949','EPSG','4662','EPSG','1026');
@@ -770,401 +770,5 @@ INSERT INTO "compound_crs" VALUES('EPSG','9973','SCM22 Grid + ODN height',NULL,'
INSERT INTO "usage" VALUES('EPSG','17442','compound_crs','EPSG','9973','EPSG','4665','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','9978','FNL22 Grid + ODN height',NULL,'EPSG','9977','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','17459','compound_crs','EPSG','9978','EPSG','4664','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10156','ETRS89 + MSL UK & Ireland VORF08 depth',NULL,'EPSG','4258','EPSG','10150',0);
INSERT INTO "usage" VALUES('EPSG','18592','compound_crs','EPSG','10156','EPSG','4668','EPSG','1198');
INSERT INTO "compound_crs" VALUES('EPSG','10157','ETRS89 + CD UK & Ireland VORF08 depth',NULL,'EPSG','4258','EPSG','10151',0);
INSERT INTO "usage" VALUES('EPSG','18586','compound_crs','EPSG','10157','EPSG','4668','EPSG','1198');
INSERT INTO "compound_crs" VALUES('EPSG','10162','JGD2024 / Japan Plane Rectangular CS I + JGD2011 (vertical) height',NULL,'EPSG','6669','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18594','compound_crs','EPSG','10162','EPSG','4670','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10163','JGD2024 / Japan Plane Rectangular CS II + JGD2011 (vertical) height',NULL,'EPSG','6670','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18595','compound_crs','EPSG','10163','EPSG','4671','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10164','JGD2024 / Japan Plane Rectangular CS III + JGD2011 (vertical) height',NULL,'EPSG','6671','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18596','compound_crs','EPSG','10164','EPSG','4672','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10165','JGD2024 / Japan Plane Rectangular CS IV + JGD2011 (vertical) height',NULL,'EPSG','6672','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18597','compound_crs','EPSG','10165','EPSG','1857','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10166','JGD2024 / Japan Plane Rectangular CS V + JGD2011 (vertical) height',NULL,'EPSG','6673','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18598','compound_crs','EPSG','10166','EPSG','1858','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10167','JGD2024 / Japan Plane Rectangular CS VI + JGD2011 (vertical) height',NULL,'EPSG','6674','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18600','compound_crs','EPSG','10167','EPSG','1859','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10168','JGD2024 / Japan Plane Rectangular CS VII + JGD2011 (vertical) height',NULL,'EPSG','6675','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18607','compound_crs','EPSG','10168','EPSG','1860','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10169','JGD2024 / Japan Plane Rectangular CS VIII + JGD2011 (vertical) height',NULL,'EPSG','6676','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18601','compound_crs','EPSG','10169','EPSG','4673','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10170','JGD2024 / Japan Plane Rectangular CS IX + JGD2011 (vertical) height',NULL,'EPSG','6677','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18602','compound_crs','EPSG','10170','EPSG','4674','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10171','JGD2024 / Japan Plane Rectangular CS X + JGD2011 (vertical) height',NULL,'EPSG','6678','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18603','compound_crs','EPSG','10171','EPSG','1863','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10172','JGD2024 / Japan Plane Rectangular CS XI + JGD2011 (vertical) height',NULL,'EPSG','6679','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18604','compound_crs','EPSG','10172','EPSG','4675','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10173','JGD2024 / Japan Plane Rectangular CS XII + JGD2011 (vertical) height',NULL,'EPSG','6680','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18605','compound_crs','EPSG','10173','EPSG','4676','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10174','JGD2024 / Japan Plane Rectangular CS XIII + JGD2011 (vertical) height',NULL,'EPSG','6681','EPSG','6695',0);
INSERT INTO "usage" VALUES('EPSG','18606','compound_crs','EPSG','10174','EPSG','1866','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','10184','DoPw22 Grid + ODN height',NULL,'EPSG','10183','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18669','compound_crs','EPSG','10184','EPSG','4686','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10189','ShAb07 Grid + ODN height',NULL,'EPSG','10188','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18668','compound_crs','EPSG','10189','EPSG','4687','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10195','CNH22 Grid + ODN height',NULL,'EPSG','10194','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18698','compound_crs','EPSG','10195','EPSG','4677','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10200','CWS13 Grid + ODN height',NULL,'EPSG','10199','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18707','compound_crs','EPSG','10200','EPSG','4678','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10208','DIBA15 Grid + ODN height',NULL,'EPSG','10207','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18713','compound_crs','EPSG','10208','EPSG','4681','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10213','GWPBS22 Grid + ODN height',NULL,'EPSG','10212','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18723','compound_crs','EPSG','10213','EPSG','4685','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10218','GWWAB22 Grid + ODN height',NULL,'EPSG','10217','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18778','compound_crs','EPSG','10218','EPSG','4684','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10223','GWWWA22 Grid + ODN height',NULL,'EPSG','10222','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18738','compound_crs','EPSG','10223','EPSG','4683','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10228','MALS09 Grid + ODN height',NULL,'EPSG','10227','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18745','compound_crs','EPSG','10228','EPSG','4682','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10236','OxWo08 Grid + ODN height',NULL,'EPSG','10235','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18755','compound_crs','EPSG','10236','EPSG','4680','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10241','SYC20 Grid + ODN height',NULL,'EPSG','10240','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18764','compound_crs','EPSG','10241','EPSG','4679','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10245','ETRS89-SVN [D96] + SVS2010 height',NULL,'EPSG','4765','EPSG','8690',0);
INSERT INTO "usage" VALUES('EPSG','18847','compound_crs','EPSG','10245','EPSG','3307','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10246','ETRS89-SVN [D96] / Slovene National Grid + SVS2010 height',NULL,'EPSG','3794','EPSG','8690',0);
INSERT INTO "usage" VALUES('EPSG','18846','compound_crs','EPSG','10246','EPSG','3307','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10276','SMITB20 Grid + ODN height',NULL,'EPSG','10275','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','19179','compound_crs','EPSG','10276','EPSG','4688','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10281','RBEPP12 Grid + ODN height',NULL,'EPSG','10280','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','19185','compound_crs','EPSG','10281','EPSG','4689','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10293','ETRS89-DEU [ETRS89/DREF91/2016] + DHHN2016 height',NULL,'EPSG','10284','EPSG','7837',0);
INSERT INTO "usage" VALUES('EPSG','19275','compound_crs','EPSG','10293','EPSG','1103','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10318','RGNC15 (lon-lat) + NGNC08 height',NULL,'EPSG','10312','EPSG','9351',0);
INSERT INTO "usage" VALUES('EPSG','19634','compound_crs','EPSG','10318','EPSG','3430','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10355','ETRS89 + Formentera height',NULL,'EPSG','4258','EPSG','10352',0);
INSERT INTO "usage" VALUES('EPSG','19914','compound_crs','EPSG','10355','EPSG','4739','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10356','ETRS89 + Alboran height',NULL,'EPSG','4258','EPSG','10353',0);
INSERT INTO "usage" VALUES('EPSG','19915','compound_crs','EPSG','10356','EPSG','4741','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10357','ETRS89 + Melilla height',NULL,'EPSG','4258','EPSG','10354',0);
INSERT INTO "usage" VALUES('EPSG','19916','compound_crs','EPSG','10357','EPSG','4740','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10365','KGD2002 + KVD1964 height',NULL,'EPSG','4737','EPSG','5193',0);
INSERT INTO "usage" VALUES('EPSG','20149','compound_crs','EPSG','10365','EPSG','3266','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10472','COV23 Grid + ODN height',NULL,'EPSG','10471','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','20315','compound_crs','EPSG','10472','EPSG','4743','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10486','ETRS89 + DVR90(2002) height',NULL,'EPSG','4258','EPSG','10483',0);
INSERT INTO "usage" VALUES('EPSG','20411','compound_crs','EPSG','10486','EPSG','3237','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10487','ETRS89 + DVR90(2013) height',NULL,'EPSG','4258','EPSG','10484',0);
INSERT INTO "usage" VALUES('EPSG','20415','compound_crs','EPSG','10487','EPSG','3237','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10488','ETRS89 + DVR90(2023) height',NULL,'EPSG','4258','EPSG','10485',0);
INSERT INTO "usage" VALUES('EPSG','20414','compound_crs','EPSG','10488','EPSG','3237','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10497','ETRS89-FRA [RGF93 v2] / Lambert-93 + NGF-IGN69 height',NULL,'EPSG','9793','EPSG','5720',0);
INSERT INTO "usage" VALUES('EPSG','20475','compound_crs','EPSG','10497','EPSG','1326','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','10498','ETRS89-FRA [RGF93 v2] / Lambert-93 + NGF-IGN78 height',NULL,'EPSG','9793','EPSG','5721',0);
INSERT INTO "usage" VALUES('EPSG','20473','compound_crs','EPSG','10498','EPSG','1327','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','10499','ETRS89-FRA [RGF93 v2b] / Lambert-93 + NGF-IGN69 height',NULL,'EPSG','9794','EPSG','5720',0);
INSERT INTO "usage" VALUES('EPSG','20472','compound_crs','EPSG','10499','EPSG','1326','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','10500','ETRS89-FRA [RGF93 v2b] / Lambert-93 + NGF-IGN78 height',NULL,'EPSG','9794','EPSG','5721',0);
INSERT INTO "usage" VALUES('EPSG','20476','compound_crs','EPSG','10500','EPSG','1327','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','10507','ETRS89-FRA [RGF93 v2b] + NGF-IGN78 height',NULL,'EPSG','9782','EPSG','5721',0);
INSERT INTO "usage" VALUES('EPSG','20491','compound_crs','EPSG','10507','EPSG','1327','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10545','ETRS89 + Cascais height',NULL,'EPSG','4258','EPSG','5780',0);
INSERT INTO "usage" VALUES('EPSG','20908','compound_crs','EPSG','10545','EPSG','1294','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10553','ETRS89 + DKMSL(2022) depth',NULL,'EPSG','4258','EPSG','10547',0);
INSERT INTO "usage" VALUES('EPSG','21026','compound_crs','EPSG','10553','EPSG','4756','EPSG','1272');
INSERT INTO "compound_crs" VALUES('EPSG','10554','ETRS89 + DKLAT(2022) depth',NULL,'EPSG','4258','EPSG','10548',0);
INSERT INTO "usage" VALUES('EPSG','21027','compound_crs','EPSG','10554','EPSG','4756','EPSG','1272');
INSERT INTO "compound_crs" VALUES('EPSG','10555','ETRS89 + DKMSL(2023) depth',NULL,'EPSG','4258','EPSG','10549',0);
INSERT INTO "usage" VALUES('EPSG','21028','compound_crs','EPSG','10555','EPSG','4756','EPSG','1272');
INSERT INTO "compound_crs" VALUES('EPSG','10556','ETRS89 + DKLAT(2023) depth',NULL,'EPSG','4258','EPSG','10550',0);
INSERT INTO "usage" VALUES('EPSG','21029','compound_crs','EPSG','10556','EPSG','4756','EPSG','1272');
INSERT INTO "compound_crs" VALUES('EPSG','10627','ECML14 Grid + ODN height',NULL,'EPSG','10626','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','21376','compound_crs','EPSG','10627','EPSG','4774','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10633','RGAF09 / UTM zone 20N + Martinique 1987 height',NULL,'EPSG','5490','EPSG','5756',0);
INSERT INTO "usage" VALUES('EPSG','21399','compound_crs','EPSG','10633','EPSG','3276','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','10643','Saba + Saba height',NULL,'EPSG','10636','EPSG','10642',0);
INSERT INTO "usage" VALUES('EPSG','21757','compound_crs','EPSG','10643','EPSG','4757','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10644','BES2020 Saba + Saba height',NULL,'EPSG','10639','EPSG','10642',0);
INSERT INTO "usage" VALUES('EPSG','21716','compound_crs','EPSG','10644','EPSG','4757','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10645','Saba DPnet + Saba height',NULL,'EPSG','10641','EPSG','10642',0);
INSERT INTO "usage" VALUES('EPSG','21872','compound_crs','EPSG','10645','EPSG','4757','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','10651','GR96 + GLMSL(2023) depth',NULL,'EPSG','4747','EPSG','10649',0);
INSERT INTO "usage" VALUES('EPSG','21455','compound_crs','EPSG','10651','EPSG','4776','EPSG','1272');
INSERT INTO "compound_crs" VALUES('EPSG','10652','GR96 + GLLAT(2023) depth',NULL,'EPSG','4747','EPSG','10650',0);
INSERT INTO "usage" VALUES('EPSG','21452','compound_crs','EPSG','10652','EPSG','4776','EPSG','1272');
INSERT INTO "compound_crs" VALUES('EPSG','10659','ETRF2000 + EOMA 1980 height',NULL,'EPSG','9067','EPSG','5787',0);
INSERT INTO "usage" VALUES('EPSG','21613','compound_crs','EPSG','10659','EPSG','1119','EPSG','1181');
INSERT INTO "compound_crs" VALUES('EPSG','10660','HD72 / EOV + EOMA 1980 height',NULL,'EPSG','23700','EPSG','5787',0);
INSERT INTO "usage" VALUES('EPSG','21616','compound_crs','EPSG','10660','EPSG','1119','EPSG','1056');
INSERT INTO "compound_crs" VALUES('EPSG','10679','ETRS89 + BSCD2000 depth',NULL,'EPSG','4258','EPSG','10678',0);
INSERT INTO "usage" VALUES('EPSG','21815','compound_crs','EPSG','10679','EPSG','4779','EPSG','1291');
INSERT INTO "compound_crs" VALUES('EPSG','10686','ETRS89-SVN [D96] + SVS2000 height',NULL,'EPSG','4765','EPSG','5779',0);
INSERT INTO "usage" VALUES('EPSG','21887','compound_crs','EPSG','10686','EPSG','3307','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10687','ETRS89-SVN [D96] / Slovene National Grid + SVS2000 height',NULL,'EPSG','3794','EPSG','5779',0);
INSERT INTO "usage" VALUES('EPSG','21888','compound_crs','EPSG','10687','EPSG','3307','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10691','ETRS89-FIN [EUREF-FIN] + N60 height',NULL,'EPSG','10690','EPSG','5717',0);
INSERT INTO "usage" VALUES('EPSG','21985','compound_crs','EPSG','10691','EPSG','3333','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10692','ETRS89-FIN [EUREF-FIN] + N2000 height',NULL,'EPSG','10690','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','21986','compound_crs','EPSG','10692','EPSG','3333','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10741','Sint Eustatius + Sint Eustatius height',NULL,'EPSG','10736','EPSG','10740',0);
INSERT INTO "usage" VALUES('EPSG','22289','compound_crs','EPSG','10741','EPSG','4788','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10742','BES2020 Sint Eustatius + Sint Eustatius height',NULL,'EPSG','10739','EPSG','10740',0);
INSERT INTO "usage" VALUES('EPSG','22290','compound_crs','EPSG','10742','EPSG','4788','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','10746','Sint Eustatius DPnet short + Sint Eustatius height',NULL,'EPSG','10744','EPSG','10740',0);
INSERT INTO "usage" VALUES('EPSG','22310','compound_crs','EPSG','10746','EPSG','4788','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','10747','Sint Eustatius DPnet long + Sint Eustatius height',NULL,'EPSG','10745','EPSG','10740',0);
INSERT INTO "usage" VALUES('EPSG','22378','compound_crs','EPSG','10747','EPSG','4788','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','10764','Bonaire DPnet + Bonaire height',NULL,'EPSG','10759','EPSG','10763',0);
INSERT INTO "usage" VALUES('EPSG','22379','compound_crs','EPSG','10764','EPSG','3822','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','10765','Bonaire 2004 + Bonaire height',NULL,'EPSG','10762','EPSG','10763',0);
INSERT INTO "usage" VALUES('EPSG','22177','compound_crs','EPSG','10765','EPSG','3822','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10774','ETRS89-FIN [EUREF-FIN] / TM35FIN(E,N) + N2000 height',NULL,'EPSG','3067','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','22245','compound_crs','EPSG','10774','EPSG','3333','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','10826','ETRS89-LVA [LKS-92] + Latvia 2000 height',NULL,'EPSG','4661','EPSG','7700',0);
INSERT INTO "usage" VALUES('EPSG','22632','compound_crs','EPSG','10826','EPSG','3268','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10839','ETRS89-LVA [LKS-2020] + Latvia 2000 height',NULL,'EPSG','10305','EPSG','7700',0);
INSERT INTO "usage" VALUES('EPSG','22700','compound_crs','EPSG','10839','EPSG','3268','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10852','EWR3 Grid + ODN height',NULL,'EPSG','10851','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','22762','compound_crs','EPSG','10852','EPSG','4799','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','10864','WSPG Grid + ODN height',NULL,'EPSG','10863','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','22839','compound_crs','EPSG','10864','EPSG','4801','EPSG','1293');
INSERT INTO "compound_crs" VALUES('EPSG','10865','CGRS93 + Famagusta 1960 height',NULL,'EPSG','6311','EPSG','7446',0);
INSERT INTO "usage" VALUES('EPSG','22850','compound_crs','EPSG','10865','EPSG','3236','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10904','Asse 2025 + Asse 2025 height',NULL,'EPSG','10898','EPSG','10900',0);
INSERT INTO "usage" VALUES('EPSG','23351','compound_crs','EPSG','10904','EPSG','4805','EPSG','1144');
INSERT INTO "compound_crs" VALUES('EPSG','10906','Asse 2025 / Gauss-Kruger zone 4 (E-N) + Asse 2025 height',NULL,'EPSG','10899','EPSG','10900',0);
INSERT INTO "usage" VALUES('EPSG','23114','compound_crs','EPSG','10906','EPSG','4805','EPSG','1144');
INSERT INTO "compound_crs" VALUES('EPSG','10920','CSRN2025 (NAD83 2011) + COH88 2025 (NAVD88) height',NULL,'EPSG','10910','EPSG','10918',0);
INSERT INTO "usage" VALUES('EPSG','23574','compound_crs','EPSG','10920','EPSG','1375','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','10997','ETRS89-GBR [OSNet v2009] + London Survey Grid height',NULL,'EPSG','11009','EPSG','10989',0);
INSERT INTO "usage" VALUES('EPSG','24857','compound_crs','EPSG','10997','EPSG','4822','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','11000','ETRS89-NOR [EUREF89] + SVD2024 height',NULL,'EPSG','10875','EPSG','10999',0);
INSERT INTO "usage" VALUES('EPSG','24134','compound_crs','EPSG','11000','EPSG','4831','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','11006','London Survey Grid 2025',NULL,'EPSG','10995','EPSG','10989',0);
INSERT INTO "usage" VALUES('EPSG','24862','compound_crs','EPSG','11006','EPSG','4822','EPSG','1297');
INSERT INTO "compound_crs" VALUES('EPSG','11120','ETRS89-FRO [2008] + FVR09 height',NULL,'EPSG','11087','EPSG','5317',0);
INSERT INTO "usage" VALUES('EPSG','24403','compound_crs','EPSG','11120','EPSG','3248','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','11158','RGM23 + IGN 2023 Mayotte height',NULL,'EPSG','10671','EPSG','11157',0);
INSERT INTO "usage" VALUES('EPSG','24603','compound_crs','EPSG','11158','EPSG','3340','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','11169','ETRS89-FIN [EUREF-FIN] / GK19FIN + N2000 height',NULL,'EPSG','3873','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24661','compound_crs','EPSG','11169','EPSG','3595','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11170','ETRS89-FIN [EUREF-FIN] / GK20FIN + N2000 height',NULL,'EPSG','3874','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24662','compound_crs','EPSG','11170','EPSG','3596','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11171','ETRS89-FIN [EUREF-FIN] / GK21FIN + N2000 height',NULL,'EPSG','3128','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24664','compound_crs','EPSG','11171','EPSG','3597','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11172','ETRS89-FIN [EUREF-FIN] / GK22FIN + N2000 height',NULL,'EPSG','3876','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24663','compound_crs','EPSG','11172','EPSG','3598','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11173','ETRS89-FIN [EUREF-FIN] / GK23FIN + N2000 height',NULL,'EPSG','3130','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24665','compound_crs','EPSG','11173','EPSG','3599','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11174','ETRS89-FIN [EUREF-FIN] / GK24FIN + N2000 height',NULL,'EPSG','3878','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24995','compound_crs','EPSG','11174','EPSG','3600','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11175','ETRS89-FIN [EUREF-FIN] / GK25FIN + N2000 height',NULL,'EPSG','3879','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24667','compound_crs','EPSG','11175','EPSG','3601','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11176','ETRS89-FIN [EUREF-FIN] / GK26FIN + N2000 height',NULL,'EPSG','3880','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24668','compound_crs','EPSG','11176','EPSG','3099','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11177','ETRS89-FIN [EUREF-FIN] / GK27FIN + N2000 height',NULL,'EPSG','3881','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24669','compound_crs','EPSG','11177','EPSG','3603','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11178','ETRS89-FIN [EUREF-FIN] / GK28FIN + N2000 height',NULL,'EPSG','3882','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24672','compound_crs','EPSG','11178','EPSG','3604','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11179','ETRS89-FIN [EUREF-FIN] / GK29FIN + N2000 height',NULL,'EPSG','3883','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24676','compound_crs','EPSG','11179','EPSG','3605','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11180','ETRS89-FIN [EUREF-FIN] / GK30FIN + N2000 height',NULL,'EPSG','3884','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24674','compound_crs','EPSG','11180','EPSG','3606','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11181','ETRS89-FIN [EUREF-FIN] / GK31FIN + N2000 height',NULL,'EPSG','3885','EPSG','3900',0);
INSERT INTO "usage" VALUES('EPSG','24675','compound_crs','EPSG','11181','EPSG','3607','EPSG','1055');
INSERT INTO "compound_crs" VALUES('EPSG','11274','SRGI2013 epoch 2021.0 + INAGeoid2020 v2 height',NULL,'EPSG','11033','EPSG','20036',0);
INSERT INTO "usage" VALUES('EPSG','24984','compound_crs','EPSG','11274','EPSG','1122','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11311','ETRS89-CZE [2007] + Baltic 1957 height',NULL,'EPSG','11070','EPSG','8357',0);
INSERT INTO "usage" VALUES('EPSG','25104','compound_crs','EPSG','11311','EPSG','1079','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11312','ETRS89-SVK [SKTRF09] + Baltic 1957 height',NULL,'EPSG','11076','EPSG','8357',0);
INSERT INTO "usage" VALUES('EPSG','25093','compound_crs','EPSG','11312','EPSG','1211','EPSG','1203');
INSERT INTO "compound_crs" VALUES('EPSG','11314','ETRS89-SVK [SKTRF09] + EVRF2007 height',NULL,'EPSG','11076','EPSG','5621',0);
INSERT INTO "usage" VALUES('EPSG','25103','compound_crs','EPSG','11314','EPSG','1211','EPSG','1161');
INSERT INTO "compound_crs" VALUES('EPSG','11318','JGD2024 + JGD2024 (vertical) height',NULL,'EPSG','6668','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25579','compound_crs','EPSG','11318','EPSG','1129','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','11319','JGD2024 / Japan Plane Rectangular CS I + JGD2024 (vertical) height',NULL,'EPSG','6669','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25737','compound_crs','EPSG','11319','EPSG','1854','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11320','JGD2024 / Japan Plane Rectangular CS II + JGD2024 (vertical) height',NULL,'EPSG','6670','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25738','compound_crs','EPSG','11320','EPSG','1855','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11321','JGD2024 / Japan Plane Rectangular CS III + JGD2024 (vertical) height',NULL,'EPSG','6671','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25739','compound_crs','EPSG','11321','EPSG','1856','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11322','JGD2024 / Japan Plane Rectangular CS IV + JGD2024 (vertical) height',NULL,'EPSG','6672','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25582','compound_crs','EPSG','11322','EPSG','1857','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11323','JGD2024 / Japan Plane Rectangular CS V + JGD2024 (vertical) height',NULL,'EPSG','6673','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25586','compound_crs','EPSG','11323','EPSG','1858','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11324','JGD2024 / Japan Plane Rectangular CS VI + JGD2024 (vertical) height',NULL,'EPSG','6674','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25587','compound_crs','EPSG','11324','EPSG','1859','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11325','JGD2024 / Japan Plane Rectangular CS VII + JGD2024 (vertical) height',NULL,'EPSG','6675','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25588','compound_crs','EPSG','11325','EPSG','1860','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11326','JGD2024 / Japan Plane Rectangular CS VIII + JGD2024 (vertical) height',NULL,'EPSG','6676','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25740','compound_crs','EPSG','11326','EPSG','1861','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11327','JGD2024 / Japan Plane Rectangular CS IX + JGD2024 (vertical) height',NULL,'EPSG','6677','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25741','compound_crs','EPSG','11327','EPSG','1862','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11328','JGD2024 / Japan Plane Rectangular CS X + JGD2024 (vertical) height',NULL,'EPSG','6678','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25591','compound_crs','EPSG','11328','EPSG','1863','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11329','JGD2024 / Japan Plane Rectangular CS XI + JGD2024 (vertical) height',NULL,'EPSG','6679','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25742','compound_crs','EPSG','11329','EPSG','1864','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11330','JGD2024 / Japan Plane Rectangular CS XII + JGD2024 (vertical) height',NULL,'EPSG','6680','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25743','compound_crs','EPSG','11330','EPSG','1865','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11333','JGD2024 / Japan Plane Rectangular CS XIII + JGD2024 (vertical) height',NULL,'EPSG','6681','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25594','compound_crs','EPSG','11333','EPSG','1866','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11336','JGD2024 / Japan Plane Rectangular CS XIV + JGD2024 (vertical) height',NULL,'EPSG','6682','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25676','compound_crs','EPSG','11336','EPSG','1867','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11383','DrukRef23 + Bhutan Vertical Datum 2022 height',NULL,'EPSG','11226','EPSG','11338',0);
INSERT INTO "usage" VALUES('EPSG','25561','compound_crs','EPSG','11383','EPSG','1048','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','11385','Mexico ITRF2008 + NAVD88 height',NULL,'EPSG','6365','EPSG','5703',0);
INSERT INTO "usage" VALUES('EPSG','25372','compound_crs','EPSG','11385','EPSG','3278','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','11399','ETRS89-NOR [EUREF89] + NN2000:2025 height',NULL,'EPSG','10875','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25499','compound_crs','EPSG','11399','EPSG','1352','EPSG','1027');
INSERT INTO "compound_crs" VALUES('EPSG','11400','ETRS89-NOR [EUREF89] / UTM zone 31N + NN2000:2025 height',NULL,'EPSG','11021','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25505','compound_crs','EPSG','11400','EPSG','3636','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','11403','ETRS89-NOR [EUREF89] / UTM zone 32N + NN2000:2025 height',NULL,'EPSG','11022','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25506','compound_crs','EPSG','11403','EPSG','4066','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','11404','ETRS89-NOR [EUREF89] / UTM zone 33N + NN2000:2025 height',NULL,'EPSG','11023','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25511','compound_crs','EPSG','11404','EPSG','4067','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','11405','ETRS89-NOR [EUREF89] / UTM zone 34N + NN2000:2025 height',NULL,'EPSG','11024','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25512','compound_crs','EPSG','11405','EPSG','4068','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','11406','ETRS89-NOR [EUREF89] / UTM zone 35N + NN2000:2025 height',NULL,'EPSG','11025','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25513','compound_crs','EPSG','11406','EPSG','4069','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','11407','ETRS89-NOR [EUREF89] / UTM zone 36N + NN2000:2025 height',NULL,'EPSG','11026','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25514','compound_crs','EPSG','11407','EPSG','3676','EPSG','1153');
INSERT INTO "compound_crs" VALUES('EPSG','11408','ETRS89-NOR [EUREF89] / NTM zone 8 + NN2000:2025 height',NULL,'EPSG','5108','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25524','compound_crs','EPSG','11408','EPSG','3648','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11409','ETRS89-NOR [EUREF89] / NTM zone 9 + NN2000:2025 height',NULL,'EPSG','5109','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25525','compound_crs','EPSG','11409','EPSG','3649','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11410','ETRS89-NOR [EUREF89] / NTM zone 10 + NN2000:2025 height',NULL,'EPSG','5110','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25526','compound_crs','EPSG','11410','EPSG','3650','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11411','ETRS89-NOR [EUREF89] / NTM zone 11 + NN2000:2025 height',NULL,'EPSG','5111','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25527','compound_crs','EPSG','11411','EPSG','3651','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11412','ETRS89-NOR [EUREF89] / NTM zone 12 + NN2000:2025 height',NULL,'EPSG','5112','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25528','compound_crs','EPSG','11412','EPSG','3653','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11413','ETRS89-NOR [EUREF89] / NTM zone 13 + NN2000:2025 height',NULL,'EPSG','5113','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25529','compound_crs','EPSG','11413','EPSG','3654','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11414','ETRS89-NOR [EUREF89] / NTM zone 14 + NN2000:2025 height',NULL,'EPSG','5114','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25548','compound_crs','EPSG','11414','EPSG','3655','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11415','ETRS89-NOR [EUREF89] / NTM zone 15 + NN2000:2025 height',NULL,'EPSG','5115','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25531','compound_crs','EPSG','11415','EPSG','3656','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11416','ETRS89-NOR [EUREF89] / NTM zone 16 + NN2000:2025 height',NULL,'EPSG','5116','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25532','compound_crs','EPSG','11416','EPSG','3657','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11417','ETRS89-NOR [EUREF89] / NTM zone 17 + NN2000:2025 height',NULL,'EPSG','5117','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25533','compound_crs','EPSG','11417','EPSG','3658','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11418','ETRS89-NOR [EUREF89] / NTM zone 18 + NN2000:2025 height',NULL,'EPSG','5118','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25534','compound_crs','EPSG','11418','EPSG','3660','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11419','ETRS89-NOR [EUREF89] / NTM zone 19 + NN2000:2025 height',NULL,'EPSG','5119','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25535','compound_crs','EPSG','11419','EPSG','3661','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11420','ETRS89-NOR [EUREF89] / NTM zone 20 + NN2000:2025 height',NULL,'EPSG','5120','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25536','compound_crs','EPSG','11420','EPSG','3662','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11421','ETRS89-NOR [EUREF89] / NTM zone 21 + NN2000:2025 height',NULL,'EPSG','5121','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25538','compound_crs','EPSG','11421','EPSG','3663','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11422','ETRS89-NOR [EUREF89] / NTM zone 22 + NN2000:2025 height',NULL,'EPSG','5122','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25539','compound_crs','EPSG','11422','EPSG','3665','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11423','ETRS89-NOR [EUREF89] / NTM zone 23 + NN2000:2025 height',NULL,'EPSG','5123','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25540','compound_crs','EPSG','11423','EPSG','3667','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11424','ETRS89-NOR [EUREF89] / NTM zone 24 + NN2000:2025 height',NULL,'EPSG','5124','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25541','compound_crs','EPSG','11424','EPSG','3668','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11425','ETRS89-NOR [EUREF89] / NTM zone 25 + NN2000:2025 height',NULL,'EPSG','5125','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25542','compound_crs','EPSG','11425','EPSG','3669','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11426','ETRS89-NOR [EUREF89] / NTM zone 26 + NN2000:2025 height',NULL,'EPSG','5126','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25543','compound_crs','EPSG','11426','EPSG','3671','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11427','ETRS89-NOR [EUREF89] / NTM zone 27 + NN2000:2025 height',NULL,'EPSG','5127','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25544','compound_crs','EPSG','11427','EPSG','3672','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11428','ETRS89-NOR [EUREF89] / NTM zone 28 + NN2000:2025 height',NULL,'EPSG','5128','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25545','compound_crs','EPSG','11428','EPSG','3673','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11429','ETRS89-NOR [EUREF89] / NTM zone 29 + NN2000:2025 height',NULL,'EPSG','5129','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25546','compound_crs','EPSG','11429','EPSG','3674','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11430','ETRS89-NOR [EUREF89] / NTM zone 30 + NN2000:2025 height',NULL,'EPSG','5130','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25547','compound_crs','EPSG','11430','EPSG','3676','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11434','JGD2024 / Japan Plane Rectangular CS XV + JGD2024 (vertical) height',NULL,'EPSG','6683','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25677','compound_crs','EPSG','11434','EPSG','1868','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11435','ETRS89-NOR [EUREF89] / NTM zone 5 + NN2000:2025 height',NULL,'EPSG','5105','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25550','compound_crs','EPSG','11435','EPSG','3636','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11436','ETRS89-NOR [EUREF89] / NTM zone 6 + NN2000:2025 height',NULL,'EPSG','5106','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25551','compound_crs','EPSG','11436','EPSG','3639','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11437','ETRS89-NOR [EUREF89] / NTM zone 7 + NN2000:2025 height',NULL,'EPSG','5107','EPSG','11394',0);
INSERT INTO "usage" VALUES('EPSG','25552','compound_crs','EPSG','11437','EPSG','3647','EPSG','1029');
INSERT INTO "compound_crs" VALUES('EPSG','11442','JGD2024 / Japan Plane Rectangular CS XVI + JGD2024 (vertical) height',NULL,'EPSG','6684','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25678','compound_crs','EPSG','11442','EPSG','1869','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11443','JGD2024 / Japan Plane Rectangular CS XVII + JGD2024 (vertical) height',NULL,'EPSG','6685','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25679','compound_crs','EPSG','11443','EPSG','1870','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11444','JGD2024 / Japan Plane Rectangular CS XVIII + JGD2024 (vertical) height',NULL,'EPSG','6686','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25680','compound_crs','EPSG','11444','EPSG','1871','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11445','JGD2024 / Japan Plane Rectangular CS XIX + JGD2024 (vertical) height',NULL,'EPSG','6687','EPSG','11317',0);
INSERT INTO "usage" VALUES('EPSG','25682','compound_crs','EPSG','11445','EPSG','1872','EPSG','1092');
INSERT INTO "compound_crs" VALUES('EPSG','11447','RGWF96 + NGFA 2022 height',NULL,'EPSG','8900','EPSG','11446',0);
INSERT INTO "usage" VALUES('EPSG','25698','compound_crs','EPSG','11447','EPSG','4855','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11452','GR96 + GLLAT(2025) depth',NULL,'EPSG','4747','EPSG','11450',0);
INSERT INTO "usage" VALUES('EPSG','25756','compound_crs','EPSG','11452','EPSG','4776','EPSG','1272');
INSERT INTO "compound_crs" VALUES('EPSG','11453','GR96 + GLMSL(2025) depth',NULL,'EPSG','4747','EPSG','11451',0);
INSERT INTO "usage" VALUES('EPSG','25757','compound_crs','EPSG','11453','EPSG','4776','EPSG','1272');
INSERT INTO "compound_crs" VALUES('EPSG','11460','NZGD2000 / New Zealand Transverse Mercator 2000 + NZVD2016 height',NULL,'EPSG','2193','EPSG','7839',0);
INSERT INTO "usage" VALUES('EPSG','25773','compound_crs','EPSG','11460','EPSG','3973','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11465','Dart+26 Grid + Malin Head height',NULL,'EPSG','11464','EPSG','5731',0);
INSERT INTO "usage" VALUES('EPSG','26016','compound_crs','EPSG','11465','EPSG','4858','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','11470','SZCTW Grid + ODN height',NULL,'EPSG','11469','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','26034','compound_crs','EPSG','11470','EPSG','4863','EPSG','1144');
INSERT INTO "compound_crs" VALUES('EPSG','11484','ETRS89-NLD [AGRS2010] + NAP height',NULL,'EPSG','11037','EPSG','5709',0);
INSERT INTO "usage" VALUES('EPSG','26361','compound_crs','EPSG','11484','EPSG','1172','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11499','ETRS89-GBR [OSNet v2009] + Douglas height',NULL,'EPSG','11009','EPSG','5750',0);
INSERT INTO "usage" VALUES('EPSG','26674','compound_crs','EPSG','11499','EPSG','2803','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11500','ETRS89-AUT [2002] + EVRF2000 Austria height',NULL,'EPSG','11057','EPSG','9274',0);
INSERT INTO "usage" VALUES('EPSG','26469','compound_crs','EPSG','11500','EPSG','1037','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11511','ETRS89-GBR [OSNet v2009] + Lerwick height',NULL,'EPSG','11009','EPSG','5742',0);
INSERT INTO "usage" VALUES('EPSG','26689','compound_crs','EPSG','11511','EPSG','2795','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11512','ETRS89-BEL [BEREF2011] + Ostend height',NULL,'EPSG','11215','EPSG','5710',0);
INSERT INTO "usage" VALUES('EPSG','26499','compound_crs','EPSG','11512','EPSG','1347','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11533','ETRS89-HUN [ETRF2000] + EOMA 1980 height',NULL,'EPSG','11163','EPSG','5787',0);
INSERT INTO "usage" VALUES('EPSG','26974','compound_crs','EPSG','11533','EPSG','1119','EPSG','1181');
INSERT INTO "compound_crs" VALUES('EPSG','11558','ETRS89-NOR [EUREF89] + NN2000:2018 height',NULL,'EPSG','10875','EPSG','5941',0);
INSERT INTO "usage" VALUES('EPSG','26583','compound_crs','EPSG','11558','EPSG','1352','EPSG','1027');
INSERT INTO "compound_crs" VALUES('EPSG','11560','ETRS89-NOR [EUREF89] + NN54 height',NULL,'EPSG','10875','EPSG','5776',0);
INSERT INTO "usage" VALUES('EPSG','26863','compound_crs','EPSG','11560','EPSG','1352','EPSG','1027');
INSERT INTO "compound_crs" VALUES('EPSG','11563','ETRS89-NOR [EUREF89] + SVD2006 height',NULL,'EPSG','10875','EPSG','20000',0);
INSERT INTO "usage" VALUES('EPSG','26599','compound_crs','EPSG','11563','EPSG','4860','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11565','ETRS89-NOR [EUREF89] + CD Norway depth',NULL,'EPSG','10875','EPSG','9672',0);
INSERT INTO "usage" VALUES('EPSG','26602','compound_crs','EPSG','11565','EPSG','4656','EPSG','1198');
INSERT INTO "compound_crs" VALUES('EPSG','11579','ETRS89-PRT [1995] + Cascais height',NULL,'EPSG','11108','EPSG','5780',0);
INSERT INTO "usage" VALUES('EPSG','26626','compound_crs','EPSG','11579','EPSG','1294','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11584','ETRS89-ESP [REGENTE] + Alboran height',NULL,'EPSG','11134','EPSG','10353',0);
INSERT INTO "usage" VALUES('EPSG','26632','compound_crs','EPSG','11584','EPSG','4741','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11585','ETRS89-ESP [REGENTE] + Alicante height',NULL,'EPSG','11134','EPSG','5782',0);
INSERT INTO "usage" VALUES('EPSG','26633','compound_crs','EPSG','11585','EPSG','4188','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11586','ETRS89-ESP [REGENTE] + Ceuta 2 height',NULL,'EPSG','11134','EPSG','9402',0);
INSERT INTO "usage" VALUES('EPSG','26634','compound_crs','EPSG','11586','EPSG','4590','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11587','ETRS89-ESP [REGENTE] + Formentera height',NULL,'EPSG','11134','EPSG','10352',0);
INSERT INTO "usage" VALUES('EPSG','26635','compound_crs','EPSG','11587','EPSG','4739','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11588','ETRS89-ESP [REGENTE] + Ibiza height',NULL,'EPSG','11134','EPSG','9394',0);
INSERT INTO "usage" VALUES('EPSG','26636','compound_crs','EPSG','11588','EPSG','4604','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11589','ETRS89-ESP [REGENTE] + Mallorca height',NULL,'EPSG','11134','EPSG','9392',0);
INSERT INTO "usage" VALUES('EPSG','26740','compound_crs','EPSG','11589','EPSG','4602','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11590','ETRS89-ESP [REGENTE] + Melilla height',NULL,'EPSG','11134','EPSG','10354',0);
INSERT INTO "usage" VALUES('EPSG','26638','compound_crs','EPSG','11590','EPSG','4740','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11591','ETRS89-ESP [REGENTE] + Menorca height',NULL,'EPSG','11134','EPSG','9393',0);
INSERT INTO "usage" VALUES('EPSG','26639','compound_crs','EPSG','11591','EPSG','4603','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11819','ETRS89-GBR [OSNet v2009] + ODN height',NULL,'EPSG','11009','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','26690','compound_crs','EPSG','11819','EPSG','2792','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11820','ETRS89-GBR [OSNet v2009] + ODN Orkney height',NULL,'EPSG','11009','EPSG','5740',0);
INSERT INTO "usage" VALUES('EPSG','26691','compound_crs','EPSG','11820','EPSG','2793','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11821','ETRS89-GBR [OSNet v2009] + St. Marys height',NULL,'EPSG','11009','EPSG','5749',0);
INSERT INTO "usage" VALUES('EPSG','26692','compound_crs','EPSG','11821','EPSG','2802','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11822','ETRS89-GBR [OSNet v2009] + Stornoway height',NULL,'EPSG','11009','EPSG','5746',0);
INSERT INTO "usage" VALUES('EPSG','26693','compound_crs','EPSG','11822','EPSG','2799','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','11895','MAGNA-SIRGAS 2018 + COLGVD2023 height',NULL,'EPSG','20046','EPSG','11513',0);
INSERT INTO "usage" VALUES('EPSG','26871','compound_crs','EPSG','11895','EPSG','3229','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','12209','RGM23 / UTM zone 38S + IGN 2023 Mayotte height',NULL,'EPSG','10674','EPSG','11157',0);
INSERT INTO "usage" VALUES('EPSG','26939','compound_crs','EPSG','12209','EPSG','3340','EPSG','1178');
INSERT INTO "compound_crs" VALUES('EPSG','12215','ETRS89-NLD [AGRS2010] + LAT-NLD depth',NULL,'EPSG','11037','EPSG','9287',0);
INSERT INTO "usage" VALUES('EPSG','27152','compound_crs','EPSG','12215','EPSG','4859','EPSG','1198');
INSERT INTO "compound_crs" VALUES('EPSG','12216','ETRS89-NLD [AGRS2010] + MSL-NLD depth',NULL,'EPSG','11037','EPSG','9288',0);
INSERT INTO "usage" VALUES('EPSG','27151','compound_crs','EPSG','12216','EPSG','4859','EPSG','1265');
INSERT INTO "compound_crs" VALUES('EPSG','12229','ETRS89-IRE [ETRF2000] + Malin Head height',NULL,'EPSG','4173','EPSG','5731',0);
INSERT INTO "usage" VALUES('EPSG','27135','compound_crs','EPSG','12229','EPSG','1305','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','12230','ETRS89-IRE [ETRF2000] + Belfast height',NULL,'EPSG','4173','EPSG','5732',0);
INSERT INTO "usage" VALUES('EPSG','27133','compound_crs','EPSG','12230','EPSG','2530','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','12245','ETRS89-ITA [RDN2008] + Genoa 1942 height',NULL,'EPSG','6706','EPSG','5214',0);
INSERT INTO "usage" VALUES('EPSG','27140','compound_crs','EPSG','12245','EPSG','3736','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','12248','ETRS89-ITA [RDN2008] + Cagliari 1956 height',NULL,'EPSG','6706','EPSG','9722',0);
INSERT INTO "usage" VALUES('EPSG','27143','compound_crs','EPSG','12248','EPSG','2339','EPSG','1270');
INSERT INTO "compound_crs" VALUES('EPSG','12293','ETRS89-BEL [BEREF2011] / Belgian Lambert 2008 + Ostend height',NULL,'EPSG','11219','EPSG','5710',0);
INSERT INTO "usage" VALUES('EPSG','27423','compound_crs','EPSG','12293','EPSG','1347','EPSG','1142');
INSERT INTO "compound_crs" VALUES('EPSG','20001','ETRS89 + SVD2006 height',NULL,'EPSG','4258','EPSG','20000',0);
INSERT INTO "usage" VALUES('EPSG','17956','compound_crs','EPSG','20001','EPSG','4860','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','20003','MWC18 Grid + ODN height',NULL,'EPSG','20002','EPSG','5701',0);
INSERT INTO "usage" VALUES('EPSG','18337','compound_crs','EPSG','20003','EPSG','4666','EPSG','1141');
INSERT INTO "compound_crs" VALUES('EPSG','20037','NAD83(CSRS)v4 + CGVD2013a(2002) height',NULL,'EPSG','8246','EPSG','20034',0);
INSERT INTO "usage" VALUES('EPSG','18294','compound_crs','EPSG','20037','EPSG','1061','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','20038','NAD83(CSRS)v3 + CGVD2013a(1997) height',NULL,'EPSG','8240','EPSG','20035',0);
INSERT INTO "usage" VALUES('EPSG','18314','compound_crs','EPSG','20038','EPSG','1061','EPSG','1026');
INSERT INTO "compound_crs" VALUES('EPSG','20043','SRGI2013 + INAGeoid2020 v2 height',NULL,'EPSG','9470','EPSG','20036',0);
INSERT INTO "usage" VALUES('EPSG','18441','compound_crs','EPSG','20043','EPSG','1122','EPSG','1026');
INSERT INTO "usage" VALUES('EPSG','17956','compound_crs','EPSG','20001','EPSG','4058','EPSG','1026');
+15 -151
View File
@@ -7,8 +7,8 @@ INSERT INTO "usage" VALUES('EPSG','9014','concatenated_operation','EPSG','3966',
INSERT INTO "concatenated_operation" VALUES('EPSG','4435','Puerto Rico to NAD83(HARN) (1)','Accuracy 0.1m at 67% confidence level. May be taken as approximate transformation Puerto Rico to WGS 84 - see code 8583.','EPSG','4139','EPSG','4152',0.08,'NGS-PRVI',0);
INSERT INTO "usage" VALUES('EPSG','9074','concatenated_operation','EPSG','4435','EPSG','3634','EPSG','1031');
INSERT INTO "concatenated_operation" VALUES('EPSG','4837','Amersfoort to ED50 (1)','Adopted by NAM in 2006, replacing polynomial tfms 1046, 6304, 1050 and 6306.','EPSG','4289','EPSG','4230',1.5,'NAM-Nld 2006',0);
INSERT INTO "usage" VALUES('EPSG','9130','concatenated_operation','EPSG','4837','EPSG','1172','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','5190','Tokyo 1892 to KGD2002 (1)','','EPSG','5132','EPSG','4737',1.0,'OGP-Kor',0);
INSERT INTO "usage" VALUES('EPSG','9130','concatenated_operation','EPSG','4837','EPSG','1275','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','5190','Tokyo 1892 to Korea 2000 (1)','','EPSG','5132','EPSG','4737',1.0,'OGP-Kor',0);
INSERT INTO "usage" VALUES('EPSG','9275','concatenated_operation','EPSG','5190','EPSG','3266','EPSG','1050');
INSERT INTO "concatenated_operation" VALUES('EPSG','5192','Tokyo 1892 to WGS 84 (1)','','EPSG','5132','EPSG','4326',1.0,'OGP-Kor',0);
INSERT INTO "usage" VALUES('EPSG','9277','concatenated_operation','EPSG','5192','EPSG','3266','EPSG','1050');
@@ -20,17 +20,17 @@ INSERT INTO "concatenated_operation" VALUES('EPSG','5242','S-JTSK (Ferro) to WGS
INSERT INTO "usage" VALUES('EPSG','9314','concatenated_operation','EPSG','5242','EPSG','1079','EPSG','1252');
INSERT INTO "concatenated_operation" VALUES('EPSG','5838','Lisbon (Lisbon) to WGS 84 (2)','','EPSG','4803','EPSG','4326',2.0,'OGP-Prt 2009',0);
INSERT INTO "usage" VALUES('EPSG','9511','concatenated_operation','EPSG','5838','EPSG','1294','EPSG','1042');
INSERT INTO "concatenated_operation" VALUES('EPSG','6714','Tokyo to JGD2024 (1)','See Tokyo to JGD2024 (2) (code 6740) for areas other than northern Honshu. On adoption of JGD2024 (vertical) with effect from 1st April 2025, the name of the target CRS was changed from JGD2011 to JGD2024; there is no change of definition or of coordinate values.','EPSG','4301','EPSG','6668',0.3,'OGP-Jpn N Honshu',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','6714','Tokyo to JGD2011 (1)','See Tokyo to JGD2011 (2) (code 6740) for areas other than northern Honshu.','EPSG','4301','EPSG','6668',0.3,'OGP-Jpn N Honshu',0);
INSERT INTO "usage" VALUES('EPSG','9742','concatenated_operation','EPSG','6714','EPSG','4170','EPSG','1142');
INSERT INTO "concatenated_operation" VALUES('EPSG','6739','NAD27 to NAD83(HARN) (22)','May be taken as approximate transformation NAD27 to WGS 84 - see code 8622.','EPSG','4267','EPSG','4152',0.2,'NGS-Usa SD',0);
INSERT INTO "usage" VALUES('EPSG','9755','concatenated_operation','EPSG','6739','EPSG','1410','EPSG','1032');
INSERT INTO "concatenated_operation" VALUES('EPSG','6874','Tananarive (Paris) to WGS 84 (2)','Used by OMV.','EPSG','4810','EPSG','4326',3.0,'OGP-Mdg',0);
INSERT INTO "usage" VALUES('EPSG','9803','concatenated_operation','EPSG','6874','EPSG','3273','EPSG','1043');
INSERT INTO "concatenated_operation" VALUES('EPSG','7811','NTF (Paris) to ETRS89-FRA [RGF93 v1] (2)','Second step is an emulation (using the NTv2 method) of the geocentric interpolation method described in CT code 9337. Note that the grid file parameters are of opposite sign.','EPSG','4807','EPSG','4171',1.0,'IOGP-Fra NTv2',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','7811','NTF (Paris) to RGF93 v1 (2)','Second step is an emulation (using the NTv2 method) of the geocentric interpolation method described in CT code 9337. Note that the grid file parameters are of opposite sign.','EPSG','4807','EPSG','4171',1.0,'IOGP-Fra NTv2',0);
INSERT INTO "usage" VALUES('EPSG','10276','concatenated_operation','EPSG','7811','EPSG','3694','EPSG','1041');
INSERT INTO "concatenated_operation" VALUES('EPSG','7965','Poolbeg height (ft(Br36)) to Malin Head height (1)','','EPSG','5754','EPSG','5731',0.1,'EPSG-Ire',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','7965','Poolbeg height (ft(Br36)) to Malin Head height (1)','','EPSG','5754','EPSG','5731',0.1,'1',0);
INSERT INTO "usage" VALUES('EPSG','10349','concatenated_operation','EPSG','7965','EPSG','1305','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','7967','Poolbeg height (ft(Br36)) to Belfast height (1)','','EPSG','5754','EPSG','5732',0.1,'EPSG-Ire',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','7967','Poolbeg height (ft(Br36)) to Belfast height (1)','','EPSG','5754','EPSG','5732',0.1,'1',0);
INSERT INTO "usage" VALUES('EPSG','10351','concatenated_operation','EPSG','7967','EPSG','2530','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','7973','NGVD29 height (ftUS) to NAVD88 height (1)','','EPSG','5702','EPSG','5703',0.02,'IOGP - US Conus W',0);
INSERT INTO "usage" VALUES('EPSG','10356','concatenated_operation','EPSG','7973','EPSG','2950','EPSG','1099');
@@ -95,7 +95,7 @@ INSERT INTO "concatenated_operation" VALUES('EPSG','8245','NAD27 to WGS 84 (26)'
INSERT INTO "usage" VALUES('EPSG','10450','concatenated_operation','EPSG','8245','EPSG','1061','EPSG','1252');
INSERT INTO "concatenated_operation" VALUES('EPSG','8263','MGI (Ferro) to WGS 84 (1)','Accuracy estimate is not available.','EPSG','4805','EPSG','4326',NULL,'DMA-balk',1);
INSERT INTO "usage" VALUES('EPSG','10458','concatenated_operation','EPSG','8263','EPSG','2370','EPSG','1160');
INSERT INTO "concatenated_operation" VALUES('EPSG','8363','ETRS89 + Baltic 1957 height to ETRS89 + EVRF2007 height (1)','Recommended method for transforming coordinates between Baltic 1957 height and EVRF2007 height and vice-versa in Slovakia. Compound transformation using two separate quasigeoid models (DVRM05 and DMQSK2014E).','EPSG','8360','EPSG','7423',0.05,'UGKK-Svk',1);
INSERT INTO "concatenated_operation" VALUES('EPSG','8363','ETRS89 + Baltic 1957 height to ETRS89 + EVRF2007 height (1)','Recommended method for transforming coordinates between Baltic 1957 height and EVRF2007 height and vice-versa in Slovakia. Compound transformation using two separate quasigeoid models (DVRM05 and DMQSK2014E).','EPSG','8360','EPSG','7423',0.05,'UGKK-Svk',0);
INSERT INTO "usage" VALUES('EPSG','10510','concatenated_operation','EPSG','8363','EPSG','1211','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','8386','Old Hawaiian to WGS 84 (1)','Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.','EPSG','4135','EPSG','4326',NULL,'EPSG-Usa Hi',1);
INSERT INTO "usage" VALUES('EPSG','10523','concatenated_operation','EPSG','8386','EPSG','1334','EPSG','1252');
@@ -371,9 +371,9 @@ INSERT INTO "concatenated_operation" VALUES('EPSG','8631','Garoua to WGS 84 (1)'
INSERT INTO "usage" VALUES('EPSG','10723','concatenated_operation','EPSG','8631','EPSG','2590','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','8632','Kousseri to WGS 84 (1)','','EPSG','4198','EPSG','4326',6.0,'EPSG-Cmr',0);
INSERT INTO "usage" VALUES('EPSG','10724','concatenated_operation','EPSG','8632','EPSG','2591','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','8633','Yoff to WGS 84 (1)','Derived via WGS72. Can be used as a single position vector transformation with parameter values of dX = -37 m, dY = +157 m, dZ = +89.5 m, rX = rY = 0 sec, rZ = 0.554 sec, dS = 0.219 ppm','EPSG','4310','EPSG','4326',26.0,'EPSG-SEN',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','8633','Yoff to WGS 84 (1)','Derived via WGS72. Can be used as a single positon vector transformation with parameter vaues of dX = -37 m, dY = +157 m, dZ = +89.5 m, rX = rY = 0 sec, rZ = 0.554 sec, dS = 0.219 ppm','EPSG','4310','EPSG','4326',26.0,'EPSG-SEN',0);
INSERT INTO "usage" VALUES('EPSG','10725','concatenated_operation','EPSG','8633','EPSG','1207','EPSG','1160');
INSERT INTO "concatenated_operation" VALUES('EPSG','8634','Beduaram to WGS 84 (1)','Derived via WGS72BE. Can be used as a single position vector transformation with parameter values of dX = -101 m, dY = -111 m, dZ = +188.9 m, rX = rY = 0 sec, rZ = 0.814 sec, dS = -0.38 ppm','EPSG','4213','EPSG','4326',16.0,'ELF-Ner SE',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','8634','Beduaram to WGS 84 (1)','Derived via WGS72BE. Can be used as a single positon vector transformation with parameter vaues of dX = -101 m, dY = -111 m, dZ = +188.9 m, rX = rY = 0 sec, rZ = 0.814 sec, dS = -0.38 ppm','EPSG','4213','EPSG','4326',16.0,'ELF-Ner SE',0);
INSERT INTO "usage" VALUES('EPSG','10726','concatenated_operation','EPSG','8634','EPSG','2771','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','8635','NAD27 to NAD83(CSRS) (3)','Can be taken as an approximate transformation NAD27 to WGS 84 - see code 8585.','EPSG','4267','EPSG','4617',2.5,'EPSG-Can AB',1);
INSERT INTO "usage" VALUES('EPSG','10727','concatenated_operation','EPSG','8635','EPSG','2376','EPSG','1151');
@@ -411,47 +411,21 @@ INSERT INTO "concatenated_operation" VALUES('EPSG','8651','Vientiane 1982 to WGS
INSERT INTO "usage" VALUES('EPSG','10743','concatenated_operation','EPSG','8651','EPSG','1138','EPSG','1045');
INSERT INTO "concatenated_operation" VALUES('EPSG','8652','Lao 1993 to WGS 84 (1)','Can be implemented as a geocentric translation tfm with param. values dX = 43.933m, dY = -129.593m, dZ= -39.331m.','EPSG','4677','EPSG','4326',6.0,'EPSG-Lao',0);
INSERT INTO "usage" VALUES('EPSG','10744','concatenated_operation','EPSG','8652','EPSG','1138','EPSG','1045');
INSERT INTO "concatenated_operation" VALUES('EPSG','8655','Manoca 1962 to WGS 84 (2)','Derived via WGS 72BE. Can be implemented as a single position vector transformation with parameter values of dX = -56.7 m, dY = -171.8 m, dZ = -38.7 m, rX = rY = 0 sec, rZ = 0.814 sec, dS = -0.38 ppm.','EPSG','4193','EPSG','4326',6.0,'OGP-Cmr',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','8655','Manoca 1962 to WGS 84 (2)','Derived via WGS 72BE. Can be implemented as a single positon vector transformation with parameter vaues of dX = -56.7 m, dY = -171.8 m, dZ = -38.7 m, rX = rY = 0 sec, rZ = 0.814 sec, dS = -0.38 ppm.','EPSG','4193','EPSG','4326',6.0,'OGP-Cmr',0);
INSERT INTO "usage" VALUES('EPSG','10747','concatenated_operation','EPSG','8655','EPSG','2555','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','8656','Mhast (offshore) to WGS 84 (1)','Derived via WGS 72BE. Can be implemented as a single position vector transformation with parameter values of dX = -255.0 m, dY = -29.0 m, dZ = -103.1 m, rX = rY = 0 sec, rZ = 0.814 sec, dS = -0.38 ppm.','EPSG','4705','EPSG','4326',11.0,'OGP-Ago Cab',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','8656','Mhast (offshore) to WGS 84 (1)','Derived via WGS 72BE. Can be implemented as a single positon vector transformation with parameter vaues of dX = -255.0 m, dY = -29.0 m, dZ = -103.1 m, rX = rY = 0 sec, rZ = 0.814 sec, dS = -0.38 ppm.','EPSG','4705','EPSG','4326',11.0,'OGP-Ago Cab',0);
INSERT INTO "usage" VALUES('EPSG','10748','concatenated_operation','EPSG','8656','EPSG','3180','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','8657','Egypt Gulf of Suez S-650 TL to WGS 84 (1)','Can be implemented as a single position vector transformation with parameter values of dX = -123.0 m, dY = 98.0 m, dZ = 3.9 m, rX = rY = 0 sec, rZ = 0.814 sec, dS = -0.38 ppm. Replaced by Egypt Gulf of Suez S-650 TL to WGS 84 (2) (tfm code 15846).','EPSG','4706','EPSG','4326',6.0,'OGP-Egy GoS',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','8657','Egypt Gulf of Suez S-650 TL to WGS 84 (1)','Can be implemented as a single positon vector transformation with parameter vaues of dX = -123.0 m, dY = 98.0 m, dZ = 3.9 m, rX = rY = 0 sec, rZ = 0.814 sec, dS = -0.38 ppm. Replaced by Egypt Gulf of Suez S-650 TL to WGS 84 (2) (tfm code 15846).','EPSG','4706','EPSG','4326',6.0,'OGP-Egy GoS',0);
INSERT INTO "usage" VALUES('EPSG','10749','concatenated_operation','EPSG','8657','EPSG','2341','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','8659','Kertau (RSO) to WGS 84 (1)','Step 1 is necessary to rescale the grid units before using step 2.','EPSG','4751','EPSG','4326',15.0,'OGP-Mys',0);
INSERT INTO "usage" VALUES('EPSG','10751','concatenated_operation','EPSG','8659','EPSG','1309','EPSG','1164');
INSERT INTO "concatenated_operation" VALUES('EPSG','9091','ITRF97 to NZGD2000 (1)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D coordinate domain. See CT 1565 for low accuracy applications.','EPSG','4918','EPSG','4959',0.03,'IOGP-Nzl 2000-01-01',0);
INSERT INTO "usage" VALUES('EPSG','10905','concatenated_operation','EPSG','9091','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9092','ITRF2000 to NZGD2000 (1)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D coordinate domain. See CT 1565 for low accuracy applications.','EPSG','4919','EPSG','4959',0.03,'IOGP-Nzl 2000-01-01',0);
INSERT INTO "usage" VALUES('EPSG','10906','concatenated_operation','EPSG','9092','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9093','ITRF2005 to NZGD2000 (1)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D coordinate domain. See CT 1565 for low accuracy applications.','EPSG','4896','EPSG','4959',0.03,'IOGP-Nzl 2000-01-01',0);
INSERT INTO "usage" VALUES('EPSG','10907','concatenated_operation','EPSG','9093','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9094','ITRF2008 to NZGD2000 (1)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D coordinate domain. Replaced by concatenated operation ITRF2008 to NZGD2000 (2) (CT code 9095) which uses the 2013-08-01 model. See CT 1565 for low accuracy applications.','EPSG','5332','EPSG','4959',0.03,'IOGP-Nzl 2000-01-01',0);
INSERT INTO "usage" VALUES('EPSG','10908','concatenated_operation','EPSG','9094','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9095','ITRF2008 to NZGD2000 (2)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D domain. Replaces concatenated op. ITRF2008 to NZGD2000 (1) (CT code 9094). Replaced by concatenated op. ITRF2008 to NZGD2000 (3) (CT code 9096). See CT 1565 for low accuracy applications.','EPSG','5332','EPSG','4959',0.03,'IOGP-Nzl 2013-08-01',0);
INSERT INTO "usage" VALUES('EPSG','10909','concatenated_operation','EPSG','9095','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9096','ITRF2008 to NZGD2000 (3)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D domain. Replaces concatenated op. ITRF2008 to NZGD2000 (2) (CT code 9095). Replaced by concatenated op. ITRF2008 to NZGD2000 (4) (CT code 9097). See CT 1565 for low accuracy applications.','EPSG','5332','EPSG','4959',0.03,'IOGP-Nzl 2014-02-01',0);
INSERT INTO "usage" VALUES('EPSG','10910','concatenated_operation','EPSG','9096','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9097','ITRF2008 to NZGD2000 (4)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D domain. Replaces concatenated op. ITRF2008 to NZGD2000 (3) (CT code 9096). Replaced by concatenated op. ITRF2008 to NZGD2000 (5) (CT code 9098). See CT 1565 for low accuracy applications.','EPSG','5332','EPSG','4959',0.03,'IOGP-Nzl 2015-01-01',0);
INSERT INTO "usage" VALUES('EPSG','10911','concatenated_operation','EPSG','9097','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9098','ITRF2008 to NZGD2000 (5)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D domain. Replaces concatenated op. ITRF2008 to NZGD2000 (4) (CT code 9097). Replaced by concatenated op. ITRF2008 to NZGD2000 (6) (CT code 9099). See CT 1565 for low accuracy applications.','EPSG','5332','EPSG','4959',0.03,'IOGP-Nzl 2016-07-01',0);
INSERT INTO "usage" VALUES('EPSG','10912','concatenated_operation','EPSG','9098','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9099','ITRF2008 to NZGD2000 (6)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D domain. Replaces concatenated op. ITRF2008 to NZGD2000 (5) (CT code 9098). See CT 1565 for low accuracy applications.','EPSG','5332','EPSG','4959',0.03,'IOGP-Nzl 2017-12-01',0);
INSERT INTO "usage" VALUES('EPSG','10913','concatenated_operation','EPSG','9099','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9100','ITRF2014 to NZGD2000 (1)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D coordinate domain. Replaced by 2017-12-01 model (CT code 9101). See CT 1565 for low accuracy applications.','EPSG','7789','EPSG','4959',0.03,'IOGP-Nzl 2016-07-01',0);
INSERT INTO "usage" VALUES('EPSG','10914','concatenated_operation','EPSG','9100','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9101','ITRF2014 to NZGD2000 (2)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D domain. Replaces concatenated op. ITRF2014 to NZGD2000 (1) (CT code 9100). Replaced by concatenated op. ITRF2014 to NZGD2000 (3) (CT code 9102). See CT 1565 for low accuracy applications.','EPSG','7789','EPSG','4959',0.03,'IOGP-Nzl 2017-12-01',0);
INSERT INTO "usage" VALUES('EPSG','10915','concatenated_operation','EPSG','9101','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9102','ITRF2014 to NZGD2000 (3)','Step 1 is in geocentric coordinate domain, step 2 in geographic 3D domain. Replaces concatenated op. ITRF2014 to NZGD2000 (2) (CT code 9101). See CT 1565 for low accuracy applications.','EPSG','7789','EPSG','4959',0.03,'IOGP-Nzl 2018-07-01',0);
INSERT INTO "usage" VALUES('EPSG','10916','concatenated_operation','EPSG','9102','EPSG','3285','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','9103','NAD27 to ITRF2014 (1)','For use with legacy data - see CT code 9104 for alternative for new areas. Note that steps 1 and 2 are documented in the geog2D domain, steps 3 and 4 in the geocentric domain. Steps 3 and 4 may be implemented in one operation using CT code 8970.','EPSG','4267','EPSG','7789',1.5,'IOGP-Usa GoM legacy',0);
INSERT INTO "usage" VALUES('EPSG','10917','concatenated_operation','EPSG','9103','EPSG','3357','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','9104','NAD27 to ITRF2014 (2)','For use in new operations - see CT code 9103 for alternative for legacy data. Note that steps 1 to 5 are documented in the geog2D domain, steps 6 and 7 in the geocentric domain. Steps 6 and 7 may be implemented in one operation using CT code 8970.','EPSG','4267','EPSG','7789',0.2,'IOGP-Usa GoM non-legacy',0);
INSERT INTO "usage" VALUES('EPSG','10918','concatenated_operation','EPSG','9104','EPSG','3357','EPSG','1136');
INSERT INTO "concatenated_operation" VALUES('EPSG','9336','NAD27 to NAD83(CSRS)v4 (3)','Can be taken as an approximate transformation NAD27 to WGS 84 - see code 8585.','EPSG','4267','EPSG','8246',2.5,'EPSG-Can AB',0);
INSERT INTO "usage" VALUES('EPSG','14011','concatenated_operation','EPSG','9336','EPSG','2376','EPSG','1151');
INSERT INTO "concatenated_operation" VALUES('EPSG','9337','NTF (Paris) to ETRS89-FRA [RGF93 v1] (1)','See transformation code 7811 for an alternative which uses the NTv2 method as an emulation of the geocentric interpolation in the second step.','EPSG','4807','EPSG','4171',1.0,'IOGP-Fra',0);
INSERT INTO "concatenated_operation" VALUES('EPSG','9337','NTF (Paris) to RGF93 v1 (1)','See transformation code 7811 for an alternative which uses the NTv2 method as an emulation of the geocentric interpolation in the second step.','EPSG','4807','EPSG','4171',1.0,'IOGP-Fra',0);
INSERT INTO "usage" VALUES('EPSG','14012','concatenated_operation','EPSG','9337','EPSG','3694','EPSG','1041');
INSERT INTO "concatenated_operation" VALUES('EPSG','9499','ETRS89 to GHA height (2)','This concatenated operation gives the same result as the Hoehen-Grid plus offset from ETRS89 to GHA height. Hoehen-Grid plus is implemented in BEV-Transformator using MGI (CRS 4312) as the interpolation CRS for the grid.','EPSG','4937','EPSG','5778',0.07,'BEV-Aut',1);
INSERT INTO "concatenated_operation" VALUES('EPSG','9499','ETRS89 to GHA height (2)','This concatenated operation gives the same result as the HoehenGrid-plus offset from ETRS89 to GHA height. HoehenGrid-plus is implemented in BEV-Transformator using MGI (CRS 4312) as the interpolation CRS for the grid','EPSG','4937','EPSG','5778',0.07,'BEV-Aut',0);
INSERT INTO "usage" VALUES('EPSG','14958','concatenated_operation','EPSG','9499','EPSG','1037','EPSG','1133');
INSERT INTO "concatenated_operation" VALUES('EPSG','9683','ITRF2014 to GDA94 (2)','See ITRF2014 to GDA94 (1) (CT 9682) for conformal-only alternative (i.e. without distortion modelling).','EPSG','9000','EPSG','4283',0.06,'ICSM-Aus Conf+Dist',0);
INSERT INTO "usage" VALUES('EPSG','14962','concatenated_operation','EPSG','9683','EPSG','2575','EPSG','1234');
@@ -461,115 +435,5 @@ INSERT INTO "concatenated_operation" VALUES('EPSG','9687','GDA94 to WGS 84 (G176
INSERT INTO "usage" VALUES('EPSG','14964','concatenated_operation','EPSG','9687','EPSG','2575','EPSG','1234');
INSERT INTO "concatenated_operation" VALUES('EPSG','9731','ETRS89 to ETRS89 + Catania 1965 height (1)','','EPSG','4937','EPSG','9724',0.035,'IGM-Ita 2005 Sicily',1);
INSERT INTO "usage" VALUES('EPSG','15285','concatenated_operation','EPSG','9731','EPSG','2340','EPSG','1270');
INSERT INTO "concatenated_operation" VALUES('EPSG','9750','ETRS89 to Catania 1965 height (1)','','EPSG','4937','EPSG','9721',0.035,'IGM-Ita 2005 Sicily',1);
INSERT INTO "concatenated_operation" VALUES('EPSG','9750','ETRS89 to Catania 1965 height (1)','','EPSG','4937','EPSG','9721',0.035,'IGM-Ita 2005 Sicily',0);
INSERT INTO "usage" VALUES('EPSG','15385','concatenated_operation','EPSG','9750','EPSG','2340','EPSG','1133');
INSERT INTO "concatenated_operation" VALUES('EPSG','10146','INAGeoid2020 v1 height to INAGeoid v2 height (1)','In central Java INAGeoid2020 v2 height minus INAGeoid2020 v1 height is approximately +0.2m (v1 surface is above the v2 surface). This difference varies significantly across Indonesia.','EPSG','9471','EPSG','20036',0.2,'BIG-Idn 2022',1);
INSERT INTO "usage" VALUES('EPSG','18452','concatenated_operation','EPSG','10146','EPSG','1122','EPSG','1178');
INSERT INTO "concatenated_operation" VALUES('EPSG','10392','Cascais height to ZH Portugal depth (1)','The Zero Hidrografico (CD Portugal) surface is defined to be 2.0m below the Cascais vertical reference surface off mainland Portugal and 2.08 metres below the Cascais vertical reference surface in the Tagus estuary off Lisbon (see CT 10393).','EPSG','5780','EPSG','10349',0.0,'IH-Por mainland',0);
INSERT INTO "usage" VALUES('EPSG','20319','concatenated_operation','EPSG','10392','EPSG','4691','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10393','Cascais height to ZH Portugal depth (2)','The Zero Hidrografico surface is defined to be 2.08 metres below the Cascais vertical reference surface in the Tagus estuary off Lisbon and 2.0m below the Cascais vertical reference surface offshore mainland Portugal (see CT 10392).','EPSG','5780','EPSG','10349',0.0,'IH-Por Tagus',0);
INSERT INTO "usage" VALUES('EPSG','20320','concatenated_operation','EPSG','10393','EPSG','4692','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10394','Cais da Pontinha height to ZH Portugal depth (1)','Offshore of Madeira, Desertas and Selvagens islands the Zero Hidrografico (CD Portugal) surface is defined to be 1.4m below the Cais da Pontinha vertical reference surface.','EPSG','6178','EPSG','10349',0.0,'IH-Por Madeira',0);
INSERT INTO "usage" VALUES('EPSG','20071','concatenated_operation','EPSG','10394','EPSG','4695','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10395','Cais da Vila height to ZH Portugal depth (1)','Offshore of Porto Santo island the Zero Hidrografico (CD Portugal) surface is defined to be 1.4m below the Cais da Vila vertical reference surface.','EPSG','6179','EPSG','10349',0.0,'IH-Por Porto Santo',0);
INSERT INTO "usage" VALUES('EPSG','20105','concatenated_operation','EPSG','10395','EPSG','4696','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10396','Santa Cruz das Flores height to ZH Portugal depth (1)','Offshore of Flores and Corvo islands the Zero Hidrografico (CD Portugal) surface is defined to be 1.0m below the Santa Cruz das Flores vertical reference surface.','EPSG','6185','EPSG','10349',0.0,'IH-Por Flores',0);
INSERT INTO "usage" VALUES('EPSG','20073','concatenated_operation','EPSG','10396','EPSG','4697','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10397','Horta height to ZH Portugal depth (1)','Offshore of Faial island the Zero Hidrografico (CD Portugal) surface is defined to be 1.0m below the Horta vertical reference surface.','EPSG','6181','EPSG','10349',0.0,'IH-Por Faial',0);
INSERT INTO "usage" VALUES('EPSG','20321','concatenated_operation','EPSG','10397','EPSG','4698','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10398','Cais da Madalena height to ZH Portugal depth (1)','Offshore of Pico island the Zero Hidrografico (CD Portugal) surface is defined to be 1.0m below the Cais da Madalena vertical reference surface.','EPSG','6182','EPSG','10349',0.0,'IH-Por Pico',0);
INSERT INTO "usage" VALUES('EPSG','20322','concatenated_operation','EPSG','10398','EPSG','4699','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10399','Cais das Velas height to ZH Portugal depth (1)','Offshore of S. Jorge island the Zero Hidrografico (CD Portugal) surface is defined to be 1.0m below the Cais das Velas vertical reference surface.','EPSG','6180','EPSG','10349',0.0,'IH-Por S Jorge',0);
INSERT INTO "usage" VALUES('EPSG','20081','concatenated_operation','EPSG','10399','EPSG','4700','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10400','Santa Cruz da Graciosa height to ZH Portugal depth (1)','Offshore of Graciosa island the Zero Hidrografico (CD Portugal) surface is defined to be 1.0m below the Santa Cruz da Graciosa vertical reference surface.','EPSG','6183','EPSG','10349',0.0,'IH-Por Graciosa',0);
INSERT INTO "usage" VALUES('EPSG','20106','concatenated_operation','EPSG','10400','EPSG','4734','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10409','Cais da Figueirinha height to ZH Portugal depth (1)','Offshore of Terceira island the Zero Hidrografico (CD Portugal) surface is defined to be 1.0m below the Cais da Figueirinha vertical reference surface.','EPSG','6184','EPSG','10349',0.0,'IH-Por Terceira',0);
INSERT INTO "usage" VALUES('EPSG','20077','concatenated_operation','EPSG','10409','EPSG','4735','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10410','Ponta Delgada height to ZH Portugal depth (1)','Offshore of S. Miguel island the Zero Hidrografico (CD Portugal) surface is defined to be 1.0m below the Ponta Delgada vertical reference surface.','EPSG','6187','EPSG','10349',0.0,'IH-Por S Miguel',0);
INSERT INTO "usage" VALUES('EPSG','20084','concatenated_operation','EPSG','10410','EPSG','4736','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10411','Cais da Vila do Porto height to ZH Portugal depth (1)','Offshore of Santa Maria and Formigas islands the Zero Hidrografico (CD Portugal) surface is defined to be 1.0m below the Cais da Vila do Porto vertical reference surface.','EPSG','6186','EPSG','10349',0.0,'IH-Por Santa Maria',0);
INSERT INTO "usage" VALUES('EPSG','20102','concatenated_operation','EPSG','10411','EPSG','4737','EPSG','1198');
INSERT INTO "concatenated_operation" VALUES('EPSG','10495','ETRS89 + DVR90(2002) height to ETRS89 + DVR90(2013) height (1)','DVR90(2002) height and DVR90(2013) height may be considered to be equivalent for applications with accuracies of 5cm or worse. At this 5cm accuracy, data referenced to either CRS may be merged without transformation. ','EPSG','10486','EPSG','10487',0.06,'SDFI-Dnk 2013',0);
INSERT INTO "usage" VALUES('EPSG','20518','concatenated_operation','EPSG','10495','EPSG','3237','EPSG','1079');
INSERT INTO "concatenated_operation" VALUES('EPSG','10496','ETRS89 + DVR90(2013) height to ETRS89 + DVR90(2023) height (1)','For applications with accuracies of 5cm or worse, DVR90(2013) height and DVR90(2023) height may be considered to be equivalent. At this 3cm accuracy, data referenced to either CRS may be merged without transformation. ','EPSG','10487','EPSG','10488',0.03,'SDFI-Dnk 2023',0);
INSERT INTO "usage" VALUES('EPSG','20516','concatenated_operation','EPSG','10496','EPSG','1080','EPSG','1273');
INSERT INTO "concatenated_operation" VALUES('EPSG','10616','SRGI2013 + INAGeoid2020 v1 height to SRGI2013 + INAGeoid v2 height (1)','In central Java INAGeoid2020 v2 height minus INAGeoid2020 v1 height is approximately +0.2m (v1 surface is above the v2 surface). This difference varies significantly across Indonesia.','EPSG','9529','EPSG','20043',0.2,'BIG-Idn 2022',0);
INSERT INTO "usage" VALUES('EPSG','21321','concatenated_operation','EPSG','10616','EPSG','1122','EPSG','1178');
INSERT INTO "concatenated_operation" VALUES('EPSG','10675','BES2020 Saba to Saba height (1)','This operation is not reversible because step 2 is not reversible. For a reversible alternative see BES2020 Saba to Saba + Saba height (1) (code 10755).','EPSG','10638','EPSG','10642',0.25,'NSGI-Bes Saba 2020',0);
INSERT INTO "usage" VALUES('EPSG','21877','concatenated_operation','EPSG','10675','EPSG','4757','EPSG','1133');
INSERT INTO "concatenated_operation" VALUES('EPSG','10754','BES2020 Sint Eustatius to Sint Eustatius height (1)','This operation is not reversible because step 2 is not reversible. For a reversible alternative see BES2020 Sint Eustatius to Sint Eustatius + Sint Eustatius height (1) (code 10756).','EPSG','10738','EPSG','10740',0.25,'NSGI-Bes SEu 2020',0);
INSERT INTO "usage" VALUES('EPSG','22322','concatenated_operation','EPSG','10754','EPSG','4788','EPSG','1133');
INSERT INTO "concatenated_operation" VALUES('EPSG','10755','BES2020 Saba to Saba + Saba height (1)','Reversible alternative to BES2020 Saba to Saba height (1) (code 10675).','EPSG','10638','EPSG','10643',0.25,'NSGI-Bes Saba 2020',0);
INSERT INTO "usage" VALUES('EPSG','22323','concatenated_operation','EPSG','10755','EPSG','4757','EPSG','1270');
INSERT INTO "concatenated_operation" VALUES('EPSG','10756','BES2020 Sint Eustatius to Sint Eustatius + Sint Eustatius height (1)','Reversible alternative to BES2020 Sint Eustatius to Sint Eustatius height (1) (code 10754).','EPSG','10738','EPSG','10741',0.25,'NSGI-Bes SEu 2020',0);
INSERT INTO "usage" VALUES('EPSG','22324','concatenated_operation','EPSG','10756','EPSG','4788','EPSG','1270');
INSERT INTO "concatenated_operation" VALUES('EPSG','10778','KKJ to ETRS89-FIN [EUREF-FIN] (3)','Recommended transformation between KKJ and ETRS89-FIN [EUREF-FIN]. Use this in preference to transformation KKJ to ETRS89-FIN [EUREF-FIN] (2) (code 10098).','EPSG','4123','EPSG','10690',0.03,'NLS-FIN TINshift LatLon',0);
INSERT INTO "usage" VALUES('EPSG','22361','concatenated_operation','EPSG','10778','EPSG','3333','EPSG','1273');
INSERT INTO "concatenated_operation" VALUES('EPSG','10815','ITRF2014 to NKG_ETRF14 (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2014) is user-defined input and is used as the source epoch in step 2.','EPSG','7789','EPSG','10805',0.001,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','23998','concatenated_operation','EPSG','10815','EPSG','4795','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10816','ITRF2014 to ETRS89-FIN [EUREF-FIN] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2014) is user-defined and is used as the source epoch in step 2.','EPSG','7789','EPSG','10688',0.004,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','23999','concatenated_operation','EPSG','10816','EPSG','1095','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10817','ITRF2014 to ETRS89-NOR [EUREF89] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2014) is user-defined and is used as the source epoch in step 2.','EPSG','7789','EPSG','10873',0.006,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24000','concatenated_operation','EPSG','10817','EPSG','1352','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10818','ITRF2014 to ETRS89-LTU [LKS94] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2014) is user-defined and is used as the source epoch in step 2.','EPSG','7789','EPSG','4950',0.013,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24001','concatenated_operation','EPSG','10818','EPSG','1145','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10824','ITRF2014 to ETRS89-SWE [SWEREF 99] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2014) is user-defined and is used as the source epoch in step 2. For coordinates originating before 2021-02-07, the NKG2008 transformation should be used.','EPSG','7789','EPSG','4976',0.004,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24002','concatenated_operation','EPSG','10824','EPSG','1225','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10825','ITRF2014 to ETRS89-EST [EST97] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2014) is user-defined and is used as the source epoch in step 2.','EPSG','7789','EPSG','4934',0.005,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24003','concatenated_operation','EPSG','10825','EPSG','1090','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10868','ITRF2020 to ETRS89-EST [EST97] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2020) is user-defined and is used as the source epoch in step 2.','EPSG','9988','EPSG','4934',0.005,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24004','concatenated_operation','EPSG','10868','EPSG','1090','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10869','ITRF2020 to ETRS89-FIN [EUREF-FIN] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2020) is user-defined and is used as the source epoch in step 2.','EPSG','9988','EPSG','10688',0.004,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24005','concatenated_operation','EPSG','10869','EPSG','1095','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10870','ITRF2020 to ETRS89-NOR [EUREF89] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2020) is user-defined and is used as the source epoch in step 2.','EPSG','9988','EPSG','10873',0.006,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24006','concatenated_operation','EPSG','10870','EPSG','1352','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10871','ITRF2020 to ETRS89-LTU [LKS94] (1)','The coordinate epoch of the coordinates referenced to the source CRS (ITRF2020) is user-defined input and is used as the source epoch in step 2.','EPSG','9988','EPSG','4950',0.013,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24013','concatenated_operation','EPSG','10871','EPSG','1145','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10872','ITRF2020 to ETRS89-SWE [SWEREF 99] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2020) is user-defined and is used as the source epoch in step 2. For coordinates originating before 2021-02-07, the NKG2008 transformation should be used.','EPSG','9988','EPSG','4976',0.004,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24008','concatenated_operation','EPSG','10872','EPSG','1225','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10894','ITRF2014 to ETRS89-DNK (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2014) is user-defined input and is used as the source epoch in step 2.','EPSG','7789','EPSG','10890',0.006,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24010','concatenated_operation','EPSG','10894','EPSG','1080','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','10895','ITRF2020 to ETRS89-DNK (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2020) is user-defined input and is used as the source epoch in step 2.','EPSG','9988','EPSG','10890',0.006,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','24011','concatenated_operation','EPSG','10895','EPSG','1080','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','11005','SVD2006 height to SVD2024 height (1)','Accuracy is RMS of the accuracies of the two concatenated operation steps.','EPSG','20000','EPSG','10999',1.4,'NMA-Sjm SV',1);
INSERT INTO "usage" VALUES('EPSG','24141','concatenated_operation','EPSG','11005','EPSG','4831','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','11066','ITRF2020 to ETRS89-GBR [OSNet v2009] (1)','Accuracy is approximately 1cm at the ETRS89-GBR [OSNet v2009] anchor epoch of 2009.756 but deteriorates with time due to tectonic deformation and/or glacial isostatic adjustment. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m.','EPSG','9988','EPSG','11007',0.1,'IOGP-Gbr 2009',0);
INSERT INTO "usage" VALUES('EPSG','24569','concatenated_operation','EPSG','11066','EPSG','1264','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','11110','ITRF2020 to ETRS89-PRT [1995] (1)','Accuracy is approximately 1cm at the ETRS89-PRT [1995] anchor epoch of 1995.4, but deteriorates with time due to tectonic deformation and/or glacial isostatic adjustment.','EPSG','9988','EPSG','11106',0.1,'IOGP-Prt 1995',0);
INSERT INTO "usage" VALUES('EPSG','24589','concatenated_operation','EPSG','11110','EPSG','4832','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','11140','ITRF2020 to ETRS89-ESP [REGENTE] (1)','Accuracy is approximately 1cm at the ETRS89-ESP [REGENTE] anchor epoch of 1995.4, but deteriorates with time due to tectonic deformation and/or glacial isostatic adjustment.','EPSG','9988','EPSG','11129',0.1,'IOGP-Esp 1995',0);
INSERT INTO "usage" VALUES('EPSG','24595','concatenated_operation','EPSG','11140','EPSG','4833','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','11194','ITRF2020 to ETRS89-HRV [HTRS96] (1)','','EPSG','9988','EPSG','4888',0.1,'IOGP-Hrv 1995',0);
INSERT INTO "usage" VALUES('EPSG','24866','concatenated_operation','EPSG','11194','EPSG','1076','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','11196','ITRF2020 to ETRS89-XKX [KOSOVAREF01] (1)','Accuracy is approximately 1cm at the ETRS89-XKX [KOSOVAREF01] anchor epoch of 2010.5 but deteriorates with time due to tectonic deformation and/or glacial isostatic adjustment.','EPSG','9988','EPSG','9138',0.1,'IOGP-Kos 2001',0);
INSERT INTO "usage" VALUES('EPSG','24869','concatenated_operation','EPSG','11196','EPSG','4542','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','11206','ITRF2020 to ETRS89-MDA [MOLDREF99] (1)','Accuracy is approximately 1cm at the ETRS89-MDA [MOLDREF99] anchor epoch of 1997.4 but deteriorates with time due to tectonic deformation and/or glacial isostatic adjustment.','EPSG','10569','EPSG','4000',0.1,'IOGP-Mda 1999',1);
INSERT INTO "usage" VALUES('EPSG','24895','concatenated_operation','EPSG','11206','EPSG','1162','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','11285','ITRF2020 to ETRS89-MDA [MOLDREF99] (1)','Accuracy is approximately 1cm at the ETRS89-MDA [MOLDREF99] anchor epoch of 1997.4 but deteriorates with time due to tectonic deformation and/or glacial isostatic adjustment.','EPSG','9988','EPSG','4000',0.1,'IOGP-Mda 1999',0);
INSERT INTO "usage" VALUES('EPSG','24996','concatenated_operation','EPSG','11285','EPSG','1162','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','11310','ITRF2020 to ETRS89-CHE [CHTRF95] (1)','','EPSG','9988','EPSG','11222',0.1,'IOGP-Che 1995',1);
INSERT INTO "usage" VALUES('EPSG','25091','concatenated_operation','EPSG','11310','EPSG','1286','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','11315','ITRF2020 to ETRS89-LVA [LKS-2020] (1)','The coordinate epoch (in years) of the coordinates referenced to the source CRS (ITRF2020) is user-defined and is used as the source epoch in step 2. For coordinates originating before 2021-02-07, the NKG2008 transformation should be used.','EPSG','9988','EPSG','10303',0.006,'NKG2020',0);
INSERT INTO "usage" VALUES('EPSG','25133','concatenated_operation','EPSG','11315','EPSG','1139','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','11398','NN2000:2018 height to NN2000:2025 height (1)','Height difference derived through difference in geoid separation models.','EPSG','5941','EPSG','11394',0.03,'IOGP-Nor 2025',1);
INSERT INTO "usage" VALUES('EPSG','25497','concatenated_operation','EPSG','11398','EPSG','1352','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','11441','JGD2024 to JGD2024 (vertical) height (2)','This concatenated operation is the path recommended by GSI for deriving JGD2024 (vertical) height from GNSS-derived ellipsoidal height in accordance with Survey Act requirements, as using the JPGEO2024 geoid separation model directly (JGD2024 to JGD2024 (vertical) height (1), CT code 11334) is not aligned with Survey Act requirements for coordinates to be at epoch 2011.395.','EPSG','6667','EPSG','11317',0.04,'GSI-Jpn',0);
INSERT INTO "usage" VALUES('EPSG','25734','concatenated_operation','EPSG','11441','EPSG','3263','EPSG','1181');
INSERT INTO "concatenated_operation" VALUES('EPSG','11505','ETRS89-AUT [2002] to GHA height (2)','This concatenated operation gives the same result as the Hoehen-Grid plus offset from ETRS89-AUT [2002] to GHA height. HoehenGrid-plus is implemented in BEV-Transformator using MGI (CRS 4312) as the interpolation CRS for the grid.','EPSG','11056','EPSG','5778',0.07,'BEV-Aut 2002',0);
INSERT INTO "usage" VALUES('EPSG','26577','concatenated_operation','EPSG','11505','EPSG','1037','EPSG','1133');
INSERT INTO "concatenated_operation" VALUES('EPSG','11523','SKTRF09 + Baltic 1957 height to SKTRF09 + EVRF2007 height (2)','Recommended method for transforming coordinates between Baltic 1957 height and EVRF2007 height and vice-versa in Slovakia. Compound transformation using two separate quasigeoid models (DVRM05 and DMQSK2014E).','EPSG','11312','EPSG','11314',0.05,'UGKK-Svk',0);
INSERT INTO "usage" VALUES('EPSG','27019','concatenated_operation','EPSG','11523','EPSG','1211','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','11528','ETRS89-SVK [SKTRF09] to S-JTSK (5)','Recommended method of a transformation from ETRS89 to S-JTSK in Slovakia. For reverse transformation see S-JTSK to ETRS89-SVK [SKTRF09] (6) (code 11529). Both together replace S-JTSK to ETRS89 (4) (code 4827).','EPSG','11076','EPSG','4156',0.06,'UGKK-Sk JTSK03',0);
INSERT INTO "usage" VALUES('EPSG','26526','concatenated_operation','EPSG','11528','EPSG','1211','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','11529','S-JTSK to ETRS89-SVK [SKTRF09] (6)','Recommended method of a transformation from S-JTSK to ETRS89 in Slovakia. For reverse transformation see ETRS89-SVK [SKTRF09] to S-JTSK (5) (code 11528). Both together replace S-JTSK to ETRS89 (4) (code 4827).','EPSG','4156','EPSG','11076',0.06,'UGKK-Sk JTSK03',0);
INSERT INTO "usage" VALUES('EPSG','26527','concatenated_operation','EPSG','11529','EPSG','1211','EPSG','1027');
INSERT INTO "concatenated_operation" VALUES('EPSG','12091','SVD2006 height to SVD2024 height (1)','Height difference derived through difference in geoid separation models. Accuracy is RMS of the accuracies of the two concatenated operation steps.','EPSG','20000','EPSG','10999',1.4,'NMA-Sjm SV',0);
INSERT INTO "usage" VALUES('EPSG','27108','concatenated_operation','EPSG','12091','EPSG','4831','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','12092','NN2000:2018 height to NN2000:2025 height (1)','Height difference derived through difference in geoid separation models.','EPSG','5941','EPSG','11394',0.03,'IOGP-Nor 2025',0);
INSERT INTO "usage" VALUES('EPSG','27105','concatenated_operation','EPSG','12092','EPSG','1352','EPSG','1059');
INSERT INTO "concatenated_operation" VALUES('EPSG','12172','ITRF2020 to ETRS89-CHE [CHTRS95] (1)','','EPSG','9988','EPSG','4932',0.1,'IOGP-Che 1995',0);
INSERT INTO "usage" VALUES('EPSG','26948','concatenated_operation','EPSG','12172','EPSG','1286','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','12191','ITRF2020 to ETRS89-GRC [HTRS07] (2)','Accuracy is approximately 2cm at the ETRS89-GRC [HTRS07] anchor epoch of 2007.5, but deteriorates with time due to tectonic deformation and/or volcanic eruption. Velocities in southern Greece exceed 3 cm/year relative to ETRS89, with co-seismic displacements of several cm and up to 40cm.','EPSG','9988','EPSG','11091',0.8,'IOGP-Grc 2007',0);
INSERT INTO "usage" VALUES('EPSG','27009','concatenated_operation','EPSG','12191','EPSG','1106','EPSG','1026');
INSERT INTO "concatenated_operation" VALUES('EPSG','12261','ETRS89-ITA [RDN2008] to Catania 1965 height (2)','This operation is reversible because both steps are reversible. Replaces non-reversible ETRS89 to Catania 1965 height (1) (code 9750).','EPSG','6705','EPSG','9721',0.035,'IGM-Ita 2005 Sicily',0);
INSERT INTO "usage" VALUES('EPSG','27230','concatenated_operation','EPSG','12261','EPSG','2340','EPSG','1270');
File diff suppressed because it is too large Load Diff
-734
View File
@@ -1,734 +0,0 @@
-- Insertion triggers that implement consistency checks across tables
CREATE TRIGGER ellipsoid_insert_trigger
BEFORE INSERT ON ellipsoid
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on ellipsoid violates constraint: uom should be of type ''length''')
WHERE (SELECT type FROM unit_of_measure WHERE auth_name = NEW.uom_auth_name AND code = NEW.uom_code) != 'length';
END;
CREATE TRIGGER usage_insert_trigger
BEFORE INSERT ON usage
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on usage violates constraint: new entry refers to unexisting code')
WHERE NOT EXISTS (SELECT 1 FROM object_view o WHERE o.table_name = NEW.object_table_name AND o.auth_name = NEW.object_auth_name AND o.code = NEW.object_code);
SELECT RAISE(ABORT, 'insert on usage violates constraint: extent must not be deprecated when object is not deprecated')
WHERE EXISTS (
SELECT 1 FROM extent JOIN object_view o WHERE
NOT (o.table_name IN ('projected_crs', 'vertical_crs', 'vertical_datum', 'conversion') AND o.auth_name = 'ESRI') AND
o.table_name = NEW.object_table_name AND
o.auth_name = NEW.object_auth_name AND
o.code = NEW.object_code AND
extent.auth_name = NEW.extent_auth_name AND
extent.code = NEW.extent_code AND
extent.deprecated = 1 AND
o.deprecated = 0);
END;
CREATE TRIGGER prime_meridian_insert_trigger
BEFORE INSERT ON prime_meridian
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on prime_meridian violates constraint: uom should be of type ''angle''')
WHERE (SELECT type FROM unit_of_measure WHERE auth_name = NEW.uom_auth_name AND code = NEW.uom_code) != 'angle';
END;
CREATE TRIGGER geodetic_datum_insert_trigger
BEFORE INSERT ON geodetic_datum
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on geodetic_datum violates constraint: ellipsoid must not be deprecated when geodetic_datum is not deprecated')
WHERE EXISTS(SELECT 1 FROM ellipsoid WHERE ellipsoid.auth_name = NEW.ellipsoid_auth_name AND ellipsoid.code = NEW.ellipsoid_code AND ellipsoid.deprecated != 0) AND NEW.deprecated = 0 AND NEW.auth_name != 'ESRI';
SELECT RAISE(ABORT, 'insert on geodetic_datum violates constraint: prime_meridian must not be deprecated when geodetic_datum is not deprecated')
WHERE EXISTS(SELECT 1 FROM prime_meridian WHERE prime_meridian.auth_name = NEW.prime_meridian_auth_name AND prime_meridian.code = NEW.prime_meridian_code AND prime_meridian.deprecated != 0) AND NEW.deprecated = 0;
SELECT RAISE(ABORT, 'frame_reference_epoch and ensemble_accuracy are mutually exclusive')
WHERE NEW.frame_reference_epoch IS NOT NULL AND NEW.ensemble_accuracy IS NOT NULL;
END;
CREATE TRIGGER axis_insert_trigger
BEFORE INSERT ON axis
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on axis violates constraint: coordinate_system_order should be <= coordinate_system.dimension')
WHERE NEW.coordinate_system_order > (SELECT dimension FROM coordinate_system WHERE auth_name = NEW.coordinate_system_auth_name AND code = NEW.coordinate_system_code);
SELECT RAISE(ABORT, 'insert on axis violates constraint: uom should be defined unless the coordinate system is ordinal')
WHERE EXISTS(SELECT 1 FROM coordinate_system cs WHERE cs.type != 'ordinal' AND (NEW.uom_auth_name IS NULL OR NEW.uom_code IS NULL) AND cs.auth_name = NEW.coordinate_system_auth_name AND cs.code = NEW.coordinate_system_code);
END;
CREATE TRIGGER geodetic_crs_insert_trigger
BEFORE INSERT ON geodetic_crs
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on geodetic_crs violates constraint: (auth_name, code) must not already exist in crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.auth_name AND crs_view.code = NEW.code);
SELECT RAISE(ABORT, 'insert on geodetic_crs violates constraint: datum must not be deprecated when geodetic_crs is not deprecated')
WHERE EXISTS(SELECT 1 FROM geodetic_datum datum WHERE datum.auth_name = NEW.datum_auth_name AND datum.code = NEW.datum_code AND datum.deprecated != 0) AND NEW.deprecated = 0 AND NEW.text_definition IS NOT NULL;
SELECT RAISE(ABORT, 'insert on geodetic_crs violates constraint: coordinate_system.dimension must be 3 for type = ''geocentric''')
WHERE NEW.type = 'geocentric' AND (SELECT dimension FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) != 3;
SELECT RAISE(ABORT, 'insert on geodetic_crs violates constraint: coordinate_system.type must be ''Cartesian'' for type = ''geocentric''')
WHERE NEW.type = 'geocentric' AND (SELECT type FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) != 'Cartesian';
SELECT RAISE(ABORT, 'insert on geodetic_crs violates constraint: coordinate_system.type must be ''ellipsoidal'' for type = ''geographic 2D'' or ''geographic 3D''')
WHERE NEW.type IN ('geographic 2D', 'geographic 3D') AND (SELECT type FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) != 'ellipsoidal';
SELECT RAISE(ABORT, 'insert on geodetic_crs violates constraint: coordinate_system.dimension must be 2 for type = ''geographic 2D''')
WHERE NEW.type = 'geographic 2D' AND NEW.deprecated != 1 AND (SELECT dimension FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) != 2;
SELECT RAISE(ABORT, 'insert on geodetic_crs violates constraint: coordinate_system.dimension must be 3 for type = ''geographic 3D''')
WHERE NEW.type = 'geographic 3D' AND (SELECT dimension FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) != 3;
END;
CREATE TRIGGER vertical_crs_insert_trigger
BEFORE INSERT ON vertical_crs
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on vertical_crs violates constraint: (auth_name, code) must not already exist in crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.auth_name AND crs_view.code = NEW.code);
SELECT RAISE(ABORT, 'insert on vertical_crs violates constraint: name (of a non-deprecated entry) must not already exist in (a non-deprecated entry of) crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.name = NEW.name AND crs_view.deprecated = 0 AND NEW.deprecated = 0
AND NEW.auth_name IN (SELECT auth_name FROM builtin_authorities WHERE auth_name != 'IGNF')
AND NOT(NEW.auth_name = 'ESRI' and crs_view.table_name = 'geodetic_crs') -- some ESRI vertical CRS are an ellipsoidal height CRS derived from a geodetic CRS
);
SELECT RAISE(ABORT, 'insert on vertical_crs violates constraint: datum must not be deprecated when vertical_crs is not deprecated')
WHERE EXISTS(SELECT 1 FROM vertical_crs datum WHERE datum.auth_name = NEW.datum_auth_name AND datum.code = NEW.datum_code AND datum.deprecated != 0) AND NEW.deprecated = 0;
SELECT RAISE(ABORT, 'insert on vertical_crs violates constraint: coordinate_system.type must be ''vertical''')
WHERE (SELECT type FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) != 'vertical';
SELECT RAISE(ABORT, 'insert on vertical_crs violates constraint: coordinate_system.dimension must be 1')
WHERE (SELECT dimension FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) != 1;
END;
CREATE TRIGGER engineering_crs_insert_trigger
BEFORE INSERT ON engineering_crs
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on engineering_crs violates constraint: (auth_name, code) must not already exist in crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.auth_name AND crs_view.code = NEW.code);
SELECT RAISE(ABORT, 'insert on engineering_crs violates constraint: name (of a non-deprecated entry) must not already exist in (a non-deprecated entry of) crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.name = NEW.name AND crs_view.deprecated = 0 AND NEW.deprecated = 0
);
SELECT RAISE(ABORT, 'insert on engineering_crs violates constraint: datum must not be deprecated when engineering_crs is not deprecated')
WHERE EXISTS(SELECT 1 FROM engineering_crs datum WHERE datum.auth_name = NEW.datum_auth_name AND datum.code = NEW.datum_code AND datum.deprecated != 0) AND NEW.deprecated = 0;
SELECT RAISE(ABORT, 'insert on engineering_crs violates constraint: coordinate_system.dimension must be 2 or 3')
WHERE (SELECT dimension FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) NOT IN (2, 3);
END;
CREATE TRIGGER conversion_method_insert_trigger
BEFORE INSERT ON conversion_method
BEGIN
SELECT RAISE(ABORT, 'insert on conversion violates constraint: method should be known')
WHERE (NEW.auth_name || '_' || NEW.code || '_' || NEW.name) NOT IN (
'EPSG_1024_Popular Visualisation Pseudo Mercator',
'EPSG_1026_Mercator (Spherical)',
'EPSG_1027_Lambert Azimuthal Equal Area (Spherical)',
'EPSG_1028_Equidistant Cylindrical',
'EPSG_1029_Equidistant Cylindrical (Spherical)',
'EPSG_1041_Krovak (North Orientated)',
'EPSG_1042_Krovak Modified',
'EPSG_1043_Krovak Modified (North Orientated)',
'EPSG_1051_Lambert Conic Conformal (2SP Michigan)',
'EPSG_1052_Colombia Urban',
'EPSG_1068_Height Depth Reversal',
'EPSG_1069_Change of Vertical Unit',
'EPSG_1104_Change of Vertical Unit',
'EPSG_1078_Equal Earth',
'EPSG_1102_Lambert Conic Conformal (1SP variant B)',
'EPSG_1111_Transverse Mercator 3D',
'EPSG_1119_Equidistant Conic',
'EPSG_1125_Azimuthal Equidistant',
'EPSG_1130_Local Orthographic',
'EPSG_9602_Geographic/geocentric conversions',
'EPSG_9659_Geographic3D to 2D conversion',
'EPSG_9801_Lambert Conic Conformal (1SP)',
'EPSG_9802_Lambert Conic Conformal (2SP)',
'EPSG_9803_Lambert Conic Conformal (2SP Belgium)',
'EPSG_9804_Mercator (variant A)',
'EPSG_9805_Mercator (variant B)',
'EPSG_9806_Cassini-Soldner',
'EPSG_9807_Transverse Mercator',
'EPSG_9808_Transverse Mercator (South Orientated)',
'EPSG_9809_Oblique Stereographic',
'EPSG_9810_Polar Stereographic (variant A)',
'EPSG_9811_New Zealand Map Grid',
'EPSG_9812_Hotine Oblique Mercator (variant A)',
'EPSG_9813_Laborde Oblique Mercator',
'EPSG_9815_Hotine Oblique Mercator (variant B)',
'EPSG_9816_Tunisia Mining Grid',
'EPSG_9817_Lambert Conic Near-Conformal',
'EPSG_9818_American Polyconic',
'EPSG_9819_Krovak',
'EPSG_9820_Lambert Azimuthal Equal Area',
'EPSG_9821_Lambert Azimuthal Equal Area (Spherical)',
'EPSG_9822_Albers Equal Area',
'EPSG_9823_Equidistant Cylindrical (Spherical)',
'EPSG_9824_Transverse Mercator Zoned Grid System',
'EPSG_9826_Lambert Conic Conformal (West Orientated)',
'EPSG_9828_Bonne (South Orientated)',
'EPSG_9829_Polar Stereographic (variant B)',
'EPSG_9830_Polar Stereographic (variant C)',
'EPSG_9831_Guam Projection',
'EPSG_9832_Modified Azimuthal Equidistant',
'EPSG_9833_Hyperbolic Cassini-Soldner',
'EPSG_9834_Lambert Cylindrical Equal Area (Spherical)',
'EPSG_9835_Lambert Cylindrical Equal Area',
'EPSG_9836_Geocentric/topocentric conversions',
'EPSG_9837_Geographic/topocentric conversions',
'EPSG_9838_Vertical Perspective',
'EPSG_9840_Orthographic',
'EPSG_9841_Mercator (1SP) (Spherical)',
'EPSG_9842_Equidistant Cylindrical',
'EPSG_9843_Axis Order Reversal (2D)',
'EPSG_9844_Axis Order Reversal (Geographic3D horizontal)',
'EPSG_9827_Bonne') AND NEW.auth_name != 'PROJ';
END;
CREATE TRIGGER conversion_table_insert_trigger
BEFORE INSERT ON conversion_table
BEGIN
SELECT RAISE(ABORT, 'insert on conversion_table violates constraint: (auth_name, code) must not already exist in coordinate_operation_with_conversion_view')
WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.auth_name AND covwv.code = NEW.code);
END;
CREATE TRIGGER projected_crs_insert_trigger
BEFORE INSERT ON projected_crs
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: (auth_name, code) must not already exist in crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.auth_name AND crs_view.code = NEW.code);
SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: name (of a non-deprecated entry) must not already exist in (a non-deprecated entry of) crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.name = NEW.name AND crs_view.deprecated = 0 AND NEW.deprecated = 0
AND NEW.auth_name IN (SELECT auth_name FROM builtin_authorities WHERE auth_name NOT IN ('IGNF', 'ESRI'))
);
SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: geodetic_crs must not be deprecated when projected_crs is not deprecated')
WHERE EXISTS(SELECT 1 FROM geodetic_crs WHERE geodetic_crs.auth_name = NEW.geodetic_crs_auth_name AND geodetic_crs.code = NEW.geodetic_crs_code AND geodetic_crs.deprecated != 0 AND geodetic_crs.name NOT LIKE 'Unknown datum%' AND geodetic_crs.name NOT LIKE 'Unspecified datum%') AND NEW.deprecated = 0 AND NOT (NEW.auth_name = 'ESRI' AND NEW.geodetic_crs_auth_name != 'ESRI');
SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: conversion must exist when text_definition is NULL')
WHERE NOT EXISTS(SELECT 1 FROM conversion WHERE conversion.auth_name = NEW.conversion_auth_name AND conversion.code = NEW.conversion_code) AND NEW.text_definition IS NULL;
SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: conversion must not be deprecated when projected_crs is not deprecated')
WHERE EXISTS(SELECT 1 FROM conversion WHERE conversion.auth_name = NEW.conversion_auth_name AND conversion.code = NEW.conversion_code AND conversion.deprecated != 0) AND NEW.deprecated = 0;
--SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: geodetic_crs must NOT be defined when text_definition is NOT NULL')
-- WHERE (NOT(NEW.geodetic_crs_auth_name IS NULL OR NEW.geodetic_crs_code IS NULL)) AND NEW.text_definition IS NOT NULL;
SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: coordinate_system.type must be ''cartesian''')
WHERE (SELECT type FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) != 'Cartesian';
SELECT RAISE(ABORT, 'insert on projected_crs violates constraint: coordinate_system.dimension must be 2 or 3')
-- EPSG:4461 is topocentric
WHERE NOT(NEW.coordinate_system_auth_name = 'EPSG' AND NEW.coordinate_system_code = '4461') AND (SELECT dimension FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) NOT IN (2,3);
END;
CREATE TRIGGER compound_crs_insert_trigger
BEFORE INSERT ON compound_crs
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on compound_crs violates constraint: (auth_name, code) must not already exist in crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.auth_name AND crs_view.code = NEW.code);
SELECT RAISE(ABORT, 'insert on compound_crs violates constraint: name (of a non-deprecated entry) must not already exist in (a non-deprecated entry of) crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.name = NEW.name AND crs_view.deprecated = 0 AND NEW.deprecated = 0
AND NEW.auth_name IN (SELECT auth_name FROM builtin_authorities WHERE auth_name != 'IGNF')
);
SELECT RAISE(ABORT, 'insert on compound_crs violates constraint: horiz_crs(auth_name, code) not found')
WHERE NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.horiz_crs_auth_name AND crs_view.code = NEW.horiz_crs_code);
SELECT RAISE(ABORT, 'insert on compound_crs violates constraint: horiz_crs must be equal to ''geographic 2D'', ''projected'', ''derived projected'' or ''engineering''')
WHERE (SELECT type FROM crs_view WHERE crs_view.auth_name = NEW.horiz_crs_auth_name AND crs_view.code = NEW.horiz_crs_code) NOT IN ('geographic 2D', 'projected', 'derived projected', 'engineering');
SELECT RAISE(ABORT, 'insert on compound_crs violates constraint: vertical_crs must be equal to ''vertical''')
WHERE (SELECT type FROM crs_view WHERE crs_view.auth_name = NEW.vertical_crs_auth_name AND crs_view.code = NEW.vertical_crs_code) NOT IN ('vertical');
SELECT RAISE(ABORT, 'insert on compound_crs violates constraint: horiz_crs must not be deprecated when compound_crs is not deprecated')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.horiz_crs_auth_name AND crs_view.code = NEW.horiz_crs_code AND crs_view.deprecated != 0) AND NEW.deprecated = 0;
SELECT RAISE(ABORT, 'insert on compound_crs violates constraint: vertical_crs must not be deprecated when compound_crs is not deprecated')
WHERE EXISTS (SELECT 1 FROM vertical_crs WHERE vertical_crs.auth_name = NEW.vertical_crs_auth_name AND vertical_crs.code = NEW.vertical_crs_code AND vertical_crs.deprecated != 0) AND NEW.deprecated = 0;
END;
CREATE TRIGGER coordinate_metadata_insert_trigger
BEFORE INSERT ON coordinate_metadata
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on coordinate_metadata violates constraint: (crs_auth_name, crs_code) must already exist in crs_view')
WHERE NOT EXISTS (
SELECT 1 FROM crs_view WHERE
NEW.crs_auth_name IS NOT NULL AND
crs_view.auth_name = NEW.crs_auth_name AND
crs_view.code = NEW.crs_code
UNION ALL SELECT 1 WHERE NEW.crs_auth_name IS NULL);
SELECT RAISE(ABORT, 'insert on coordinate_metadata violates constraint: (crs_auth_name, crs_code) and crs_text_definition are mutually exclusive')
WHERE NEW.crs_auth_name IS NOT NULL AND NEW.crs_text_definition IS NOT NULL;
SELECT RAISE(ABORT, 'insert on coordinate_metadata violates constraint: one of (crs_auth_name, crs_code) or crs_text_definition must be set')
WHERE NEW.crs_auth_name IS NULL AND NEW.crs_text_definition IS NULL;
END;
CREATE TRIGGER helmert_transformation_insert_trigger
BEFORE INSERT ON helmert_transformation_table
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: (auth_name, code) must not already exist in coordinate_operation_with_conversion_view')
WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.auth_name AND covwv.code = NEW.code);
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: name (of a non-deprecated entry) must not already exist in (a non-deprecated entry of) coordinate_operation_with_conversion_view')
WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.name = NEW.name AND covwv.deprecated = 0 AND NEW.deprecated = 0
AND NEW.auth_name IN (SELECT auth_name FROM builtin_authorities WHERE auth_name != 'IGNF')
);
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: translation_uom.type must be ''length''')
WHERE (SELECT type FROM unit_of_measure WHERE unit_of_measure.auth_name = NEW.translation_uom_auth_name AND unit_of_measure.code = NEW.translation_uom_code) != 'length';
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: rotation_uom.type must be ''angle''')
WHERE (SELECT type FROM unit_of_measure WHERE unit_of_measure.auth_name = NEW.rotation_uom_auth_name AND unit_of_measure.code = NEW.rotation_uom_code) != 'angle';
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: scale_difference_uom.type must be ''scale''')
WHERE (SELECT type FROM unit_of_measure WHERE unit_of_measure.auth_name = NEW.scale_difference_uom_auth_name AND unit_of_measure.code = NEW.scale_difference_uom_code) != 'scale';
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: rate_translation_uom.type must be ''length''')
WHERE (SELECT type FROM unit_of_measure WHERE unit_of_measure.auth_name = NEW.rate_translation_uom_auth_name AND unit_of_measure.code = NEW.rate_translation_uom_code) != 'length';
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: rate_rotation_uom.type must be ''angle''')
WHERE (SELECT type FROM unit_of_measure WHERE unit_of_measure.auth_name = NEW.rate_rotation_uom_auth_name AND unit_of_measure.code = NEW.rate_rotation_uom_code) != 'angle';
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: rate_scale_difference_uom.type must be ''scale''')
WHERE (SELECT type FROM unit_of_measure WHERE unit_of_measure.auth_name = NEW.rate_scale_difference_uom_auth_name AND unit_of_measure.code = NEW.rate_scale_difference_uom_code) != 'scale';
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: epoch_uom.type must be ''time''')
WHERE (SELECT type FROM unit_of_measure WHERE unit_of_measure.auth_name = NEW.epoch_uom_auth_name AND unit_of_measure.code = NEW.epoch_uom_code) != 'time';
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: pivot_uom.type must be ''length''')
WHERE (SELECT type FROM unit_of_measure WHERE unit_of_measure.auth_name = NEW.pivot_uom_auth_name AND unit_of_measure.code = NEW.pivot_uom_code) != 'length';
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: source_crs must not be deprecated when helmert_transformation is not deprecated')
WHERE EXISTS(SELECT 1 FROM crs_view crs WHERE crs.auth_name = NEW.source_crs_auth_name AND crs.code = NEW.source_crs_code AND crs.deprecated != 0) AND NEW.deprecated = 0 AND NOT (NEW.auth_name = 'ESRI') AND NOT (NEW.auth_name = 'PROJ' AND NEW.code LIKE 'OLD_EPSG_%') AND NOT (NEW.auth_name = 'EPSG' AND NEW.code = 10786);
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: target_crs must not be deprecated when helmert_transformation is not deprecated')
WHERE EXISTS(SELECT 1 FROM crs_view crs WHERE crs.auth_name = NEW.target_crs_auth_name AND crs.code = NEW.target_crs_code AND crs.deprecated != 0) AND NEW.deprecated = 0 AND NOT (NEW.auth_name = 'ESRI') AND NOT (NEW.auth_name = 'PROJ' AND NEW.code LIKE 'OLD_EPSG_%') AND NOT (NEW.auth_name = 'EPSG' AND NEW.code IN (10786, 10787));
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: target_crs(auth_name, code) not found')
WHERE NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.target_crs_auth_name AND crs_view.code = NEW.target_crs_code);
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: target_crs must be geodetic or compound')
WHERE NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.target_crs_auth_name AND crs_view.code = NEW.target_crs_code AND crs_view.type IN ('geographic 2D', 'geographic 3D', 'geocentric', 'compound'));
-- check that source and target of the same nature
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: source CRS and target CRS must have consistent geodetic_crs.type')
WHERE EXISTS (SELECT 1 FROM crs_view crs1, crs_view crs2 WHERE
crs1.auth_name = NEW.source_crs_auth_name AND crs1.code = NEW.source_crs_code
AND crs2.auth_name = NEW.target_crs_auth_name AND crs2.code = NEW.target_crs_code
AND NEW.deprecated = 0 AND (
NOT ((crs1.type = crs2.type AND crs1.type IN ('geographic 2D', 'geographic 3D', 'geocentric') AND
NOT(NEW.method_auth_name = 'EPSG' AND NEW.method_code = 1149)) OR
(crs1.type = 'geographic 3D' and crs2.type = 'compound' AND
NEW.method_auth_name = 'EPSG' AND NEW.method_code = 1149))));
-- check that the method used by a Helmert transformation is consistent with the dimensionality of the CRS
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: the domain of the method of helmert_transformation should be consistent with the dimensionality of the CRS')
WHERE NEW.deprecated = 0 AND
(NOT(NEW.method_auth_name = 'EPSG' AND NEW.method_code = 1149) AND EXISTS (SELECT 1 FROM geodetic_crs crs
LEFT JOIN coordinate_operation_method m ON
NEW.method_auth_name = m.auth_name AND NEW.method_code = m.code
WHERE
crs.auth_name = NEW.source_crs_auth_name AND crs.code = NEW.source_crs_code AND
((m.name LIKE '%geog2D domain%' AND crs.type != 'geographic 2D') OR
(m.name LIKE '%geog3D domain%' AND crs.type != 'geographic 3D') OR
(m.name LIKE '%geocentric domain%' AND crs.type != 'geocentric')))
OR (NEW.method_auth_name = 'EPSG' AND NEW.method_code = 1149 AND EXISTS (SELECT 1 FROM compound_crs crs
LEFT JOIN coordinate_operation_method m ON
NEW.method_auth_name = m.auth_name AND NEW.method_code = m.code
WHERE
crs.auth_name = NEW.target_crs_auth_name AND crs.code = NEW.target_crs_code AND
m.name NOT LIKE '%geog3D domain%')));
-- check that a time-dependent Helmert transformation has its source or target CRS being dynamic
SELECT RAISE(ABORT, 'insert on helmert_transformation violates constraint: a time-dependent Helmert transformations should have at least one of its source or target CRS dynamic')
WHERE NEW.deprecated = 0
AND EXISTS (SELECT 1 FROM coordinate_operation_method m
WHERE NEW.method_auth_name = m.auth_name AND NEW.method_code = m.code AND
m.name LIKE 'Time-dependent%')
AND EXISTS (
SELECT 1 FROM geodetic_crs crs
JOIN geodetic_datum gd ON
gd.auth_name = crs.datum_auth_name AND gd.code = crs.datum_code
WHERE crs.auth_name = NEW.source_crs_auth_name AND
crs.code = NEW.source_crs_code AND
gd.frame_reference_epoch IS NULL)
AND EXISTS (
SELECT 1 FROM geodetic_crs crs
JOIN geodetic_datum gd ON
gd.auth_name = crs.datum_auth_name AND gd.code = crs.datum_code
WHERE crs.auth_name = NEW.target_crs_auth_name AND
crs.code = NEW.target_crs_code AND
gd.frame_reference_epoch IS NULL);
END;
CREATE TRIGGER grid_transformation_insert_trigger
BEFORE INSERT ON grid_transformation
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: (auth_name, code) must not already exist in coordinate_operation_with_conversion_view')
WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.auth_name AND covwv.code = NEW.code);
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: name (of a non-deprecated entry) must not already exist in (a non-deprecated entry of) coordinate_operation_with_conversion_view')
WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.name = NEW.name AND covwv.deprecated = 0 AND NEW.deprecated = 0
AND NEW.auth_name IN (SELECT auth_name FROM builtin_authorities WHERE auth_name != 'IGNF')
AND NOT (NEW.description LIKE 'Reversible alternative to%' AND covwv.description NOT LIKE 'Reversible alternative to%')
AND NEW.code NOT LIKE '%_WITH_NAD83CSRSV7_INTERPOLATION'
);
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: source_crs(auth_name, code) not found')
WHERE NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.source_crs_auth_name AND crs_view.code = NEW.source_crs_code);
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: target_crs(auth_name, code) not found')
WHERE NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.target_crs_auth_name AND crs_view.code = NEW.target_crs_code);
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: interpolation_crs(auth_name, code) not found')
WHERE NEW.interpolation_crs_code IS NOT NULL AND NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.interpolation_crs_auth_name AND crs_view.code = NEW.interpolation_crs_code);
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: interpolation_crs must be a GeodeticCRS on non-TIN shift based files')
WHERE NEW.method_name NOT LIKE '%JSON%' AND NEW.interpolation_crs_code IS NOT NULL AND NOT EXISTS (SELECT 1 FROM geodetic_crs WHERE geodetic_crs.auth_name = NEW.interpolation_crs_auth_name AND geodetic_crs.code = NEW.interpolation_crs_code);
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: source_crs must not be deprecated when grid_transformation is not deprecated')
WHERE EXISTS(SELECT 1 FROM crs_view crs WHERE crs.auth_name = NEW.source_crs_auth_name AND crs.code = NEW.source_crs_code AND crs.deprecated != 0) AND NEW.deprecated = 0 AND NOT (NEW.auth_name = 'ESRI') AND NOT (NEW.auth_name = 'PROJ' AND NEW.code LIKE 'OLD_EPSG_%');
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: target_crs must not be deprecated when grid_transformation is not deprecated')
WHERE EXISTS(SELECT 1 FROM crs_view crs WHERE crs.auth_name = NEW.target_crs_auth_name AND crs.code = NEW.target_crs_code AND crs.deprecated != 0) AND NEW.deprecated = 0 AND NOT (NEW.auth_name = 'ESRI') AND NOT (NEW.auth_name = 'PROJ' AND NEW.code LIKE 'OLD_EPSG_%');
-- check that grids with NTv2 method are properly registered
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: grid_transformation with NTv2 must have its source_crs in geodetic_crs table with type = ''geographic 2D''')
WHERE NEW.method_name = 'NTv2' AND
NOT EXISTS (SELECT 1 FROM geodetic_crs crs WHERE
NEW.source_crs_auth_name = crs.auth_name AND
NEW.source_crs_code = crs.code AND
crs.type = 'geographic 2D');
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: grid_transformation with NTv2 has have its target_crs in geodetic_crs table with type = ''geographic 2D''')
WHERE NEW.method_name = 'NTv2' AND
NOT EXISTS (SELECT 1 FROM geodetic_crs crs WHERE
NEW.target_crs_auth_name = crs.auth_name AND
NEW.target_crs_code = crs.code AND
crs.type = 'geographic 2D');
-- check that grids with Geographic3D to GravityRelatedHeight method are properly registered
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: grid_transformation with Geographic3D to GravityRelatedHeight must have its target_crs in vertical_crs table')
WHERE NEW.deprecated = 0 AND
NEW.method_name LIKE 'Geographic3D to GravityRelatedHeight%' AND
NOT EXISTS (SELECT 1 FROM vertical_crs crs WHERE
NEW.target_crs_auth_name = crs.auth_name AND
NEW.target_crs_code = crs.code);
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: grid_transformation with Geographic3D to GravityRelatedHeight or Geog3D to Geog2D+XXX must have its source_crs in geodetic_crs table with type = ''geographic 3D''')
WHERE NEW.deprecated = 0 AND
(NEW.method_name LIKE 'Geographic3D to %' OR NEW.method_name LIKE 'Geog3D to %') AND
NOT EXISTS (SELECT 1 FROM geodetic_crs crs WHERE
NEW.source_crs_auth_name = crs.auth_name AND
NEW.source_crs_code = crs.code AND
crs.type = 'geographic 3D');
-- check that transformations with Geog3D to Geog2D+GravityRelatedHeight/Depth family of methods are properly registered
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: a transformation Geog3D to Geog2D+GravityRelatedHeight/Depth must have a geog3D CRS as source')
WHERE NEW.deprecated = 0 AND
NEW.method_name LIKE 'Geog3D to Geog2D+%' AND
NOT EXISTS (SELECT 1 FROM geodetic_crs gcrs WHERE
gcrs.auth_name = NEW.source_crs_auth_name AND gcrs.code = NEW.source_crs_code
AND gcrs.type = 'geographic 3D');
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: a transformation Geog3D to Geog2D+GravityRelatedHeight/Depth must have a compound CRS with a geog2D CRS as target')
WHERE NEW.deprecated = 0 AND
NEW.method_name LIKE 'Geog3D to Geog2D+%' AND
NOT EXISTS (SELECT 1 FROM compound_crs ccrs
LEFT JOIN geodetic_crs gcrs ON
gcrs.auth_name = horiz_crs_auth_name AND gcrs.code = horiz_crs_code
WHERE
ccrs.auth_name = NEW.target_crs_auth_name AND ccrs.code = NEW.target_crs_code
AND gcrs.type = 'geographic 2D');
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: a transformation Geog3D to Geog2D+GravityRelatedHeight/Depth must use the same geodetic datum for the source and target CRS')
WHERE NEW.deprecated = 0 AND
NEW.method_name LIKE 'Geog3D to Geog2D+%' AND
-- Exception for following CRS 'ETRS89-CZE [2007] to ETRS89-CZE [2007] + Baltic 1957 height (2)'
(NOT (NEW.auth_name = 'EPSG' AND NEW.code = 10568)) AND
NOT EXISTS (SELECT 1 FROM compound_crs ccrs
LEFT JOIN geodetic_crs target_gcrs ON
target_gcrs.auth_name = horiz_crs_auth_name AND target_gcrs.code = horiz_crs_code
LEFT JOIN geodetic_crs source_gcrs ON
source_gcrs.auth_name = NEW.source_crs_auth_name AND source_gcrs.code = NEW.source_crs_code
WHERE
ccrs.auth_name = NEW.target_crs_auth_name AND ccrs.code = NEW.target_crs_code
AND source_gcrs.name = target_gcrs.name);
-- check that grids with 'Vertical Offset by Grid Interpolation' methods are properly registered
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: grid_transformation with Vertical Offset by Grid Interpolation must have its source_crs in vertical_crs table')
WHERE NEW.method_name LIKE 'Vertical Offset by Grid Interpolation%' AND
NOT EXISTS (SELECT 1 FROM vertical_crs crs WHERE
NEW.source_crs_auth_name = crs.auth_name AND
NEW.source_crs_code = crs.code);
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: grid_transformation with Vertical Offset by Grid Interpolation must have its target_crs in vertical_crs table')
WHERE NEW.method_name LIKE 'Vertical Offset by Grid Interpolation%' AND
NOT EXISTS (SELECT 1 FROM vertical_crs crs WHERE
NEW.target_crs_auth_name = crs.auth_name AND
NEW.target_crs_code = crs.code);
-- check that grids with 'Geocentric translations using NEU velocity grid (gtg)' method are properly registered
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: source_crs(auth_name, code) must be Geocentric')
WHERE NEW.method_name IN ('Geocentric translations using NEU velocity grid (gtg)') AND NOT EXISTS (SELECT 1 FROM geodetic_crs gcrs WHERE gcrs.auth_name = NEW.source_crs_auth_name AND gcrs.code = NEW.source_crs_code AND type = 'geocentric');
SELECT RAISE(ABORT, 'insert on grid_transformation violates constraint: target_crs(auth_name, code) must be Geocentric')
WHERE NEW.method_name IN ('Geocentric translations using NEU velocity grid (gtg)') AND NOT EXISTS (SELECT 1 FROM geodetic_crs gcrs WHERE gcrs.auth_name = NEW.target_crs_auth_name AND gcrs.code = NEW.target_crs_code AND type = 'geocentric');
END;
CREATE TRIGGER grid_packages_insert_trigger
BEFORE INSERT ON grid_packages
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on grid_packages violates constraint: open_license must be set when url is not NULL')
WHERE NEW.open_license IS NULL AND NEW.url IS NOT NULL;
SELECT RAISE(ABORT, 'insert on grid_packages violates constraint: direct_download must be set when url is not NULL')
WHERE NEW.direct_download IS NULL AND NEW.url IS NOT NULL;
END;
CREATE TRIGGER grid_alternatives_insert_trigger
BEFORE INSERT ON grid_alternatives
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on grid_alternatives violates constraint: original_grid_name must be referenced in grid_transformation.grid_name or in other_transformation.method_name')
WHERE NEW.original_grid_name NOT LIKE 'NOT-YET-IN-GRID-TRANSFORMATION-%' AND
NOT EXISTS (
SELECT 1 FROM grid_transformation WHERE grid_name = NEW.original_grid_name
UNION ALL
SELECT 1 FROM other_transformation WHERE
(method_auth_name = 'PROJ' AND
method_name LIKE '%' || NEW.original_grid_name || '%') OR grid_name = NEW.original_grid_name);
END;
CREATE TRIGGER other_transformation_insert_trigger
BEFORE INSERT ON other_transformation
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: (auth_name, code) must not already exist in coordinate_operation_with_conversion_view')
WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.auth_name AND covwv.code = NEW.code);
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: name (of a non-deprecated entry) must not already exist in (a non-deprecated entry of) coordinate_operation_with_conversion_view')
WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.name = NEW.name AND covwv.deprecated = 0 AND NEW.deprecated = 0
AND NEW.auth_name IN (SELECT auth_name FROM builtin_authorities WHERE auth_name != 'IGNF')
);
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: source_crs(auth_name, code) not found')
WHERE NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.source_crs_auth_name AND crs_view.code = NEW.source_crs_code);
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: target_crs(auth_name, code) not found')
WHERE NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.target_crs_auth_name AND crs_view.code = NEW.target_crs_code);
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: source_crs must not be deprecated when other_transformation is not deprecated')
WHERE EXISTS(SELECT 1 FROM crs_view crs WHERE crs.auth_name = NEW.source_crs_auth_name AND crs.code = NEW.source_crs_code AND crs.deprecated != 0) AND NEW.deprecated = 0 AND NOT (NEW.auth_name = 'ESRI');
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: target_crs must not be deprecated when other_transformation is not deprecated')
WHERE EXISTS(SELECT 1 FROM crs_view crs WHERE crs.auth_name = NEW.target_crs_auth_name AND crs.code = NEW.target_crs_code AND crs.deprecated != 0) AND NEW.deprecated = 0 AND NOT (NEW.auth_name = 'ESRI');
-- check that transformations operations between vertical CRS are from/into a vertical CRS
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: transformation operating on vertical CRS must have a source CRS being a vertical CRS')
WHERE NEW.deprecated = 0 AND
NEW.method_name IN ('Vertical Offset', 'Height Depth Reversal', 'Change of Vertical Unit') AND
NOT EXISTS (SELECT 1 FROM vertical_crs crs WHERE
crs.auth_name = NEW.source_crs_auth_name AND crs.code = NEW.source_crs_code);
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: transformation operating on vertical CRS must have a target CRS being a vertical CRS')
WHERE NEW.deprecated = 0 AND
NEW.method_name IN ('Vertical Offset', 'Height Depth Reversal', 'Change of Vertical Unit') AND
NOT EXISTS (SELECT 1 FROM vertical_crs crs WHERE
crs.auth_name = NEW.target_crs_auth_name AND crs.code = NEW.target_crs_code);
-- check that 'Geographic2D with Height Offsets' transformations have a compound CRS with a geog2D as source
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: a transformation Geographic2D with Height Offsets must have a compound CRS with a geog2D as source')
WHERE NEW.deprecated = 0 AND
NEW.method_name = 'Geographic2D with Height Offsets' AND
NOT EXISTS (SELECT 1 FROM compound_crs ccrs
LEFT JOIN geodetic_crs gcrs ON
gcrs.auth_name = horiz_crs_auth_name AND gcrs.code = horiz_crs_code
WHERE
ccrs.auth_name = NEW.source_crs_auth_name AND ccrs.code = NEW.source_crs_code
AND gcrs.type = 'geographic 2D');
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: a transformation Geographic2D with Height Offsets must have a geographic 3D CRS as target')
WHERE NEW.deprecated = 0 AND
NEW.method_name = 'Geographic2D with Height Offsets' AND
NOT EXISTS (SELECT 1 FROM geodetic_crs gcrs WHERE
gcrs.auth_name = NEW.target_crs_auth_name AND gcrs.code = NEW.target_crs_code
AND gcrs.type = 'geographic 3D');
-- check that operations with 'Geocen translations by grid (gtg) & Geocen translations NEU velocities (gtg)' and 'Position Vector (geocen) & Geocen translations NEU velocities (gtg)' methods are properly registered
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: source_crs(auth_name, code) must be Geocentric')
WHERE NEW.method_name IN ('Geocen translations by grid (gtg) & Geocen translations NEU velocities (gtg)', 'Position Vector (geocen) & Geocen translations NEU velocities (gtg)') AND NOT EXISTS (SELECT 1 FROM geodetic_crs gcrs WHERE gcrs.auth_name = NEW.source_crs_auth_name AND gcrs.code = NEW.source_crs_code AND type = 'geocentric');
SELECT RAISE(ABORT, 'insert on other_transformation violates constraint: target_crs(auth_name, code) must be Geocentric')
WHERE NEW.method_name IN ('Geocen translations by grid (gtg) & Geocen translations NEU velocities (gtg)', 'Position Vector (geocen) & Geocen translations NEU velocities (gtg)') AND NOT EXISTS (SELECT 1 FROM geodetic_crs gcrs WHERE gcrs.auth_name = NEW.target_crs_auth_name AND gcrs.code = NEW.target_crs_code AND type = 'geocentric');
END;
CREATE TRIGGER concatenated_operation_insert_trigger
BEFORE INSERT ON concatenated_operation
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on concatenated_operation violates constraint: (auth_name, code) must not already exist in coordinate_operation_with_conversion_view')
WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.auth_name AND covwv.code = NEW.code);
SELECT RAISE(ABORT, 'insert on concatenated_operation violates constraint: name (of a non-deprecated entry) must not already exist in (a non-deprecated entry of) coordinate_operation_with_conversion_view')
WHERE EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.name = NEW.name AND covwv.deprecated = 0 AND NEW.deprecated = 0
AND NEW.auth_name IN (SELECT auth_name FROM builtin_authorities WHERE auth_name != 'IGNF')
);
SELECT RAISE(ABORT, 'insert on concatenated_operation violates constraint: source_crs(auth_name, code) not found')
WHERE NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.source_crs_auth_name AND crs_view.code = NEW.source_crs_code);
SELECT RAISE(ABORT, 'insert on concatenated_operation violates constraint: target_crs(auth_name, code) not found')
WHERE NOT EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.target_crs_auth_name AND crs_view.code = NEW.target_crs_code);
SELECT RAISE(ABORT, 'insert on concatenated_operation violates constraint: source_crs must not be deprecated when concatenated_operation is not deprecated')
WHERE EXISTS(SELECT 1 FROM crs_view crs WHERE crs.auth_name = NEW.source_crs_auth_name AND crs.code = NEW.source_crs_code AND crs.deprecated != 0) AND NEW.deprecated = 0 AND NOT (NEW.auth_name = 'ESRI');
SELECT RAISE(ABORT, 'insert on concatenated_operation violates constraint: target_crs must not be deprecated when concatenated_operation is not deprecated')
WHERE EXISTS(SELECT 1 FROM crs_view crs WHERE crs.auth_name = NEW.target_crs_auth_name AND crs.code = NEW.target_crs_code AND crs.deprecated != 0) AND NEW.deprecated = 0 AND NOT (NEW.auth_name = 'ESRI');
END;
CREATE TRIGGER concatenated_operation_step_insert_trigger
BEFORE INSERT ON concatenated_operation_step
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on concatenated_operation_step violates constraint: (step_auth_name, step_code) must already exist in coordinate_operation_with_conversion_view')
WHERE NOT EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.step_auth_name AND covwv.code = NEW.step_code);
SELECT RAISE(ABORT, 'insert on concatenated_operation_step violates constraint: step should not be a concatenated_operation')
WHERE EXISTS(SELECT 1 FROM concatenated_operation WHERE auth_name = NEW.step_auth_name AND code = NEW.step_code);
-- NOTE: it would be good to be able to do the same for the last step, but
-- we don't know at INSERT time which one is going to be the last one...
SELECT RAISE(ABORT, 'insert on concatenated_operation_step violates constraint: step 1 must be a conversion or its source_crs or target_crs must be the source_crs of the concatenated_operation')
WHERE
NEW.step_number = 1
-- skip deprecated concatenated operations, or some blocklisted EPSG operations
AND NOT EXISTS (
SELECT 1 FROM concatenated_operation concat_op WHERE
concat_op.auth_name = NEW.operation_auth_name AND concat_op.code = NEW.operation_code
AND concat_op.deprecated = 1)
-- check if source_crs of step 1 is the source_crs of the concatenated_operation (by CRS code)
AND NOT EXISTS (
SELECT 1 FROM coordinate_operation_view step_op
LEFT JOIN concatenated_operation concat_op ON
concat_op.auth_name = NEW.operation_auth_name AND concat_op.code = NEW.operation_code
WHERE concat_op.deprecated = 0
AND step_op.auth_name = NEW.step_auth_name AND step_op.code = NEW.step_code
AND concat_op.source_crs_auth_name = step_op.source_crs_auth_name
AND concat_op.source_crs_code = step_op.source_crs_code)
-- same as above, but check by CRS name, and only for geodetic CRS.
-- For example the concatenated operation EPSG:9683 ("ITRF2014 to GDA94 (2)")
-- has EPSG:9000 "ITRF2014" (geographic 2D) as source CRS
-- but its first step is EPSG:8049 ("ITRF2014 to GDA2020 (1)") which has
-- EPSG:7789 "ITRF2014" (geocentric) as source CRS !
AND NOT EXISTS (
SELECT 1 FROM coordinate_operation_view step_op
LEFT JOIN concatenated_operation concat_op ON
concat_op.auth_name = NEW.operation_auth_name AND concat_op.code = NEW.operation_code
LEFT JOIN geodetic_crs concat_op_source_crs ON
concat_op_source_crs.auth_name = concat_op.source_crs_auth_name
AND concat_op_source_crs.code = concat_op.source_crs_code
LEFT JOIN geodetic_crs step_op_source_crs ON
step_op_source_crs.auth_name = step_op.source_crs_auth_name
AND step_op_source_crs.code = step_op.source_crs_code
WHERE concat_op.deprecated = 0
AND step_op.auth_name = NEW.step_auth_name AND step_op.code = NEW.step_code
AND concat_op_source_crs.name = step_op_source_crs.name)
-- case for EPSG:10146 "INAGeoid2020 v1 height to INAGeoid v2 height (1)"
-- that has EPSG:9471 "INAGeoid2020 v1 height" as source CRS
-- but its first step is EPSG:9629 "SRGI2013 to SRGI2013 + INAGeoid2020 v1 height (1)"
-- that has EPSG:9529 "SRGI2013 + INAGeoid2020 v1 height" as target CRS
AND NOT EXISTS (
SELECT 1 FROM coordinate_operation_view step_op
LEFT JOIN concatenated_operation concat_op ON
concat_op.auth_name = NEW.operation_auth_name AND concat_op.code = NEW.operation_code
LEFT JOIN vertical_crs concat_op_source_crs ON
concat_op_source_crs.auth_name = concat_op.source_crs_auth_name
AND concat_op_source_crs.code = concat_op.source_crs_code
LEFT JOIN compound_crs step_op_target_crs ON
step_op_target_crs.auth_name = step_op.target_crs_auth_name
AND step_op_target_crs.code = step_op.target_crs_code
WHERE concat_op.deprecated = 0
AND step_op.auth_name = NEW.step_auth_name AND step_op.code = NEW.step_code
AND step_op_target_crs.name LIKE '% + '|| concat_op_source_crs.name)
-- or if source_crs of step 1 is the target_crs of the concatenated_operation
AND NOT EXISTS (
SELECT 1 FROM coordinate_operation_view step_op
LEFT JOIN concatenated_operation concat_op ON
concat_op.auth_name = NEW.operation_auth_name AND concat_op.code = NEW.operation_code
WHERE concat_op.deprecated = 0
AND step_op.auth_name = NEW.step_auth_name AND step_op.code = NEW.step_code
AND concat_op.source_crs_auth_name = step_op.target_crs_auth_name
AND concat_op.source_crs_code = step_op.target_crs_code)
-- or if source_crs of step 1 is a conversion
AND NOT EXISTS (
SELECT 1 FROM conversion_table step_op
LEFT JOIN concatenated_operation concat_op ON
concat_op.auth_name = NEW.operation_auth_name AND concat_op.code = NEW.operation_code
WHERE concat_op.deprecated = 0
AND step_op.auth_name = NEW.step_auth_name AND step_op.code = NEW.step_code)
;
END;
CREATE TRIGGER geoid_model_insert_trigger
BEFORE INSERT ON geoid_model
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on geoid_model violates constraint: (operation_auth_name, operation_code) must already exist in coordinate_operation_with_conversion_view')
WHERE NOT EXISTS (SELECT 1 FROM coordinate_operation_with_conversion_view covwv WHERE covwv.auth_name = NEW.operation_auth_name AND covwv.code = NEW.operation_code);
END;
CREATE TRIGGER alias_name_insert_trigger
BEFORE INSERT ON alias_name
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on alias_name violates constraint: new entry refers to unexisting code')
WHERE NOT EXISTS (SELECT 1 FROM object_view o WHERE o.table_name = NEW.table_name AND o.auth_name = NEW.auth_name AND o.code = NEW.code);
END;
CREATE TRIGGER derived_projected_crs_insert_trigger
BEFORE INSERT ON derived_projected_crs
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on derived_projected_crs violates constraint: (auth_name, code) must not already exist in crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.auth_name = NEW.auth_name AND crs_view.code = NEW.code);
SELECT RAISE(ABORT, 'insert on derived_projected_crs violates constraint: name (of a non-deprecated entry) must not already exist in (a non-deprecated entry of) crs_view')
WHERE EXISTS (SELECT 1 FROM crs_view WHERE crs_view.name = NEW.name AND crs_view.deprecated = 0 AND NEW.deprecated = 0
);
SELECT RAISE(ABORT, 'insert on derived_projected_crs violates constraint: base_crs must not be deprecated when derived_projected_crs is not deprecated')
WHERE EXISTS(SELECT 1 FROM projected_crs WHERE projected_crs.auth_name = NEW.base_crs_auth_name AND projected_crs.code = NEW.base_crs_code AND projected_crs.deprecated != 0) AND NEW.deprecated = 0;
SELECT RAISE(ABORT, 'insert on derived_projected_crs violates constraint: conversion must exist when text_definition is NULL')
WHERE NOT EXISTS(SELECT 1 FROM conversion WHERE conversion.auth_name = NEW.conversion_auth_name AND conversion.code = NEW.conversion_code) AND NEW.text_definition IS NULL;
SELECT RAISE(ABORT, 'insert on derived_projected_crs violates constraint: conversion must not be deprecated when derived_projected_crs is not deprecated')
WHERE EXISTS(SELECT 1 FROM conversion WHERE conversion.auth_name = NEW.conversion_auth_name AND conversion.code = NEW.conversion_code AND conversion.deprecated != 0) AND NEW.deprecated = 0;
SELECT RAISE(ABORT, 'insert on derived_projected_crs violates constraint: coordinate_system.type must be one of ''affine'', ''Cartesian'', ''cylindrical'', ''ordinal'', ''polar'', ''spherical''')
WHERE (SELECT type FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) NOT IN ('affine', 'Cartesian', 'cylindrical', 'ordinal', 'polar', 'spherical');
SELECT RAISE(ABORT, 'insert on derived_projected_crs violates constraint: coordinate_system.dimension must be 1, 2 or 3')
WHERE (SELECT dimension FROM coordinate_system WHERE coordinate_system.auth_name = NEW.coordinate_system_auth_name AND coordinate_system.code = NEW.coordinate_system_code) NOT IN (1, 2, 3);
END;
CREATE TRIGGER supersession_insert_trigger
BEFORE INSERT ON supersession
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on supersession violates constraint: superseded entry refers to unexisting code')
WHERE NOT EXISTS (SELECT 1 FROM object_view o WHERE o.table_name = NEW.superseded_table_name AND o.auth_name = NEW.superseded_auth_name AND o.code = NEW.superseded_code);
SELECT RAISE(ABORT, 'insert on supersession violates constraint: replacement entry refers to unexisting code')
WHERE NOT EXISTS (SELECT 1 FROM object_view o WHERE o.table_name = NEW.replacement_table_name AND o.auth_name = NEW.replacement_auth_name AND o.code = NEW.replacement_code);
END;
CREATE TRIGGER deprecation_insert_trigger
BEFORE INSERT ON deprecation
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'insert on deprecation violates constraint: deprecated entry refers to unexisting code')
WHERE NOT EXISTS (SELECT 1 FROM object_view o WHERE o.table_name = NEW.table_name AND o.auth_name = NEW.deprecated_auth_name AND o.code = NEW.deprecated_code);
SELECT RAISE(ABORT, 'insert on deprecation violates constraint: replacement entry refers to unexisting code')
WHERE NOT EXISTS (SELECT 1 FROM object_view o WHERE o.table_name = NEW.table_name AND o.auth_name = NEW.replacement_auth_name AND o.code = NEW.replacement_code);
END;
+451 -783
View File
File diff suppressed because it is too large Load Diff
+3 -12
View File
@@ -71,7 +71,7 @@ BEGIN
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1052' AND (NEW.method_name != 'Colombia Urban' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8801' OR NEW.param1_name != 'Latitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8802' OR NEW.param2_name != 'Longitude of natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8806' OR NEW.param3_name != 'False easting' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'length' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8807' OR NEW.param4_name != 'False northing' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'length' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '1039' OR NEW.param5_name != 'Projection plane origin height' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'length' OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Hotine Oblique Mercator (variant A)')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9812' AND (NEW.method_name != 'Hotine Oblique Mercator (variant A)' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8811' OR NEW.param1_name != 'Latitude of projection centre' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8812' OR NEW.param2_name != 'Longitude of projection centre' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8813' OR NEW.param3_name != 'Azimuth at projection centre' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8814' OR NEW.param4_name != 'Angle from Rectified to Skew Grid' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'angle' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8815' OR NEW.param5_name != 'Scale factor at projection centre' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'scale' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8806' OR NEW.param6_name != 'False easting' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name != 'EPSG' OR NEW.param7_code != '8807' OR NEW.param7_name != 'False northing' OR NEW.param7_value IS NULL OR NEW.param7_uom_auth_name IS NULL OR NEW.param7_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param7_uom_auth_name AND code = NEW.param7_uom_code) != 'length');
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9812' AND (NEW.method_name != 'Hotine Oblique Mercator (variant A)' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8811' OR NEW.param1_name != 'Latitude of projection centre' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8812' OR NEW.param2_name != 'Longitude of projection centre' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8813' OR NEW.param3_name != 'Azimuth of initial line' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8814' OR NEW.param4_name != 'Angle from Rectified to Skew Grid' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'angle' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8815' OR NEW.param5_name != 'Scale factor on initial line' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'scale' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8806' OR NEW.param6_name != 'False easting' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name != 'EPSG' OR NEW.param7_code != '8807' OR NEW.param7_name != 'False northing' OR NEW.param7_value IS NULL OR NEW.param7_uom_auth_name IS NULL OR NEW.param7_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param7_uom_auth_name AND code = NEW.param7_uom_code) != 'length');
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Lambert Cylindrical Equal Area')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9835' AND (NEW.method_name != 'Lambert Cylindrical Equal Area' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8823' OR NEW.param1_name != 'Latitude of 1st standard parallel' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8802' OR NEW.param2_name != 'Longitude of natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8806' OR NEW.param3_name != 'False easting' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'length' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8807' OR NEW.param4_name != 'False northing' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'length' OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
@@ -86,23 +86,17 @@ BEGIN
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1104' AND (NEW.method_name != 'Change of Vertical Unit' OR NEW.param1_auth_name IS NOT NULL OR NEW.param1_code IS NOT NULL OR NEW.param1_name IS NOT NULL OR NEW.param1_value IS NOT NULL OR NEW.param1_uom_auth_name IS NOT NULL OR NEW.param1_uom_code IS NOT NULL OR NEW.param2_auth_name IS NOT NULL OR NEW.param2_code IS NOT NULL OR NEW.param2_name IS NOT NULL OR NEW.param2_value IS NOT NULL OR NEW.param2_uom_auth_name IS NOT NULL OR NEW.param2_uom_code IS NOT NULL OR NEW.param3_auth_name IS NOT NULL OR NEW.param3_code IS NOT NULL OR NEW.param3_name IS NOT NULL OR NEW.param3_value IS NOT NULL OR NEW.param3_uom_auth_name IS NOT NULL OR NEW.param3_uom_code IS NOT NULL OR NEW.param4_auth_name IS NOT NULL OR NEW.param4_code IS NOT NULL OR NEW.param4_name IS NOT NULL OR NEW.param4_value IS NOT NULL OR NEW.param4_uom_auth_name IS NOT NULL OR NEW.param4_uom_code IS NOT NULL OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Hotine Oblique Mercator (variant B)')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9815' AND (NEW.method_name != 'Hotine Oblique Mercator (variant B)' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8811' OR NEW.param1_name != 'Latitude of projection centre' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8812' OR NEW.param2_name != 'Longitude of projection centre' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8813' OR NEW.param3_name != 'Azimuth at projection centre' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8814' OR NEW.param4_name != 'Angle from Rectified to Skew Grid' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'angle' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8815' OR NEW.param5_name != 'Scale factor at projection centre' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'scale' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8816' OR NEW.param6_name != 'Easting at projection centre' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name != 'EPSG' OR NEW.param7_code != '8817' OR NEW.param7_name != 'Northing at projection centre' OR NEW.param7_value IS NULL OR NEW.param7_uom_auth_name IS NULL OR NEW.param7_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param7_uom_auth_name AND code = NEW.param7_uom_code) != 'length');
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9815' AND (NEW.method_name != 'Hotine Oblique Mercator (variant B)' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8811' OR NEW.param1_name != 'Latitude of projection centre' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8812' OR NEW.param2_name != 'Longitude of projection centre' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8813' OR NEW.param3_name != 'Azimuth of initial line' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8814' OR NEW.param4_name != 'Angle from Rectified to Skew Grid' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'angle' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8815' OR NEW.param5_name != 'Scale factor on initial line' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'scale' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8816' OR NEW.param6_name != 'Easting at projection centre' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name != 'EPSG' OR NEW.param7_code != '8817' OR NEW.param7_name != 'Northing at projection centre' OR NEW.param7_value IS NULL OR NEW.param7_uom_auth_name IS NULL OR NEW.param7_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param7_uom_auth_name AND code = NEW.param7_uom_code) != 'length');
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Laborde Oblique Mercator')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9813' AND (NEW.method_name != 'Laborde Oblique Mercator' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8811' OR NEW.param1_name != 'Latitude of projection centre' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8812' OR NEW.param2_name != 'Longitude of projection centre' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8813' OR NEW.param3_name != 'Azimuth at projection centre' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8815' OR NEW.param4_name != 'Scale factor at projection centre' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'scale' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8806' OR NEW.param5_name != 'False easting' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'length' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8807' OR NEW.param6_name != 'False northing' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9813' AND (NEW.method_name != 'Laborde Oblique Mercator' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8811' OR NEW.param1_name != 'Latitude of projection centre' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8812' OR NEW.param2_name != 'Longitude of projection centre' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8813' OR NEW.param3_name != 'Azimuth of initial line' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8815' OR NEW.param4_name != 'Scale factor on initial line' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'scale' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8806' OR NEW.param5_name != 'False easting' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'length' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8807' OR NEW.param6_name != 'False northing' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Equal Earth')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1078' AND (NEW.method_name != 'Equal Earth' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8802' OR NEW.param1_name != 'Longitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8806' OR NEW.param2_name != 'False easting' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'length' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8807' OR NEW.param3_name != 'False northing' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'length' OR NEW.param4_auth_name IS NOT NULL OR NEW.param4_code IS NOT NULL OR NEW.param4_name IS NOT NULL OR NEW.param4_value IS NOT NULL OR NEW.param4_uom_auth_name IS NOT NULL OR NEW.param4_uom_code IS NOT NULL OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Lambert Conic Conformal (1SP variant B)')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1102' AND (NEW.method_name != 'Lambert Conic Conformal (1SP variant B)' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8801' OR NEW.param1_name != 'Latitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8805' OR NEW.param2_name != 'Scale factor at natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'scale' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8821' OR NEW.param3_name != 'Latitude of false origin' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8822' OR NEW.param4_name != 'Longitude of false origin' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'angle' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8826' OR NEW.param5_name != 'Easting at false origin' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'length' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8827' OR NEW.param6_name != 'Northing at false origin' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Transverse Mercator 3D')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1111' AND (NEW.method_name != 'Transverse Mercator 3D' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8801' OR NEW.param1_name != 'Latitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8802' OR NEW.param2_name != 'Longitude of natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8805' OR NEW.param3_name != 'Scale factor at natural origin' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'scale' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8806' OR NEW.param4_name != 'False easting' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'length' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8807' OR NEW.param5_name != 'False northing' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'length' OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Local Orthographic')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1130' AND (NEW.method_name != 'Local Orthographic' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8811' OR NEW.param1_name != 'Latitude of projection centre' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8812' OR NEW.param2_name != 'Longitude of projection centre' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8813' OR NEW.param3_name != 'Azimuth at projection centre' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'angle' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8815' OR NEW.param4_name != 'Scale factor at projection centre' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'scale' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8816' OR NEW.param5_name != 'Easting at projection centre' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'length' OR NEW.param6_auth_name != 'EPSG' OR NEW.param6_code != '8817' OR NEW.param6_name != 'Northing at projection centre' OR NEW.param6_value IS NULL OR NEW.param6_uom_auth_name IS NULL OR NEW.param6_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param6_uom_auth_name AND code = NEW.param6_uom_code) != 'length' OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Modified Azimuthal Equidistant')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9832' AND (NEW.method_name != 'Modified Azimuthal Equidistant' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8801' OR NEW.param1_name != 'Latitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8802' OR NEW.param2_name != 'Longitude of natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8806' OR NEW.param3_name != 'False easting' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'length' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8807' OR NEW.param4_name != 'False northing' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'length' OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
@@ -133,9 +127,6 @@ BEGIN
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Transverse Mercator (South Orientated)')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9808' AND (NEW.method_name != 'Transverse Mercator (South Orientated)' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8801' OR NEW.param1_name != 'Latitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8802' OR NEW.param2_name != 'Longitude of natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8805' OR NEW.param3_name != 'Scale factor at natural origin' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'scale' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8806' OR NEW.param4_name != 'False easting' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'length' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8807' OR NEW.param5_name != 'False northing' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'length' OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Azimuthal Equidistant')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '1125' AND (NEW.method_name != 'Azimuthal Equidistant' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8801' OR NEW.param1_name != 'Latitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8802' OR NEW.param2_name != 'Longitude of natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8806' OR NEW.param3_name != 'False easting' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'length' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8807' OR NEW.param4_name != 'False northing' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'length' OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Lambert Conic Conformal (West Orientated)')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9826' AND (NEW.method_name != 'Lambert Conic Conformal (West Orientated)' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8801' OR NEW.param1_name != 'Latitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8802' OR NEW.param2_name != 'Longitude of natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8805' OR NEW.param3_name != 'Scale factor at natural origin' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'scale' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8806' OR NEW.param4_name != 'False easting' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'length' OR NEW.param5_auth_name != 'EPSG' OR NEW.param5_code != '8807' OR NEW.param5_name != 'False northing' OR NEW.param5_value IS NULL OR NEW.param5_uom_auth_name IS NULL OR NEW.param5_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param5_uom_auth_name AND code = NEW.param5_uom_code) != 'length' OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
@@ -1,9 +0,0 @@
CREATE TRIGGER conversion_method_check_insert_trigger_orthographic
INSTEAD OF INSERT ON conversion
BEGIN
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Orthographic')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9840' AND (NEW.method_name != 'Orthographic' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8801' OR NEW.param1_name != 'Latitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8802' OR NEW.param2_name != 'Longitude of natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8806' OR NEW.param3_name != 'False easting' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'length' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8807' OR NEW.param4_name != 'False northing' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'length' OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
END;
-2
View File
@@ -27,8 +27,6 @@ INSERT INTO "coordinate_system" VALUES('EPSG','1047','Cartesian',2);
INSERT INTO "coordinate_system" VALUES('EPSG','1048','Cartesian',2);
INSERT INTO "coordinate_system" VALUES('EPSG','1049','vertical',1);
INSERT INTO "coordinate_system" VALUES('EPSG','1050','vertical',1);
INSERT INTO "coordinate_system" VALUES('EPSG','1053','Cartesian',2);
INSERT INTO "coordinate_system" VALUES('EPSG','1054','Cartesian',2);
INSERT INTO "coordinate_system" VALUES('EPSG','4400','Cartesian',2);
INSERT INTO "coordinate_system" VALUES('EPSG','4401','Cartesian',2);
INSERT INTO "coordinate_system" VALUES('EPSG','4402','Cartesian',2);
+73 -436
View File
@@ -68,7 +68,7 @@ INSERT INTO "usage" VALUES(
'EPSG','1024' -- unknown
);
INSERT INTO "other_transformation" VALUES('PROJ','CRS84_TO_EPSG_4326','OGC:CRS84 to WGS 84',NULL,'EPSG','9843','Axis Order Reversal (2D)','OGC','CRS84','EPSG','4326',0.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "other_transformation" VALUES('PROJ','CRS84_TO_EPSG_4326','OGC:CRS84 to WGS 84',NULL,'EPSG','9843','Axis Order Reversal (2D)','OGC','CRS84','EPSG','4326',0.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES(
'PROJ',
'CRS84_TO_EPSG_4326_USAGE',
@@ -79,7 +79,7 @@ INSERT INTO "usage" VALUES(
'EPSG','1024' -- unknown
);
INSERT INTO "other_transformation" VALUES('PROJ','CRS27_TO_EPSG_4267','OGC:CRS27 to NAD27',NULL,'EPSG','9843','Axis Order Reversal (2D)','OGC','CRS27','EPSG','4267',0.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "other_transformation" VALUES('PROJ','CRS27_TO_EPSG_4267','OGC:CRS27 to NAD27',NULL,'EPSG','9843','Axis Order Reversal (2D)','OGC','CRS27','EPSG','4267',0.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES(
'PROJ',
'CRS27_TO_EPSG_4267_USAGE',
@@ -90,7 +90,7 @@ INSERT INTO "usage" VALUES(
'EPSG','1024' -- unknown
);
INSERT INTO "other_transformation" VALUES('PROJ','CRS83_TO_EPSG_4269','OGC:CRS83 to NAD83',NULL,'EPSG','9843','Axis Order Reversal (2D)','OGC','CRS83','EPSG','4269',0.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "other_transformation" VALUES('PROJ','CRS83_TO_EPSG_4269','OGC:CRS83 to NAD83',NULL,'EPSG','9843','Axis Order Reversal (2D)','OGC','CRS83','EPSG','4269',0.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES(
'PROJ',
'CRS83_TO_EPSG_4269_USAGE',
@@ -135,7 +135,7 @@ UPDATE grid_transformation SET interpolation_crs_auth_name = 'EPSG',
-- EPSG:1312 'NAD27 to NAD83 (3)' / NTv1_0.gsb has a accuracy of 1m whereas
-- EPSG:1313 'NAD27 to NAD83 (4)' / NTv2_0.gsb has a accuracy of 1.5m
-- so we will never select automatically NTv2_0.gsb. Worse the advertise
-- so we will never select automatically NTv2_0.gsb. Worse the advertize
-- accuracy of the NTv1 method
UPDATE grid_transformation SET accuracy = 2.0 WHERE auth_name = 'EPSG' AND code = '1312';
@@ -144,364 +144,6 @@ UPDATE grid_transformation SET accuracy = 2.0 WHERE auth_name = 'EPSG' AND code
UPDATE grid_transformation SET accuracy = 2.0 WHERE auth_name = 'EPSG' AND code = '1462';
-- Create a PROJ copy of EPSG:9123 "NAD83(CSRS) to CGVD28 height (1)" by
-- removing the deprecation flag.
-- Having a transformation from/to CGVD28 using the "generic" NAD83(CSRS) is much
-- more convenient for low accuracy cases like https://github.com/OSGeo/PROJ/issues/3328
INSERT INTO grid_transformation SELECT
'PROJ' AS auth_name,
'EPSG_9123' AS code,
name,
description || ' Imported from EPSG:9123 with deprecation flag removed by PROJ' AS description,
method_auth_name,
method_code,
method_name,
source_crs_auth_name,
source_crs_code,
target_crs_auth_name,
target_crs_code,
accuracy,
grid_param_auth_name,
grid_param_code,
grid_param_name,
grid_name,
grid2_param_auth_name,
grid2_param_code,
grid2_param_name,
grid2_name,
param1_auth_name,
param1_code,
param1_name,
param1_value,
param1_uom_auth_name,
param1_uom_code,
param2_auth_name,
param2_code,
param2_name,
param2_value,
param2_uom_auth_name,
param2_uom_code,
interpolation_crs_auth_name,
interpolation_crs_code,
operation_version,
0 AS deprecated
FROM grid_transformation WHERE auth_name = 'EPSG' AND code = '9123';
INSERT INTO usage SELECT
'PROJ' AS auth_name,
'USAGE_PROJ_EPSG_9123' AS code,
object_table_name,
'PROJ' AS object_auth_name,
'EPSG_9123' AS object_code,
extent_auth_name,
extent_code,
scope_auth_name,
scope_code
FROM usage WHERE object_table_name = 'grid_transformation' AND object_auth_name = 'EPSG' AND object_code = '9123';
-- Canadian transformations: duplicate EPSG:10518, 10519, 10520, 10116, 10117, 10118 with NAD83(CSRS)v7 as interpolation CRS
INSERT INTO grid_transformation SELECT
'PROJ' AS auth_name,
'EPSG_10518_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
name,
description || ' Specifies NAD83(CSRS)v7 (code 8255) as interpolation CRS.' AS description,
method_auth_name,
method_code,
method_name,
source_crs_auth_name,
source_crs_code,
target_crs_auth_name,
target_crs_code,
accuracy,
grid_param_auth_name,
grid_param_code,
grid_param_name,
grid_name,
grid2_param_auth_name,
grid2_param_code,
grid2_param_name,
grid2_name,
param1_auth_name,
param1_code,
param1_name,
param1_value,
param1_uom_auth_name,
param1_uom_code,
param2_auth_name,
param2_code,
param2_name,
param2_value,
param2_uom_auth_name,
param2_uom_code,
'EPSG' AS interpolation_crs_auth_name,
8255 AS interpolation_crs_code,
operation_version,
0 AS deprecated
FROM grid_transformation WHERE auth_name = 'EPSG' AND code = '10518';
INSERT INTO usage SELECT
'PROJ' AS auth_name,
'USAGE_PROJ_EPSG_1058_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
object_table_name,
'PROJ' AS object_auth_name,
'EPSG_10518_WITH_NAD83CSRSV7_INTERPOLATION' AS object_code,
extent_auth_name,
extent_code,
scope_auth_name,
scope_code
FROM usage WHERE object_table_name = 'grid_transformation' AND object_auth_name = 'EPSG' AND object_code = '10518';
INSERT INTO grid_transformation SELECT
'PROJ' AS auth_name,
'EPSG_10519_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
name,
description || ' Specifies NAD83(CSRS)v7 (code 8255) as interpolation CRS.' AS description,
method_auth_name,
method_code,
method_name,
source_crs_auth_name,
source_crs_code,
target_crs_auth_name,
target_crs_code,
accuracy,
grid_param_auth_name,
grid_param_code,
grid_param_name,
grid_name,
grid2_param_auth_name,
grid2_param_code,
grid2_param_name,
grid2_name,
param1_auth_name,
param1_code,
param1_name,
param1_value,
param1_uom_auth_name,
param1_uom_code,
param2_auth_name,
param2_code,
param2_name,
param2_value,
param2_uom_auth_name,
param2_uom_code,
'EPSG' AS interpolation_crs_auth_name,
8255 AS interpolation_crs_code,
operation_version,
0 AS deprecated
FROM grid_transformation WHERE auth_name = 'EPSG' AND code = '10519';
INSERT INTO usage SELECT
'PROJ' AS auth_name,
'USAGE_PROJ_EPSG_10519_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
object_table_name,
'PROJ' AS object_auth_name,
'EPSG_10519_WITH_NAD83CSRSV7_INTERPOLATION' AS object_code,
extent_auth_name,
extent_code,
scope_auth_name,
scope_code
FROM usage WHERE object_table_name = 'grid_transformation' AND object_auth_name = 'EPSG' AND object_code = '10519';
INSERT INTO grid_transformation SELECT
'PROJ' AS auth_name,
'EPSG_10520_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
name,
description || ' Specifies NAD83(CSRS)v7 (code 8255) as interpolation CRS.' AS description,
method_auth_name,
method_code,
method_name,
source_crs_auth_name,
source_crs_code,
target_crs_auth_name,
target_crs_code,
accuracy,
grid_param_auth_name,
grid_param_code,
grid_param_name,
grid_name,
grid2_param_auth_name,
grid2_param_code,
grid2_param_name,
grid2_name,
param1_auth_name,
param1_code,
param1_name,
param1_value,
param1_uom_auth_name,
param1_uom_code,
param2_auth_name,
param2_code,
param2_name,
param2_value,
param2_uom_auth_name,
param2_uom_code,
'EPSG' AS interpolation_crs_auth_name,
8255 AS interpolation_crs_code,
operation_version,
0 AS deprecated
FROM grid_transformation WHERE auth_name = 'EPSG' AND code = '10520';
INSERT INTO usage SELECT
'PROJ' AS auth_name,
'USAGE_PROJ_EPSG_10520_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
object_table_name,
'PROJ' AS object_auth_name,
'EPSG_10520_WITH_NAD83CSRSV7_INTERPOLATION' AS object_code,
extent_auth_name,
extent_code,
scope_auth_name,
scope_code
FROM usage WHERE object_table_name = 'grid_transformation' AND object_auth_name = 'EPSG' AND object_code = '10520';
INSERT INTO grid_transformation SELECT
'PROJ' AS auth_name,
'EPSG_10116_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
name,
description || ' Specifies NAD83(CSRS)v7 (code 8255) as interpolation CRS.' AS description,
method_auth_name,
method_code,
method_name,
source_crs_auth_name,
source_crs_code,
target_crs_auth_name,
target_crs_code,
accuracy,
grid_param_auth_name,
grid_param_code,
grid_param_name,
grid_name,
grid2_param_auth_name,
grid2_param_code,
grid2_param_name,
grid2_name,
param1_auth_name,
param1_code,
param1_name,
param1_value,
param1_uom_auth_name,
param1_uom_code,
param2_auth_name,
param2_code,
param2_name,
param2_value,
param2_uom_auth_name,
param2_uom_code,
'EPSG' AS interpolation_crs_auth_name,
8255 AS interpolation_crs_code,
operation_version,
0 AS deprecated
FROM grid_transformation WHERE auth_name = 'EPSG' AND code = '10116';
INSERT INTO usage SELECT
'PROJ' AS auth_name,
'USAGE_PROJ_EPSG_10116_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
object_table_name,
'PROJ' AS object_auth_name,
'EPSG_10116_WITH_NAD83CSRSV7_INTERPOLATION' AS object_code,
extent_auth_name,
extent_code,
scope_auth_name,
scope_code
FROM usage WHERE object_table_name = 'grid_transformation' AND object_auth_name = 'EPSG' AND object_code = '10116';
INSERT INTO grid_transformation SELECT
'PROJ' AS auth_name,
'EPSG_10117_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
name,
description || ' Specifies NAD83(CSRS)v7 (code 8255) as interpolation CRS.' AS description,
method_auth_name,
method_code,
method_name,
source_crs_auth_name,
source_crs_code,
target_crs_auth_name,
target_crs_code,
accuracy,
grid_param_auth_name,
grid_param_code,
grid_param_name,
grid_name,
grid2_param_auth_name,
grid2_param_code,
grid2_param_name,
grid2_name,
param1_auth_name,
param1_code,
param1_name,
param1_value,
param1_uom_auth_name,
param1_uom_code,
param2_auth_name,
param2_code,
param2_name,
param2_value,
param2_uom_auth_name,
param2_uom_code,
'EPSG' AS interpolation_crs_auth_name,
8255 AS interpolation_crs_code,
operation_version,
0 AS deprecated
FROM grid_transformation WHERE auth_name = 'EPSG' AND code = '10117';
INSERT INTO usage SELECT
'PROJ' AS auth_name,
'USAGE_PROJ_EPSG_10117_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
object_table_name,
'PROJ' AS object_auth_name,
'EPSG_10117_WITH_NAD83CSRSV7_INTERPOLATION' AS object_code,
extent_auth_name,
extent_code,
scope_auth_name,
scope_code
FROM usage WHERE object_table_name = 'grid_transformation' AND object_auth_name = 'EPSG' AND object_code = '10117';
INSERT INTO grid_transformation SELECT
'PROJ' AS auth_name,
'EPSG_10118_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
name,
description || ' Specifies NAD83(CSRS)v7 (code 8255) as interpolation CRS.' AS description,
method_auth_name,
method_code,
method_name,
source_crs_auth_name,
source_crs_code,
target_crs_auth_name,
target_crs_code,
accuracy,
grid_param_auth_name,
grid_param_code,
grid_param_name,
grid_name,
grid2_param_auth_name,
grid2_param_code,
grid2_param_name,
grid2_name,
param1_auth_name,
param1_code,
param1_name,
param1_value,
param1_uom_auth_name,
param1_uom_code,
param2_auth_name,
param2_code,
param2_name,
param2_value,
param2_uom_auth_name,
param2_uom_code,
'EPSG' AS interpolation_crs_auth_name,
8255 AS interpolation_crs_code,
operation_version,
0 AS deprecated
FROM grid_transformation WHERE auth_name = 'EPSG' AND code = '10118';
INSERT INTO usage SELECT
'PROJ' AS auth_name,
'USAGE_PROJ_EPSG_10118_WITH_NAD83CSRSV7_INTERPOLATION' AS code,
object_table_name,
'PROJ' AS object_auth_name,
'EPSG_10118_WITH_NAD83CSRSV7_INTERPOLATION' AS object_code,
extent_auth_name,
extent_code,
scope_auth_name,
scope_code
FROM usage WHERE object_table_name = 'grid_transformation' AND object_auth_name = 'EPSG' AND object_code = '10118';
-- Define the allowed authorities, and their precedence, when researching a
-- coordinate operation
@@ -542,6 +184,73 @@ INSERT INTO "axis" VALUES('PROJ','1','Easting','E','east','PROJ','ENh',1,'EPSG',
INSERT INTO "axis" VALUES('PROJ','2','Northing','N','north','PROJ','ENh',2,'EPSG','9001');
INSERT INTO "axis" VALUES('PROJ','3','Ellipsoidal height','h','up','PROJ','ENh',2,'EPSG','9001');
-- Consider all WGS84 related CRS are equivalent with an accuracy of 2m
INSERT INTO "helmert_transformation" VALUES('PROJ','WGS84_TO_WGS84_G730','WGS 84 to WGS 84 (G730)','Accuracy 2m','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4326','EPSG','9053',2.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,'',0);
INSERT INTO "usage" VALUES(
'PROJ',
'WGS84_TO_WGS84_G730_USAGE',
'helmert_transformation',
'PROJ',
'WGS84_TO_WGS84_G730',
'EPSG','1262', -- extent
'EPSG','1024' -- unknown
);
INSERT INTO "helmert_transformation" VALUES('PROJ','WGS84_TO_WGS84_G873','WGS 84 to WGS 84 (G873)','Accuracy 2m','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4326','EPSG','9054',2.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,'',0);
INSERT INTO "usage" VALUES(
'PROJ',
'WGS84_TO_WGS84_G873_USAGE',
'helmert_transformation',
'PROJ',
'WGS84_TO_WGS84_G873',
'EPSG','1262', -- extent
'EPSG','1024' -- unknown
);
INSERT INTO "helmert_transformation" VALUES('PROJ','WGS84_TO_WGS84_G1150','WGS 84 to WGS 84 (G1150)','Accuracy 2m','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4326','EPSG','9055',2.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,'',0);
INSERT INTO "usage" VALUES(
'PROJ',
'WGS84_TO_WGS84_G1150_USAGE',
'helmert_transformation',
'PROJ',
'WGS84_TO_WGS84_G1150',
'EPSG','1262', -- extent
'EPSG','1024' -- unknown
);
INSERT INTO "helmert_transformation" VALUES('PROJ','WGS84_TO_WGS84_G1674','WGS 84 to WGS 84 (G1674)','Accuracy 2m','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4326','EPSG','9056',2.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,'',0);
INSERT INTO "usage" VALUES(
'PROJ',
'WGS84_TO_WGS84_G1674_USAGE',
'helmert_transformation',
'PROJ',
'WGS84_TO_WGS84_G1674',
'EPSG','1262', -- extent
'EPSG','1024' -- unknown
);
INSERT INTO "helmert_transformation" VALUES('PROJ','WGS84_TO_WGS84_G1762','WGS 84 to WGS 84 (G1762)','Accuracy 2m','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4326','EPSG','9057',2.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,'',0);
INSERT INTO "usage" VALUES(
'PROJ',
'WGS84_TO_WGS84_G1762_USAGE',
'helmert_transformation',
'PROJ',
'WGS84_TO_WGS84_G1762',
'EPSG','1262', -- extent
'EPSG','1024' -- unknown
);
INSERT INTO "helmert_transformation" VALUES('PROJ','WGS84_TO_WGS84_TRANSIT','WGS 84 to WGS 84 (Transit)','Accuracy 2m','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4326','EPSG','8888',2.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,'',0);
INSERT INTO "usage" VALUES(
'PROJ',
'WGS84_TO_WGS84_TRANSIT_USAGE',
'helmert_transformation',
'PROJ',
'WGS84_TO_WGS84_TRANSIT',
'EPSG','1262', -- extent
'EPSG','1024' -- unknown
);
---- Geoid models -----
INSERT INTO "geoid_model" SELECT 'GEOID99', auth_name, code FROM grid_transformation WHERE auth_name = 'EPSG' AND grid_name LIKE 'g1999%' AND deprecated = 0;
@@ -561,7 +270,7 @@ INSERT INTO "geoid_model" SELECT 'GEOID18', auth_name, code FROM grid_transforma
INSERT INTO "geoid_model" SELECT 'OSGM15', auth_name, code FROM grid_transformation WHERE auth_name = 'EPSG' AND grid_name LIKE '%OSGM15%' AND deprecated = 0;
INSERT INTO "geoid_model" SELECT 'GGM10', auth_name, code FROM grid_transformation WHERE auth_name = 'EPSG' AND grid_name LIKE 'GGM10.txt' AND deprecated = 0;
INSERT INTO "geoid_model" SELECT 'GGM10', auth_name, code FROM grid_transformation WHERE auth_name = 'PROJ' AND grid_name LIKE 'GGM10.txt' AND deprecated = 0;
---- PROJ historic +datum aliases -----
@@ -638,18 +347,6 @@ SELECT
gt.grid2_param_code,
gt.grid2_param_name,
gt.grid2_name,
gt.param1_auth_name,
gt.param1_code,
gt.param1_name,
gt.param1_value,
gt.param1_uom_auth_name,
gt.param1_uom_code,
gt.param2_auth_name,
gt.param2_code,
gt.param2_name,
gt.param2_value,
gt.param2_uom_auth_name,
gt.param2_uom_code,
gt.interpolation_crs_auth_name,
gt.interpolation_crs_code,
gt.operation_version,
@@ -659,7 +356,7 @@ JOIN compound_crs c ON gt.target_crs_code = c.code AND gt.target_crs_auth_name =
JOIN geodetic_crs gcrs ON gt.source_crs_auth_name = gcrs.auth_name AND gt.source_crs_code = gcrs.code
JOIN vertical_crs vcrs on vcrs.auth_name = c.vertical_crs_auth_name AND vcrs.code = c.vertical_crs_code
WHERE method_auth_name = 'EPSG' AND method_name LIKE 'Geog3D to Geog2D+%'
AND NOT EXISTS (SELECT 1 FROM grid_transformation gt2 WHERE gt2.method_name LIKE 'Geographic3D to%' AND gt2.source_crs_auth_name = gt.source_crs_auth_name AND gt2.source_crs_code = gt.source_crs_code AND gt2.target_crs_auth_name = vcrs.auth_name AND gt2.target_crs_code = vcrs.code AND gt2.grid_name = gt.grid_name)
AND NOT EXISTS (SELECT 1 FROM grid_transformation gt2 WHERE gt2.method_name LIKE 'Geographic3D to%' AND gt2.source_crs_auth_name = gt.source_crs_auth_name AND gt2.source_crs_code = gt.source_crs_code AND gt2.target_crs_auth_name = vcrs.auth_name AND gt2.target_crs_code = vcrs.code)
AND gt.deprecated = 0;
INSERT INTO "usage"
@@ -677,63 +374,3 @@ FROM grid_transformation gt
JOIN usage u ON u.object_auth_name = gt.auth_name AND u.object_code = gt.code AND u.object_table_name = 'grid_transformation'
WHERE method_auth_name = 'EPSG' AND method_name LIKE 'Geog3D to Geog2D+%'
AND EXISTS (SELECT 1 FROM grid_transformation gt2 WHERE gt2.auth_name = 'PROJ' AND gt2.code = gt.auth_name || '_' || gt.code || '_RESTRICTED_TO_VERTCRS');
-- Add records corresponding to EGM2008 grid for WGS 84 realizations
INSERT INTO "grid_transformation"
SELECT
'PROJ' AS auth_name,
replace(replace(replace(gcrs.name, ' ', '_'), '(', ''), ')', '') || '_TO_EGM2008',
gcrs.name || ' to EGM2008 height (from ' || gt.name || ')' AS name,
gt.description,
gt.method_auth_name,
gt.method_code,
gt.method_name,
gcrs.auth_name,
gcrs.code,
gt.target_crs_auth_name,
gt.target_crs_code,
gt.accuracy,
gt.grid_param_auth_name,
gt.grid_param_code,
gt.grid_param_name,
gt.grid_name,
gt.grid2_param_auth_name,
gt.grid2_param_code,
gt.grid2_param_name,
gt.grid2_name,
gt.param1_auth_name,
gt.param1_code,
gt.param1_name,
gt.param1_value,
gt.param1_uom_auth_name,
gt.param1_uom_code,
gt.param2_auth_name,
gt.param2_code,
gt.param2_name,
gt.param2_value,
gt.param2_uom_auth_name,
gt.param2_uom_code,
gt.interpolation_crs_auth_name,
gt.interpolation_crs_code,
gt.operation_version,
gt.deprecated
FROM grid_transformation gt, geodetic_crs gcrs
WHERE gt.name = 'WGS 84 to EGM2008 height (1)'
AND gcrs.auth_name = 'EPSG' AND gcrs.name LIKE 'WGS 84 (G%' AND gcrs.type='geographic 3D' and gcrs.deprecated=0;
INSERT INTO "usage"
SELECT
'PROJ' AS auth_name,
'USAGE_' || replace(replace(replace(gcrs.name, ' ', '_'), '(', ''), ')', '') || '_TO_EGM2008' AS code,
'grid_transformation' AS object_table_name,
'PROJ' AS object_auth_name,
replace(replace(replace(gcrs.name, ' ', '_'), '(', ''), ')', '') || '_TO_EGM2008' AS object_code,
u.extent_auth_name,
u.extent_code,
u.scope_auth_name,
u.scope_code
FROM grid_transformation gt, geodetic_crs gcrs
JOIN usage u ON u.object_auth_name = gt.auth_name AND u.object_code = gt.code AND u.object_table_name = 'grid_transformation'
WHERE gt.name = 'WGS 84 to EGM2008 height (1)'
AND gcrs.auth_name = 'EPSG' AND gcrs.name LIKE 'WGS 84 (G%' AND gcrs.type='geographic 3D' and gcrs.deprecated=0;
+9
View File
@@ -6,3 +6,12 @@ INSERT INTO "scope" VALUES('PROJ','SCOPE_UNKNOWN','Not known.',0);
INSERT INTO celestial_body VALUES('PROJ', 'EARTH', 'Earth', 6378137.0);
INSERT INTO versioned_auth_name_mapping VALUES ('IAU_2015', 'IAU', '2015', 1);
CREATE TRIGGER conversion_method_check_insert_trigger_orthographic
INSTEAD OF INSERT ON conversion
BEGIN
SELECT RAISE(ABORT, 'insert on conversion violates constraint: bad parameters for Orthographic')
WHERE NEW.deprecated != 1 AND NEW.method_auth_name = 'EPSG' AND NEW.method_code = '9840' AND (NEW.method_name != 'Orthographic' OR NEW.param1_auth_name != 'EPSG' OR NEW.param1_code != '8801' OR NEW.param1_name != 'Latitude of natural origin' OR NEW.param1_value IS NULL OR NEW.param1_uom_auth_name IS NULL OR NEW.param1_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param1_uom_auth_name AND code = NEW.param1_uom_code) != 'angle' OR NEW.param2_auth_name != 'EPSG' OR NEW.param2_code != '8802' OR NEW.param2_name != 'Longitude of natural origin' OR NEW.param2_value IS NULL OR NEW.param2_uom_auth_name IS NULL OR NEW.param2_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param2_uom_auth_name AND code = NEW.param2_uom_code) != 'angle' OR NEW.param3_auth_name != 'EPSG' OR NEW.param3_code != '8806' OR NEW.param3_name != 'False easting' OR NEW.param3_value IS NULL OR NEW.param3_uom_auth_name IS NULL OR NEW.param3_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param3_uom_auth_name AND code = NEW.param3_uom_code) != 'length' OR NEW.param4_auth_name != 'EPSG' OR NEW.param4_code != '8807' OR NEW.param4_name != 'False northing' OR NEW.param4_value IS NULL OR NEW.param4_uom_auth_name IS NULL OR NEW.param4_uom_code IS NULL OR (SELECT type FROM unit_of_measure WHERE auth_name = NEW.param4_uom_auth_name AND code = NEW.param4_uom_code) != 'length' OR NEW.param5_auth_name IS NOT NULL OR NEW.param5_code IS NOT NULL OR NEW.param5_name IS NOT NULL OR NEW.param5_value IS NOT NULL OR NEW.param5_uom_auth_name IS NOT NULL OR NEW.param5_uom_code IS NOT NULL OR NEW.param6_auth_name IS NOT NULL OR NEW.param6_code IS NOT NULL OR NEW.param6_name IS NOT NULL OR NEW.param6_value IS NOT NULL OR NEW.param6_uom_auth_name IS NOT NULL OR NEW.param6_uom_code IS NOT NULL OR NEW.param7_auth_name IS NOT NULL OR NEW.param7_code IS NOT NULL OR NEW.param7_name IS NOT NULL OR NEW.param7_value IS NOT NULL OR NEW.param7_uom_auth_name IS NOT NULL OR NEW.param7_uom_code IS NOT NULL);
END;
+5 -8
View File
@@ -457,17 +457,14 @@ INSERT INTO "deprecation" VALUES('geodetic_crs','EPSG','8449','EPSG','8860','EPS
INSERT INTO "deprecation" VALUES('geodetic_crs','EPSG','4280','EPSG','4211','EPSG');
INSERT INTO "deprecation" VALUES('geodetic_crs','EPSG','4808','EPSG','4813','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','2163','EPSG','9311','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','3408','EPSG','6931','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','3409','EPSG','6932','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','3410','EPSG','6933','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','3411','EPSG','3413','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','3412','EPSG','3976','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','4088','EPSG','4087','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','7804','EPSG','9391','EPSG');
INSERT INTO "deprecation" VALUES('compound_crs','EPSG','5832','EPSG','9928','EPSG');
INSERT INTO "deprecation" VALUES('compound_crs','EPSG','5833','EPSG','9929','EPSG');
INSERT INTO "deprecation" VALUES('compound_crs','EPSG','5834','EPSG','9930','EPSG');
INSERT INTO "deprecation" VALUES('compound_crs','EPSG','5835','EPSG','9931','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','10480','EPSG','10481','EPSG');
INSERT INTO "deprecation" VALUES('projected_crs','EPSG','10788','EPSG','10820','EPSG');
INSERT INTO "deprecation" VALUES('geodetic_crs','EPSG','10783','EPSG','10176','EPSG');
INSERT INTO "deprecation" VALUES('geodetic_crs','EPSG','10784','EPSG','10177','EPSG');
INSERT INTO "deprecation" VALUES('geodetic_crs','EPSG','10785','EPSG','10178','EPSG');
INSERT INTO "deprecation" VALUES('geodetic_crs','EPSG','10781','EPSG','9990','EPSG');
INSERT INTO "deprecation" VALUES('geodetic_crs','EPSG','10780','EPSG','9989','EPSG');
INSERT INTO "deprecation" VALUES('geodetic_crs','EPSG','10779','EPSG','9988','EPSG');
-612
View File
@@ -1,612 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:uml="http://schema.omg.org/spec/UML/2.1">
<xmi:Documentation exporter="umbrello uml modeller 2.35.0 (Applications 22.08.0) http://umbrello.kde.org" exporterVersion="2.0.4"/>
<uml:Model xmi:id="m1" name="Modèle UML">
<packagedElement xmi:type="uml:Stereotype" xmi:id="folder" name="folder"/>
<packagedElement xmi:type="uml:Stereotype" xmi:id="dataType" name="dataType"/>
<packagedElement xmi:type="uml:Stereotype" xmi:id="interface" name="interface"/>
<packagedElement xmi:type="uml:Model" xmi:id="Logical_View" name="Logical View">
<uml:Package xmi:id="Datatypes" name="Datatypes" stereotype="folder">
<packagedElement xmi:type="uml:DataType" xmi:id="un10q3RAZh9YU" name="char" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uAynv6TbgG11Z" name="int" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="ucOVt2J1fTMkF" name="float" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uiXGLFrfkCoBN" name="double" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uM3vdo8djgFgC" name="bool" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uhL8F851fQQyq" name="string" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="utJAws36TUGWD" name="unsigned char" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="unKRfzLu0XGvb" name="signed char" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="u95deU2ow68b1" name="unsigned int" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uLpP90F2P3CjD" name="signed int" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="u4xSDe1bTIp4y" name="short int" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="ujAtUquSJ4ymf" name="unsigned short int" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uQJ6caew3c0pr" name="signed short int" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="u0pTHqeM9ZjOn" name="long int" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uHILGaUoMVqSP" name="signed long int" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uMQGXdDcGxXwm" name="unsigned long int" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uGU1cu1WWxGTK" name="long double" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uxDmw01nt3l8h" name="wchar_t" stereotype="dataType"/>
<packagedElement xmi:type="uml:DataType" xmi:id="uoLfrpRTKO5H9" name="celestial_body" stereotype="dataType" isActive="false"/>
</uml:Package>
<packagedElement xmi:type="uml:Class" xmi:id="usFiDnmfbJFfx" name="celestial_body"/>
<packagedElement xmi:type="uml:Class" xmi:id="uObC58hPo02ai" name="ellipsoid"/>
<packagedElement xmi:type="uml:Class" xmi:id="uxIdWYUj1tC89" name="extent"/>
<packagedElement xmi:type="uml:Class" xmi:id="uJg1To66U2yLo" name="scope"/>
<packagedElement xmi:type="uml:Class" xmi:id="u7xVpU72itjoO" name="usage"/>
<packagedElement xmi:type="uml:Class" xmi:id="uyKfofPnOJBBz" name="prime_meridian"/>
<packagedElement xmi:type="uml:Class" xmi:id="uXIw9hpV4Laec" name="geodetic_datum"/>
<packagedElement xmi:type="uml:Class" xmi:id="uZFrn4Xpu0xx2" name="geodetic_datum_ensemble_member"/>
<packagedElement xmi:type="uml:Association" xmi:id="u2iZnV3lQo8VV" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uIclTFwqf3Qzm" name="" type="uObC58hPo02ai" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="ubctbZ3lLchnR" name="" type="usFiDnmfbJFfx" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uVfxEzXLrb5Rx" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="udba8A00mJCH4" name="" type="usFiDnmfbJFfx" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u4UKCzMwHfe5W" name="" type="uObC58hPo02ai" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uxGY0deqShuSF" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="usTC48tt9lcUM" name="" type="u7xVpU72itjoO" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uGh6TFBFzznNi" name="" type="uJg1To66U2yLo" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uNmyoVwUTXMDb" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uRJkZIVlNqBJ8" name="" type="u7xVpU72itjoO" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u4nTLk0C5WkOO" name="" type="uxIdWYUj1tC89" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="u0flfhTWustUM" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uCa7re6vVEGdT" name="" type="uObC58hPo02ai" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="us7QbDcUitYdi" name="" type="uXIw9hpV4Laec" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uPn9DTm3O4C2C" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="unUPWkhkiuSqv" name="" type="usFiDnmfbJFfx" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="umXR5RGTZy9Bm" name="" type="uObC58hPo02ai" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uKCie6nj32jNj" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="ul9s5PfHcwHi9" name="" type="uObC58hPo02ai" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uJGMUUu3aUdnD" name="" type="usFiDnmfbJFfx" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="ucUcuKZl9wulS" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u9hlMKrXk5IIg" name="" type="uXIw9hpV4Laec" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uUYM4WW4jdn8k" name="" type="uObC58hPo02ai" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uqmMELyDiHgbZ" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uRSTymCE2VAqd" name="" type="uXIw9hpV4Laec" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="upwscO1GgZUwK" name="" type="uyKfofPnOJBBz" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uhhqgJpi7OTNv" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uAhG7f7lOZDjw" name="" type="uZFrn4Xpu0xx2" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uMVzlQTUTpWaP" name="" type="uXIw9hpV4Laec" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="utMrJMUbU32wJ" name="coordinate_system"/>
<packagedElement xmi:type="uml:Class" xmi:id="u0B5HltcEv058" name="axis"/>
<packagedElement xmi:type="uml:Association" xmi:id="ub524vi7o2MQs" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uG3CflRilOpLF" name="" type="u0B5HltcEv058" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uvWqs7Gvj2623" name="" type="utMrJMUbU32wJ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uICv8VZ7ridbA" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u1qF7rQfnlpJY" name="" type="utMrJMUbU32wJ" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u4Q97lZKWq2lT" name="" type="u0B5HltcEv058" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uaj1PqppIwcJM" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="upl40aCxoShlE" name="" type="utMrJMUbU32wJ" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uDFrgIldp3PvY" name="" type="u0B5HltcEv058" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="uBBUUxy1ciMcJ" name="vertical_datum"/>
<packagedElement xmi:type="uml:Class" xmi:id="uyjoPy6DRbPA4" name="vertical_datum_ensemble_member"/>
<packagedElement xmi:type="uml:Class" xmi:id="uGyT73jCULmlG" name="geodetic_crs"/>
<packagedElement xmi:type="uml:Association" xmi:id="uzgX0FJyw7lFO" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uL9l3B5uNr8x7" name="" type="uGyT73jCULmlG" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u21uRcpRMJXas" name="" type="uXIw9hpV4Laec" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uDA52qncCXvlM" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uWZJXd5PxK0v9" name="" type="uGyT73jCULmlG" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uvOEO2TnPi5Sf" name="" type="utMrJMUbU32wJ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uqmjTn3jgUi3v" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u3os39y38Ok0x" name="" type="uGyT73jCULmlG" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uqLzmqQeXfOeD" name="" type="u7xVpU72itjoO" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="uaNvEyeKUaDUQ" name="vertical_crs"/>
<packagedElement xmi:type="uml:Class" xmi:id="uF1TLmuLJtlVj" name="unit_of_measure"/>
<packagedElement xmi:type="uml:Association" xmi:id="uHGGZSuHhrnIU" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uj4370zCys8pO" name="" type="u0B5HltcEv058" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uU41D2bzT8NWS" name="" type="uF1TLmuLJtlVj" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="u25L1YUK3aNvZ" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uewTRFLTUoCDX" name="" type="uBBUUxy1ciMcJ" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="ux5bkjkvacrsX" name="" type="uaNvEyeKUaDUQ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="ukSvQYmStkMCb" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u1TUDRfuF5nf4" name="" type="uBBUUxy1ciMcJ" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uYuFkkxVGtvVm" name="" type="uaNvEyeKUaDUQ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="u0vCAwaM6wOIT" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="upf6QJ4elmkVN" name="" type="uaNvEyeKUaDUQ" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uCD4usquL7e3R" name="" type="uBBUUxy1ciMcJ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uFYTHrYnhGxji" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uCtxpIJqEUdlI" name="" type="uaNvEyeKUaDUQ" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uoVylRS0TwDSD" name="" type="utMrJMUbU32wJ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uSVHHvwBxQSrq" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="ubdep3WXQC0tf" name="" type="uaNvEyeKUaDUQ" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uXj3ZkhJ4jpDh" name="" type="u7xVpU72itjoO" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="u8NpszsCtPwog" name="conversion"/>
<packagedElement xmi:type="uml:Class" xmi:id="u6Mx5ikYdLO6g" name="projected_crs"/>
<packagedElement xmi:type="uml:Association" xmi:id="uf2iKfQ1gbEHG" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uu49xwJ8zo4B7" name="" type="u6Mx5ikYdLO6g" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="ud17hibkUBpBY" name="" type="uGyT73jCULmlG" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="ujhNRvn4TLezM" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="umXAyVN6hB28J" name="" type="u6Mx5ikYdLO6g" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uxvOHxqWG1prq" name="" type="u8NpszsCtPwog" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uKY6ijA9G37v4" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uQZm5sCJjahvT" name="" type="u6Mx5ikYdLO6g" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uuXFCYoz4xFFw" name="" type="utMrJMUbU32wJ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="ul2lN2OKAIDYf" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uemGlZVVj4z7e" name="" type="u6Mx5ikYdLO6g" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="ussKvy1UDMruJ" name="" type="u7xVpU72itjoO" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Interface" xmi:id="u5BghmDXUkrxB" name="CRS" isAbstract="true" stereotype="interface"/>
<packagedElement xmi:type="uml:Interface" xmi:id="umFTWBZY3sT1t" name="horizontal_crs" isAbstract="true" stereotype="interface"/>
<packagedElement xmi:type="uml:Association" xmi:id="uxlafigrj7dPB" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uZev0Oqtg0P9I" name="" type="uGyT73jCULmlG" aggregation="none" isNavigable="false" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uuEtFcVNefM4a" name="" type="umFTWBZY3sT1t" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uOGESIiV1lUWR" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uvMDc1BneKqzU" name="" type="u6Mx5ikYdLO6g" aggregation="none" isNavigable="false" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uVuB81gENCakM" name="" type="umFTWBZY3sT1t" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="uyyIBNbwTXz8Y" name="compound_crs"/>
<packagedElement xmi:type="uml:Association" xmi:id="uVmMIfTWfhhtz" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="ufWb8BVBiApKZ" name="" type="uyyIBNbwTXz8Y" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uirBkX3LK38PS" name="" type="umFTWBZY3sT1t" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uLcwRFeyrXoYI" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u4ac4Rbyy6T1c" name="" type="uyyIBNbwTXz8Y" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u8LvbhzYcD0t0" name="" type="uaNvEyeKUaDUQ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="uxsXx7eblI25W" name="helmert_transformation"/>
<packagedElement xmi:type="uml:Class" xmi:id="uRgOG0gxyXHen" name="grid_transformation"/>
<packagedElement xmi:type="uml:Class" xmi:id="ueG4mAO9OIIjR" name="grid_alternatives"/>
<packagedElement xmi:type="uml:Class" xmi:id="uKZXCWxhPhOED" name="other_transformation"/>
<packagedElement xmi:type="uml:Class" xmi:id="uS8pYe6W1TbbV" name="concatenated_operation"/>
<packagedElement xmi:type="uml:Class" xmi:id="utLTCBJh0isMw" name="concatenated_operation_step"/>
<packagedElement xmi:type="uml:Class" xmi:id="uthCBXfzNVdWl" name="geoid_model"/>
<packagedElement xmi:type="uml:Class" xmi:id="u1P4Ek5lBEvCq" name="alias_name"/>
<packagedElement xmi:type="uml:Class" xmi:id="uBbOK5nnocONP" name="supersession"/>
<packagedElement xmi:type="uml:Class" xmi:id="uECCtbU6r1Dl2" name="deprecation"/>
<packagedElement xmi:type="uml:Interface" xmi:id="uvKHM8bb9hdJo" name="coordinate_operation_view" isAbstract="true" stereotype="interface"/>
<packagedElement xmi:type="uml:Association" xmi:id="uDLBTtfmmpy0I" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u58BWrcYoyDzA" name="" type="u8NpszsCtPwog" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uJsm3ogOZZZqs" name="" type="u7xVpU72itjoO" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uqeoRajY1FPQy" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uTv44pAdrI0ky" name="" type="uyyIBNbwTXz8Y" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u7ltOXnMiCU4P" name="" type="u7xVpU72itjoO" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uDQy82RrAbccG" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uAZj0Bxj10Ver" name="" type="u5BghmDXUkrxB" aggregation="composite" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uOFDVFgYPPXdv" name="" type="uvKHM8bb9hdJo" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uuiecxJhCPEvO" name="target_crs">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uKrykRrmsOJcf" name="target_crs" type="uvKHM8bb9hdJo" aggregation="composite" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uOnbDosY1YM4S" name="" type="u5BghmDXUkrxB" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uHaQTAVxi5e4O" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uXEl4xBNl1sUi" name="target_crs" type="uvKHM8bb9hdJo" aggregation="composite" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="urxH3Z5eiAva2" name="" type="u5BghmDXUkrxB" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uUCcxG5D8Rkrs" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uXdJx3yR9vn4v" name="source_crs" type="uvKHM8bb9hdJo" aggregation="composite" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uQ50yb32weyb7" name="" type="u5BghmDXUkrxB" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uR78sm66CrD8b" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u95kbTTjQ8XgJ" name="target_crs" type="uvKHM8bb9hdJo" aggregation="composite" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uc8W2plMCS3sr" name="" type="u5BghmDXUkrxB" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uihRS82NbmZEs" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uSurihb4JiVsr" name="target_crs" type="uvKHM8bb9hdJo" aggregation="composite" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uN7484LtfWKo7" name="" type="u5BghmDXUkrxB" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="ucfurEKNx9d1o" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uxJQwax33ycVo" name="" type="uRgOG0gxyXHen" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uAb8OGLn3zv1v" name="" type="uvKHM8bb9hdJo" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uAAQFL3kNJRPy" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uxylhmjFul2Wb" name="" type="uRgOG0gxyXHen" aggregation="none" isNavigable="false" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uQC46ajWmwrJB" name="" type="uvKHM8bb9hdJo" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uXwScx6KWydSm" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uFsqqoIYw3nm8" name="" type="uxsXx7eblI25W" aggregation="none" isNavigable="false" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uQZfLqrTiaHQy" name="" type="uxsXx7eblI25W" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uZQKUjkh1Kd80" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uvfM9sFpkRe8D" name="" type="uxsXx7eblI25W" aggregation="none" isNavigable="false" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uPzY3jhCCUbYp" name="" type="uvKHM8bb9hdJo" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uM8GLBwvBTyof" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u3eAG9tJsAFpW" name="" type="uKZXCWxhPhOED" aggregation="none" isNavigable="false" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uojCvTXm08l6q" name="" type="uvKHM8bb9hdJo" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uC9cOTQW4qHhH" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uXGJTJ0sMyqfe" name="" type="uS8pYe6W1TbbV" aggregation="none" isNavigable="false" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uSmK5eDuTwJoc" name="" type="uvKHM8bb9hdJo" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="urp6VgZbsPpuf" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u4azzucGtnnZ3" name="" type="uS8pYe6W1TbbV" aggregation="composite" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uwHTXL4yteAeZ" name="" type="uvKHM8bb9hdJo" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="upU79bBdZeqNt" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="ux4Gd38ZgsI6Z" name="operation" type="utLTCBJh0isMw" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u3mWQPFThYIU4" name="" type="uS8pYe6W1TbbV" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="ukLdcpun6whGn" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uiaaS2VZw0zI8" name="steps" type="utLTCBJh0isMw" multiplicity="2..*" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uWpHoYwL4vJZm" name="" type="uvKHM8bb9hdJo" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="ukeMqqqHuDxV8" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="ulhOABCj0wB46" name="member" type="uZFrn4Xpu0xx2" multiplicity="1..*" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u6e7k7W7XgDxy" name="" type="uXIw9hpV4Laec" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="u7hSFXvDh1F4A" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uoUL9BM6nJ8ca" name="member" type="uyjoPy6DRbPA4" multiplicity="1..*" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="usBc4YO7v8ws3" name="" type="uBBUUxy1ciMcJ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="uvTttS4A9izaK" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="u7VX1ZIV8yiLS" name="ensemble" type="uZFrn4Xpu0xx2" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uzsNkuWxBT34b" name="" type="uXIw9hpV4Laec" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="upU7nuwAKothA" name="">
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="uNmaAHkBLQnpD" name="ensemble" type="uyjoPy6DRbPA4" aggregation="aggregate" isNavigable="true" changeability="changeable"/>
<ownedEnd xmi:type="uml:AssociationEnd" xmi:id="umCrLhPuRqKWg" name="" type="uBBUUxy1ciMcJ" aggregation="none" isNavigable="true" changeability="changeable"/>
</packagedElement>
<xmi:Extension extender="umbrello">
<diagrams resolution="96">
<diagram xmi.id="uhRWDcb50cJGi" name="CRS" type="1" documentation="" backgroundcolor="#ffffff" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" griddotcolor="#d3d3d3" linecolor="#990000" linewidth="0" textcolor="#000000" usefillcolor="1" showattribassocs="1" showatts="1" showattsig="1" showops="1" showopsig="1" showpackage="1" showpubliconly="0" showscope="1" showstereotype="2" localid="-1" showgrid="0" snapgrid="0" snapcsgrid="0" snapx="25" snapy="25" zoom="115" canvasheight="800" canvaswidth="1100" isopen="1">
<widgets>
<classwidget xmi.id="uJg1To66U2yLo" localid="um3Woizf9tJfa" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="675" y="121" width="50" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uxIdWYUj1tC89" localid="uDtGrAaNA4U2E" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="754" y="120" width="54" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uyKfofPnOJBBz" localid="unOwcPMA87WHO" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="385" y="192" width="116" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="u1P4Ek5lBEvCq" localid="uxJZQo6P2x7xO" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="73" y="259" width="85" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uObC58hPo02ai" localid="ujoBH6gtV9Wvq" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="273" y="191" width="68" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uBbOK5nnocONP" localid="u1sGx2RBu2Do3" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="73" y="201" width="99" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="u7xVpU72itjoO" localid="uLboalyAJhqf6" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="720" y="190" width="51" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="usFiDnmfbJFfx" localid="uKlBLV0UElMUg" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="253" y="105" width="106" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uXIw9hpV4Laec" localid="u1saeYruHtZ1T" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="248" y="289" width="119" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uZFrn4Xpu0xx2" localid="uVSndXk8FBg1M" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="0" x="23" y="452" width="251" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uF1TLmuLJtlVj" localid="uVqjtAY461nOT" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="541" y="43" width="121" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="utMrJMUbU32wJ" localid="uWIzhT61I6HHL" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="535" y="197" width="138" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<interfacewidget xmi.id="umFTWBZY3sT1t" localid="umDcz2kF8o1sO" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="431" y="367.13" width="105" height="35" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="0" showattsigs="601" drawascircle="0"/>
<classwidget xmi.id="u8NpszsCtPwog" localid="uIy0iKynNyv01" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="593" y="411" width="84" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uyjoPy6DRbPA4" localid="uFfif7LcmqYAU" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="805" y="456" width="244" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uGyT73jCULmlG" localid="uRPKt5kxhV0ik" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="258" y="399" width="95" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="u6Mx5ikYdLO6g" localid="uzuca1OOB9I3O" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="436" y="506" width="101" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="u0B5HltcEv058" localid="u9JQOokGIuBwn" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="583" y="119" width="38" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uBBUUxy1ciMcJ" localid="uufK51OlynST7" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="781" y="295" width="111" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uaNvEyeKUaDUQ" localid="u0QM38nSYHuMl" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="715" y="500" width="88" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uyyIBNbwTXz8Y" localid="uzBuX2RUFnAkw" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="599" y="600" width="107" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uECCtbU6r1Dl2" localid="ufo3O2iJ3R37l" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="73" y="149" width="92" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
</widgets>
<messages/>
<associations>
<assocwidget xmi.id="ucUcuKZl9wulS" localid="uG5A8dXr4ptuQ" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uXIw9hpV4Laec" widgetbid="uObC58hPo02ai" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="307.429" starty="289"/>
<endpoint endx="307.071" endy="219"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uOGESIiV1lUWR" localid="uItkUlCNCgmId" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="512" widgetaid="u6Mx5ikYdLO6g" widgetbid="umFTWBZY3sT1t" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="486.19" starty="506"/>
<endpoint endx="483.888" endy="402.13"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uKCie6nj32jNj" localid="uz76hz3D3NMgU" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uObC58hPo02ai" widgetbid="usFiDnmfbJFfx" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="306.837" starty="191"/>
<endpoint endx="306.163" endy="133"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uxGY0deqShuSF" localid="uH0EYRqn2Lwpy" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="u7xVpU72itjoO" widgetbid="uJg1To66U2yLo" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="736.268" starty="190"/>
<endpoint endx="709.232" endy="149"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="ujhNRvn4TLezM" localid="uBdE0IxTGsntz" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="u6Mx5ikYdLO6g" widgetbid="u8NpszsCtPwog" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="508.384" starty="506"/>
<endpoint endx="613.116" endy="439"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uvTttS4A9izaK" localid="uB8eqDI9r8Tvh" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uZFrn4Xpu0xx2" widgetbid="uXIw9hpV4Laec" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<floatingtext xmi.id="uJTT6faChkdCx" localid="uK5qiY2RLA0AF" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="188.994" y="432" width="77" height="18" isinstance="0" showstereotype="2" text="ensemble" pretext="+" posttext="" role="709"/>
<linepath layout="Polyline">
<startpoint startx="168.593" starty="452"/>
<endpoint endx="297.032" endy="317"/>
<point x="226" y="412"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uNmyoVwUTXMDb" localid="uqraqvRr5X6Ph" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="u7xVpU72itjoO" widgetbid="uxIdWYUj1tC89" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="752.6" starty="190"/>
<endpoint endx="773.9" endy="148"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="ukeMqqqHuDxV8" localid="uD4BmT3DPdj8U" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uZFrn4Xpu0xx2" widgetbid="uXIw9hpV4Laec" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<floatingtext xmi.id="u7Xpl1pp3dZRT" localid="uIjc6x7qDuUXQ" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="116.006" y="418.079" width="29" height="18" isinstance="0" showstereotype="2" text="1..*" pretext="" posttext="" role="701"/>
<floatingtext xmi.id="uiGd8EdVUaF4k" localid="unk24DNnkZ09O" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="73.7037" y="432.5" width="69" height="18" isinstance="0" showstereotype="2" text="member" pretext="+" posttext="" role="709"/>
<linepath layout="Polyline">
<startpoint startx="148.762" starty="452"/>
<endpoint endx="280.934" endy="317"/>
<point x="150" y="386"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uzgX0FJyw7lFO" localid="uhtr9AACb1I94" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uGyT73jCULmlG" widgetbid="uXIw9hpV4Laec" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="305.755" starty="399"/>
<endpoint endx="307.245" endy="317"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uHGGZSuHhrnIU" localid="uPc04hGlrrM6r" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="u0B5HltcEv058" widgetbid="uF1TLmuLJtlVj" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="601.908" starty="119"/>
<endpoint endx="601.592" endy="71"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uxlafigrj7dPB" localid="ujMoBFYWTMM5E" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="512" widgetaid="uGyT73jCULmlG" widgetbid="umFTWBZY3sT1t" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="431" starty="392.998"/>
<endpoint endx="353" endy="405.429"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uqmMELyDiHgbZ" localid="uWKIHcQd7U9bq" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uXIw9hpV4Laec" widgetbid="uyKfofPnOJBBz" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="327.057" starty="289"/>
<endpoint endx="423.443" endy="220"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="ul2lN2OKAIDYf" localid="uOfgy3I312rcW" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="u6Mx5ikYdLO6g" widgetbid="u7xVpU72itjoO" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="497.975" starty="506"/>
<endpoint endx="734.025" endy="218"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uKY6ijA9G37v4" localid="uuR1rFpcd9GPz" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="u6Mx5ikYdLO6g" widgetbid="utMrJMUbU32wJ" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="491.824" starty="506"/>
<endpoint endx="598.676" endy="225"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uLcwRFeyrXoYI" localid="uMhwVTs0yws9w" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uyyIBNbwTXz8Y" widgetbid="uaNvEyeKUaDUQ" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="667.41" starty="600"/>
<endpoint endx="744.09" endy="528"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uVmMIfTWfhhtz" localid="ueA80KQgI0i5L" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uyyIBNbwTXz8Y" widgetbid="umFTWBZY3sT1t" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="642.185" starty="600"/>
<endpoint endx="496.394" endy="402.13"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uFYTHrYnhGxji" localid="uzv82lgr6HcYe" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uaNvEyeKUaDUQ" widgetbid="utMrJMUbU32wJ" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="751.838" starty="500"/>
<endpoint endx="611.162" endy="225"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uSVHHvwBxQSrq" localid="upFaNi2SnbldZ" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uaNvEyeKUaDUQ" widgetbid="u7xVpU72itjoO" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="758.39" starty="500"/>
<endpoint endx="746.11" endy="218"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uDA52qncCXvlM" localid="u2o8RW3IOKF04" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uGyT73jCULmlG" widgetbid="utMrJMUbU32wJ" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="326.188" starty="399"/>
<endpoint endx="583.312" endy="225"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="u0vCAwaM6wOIT" localid="u2MzIfZDtTgIq" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uaNvEyeKUaDUQ" widgetbid="uBBUUxy1ciMcJ" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="764.293" starty="500"/>
<endpoint endx="831.207" endy="323"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uf2iKfQ1gbEHG" localid="u8b6sCt7LB9du" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="u6Mx5ikYdLO6g" widgetbid="uGyT73jCULmlG" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="462.818" starty="506"/>
<endpoint endx="329.182" endy="427"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="u7hSFXvDh1F4A" localid="uYYh924ri6t6G" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uyjoPy6DRbPA4" widgetbid="uBBUUxy1ciMcJ" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<floatingtext xmi.id="uVxuH9MAs4KAa" localid="uwakwbIl2CPo0" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="850.137" y="420.391" width="29" height="18" isinstance="0" showstereotype="2" text="1..*" pretext="" posttext="" role="701"/>
<floatingtext xmi.id="uRouwIogXnsLU" localid="uGaZVOInAaFqc" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="810.174" y="437.739" width="69" height="18" isinstance="0" showstereotype="2" text="member" pretext="+" posttext="" role="709"/>
<linepath layout="Polyline">
<startpoint startx="913.099" starty="456"/>
<endpoint endx="841.221" endy="323"/>
<point x="872.174" y="414.783"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uaj1PqppIwcJM" localid="ujZle0tkmbWn3" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="utMrJMUbU32wJ" widgetbid="u0B5HltcEv058" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="603.641" starty="197"/>
<endpoint endx="602.359" endy="147"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uqmjTn3jgUi3v" localid="u77m7M873mSKV" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uGyT73jCULmlG" widgetbid="u7xVpU72itjoO" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="334.974" starty="399"/>
<endpoint endx="720" endy="216.113"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uDLBTtfmmpy0I" localid="uBB2vq7eUTBz1" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="u8NpszsCtPwog" widgetbid="u7xVpU72itjoO" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="642" starty="411"/>
<endpoint endx="738.5" endy="218"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uqeoRajY1FPQy" localid="uWVpetcVmRbfw" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uyyIBNbwTXz8Y" widgetbid="u7xVpU72itjoO" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="655.676" starty="600"/>
<endpoint endx="742.324" endy="218"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="upU7nuwAKothA" localid="umX2zL5BOZfIT" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="uyjoPy6DRbPA4" widgetbid="uBBUUxy1ciMcJ" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<floatingtext xmi.id="uXrql08EjHItm" localid="us5vetosNrtkL" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="932.739" y="435.13" width="77" height="18" isinstance="0" showstereotype="2" text="ensemble" pretext="+" posttext="" role="709"/>
<linepath layout="Polyline">
<startpoint startx="926.317" starty="456"/>
<endpoint endx="848.032" endy="323"/>
<point x="924.348" y="415.652"/>
</linepath>
</assocwidget>
</associations>
</diagram>
<diagram xmi.id="uLa8bk62duhDT" name="Transformations" type="1" documentation="" backgroundcolor="#ffffff" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" griddotcolor="#d3d3d3" linecolor="#990000" linewidth="0" textcolor="#000000" usefillcolor="1" showattribassocs="1" showatts="1" showattsig="1" showops="1" showopsig="1" showpackage="1" showpubliconly="0" showscope="1" showstereotype="2" localid="-1" showgrid="0" snapgrid="0" snapcsgrid="0" snapx="25" snapy="25" zoom="100" canvasheight="813" canvaswidth="1086" isopen="1">
<widgets>
<interfacewidget xmi.id="u5BghmDXUkrxB" localid="u0iOMQc48A8ui" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="354" y="70" width="87" height="35" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="0" showscope="1" showattributes="0" showattsigs="601" drawascircle="0"/>
<classwidget xmi.id="utLTCBJh0isMw" localid="u1Yi2Azrfm068" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="663" y="370" width="210" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uRgOG0gxyXHen" localid="u6PnghQcoxIEn" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="22" y="288" width="146" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uxsXx7eblI25W" localid="uqhYrC8OA4YoG" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="188" y="285" width="171" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uS8pYe6W1TbbV" localid="ui21ynkFBrL8e" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="678" y="285" width="174" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="uKZXCWxhPhOED" localid="uqEW5xNn1H9K2" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="377" y="285" width="155" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<classwidget xmi.id="ueG4mAO9OIIjR" localid="us14okeSxbdQS" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="36" y="369" width="125" height="28" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="1" showattsigs="601"/>
<interfacewidget xmi.id="uvKHM8bb9hdJo" localid="uyx5AQn5q5U5h" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="0" usesdiagramusefillcolor="0" fillcolor="#ffffc0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="307.905" y="199.293" width="193" height="35" isinstance="0" showstereotype="2" showoperations="1" showpubliconly="0" showopsigs="601" showpackage="1" showscope="1" showattributes="0" showattsigs="601" drawascircle="0"/>
</widgets>
<messages/>
<associations>
<assocwidget xmi.id="upU79bBdZeqNt" localid="uP6qpMRa4zD1m" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="utLTCBJh0isMw" widgetbid="uS8pYe6W1TbbV" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<floatingtext xmi.id="ubSf4vR8y9mWu" localid="uo3ahNRjUBHG0" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="774.506" y="348" width="76" height="18" isinstance="0" showstereotype="2" text="operation" pretext="+" posttext="" role="709"/>
<linepath layout="Direct">
<startpoint startx="767.506" starty="370"/>
<endpoint endx="765.494" endy="313"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uM8GLBwvBTyof" localid="uNnd7XdPZJomh" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="512" widgetaid="uKZXCWxhPhOED" widgetbid="uvKHM8bb9hdJo" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="445.969" starty="285"/>
<endpoint endx="415.069" endy="234.293"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uAAQFL3kNJRPy" localid="uDr9tQwCW3LIW" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="512" widgetaid="uRgOG0gxyXHen" widgetbid="uvKHM8bb9hdJo" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="145.837" starty="288"/>
<endpoint endx="340.859" endy="234.293"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uZQKUjkh1Kd80" localid="uK89JkfWajCgs" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="512" widgetaid="uxsXx7eblI25W" widgetbid="uvKHM8bb9hdJo" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="295.793" starty="285"/>
<endpoint endx="376.538" endy="234.293"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uC9cOTQW4qHhH" localid="uNs9cOeSNg9yI" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="512" widgetaid="uS8pYe6W1TbbV" widgetbid="uvKHM8bb9hdJo" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<linepath layout="Direct">
<startpoint startx="703.59" starty="285"/>
<endpoint endx="481.167" endy="234.293"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="ukLdcpun6whGn" localid="uVCUJOqTsKcl0" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="501" widgetaid="utLTCBJh0isMw" widgetbid="uvKHM8bb9hdJo" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<floatingtext xmi.id="uR6DqpJGcZiA4" localid="uBpmlFtAKyKcp" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="713.694" y="343.552" width="29" height="18" isinstance="0" showstereotype="2" text="2..*" pretext="" posttext="" role="701"/>
<floatingtext xmi.id="uICoecWqBxBu3" localid="ukpHrPZQ09jnB" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="657.75" y="350.853" width="50" height="18" isinstance="0" showstereotype="2" text="steps" pretext="+" posttext="" role="709"/>
<linepath layout="Direct">
<startpoint startx="737.557" starty="370"/>
<endpoint endx="442.459" endy="234.293"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uihRS82NbmZEs" localid="uxmC5Iq6uXfmO" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="510" widgetaid="uvKHM8bb9hdJo" widgetbid="u5BghmDXUkrxB" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<floatingtext xmi.id="uYJzY8EsweHrf" localid="uHm3PIFZRlTZW" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="422.991" y="160.293" width="78" height="18" isinstance="0" showstereotype="2" text="target_crs" pretext="+" posttext="" role="709"/>
<linepath layout="Polyline">
<startpoint startx="409.99" starty="199.293"/>
<endpoint endx="406.325" endy="105"/>
<point x="427" y="146"/>
</linepath>
</assocwidget>
<assocwidget xmi.id="uUCcxG5D8Rkrs" localid="uSDOWqI77RXZG" textcolor="#000000" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" seqnum="" type="510" widgetaid="uvKHM8bb9hdJo" widgetbid="u5BghmDXUkrxB" indexa="0" totalcounta="0" indexb="0" totalcountb="0">
<floatingtext xmi.id="udCeDALUprRei" localid="u6SMTgNQSz54I" textcolor="none" linecolor="#990000" linewidth="0" usefillcolor="1" usesdiagramfillcolor="1" usesdiagramusefillcolor="1" fillcolor="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0" autoresize="1" x="300.009" y="155" width="82" height="18" isinstance="0" showstereotype="2" text="source_crs" pretext="+" posttext="" role="709"/>
<linepath layout="Polyline">
<startpoint startx="396.461" starty="199.293"/>
<endpoint endx="388.505" endy="105"/>
<point x="370" y="141"/>
</linepath>
</assocwidget>
</associations>
</diagram>
</diagrams>
</xmi:Extension>
</packagedElement>
<packagedElement xmi:type="uml:Model" xmi:id="Use_Case_View" name="Use Case View"/>
<packagedElement xmi:type="uml:Model" xmi:id="Component_View" name="Component View"/>
<packagedElement xmi:type="uml:Model" xmi:id="Deployment_View" name="Deployment View"/>
<packagedElement xmi:type="uml:Model" xmi:id="Entity_Relationship_Model" name="Entity Relationship Model"/>
</uml:Model>
<xmi:Extension extender="umbrello">
<docsettings viewid="uhRWDcb50cJGi" documentation="" uniqueid="uwakwbIl2CPo0"/>
<listview>
<listitem id="Views" type="800" open="1">
<listitem id="Entity_Relationship_Model" type="836" open="1"/>
<listitem id="Use_Case_View" type="802" open="1"/>
<listitem id="Component_View" type="821" open="1"/>
<listitem id="Deployment_View" type="827" open="1"/>
<listitem id="Logical_View" type="801" open="1">
<listitem id="u1P4Ek5lBEvCq" type="813" open="1"/>
<listitem id="u0B5HltcEv058" type="813" open="1"/>
<listitem id="usFiDnmfbJFfx" type="813" open="1"/>
<listitem id="uyyIBNbwTXz8Y" type="813" open="1"/>
<listitem id="uS8pYe6W1TbbV" type="813" open="1"/>
<listitem id="utLTCBJh0isMw" type="813" open="1"/>
<listitem id="u8NpszsCtPwog" type="813" open="1"/>
<listitem id="uvKHM8bb9hdJo" type="817" open="1"/>
<listitem id="utMrJMUbU32wJ" type="813" open="1"/>
<listitem id="u5BghmDXUkrxB" type="817" open="1"/>
<listitem id="uhRWDcb50cJGi" type="807" label="CRS" open="0"/>
<listitem id="uECCtbU6r1Dl2" type="813" open="1"/>
<listitem id="uObC58hPo02ai" type="813" open="1"/>
<listitem id="uxIdWYUj1tC89" type="813" open="1"/>
<listitem id="uGyT73jCULmlG" type="813" open="1"/>
<listitem id="uXIw9hpV4Laec" type="813" open="1"/>
<listitem id="uZFrn4Xpu0xx2" type="813" open="1"/>
<listitem id="uthCBXfzNVdWl" type="813" open="1"/>
<listitem id="ueG4mAO9OIIjR" type="813" open="1"/>
<listitem id="uRgOG0gxyXHen" type="813" open="1"/>
<listitem id="uxsXx7eblI25W" type="813" open="1"/>
<listitem id="umFTWBZY3sT1t" type="817" open="1"/>
<listitem id="uKZXCWxhPhOED" type="813" open="1"/>
<listitem id="uyKfofPnOJBBz" type="813" open="1"/>
<listitem id="u6Mx5ikYdLO6g" type="813" open="1"/>
<listitem id="uJg1To66U2yLo" type="813" open="1"/>
<listitem id="uBbOK5nnocONP" type="813" open="1"/>
<listitem id="uLa8bk62duhDT" type="807" label="Transformations" open="0"/>
<listitem id="Datatypes" type="830" open="0">
<listitem id="uM3vdo8djgFgC" type="829" open="0"/>
<listitem id="uiXGLFrfkCoBN" type="829" open="0"/>
<listitem id="ucOVt2J1fTMkF" type="829" open="0"/>
<listitem id="uGU1cu1WWxGTK" type="829" open="0"/>
<listitem id="u0pTHqeM9ZjOn" type="829" open="0"/>
<listitem id="u4xSDe1bTIp4y" type="829" open="0"/>
<listitem id="unKRfzLu0XGvb" type="829" open="0"/>
<listitem id="uLpP90F2P3CjD" type="829" open="0"/>
<listitem id="uHILGaUoMVqSP" type="829" open="0"/>
<listitem id="uQJ6caew3c0pr" type="829" open="0"/>
<listitem id="utJAws36TUGWD" type="829" open="0"/>
<listitem id="u95deU2ow68b1" type="829" open="0"/>
<listitem id="uMQGXdDcGxXwm" type="829" open="0"/>
<listitem id="ujAtUquSJ4ymf" type="829" open="0"/>
<listitem id="uxDmw01nt3l8h" type="829" open="0"/>
</listitem>
<listitem id="uF1TLmuLJtlVj" type="813" open="1"/>
<listitem id="u7xVpU72itjoO" type="813" open="1"/>
<listitem id="uaNvEyeKUaDUQ" type="813" open="1"/>
<listitem id="uBBUUxy1ciMcJ" type="813" open="1"/>
<listitem id="uyjoPy6DRbPA4" type="813" open="1"/>
</listitem>
</listitem>
</listview>
<codegeneration>
<codegenerator language="C++"/>
</codegeneration>
</xmi:Extension>
</xmi:XMI>
-34
View File
@@ -1,34 +0,0 @@
--- This file has been generated by scripts/build_db.py. DO NOT EDIT !
INSERT INTO "engineering_crs" VALUES('EPSG','5800','Astra Minas Grid',NULL,'EPSG','6507','EPSG','9300',0);
INSERT INTO "usage" VALUES('EPSG','4243','engineering_crs','EPSG','5800','EPSG','1265','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5801','Barcelona Grid B1',NULL,'EPSG','4500','EPSG','9301',0);
INSERT INTO "usage" VALUES('EPSG','4244','engineering_crs','EPSG','5801','EPSG','1266','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5802','Barcelona Grid B2',NULL,'EPSG','4500','EPSG','9301',0);
INSERT INTO "usage" VALUES('EPSG','4245','engineering_crs','EPSG','5802','EPSG','1266','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5803','Maturin Grid',NULL,'EPSG','4500','EPSG','9302',0);
INSERT INTO "usage" VALUES('EPSG','4246','engineering_crs','EPSG','5803','EPSG','1320','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5808','Maracaibo Cross Grid M4',NULL,'EPSG','4500','EPSG','9303',0);
INSERT INTO "usage" VALUES('EPSG','4251','engineering_crs','EPSG','5808','EPSG','1319','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5809','Maracaibo Cross Grid M5',NULL,'EPSG','4500','EPSG','9303',0);
INSERT INTO "usage" VALUES('EPSG','4252','engineering_crs','EPSG','5809','EPSG','1319','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5810','La Rosa Grid',NULL,'EPSG','4500','EPSG','9304',0);
INSERT INTO "usage" VALUES('EPSG','4253','engineering_crs','EPSG','5810','EPSG','1311','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5811','Mene Grande',NULL,'EPSG','4500','EPSG','9305',0);
INSERT INTO "usage" VALUES('EPSG','4254','engineering_crs','EPSG','5811','EPSG','1270','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5812','El Cubo',NULL,'EPSG','4500','EPSG','9306',0);
INSERT INTO "usage" VALUES('EPSG','4255','engineering_crs','EPSG','5812','EPSG','1269','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5813','Dabajuro',NULL,'EPSG','4500','EPSG','9307',0);
INSERT INTO "usage" VALUES('EPSG','4256','engineering_crs','EPSG','5813','EPSG','1268','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5814','Tucupita',NULL,'EPSG','4500','EPSG','9308',0);
INSERT INTO "usage" VALUES('EPSG','4257','engineering_crs','EPSG','5814','EPSG','1370','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5815','Santa Maria de Ipire',NULL,'EPSG','4500','EPSG','9310',0);
INSERT INTO "usage" VALUES('EPSG','4258','engineering_crs','EPSG','5815','EPSG','1371','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5816','Barinas west base',NULL,'EPSG','4500','EPSG','9311',0);
INSERT INTO "usage" VALUES('EPSG','4259','engineering_crs','EPSG','5816','EPSG','1267','EPSG','1136');
INSERT INTO "engineering_crs" VALUES('EPSG','5817','Tombak LNG plant',NULL,'EPSG','6510','EPSG','9314',0);
INSERT INTO "usage" VALUES('EPSG','4260','engineering_crs','EPSG','5817','EPSG','2362','EPSG','1029');
INSERT INTO "engineering_crs" VALUES('EPSG','6715','Christmas Island Grid 1985',NULL,'EPSG','4400','EPSG','1134',0);
INSERT INTO "usage" VALUES('EPSG','4925','engineering_crs','EPSG','6715','EPSG','4169','EPSG','1056');
INSERT INTO "engineering_crs" VALUES('EPSG','11378','Heathrow Airport Grid',NULL,'EPSG','4400','EPSG','1452',0);
INSERT INTO "usage" VALUES('EPSG','25471','engineering_crs','EPSG','11378','EPSG','4796','EPSG','1142');
-32
View File
@@ -1,32 +0,0 @@
--- This file has been generated by scripts/build_db.py. DO NOT EDIT !
INSERT INTO "engineering_datum" VALUES('EPSG','1134','Christmas Island Datum 1985','1985-01-01',NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13186','engineering_datum','EPSG','1134','EPSG','4169','EPSG','1056');
INSERT INTO "engineering_datum" VALUES('EPSG','1452','Heathrow Airport Grid',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','25470','engineering_datum','EPSG','1452','EPSG','4796','EPSG','1142');
INSERT INTO "engineering_datum" VALUES('EPSG','9300','Astra Minas',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13850','engineering_datum','EPSG','9300','EPSG','1265','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9301','Barcelona',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13851','engineering_datum','EPSG','9301','EPSG','1266','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9302','Maturin',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13852','engineering_datum','EPSG','9302','EPSG','1320','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9303','Maracaibo Cross',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13853','engineering_datum','EPSG','9303','EPSG','1319','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9304','La Rosa',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13854','engineering_datum','EPSG','9304','EPSG','1311','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9305','Mene Grande',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13855','engineering_datum','EPSG','9305','EPSG','1270','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9306','El Cubo',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13856','engineering_datum','EPSG','9306','EPSG','1269','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9307','Dabajuro',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13857','engineering_datum','EPSG','9307','EPSG','1268','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9308','Tucupita',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13858','engineering_datum','EPSG','9308','EPSG','1370','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9309','El Mene',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13859','engineering_datum','EPSG','9309','EPSG','1270','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9310','Santa Maria de Ipire',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13860','engineering_datum','EPSG','9310','EPSG','1371','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9311','Barinas west base',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13861','engineering_datum','EPSG','9311','EPSG','1267','EPSG','1216');
INSERT INTO "engineering_datum" VALUES('EPSG','9314','Tombak LNG plant',NULL,NULL,NULL,0);
INSERT INTO "usage" VALUES('EPSG','13864','engineering_datum','EPSG','9314','EPSG','2362','EPSG','1029');
+3317 -5755
View File
File diff suppressed because it is too large Load Diff
+287 -499
View File
File diff suppressed because it is too large Load Diff

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