diff options
102 files changed, 5332 insertions, 1340 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index bb1fdf93..4d561680 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,9 +110,9 @@ message(STATUS "Configuring PROJ:") #PROJ version information ################################################################################ include(ProjVersion) -proj_version(MAJOR 8 MINOR 1 PATCH 0) +proj_version(MAJOR 8 MINOR 2 PATCH 0) set(PROJ_API_VERSION "22") -set(PROJ_BUILD_VERSION "22.0.0") +set(PROJ_BUILD_VERSION "23.0.1") ################################################################################ # Build features and variants @@ -229,8 +229,6 @@ endif() set(CMAKE_THREAD_PREFER_PTHREAD TRUE) find_package(Threads) -include(CheckIncludeFiles) - include(CheckCSourceCompiles) if(MSVC) set(CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} /WX /W4") diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5df8a450..6f184603 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,11 +1,11 @@ -# How to contribute to PROJ.4 +# How to contribute to PROJ -PROJ.4 has a wide and varied user base. Some are highly skilled geodesists with a deep +PROJ has a wide and varied user base. Some are highly skilled geodesists with a deep knowledge of map projections and reference systems, some are GIS software developers and others are GIS users. All users, regardless of the profession or skill level, -has the ability to contribute to PROJ.4. Here's a few suggestion on how: +has the ability to contribute to PROJ. Here's a few suggestion on how: -* Help PROJ.4-users that is less experienced than yourself. +* Help PROJ-users that is less experienced than yourself. * Write a bug report * Request a new feature * Write documentation for your favorite map projection @@ -13,16 +13,16 @@ has the ability to contribute to PROJ.4. Here's a few suggestion on how: * Implement a new feature In the following sections you can find some guidelines on how to contribute. -As PROJ.4 is managed on GitHub most contributions require that you have a GitHub +As PROJ is managed on GitHub most contributions require that you have a GitHub account. Familiarity with [issues](https://guides.github.com/features/issues/) and the [GitHub Flow](https://guides.github.com/introduction/flow/) is an advantage. -## Help a fellow PROJ.4 user -The main forum for support for PROJ.4 is the mailing list. You can subscribe to +## 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/). -If you have questions about the usage of PROJ.4 the mailing list is also the place to go. +If you have questions about the usage of PROJ the mailing list is also the place to go. Please *do not* use the GitHub issue tracker as a support forum. Your question is much more likely to be answered on the mailing list, as many more people follow that than the issue tracker. @@ -30,7 +30,7 @@ the issue tracker. ## Adding bug reports Bug reports are handled in the [issue tracker](https://github.com/OSGeo/PROJ/issues) -on PROJ.4's home on GitHub. Writing a good bug report is not easy. But fixing a poorly +on PROJ's home on GitHub. Writing a good bug report is not easy. But fixing a poorly documented bug is not easy either, so please put in the effort it takes to create a thorough bug report. @@ -38,7 +38,7 @@ A good bug report includes at least: * A title that quickly explains the problem * A description of the problem and how it can be reproduced -* Version of PROJ.4 being used +* Version of PROJ being used * Version numbers of any other relevant software being used, e.g. operating system * A description of what already has been done to solve the problem @@ -47,15 +47,15 @@ will find interest in solving the problem. You will probably get follow-up quest after submitting a bug report. Please answer them in a timely manner if you have an interest in getting the issue solved. -Finally, please only submit bug reports that are actually related to PROJ.4. If the -issue materializes in software that uses PROJ.4 it is likely a problem with that -particular software. Make sure that it actually is a PROJ.4 problem before you submit -an issue. If you can reproduce the problem only by using tools from PROJ.4 it is -definitely a problem with PROJ.4. +Finally, please only submit bug reports that are actually related to PROJ. If the +issue materializes in software that uses PROJ it is likely a problem with that +particular software. Make sure that it actually is a PROJ problem before you submit +an issue. If you can reproduce the problem only by using tools from PROJ it is +definitely a problem with PROJ. ## Feature requests -Got an idea for a new feature in PROJ.4? Submit a thorough description of the new +Got an idea for a new feature in PROJ? Submit a thorough description of the new feature in the [issue tracker](https://github.com/OSGeo/PROJ/issues). Please include any technical documents that can help the developer make the new feature a reality. An example of this could be a publicly available academic paper that @@ -67,13 +67,13 @@ Note that not all feature requests are accepted. ## Write documentation -PROJ.4 is in dire need of better documentation. Any contributions of documentation -are greatly appreciated. The PROJ.4 documentation is available on [proj.org](https://proj.org). +PROJ is in dire need of better documentation. Any contributions of documentation +are greatly appreciated. The PROJ documentation is available on [proj.org](https://proj.org). The website is generated with [Sphinx](http://www.sphinx-doc.org/en/stable/). Contributions to the documentation should be made as [Pull Requests](https://github.com/OSGeo/PROJ/pulls) on GitHub. -If you intend to document one of PROJ.4's supported projections please use the +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. @@ -83,7 +83,7 @@ See [Code Contributions](https://proj.org/community/code_contributions.html) #### Legalese Committers are the front line gatekeepers to keep the code base clear of improperly contributed code. -It is important to the PROJ.4 users, developers and the OSGeo foundation to avoid contributing any +It is important to the PROJ users, developers and the OSGeo foundation to avoid contributing any code to the project without it being clearly licensed under the project license. Generally speaking the key issues are that those providing code to be included in the repository @@ -1,3 +1,97 @@ +8.1.0 Release Notes +------------------- + + Updates + ------- + + + Database + + o Update to EPSG v10.027 (#2751) + + o Decrease DB size by using WITHOUT ROWID tables (#2730) (#2647) + + o Add a ANALYZE step during proj.db creation allowing for + faster lookups (#2729) + + o Added a PROJ.VERSION metadata entry (#2646) + + o Added NGO48 (EPSG:4273) to ETRS89 (EPSG:4258) triangulation-based + transformation (#2554) + + o Additions to the norwegian NKG2020 transformation (#2548) + + o ESRI projection database updated to version 12.8 (#2717) + + + API additions + + o Added proj_get_geoid_models_from_database() function that returns a list of + geoid models available for a given CRS (#2681) + + o Added proj_get_celestial_body_list_from_database that returns a list + of celestial bodies in the PROJ database (#2667) + + o Added proj_get_celestial_body_name() (#2662) + + + Various improvements + + o proj_trans/cs2cs: If two operations have the same accuracy, + use the one that is contained within a larger one (#2750) + + o Share SQLite database handle among all contexts (#2738) + + o Add proj/internal/mutex.hpp as compat layer for mingw32 for std::mutex (#2736) + + o projsync: make it filter out files not intended for the current version (#2725) + + o Improvements related to DerivedVerticalCRS using Change Unit and + Height/Depth reversal methods (#2696) + + o Update internal nlohmann/json to 3.9.1, and add a CMake option to + be able to use external nlohmann/json (#2686) + + o createFromUserInput(): change name of CRS built from URN combined references to match the convention of EPSG projected CRS (#2677) + + o Parse compound id with two authorities, like ESRI:103668+EPSG:5703 (#2669) + + o Added projinfo option --list-crs (supports --area) (#2663) + + o Added support for hyperbolic Cassini-Soldner (#2637) + + o Added capability to get SQL statements to add custom CRS in the database (#2577) + + Bug fixes + --------- + + o Fix 'Please include winsock2.h before windows.h' warning with msys (#2692) + + o Minor changes to address lint in geodesic.c (#2752) + + o BoundCRS::identify(): avoid incompatible transformation for + WKT1 / TOWGS84 export (#2747) + + o proj_create(): do not open proj.db if string is a PROJ string, + even if proj_context_set_autoclose_database() has been set (#2735) + + o Fix export of transformation to PROJ string in a particular situation + where CompoundCRS are involved (#2721) + + Thanks to + --------- + + Howard Butler + Alan D. Snow + Roel van den Berg + Heidi Vanparys + Sveinung Himle + 積丹尼 Dan Jacobson + Nyall Dawson + Javier Jimenez Shaw + Charles Karney + Mike Taves + Kristian Evers + Even Rouault + + 8.0.1 Release Notes ------------------- diff --git a/cmake/ProjConfig.cmake b/cmake/ProjConfig.cmake index 3dc2133b..a53c3af1 100644 --- a/cmake/ProjConfig.cmake +++ b/cmake/ProjConfig.cmake @@ -7,28 +7,15 @@ # (See accompanying file LICENSE_1_0.txt or copy at # https://www.boost.org/LICENSE_1_0.txt) ################################################################################ -include(CheckIncludeFiles) include(CheckLibraryExists) include(CheckFunctionExists) # check needed include file -check_include_files(dlfcn.h HAVE_DLFCN_H) -check_include_files(inttypes.h HAVE_INTTYPES_H) -check_include_files(memory.h HAVE_MEMORY_H) -check_include_files(stdint.h HAVE_STDINT_H) -check_include_files(stdlib.h HAVE_STDLIB_H) -check_include_files(string.h HAVE_STRING_H) -check_include_files(sys/stat.h HAVE_SYS_STAT_H) -check_include_files(sys/types.h HAVE_SYS_TYPES_H) -check_include_files(unistd.h HAVE_UNISTD_H) -check_include_files("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) - check_function_exists(localeconv HAVE_LOCALECONV) check_function_exists(strerror HAVE_STRERROR) if(NOT WIN32) check_library_exists(dl dladdr "" HAVE_LIBDL) - # check libm need on unix - check_library_exists(m ceil "" HAVE_LIBM) + check_library_exists(m exp "" HAVE_LIBM) endif() set(PACKAGE "proj") diff --git a/cmake/ProjUtilities.cmake b/cmake/ProjUtilities.cmake index f8688cd6..55d53cbb 100644 --- a/cmake/ProjUtilities.cmake +++ b/cmake/ProjUtilities.cmake @@ -83,6 +83,16 @@ function(configure_proj_pc) if(CURL_ENABLED) set(CURL_LIBS -lcurl) endif() + set(EXTRA_LIBS "-lstdc++") + if(HAVE_LIBM) + list(APPEND EXTRA_LIBS "-lm") + endif() + if(HAVE_LIBDL) + list(APPEND EXTRA_LIBS "-ldl") + endif() + # Join list with a space + string(REPLACE ";" " " _tmp_str "${EXTRA_LIBS}") + set(EXTRA_LIBS "${_tmp_str}") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/proj.pc.in diff --git a/cmake/proj_config.cmake.in b/cmake/proj_config.cmake.in index ddb24347..ca5b37ef 100644 --- a/cmake/proj_config.cmake.in +++ b/cmake/proj_config.cmake.in @@ -1,45 +1,12 @@ -/* Define to 1 if you have the <dlfcn.h> header file. */ -#cmakedefine HAVE_DLFCN_H 1 - -/* Define to 1 if you have the <inttypes.h> header file. */ -#cmakedefine HAVE_INTTYPES_H 1 - /* Define to 1 if you have the `dl' library (-ldl). */ #cmakedefine HAVE_LIBDL 1 -/* Define to 1 if you have the `m' library (-lm). */ -#cmakedefine HAVE_LIBM 1 - /* Define to 1 if you have localeconv */ #cmakedefine HAVE_LOCALECONV 1 -/* Define to 1 if you have the <memory.h> header file. */ -#cmakedefine HAVE_MEMORY_H 1 - -/* Define to 1 if you have the <stdint.h> header file. */ -#cmakedefine HAVE_STDINT_H 1 - -/* Define to 1 if you have the <stdlib.h> header file. */ -#cmakedefine HAVE_STDLIB_H 1 - /* Define to 1 if you have the `strerror' function. */ #cmakedefine HAVE_STRERROR 1 -/* Define to 1 if you have the <strings.h> header file. */ -#cmakedefine HAVE_STRINGS_H 1 - -/* Define to 1 if you have the <string.h> header file. */ -#cmakedefine HAVE_STRING_H 1 - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#cmakedefine HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the <sys/types.h> header file. */ -#cmakedefine HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the <unistd.h> header file. */ -#cmakedefine HAVE_UNISTD_H 1 - /* Name of package */ #cmakedefine PACKAGE "${PACKAGE}" @@ -58,8 +25,5 @@ /* Define to the version of this package. */ #cmakedefine PACKAGE_VERSION "${PACKAGE_VERSION}" -/* Define to 1 if you have the ANSI C header files. */ -#cmakedefine STDC_HEADERS 1 - /* Version number of package */ #cmakedefine VERSION "${VERSION}" diff --git a/configure.ac b/configure.ac index 4ff2ad9f..d3b1aa2d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT([PROJ], [8.1.0], +AC_INIT([PROJ], [8.2.0], [https://github.com/OSGeo/PROJ/issues], proj, [https://proj.org]) AC_CONFIG_MACRO_DIR([m4]) AC_LANG(C) @@ -181,7 +181,7 @@ esac dnl Checks for libraries. save_CFLAGS="$CFLAGS" CFLAGS=`echo "$CFLAGS" | sed "s/-Werror/ /"` -AC_CHECK_LIB(m,exp,,,) +AC_CHECK_LIB(m,exp,,HAVE_LIBM=no,) CFLAGS="$save_CFLAGS" dnl We check for headers @@ -198,7 +198,7 @@ AC_SEARCH_LIBS([sqrt], [m]) AC_CHECK_FUNC(localeconv, [AC_DEFINE(HAVE_LOCALECONV,1,[Define to 1 if you have localeconv])]) AC_CHECK_FUNCS([strerror]) -AC_CHECK_LIB(dl,dladdr,,,) +AC_CHECK_LIB(dl,dladdr,,HAVE_LIBDL=no,) dnl --------------------------------------------------------------------------- dnl Provide a mechanism to disable real mutex support (if lacking win32 or @@ -321,6 +321,18 @@ AC_SUBST(CURL_LIBS,$CURL_LIBS) AC_SUBST(CURL_ENABLED_FLAGS,$CURL_ENABLED_FLAGS) AM_CONDITIONAL(HAVE_CURL, [test "x$FOUND_CURL" = "xyes"]) +dnl --------------------------------------------------------------------------- +dnl Check for extra libraries, required for static linking with pkg-config +dnl --------------------------------------------------------------------------- + +EXTRA_LIBS="-lstdc++" +if test "$HAVE_LIBM" != "no" ; then + EXTRA_LIBS="$EXTRA_LIBS -lm" +fi +if test "$HAVE_LIBDL" != "no" ; then + EXTRA_LIBS="$EXTRA_LIBS -ldl" +fi +AC_SUBST(EXTRA_LIBS,$EXTRA_LIBS) dnl --------------------------------------------------------------------------- dnl proj-lib-env-var-tried-last diff --git a/data/projjson.schema.json b/data/projjson.schema.json index bdb97bd5..c347b3e1 100644 --- a/data/projjson.schema.json +++ b/data/projjson.schema.json @@ -1,7 +1,7 @@ { - "$id": "https://proj.org/schemas/v0.2/projjson.schema.json", + "$id": "https://proj.org/schemas/v0.3/projjson.schema.json", "$schema": "http://json-schema.org/draft-07/schema#", - "description": "Schema for PROJJSON (v0.2.1)", + "description": "Schema for PROJJSON (v0.3)", "$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": [ @@ -111,12 +111,20 @@ "bound_crs": { "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], "properties": { "$schema" : { "type": "string" }, "type": { "type": "string", "enum": ["BoundCRS"] }, + "name": { "type": "string" }, "source_crs": { "$ref": "#/definitions/crs" }, "target_crs": { "$ref": "#/definitions/crs" }, - "transformation": { "$ref": "#/definitions/abridged_transformation" } + "transformation": { "$ref": "#/definitions/abridged_transformation" }, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} }, "required" : [ "source_crs", "target_crs", "transformation" ], "additionalProperties": false diff --git a/data/sql/alias_name.sql b/data/sql/alias_name.sql index f12c1837..cf636a52 100644 --- a/data/sql/alias_name.sql +++ b/data/sql/alias_name.sql @@ -44,7 +44,7 @@ INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6132','FD58','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6133','EST92','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6134','PSD93','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6140','NAD83(CSRS)','EPSG'); -INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6151','CHTRF95','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6151','CHTRS95','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6152','NAD83(HARN)','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6154','ED50(ED77)','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6156','S-JTSK','EPSG'); @@ -56,7 +56,7 @@ INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6172','POSGAR','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6202','AGD66','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6203','AGD84','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6204','Ain el Abd','EPSG'); -INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6215','Belge 1950','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6215','BD50','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6230','ED50','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6231','ED87','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6237','HD72','EPSG'); @@ -78,7 +78,7 @@ INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6297','Tananarive','EPS INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6303','TC(1948)','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6308','RT38','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6312','MGI','EPSG'); -INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6313','Belge 1972','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6313','BD72','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6314','DHDN','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6318','NGN','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6319','KUDAMS','EPSG'); @@ -627,6 +627,18 @@ INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6277','OSGB 1936','EPSG INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1051','Genoa','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1308','EOS21-IRF','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6282','Pointe Noire','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6215','Belge 1950','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6313','Belge 1972','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6809','BD50 (Brussels)','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1310','ECML14_NB-IRF','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','6151','Swiss Terrestrial Reference Frame 1995 (CHTRF95)','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1311','EWR2-IRF','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1193','NAD83(CSRS) 1997','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1194','NAD83(CSRS) 1997','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1195','NAD83(CSRS) 2002','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1196','NAD83(CSRS) 2005','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1197','NAD83(CSRS) 2010','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1198','NAD83(CSRS) 2010','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21100','Genuk / NEIEZ','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','2140','NAD83(CSRS98) / SCoPQ zone 3','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','2141','NAD83(CSRS98) / SCoPQ zone 4','EPSG'); @@ -729,11 +741,11 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3564','Old Hawaiian / SP INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3565','Old Hawaiian / SP zone 5','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3991','Puerto Rico SPCS 27','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4134','PDO Survey Datum 1993','EPSG'); -INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4215','BD 50','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4215','Belge 1950','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4268','NAD Michigan','EPSG'); -INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4313','BD 72','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4313','Belge 1972','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4609','CGQ77','EPSG'); -INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4809','BD 50 (Brussels)','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4809','Belge 1950 (Brussels)','EPSG'); INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5701','Newlyn height','EPSG'); INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5702','National Geodetic Vertical Datum of 1929 height (ftUS)','EPSG'); INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5703','North American Vertical Datum of 1988 height (m)','EPSG'); @@ -1079,7 +1091,7 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31268','MGI / Gauss zone INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31291','MGI / Austria West','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31292','MGI / Austria Central','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31293','MGI / Austria East','EPSG'); -INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31370','BD 72 / Lambert 72','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31370','BD72 / Lambert 72','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31461','DHDN / Gauss zone 1','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31462','DHDN / Gauss zone 2','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31463','DHDN / Gauss zone 3','EPSG'); @@ -2753,7 +2765,7 @@ INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3816','NAD83(NSRS2007) / INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','9378','IGb14 - XYZ','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3812','ETRS89 / LB08','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','3447','ETRS89 / LB05','EPSG'); -INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31370','BD 72 / LB72','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31370','BD72 / LB72','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4236','Hu Tzu Shan','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4179','Pulkovo 1942(56)','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4178','Uniform Astro-Geodetic Network (UAGN) 1983','EPSG'); @@ -7274,3 +7286,96 @@ INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5608','770','EPSG'); INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5608','IGLD (1955) - DHt','EPSG'); INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5609','771','EPSG'); INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','5609','IGLD (1985) - DHt','EPSG'); +INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9390','766','EPSG'); +INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9390','EVRF2019mean-NHt','EPSG'); +INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9389','765','EPSG'); +INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','9389','EVRF2019-NHt','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9749','NAD83(2011) / AL W (ftUS)','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9748','NAD83(2011) / AL E (ftUS)','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20904','GSK-2011 / 6-degree Gauss-Kruger zone 4','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20906','GSK-2011 / 6-degree Gauss-Kruger zone 6','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20907','GSK-2011 / 6-degree Gauss-Kruger zone 7','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20905','GSK-2011 / 6-degree Gauss-Kruger zone 5','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20908','GSK-2011 / 6-degree Gauss-Kruger zone 8','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20909','GSK-2011 / 6-degree Gauss-Kruger zone 9','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20910','GSK-2011 / 6-degree Gauss-Kruger zone 10','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20911','GSK-2011 / 6-degree Gauss-Kruger zone 11','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20912','GSK-2011 / 6-degree Gauss-Kruger zone 12','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20913','GSK-2011 / 6-degree Gauss-Kruger zone 13','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20914','GSK-2011 / 6-degree Gauss-Kruger zone 14','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20915','GSK-2011 / 6-degree Gauss-Kruger zone 15','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20916','GSK-2011 / 6-degree Gauss-Kruger zone 16','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20917','GSK-2011 / 6-degree Gauss-Kruger zone 17','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20919','GSK-2011 / 6-degree Gauss-Kruger zone 19','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20920','GSK-2011 / 6-degree Gauss-Kruger zone 20','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20921','GSK-2011 / 6-degree Gauss-Kruger zone 21','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20922','GSK-2011 / 6-degree Gauss-Kruger zone 22','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20923','GSK-2011 / 6-degree Gauss-Kruger zone 23','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20924','GSK-2011 / 6-degree Gauss-Kruger zone 24','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20925','GSK-2011 / 6-degree Gauss-Kruger zone 25','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20926','GSK-2011 / 6-degree Gauss-Kruger zone 26','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20927','GSK-2011 / 6-degree Gauss-Kruger zone 27','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20929','GSK-2011 / 6-degree Gauss-Kruger zone 29','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20930','GSK-2011 / 6-degree Gauss-Kruger zone 30','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20931','GSK-2011 / 6-degree Gauss-Kruger zone 31','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20932','GSK-2011 / 6-degree Gauss-Kruger zone 32','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20928','GSK-2011 / 6-degree Gauss-Kruger zone 28','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21005','GSK-2011 / 6-degree Gauss-Kruger CM 27E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21006','GSK-2011 / 6-degree Gauss-Kruger CM 33E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21007','GSK-2011 / 6-degree Gauss-Kruger CM 39E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21008','GSK-2011 / 6-degree Gauss-Kruger CM 45E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21010','GSK-2011 / 6-degree Gauss-Kruger CM 57E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21011','GSK-2011 / 6-degree Gauss-Kruger CM 63E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21012','GSK-2011 / 6-degree Gauss-Kruger CM 69E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21013','GSK-2011 / 6-degree Gauss-Kruger CM 75E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21014','GSK-2011 / 6-degree Gauss-Kruger CM 81E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21015','GSK-2011 / 6-degree Gauss-Kruger CM 87E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21016','GSK-2011 / 6-degree Gauss-Kruger CM 93E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21017','GSK-2011 / 6-degree Gauss-Kruger CM 99E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21018','GSK-2011 / 6-degree Gauss-Kruger CM 105E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21019','GSK-2011 / 6-degree Gauss-Kruger CM 111E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21020','GSK-2011 / 6-degree Gauss-Kruger CM 117E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21021','GSK-2011 / 6-degree Gauss-Kruger CM 123E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21022','GSK-2011 / 6-degree Gauss-Kruger CM 129E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21023','GSK-2011 / 6-degree Gauss-Kruger CM 135E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21024','GSK-2011 / 6-degree Gauss-Kruger CM 141E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21025','GSK-2011 / 6-degree Gauss-Kruger CM 147E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21026','GSK-2011 / 6-degree Gauss-Kruger CM 153E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21027','GSK-2011 / 6-degree Gauss-Kruger CM 159E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21028','GSK-2011 / 6-degree Gauss-Kruger CM 165E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21029','GSK-2011 / 6-degree Gauss-Kruger CM 171E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21030','GSK-2011 / 6-degree Gauss-Kruger CM 177E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21031','GSK-2011 / 6-degree Gauss-Kruger CM 177W','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21032','GSK-2011 / 6-degree Gauss-Kruger CM 171W','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21004','GSK-2011 / 6-degree Gauss-Kruger CM 21E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21009','GSK-2011 / 6-degree Gauss-Kruger CM 51E','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','20918','GSK-2011 / 6-degree Gauss-Kruger zone 18','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21500','Belge 1950 (Brussels) / Belge Lambert 50','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31300','Belge 1972 / Belge Lambert 72','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','31370','Belge 1972 / Belgian Lambert 72','EPSG'); +INSERT INTO "alias_name" VALUES('compound_crs','EPSG','6190','Belge 1972 / Belgian Lambert 72 + Ostend height','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9761','ETRS89 / ECML14_NB SnakeGrid','EPSG'); +INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9762','ETRS89 / ECML14_NB SnakeGrid + Newlyn height','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9766','ETRS89 / EWR2 SnakeGrid','EPSG'); +INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9767','ETRS89 / EWR2 SnakeGrid + Newlyn height','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4932','CHTRF95','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4933','CHTRF95','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4151','CHTRF95','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8233','NAD83(CSRS) 1997','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8235','NAD83(CSRS) 1997','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8237','NAD83(CSRS) 1997','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8238','NAD83(CSRS) 1997','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8239','NAD83(CSRS) 1997','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8240','NAD83(CSRS) 1997','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8242','NAD83(CSRS) 2002','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8244','NAD83(CSRS) 2002','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8246','NAD83(CSRS) 2002','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8247','NAD83(CSRS) 2005','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8248','NAD83(CSRS) 2005','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8249','NAD83(CSRS) 2005','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8250','NAD83(CSRS) 2010','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8251','NAD83(CSRS) 2010','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8252','NAD83(CSRS) 2010','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8253','NAD83(CSRS) 2010','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8254','NAD83(CSRS) 2010','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','8255','NAD83(CSRS) 2010','EPSG'); diff --git a/data/sql/axis.sql b/data/sql/axis.sql index 21d658f0..3e359150 100644 --- a/data/sql/axis.sql +++ b/data/sql/axis.sql @@ -31,20 +31,20 @@ INSERT INTO "axis" VALUES('EPSG','1481','Easting','X','South along 165°W','EPSG INSERT INTO "axis" VALUES('EPSG','1482','Northing','Y','South along 75°W','EPSG','1038',2,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','1486','Easting','E','east','EPSG','1039',1,'EPSG','9002'); INSERT INTO "axis" VALUES('EPSG','1487','Northing','N','north','EPSG','1039',2,'EPSG','9002'); -INSERT INTO "axis" VALUES('EPSG','1024','Forward','x','Ahead','EPSG','1040',1,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1025','Starboard','y','Starboard','EPSG','1040',2,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1026','Platform Up','z','Upward','EPSG','1040',3,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1030','Forward','x','Ahead','EPSG','1041',1,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1031','Starboard','y','Starboard','EPSG','1041',2,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1032','Platform Down','z','Downward','EPSG','1041',3,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1036','Starboard','x','Starboard','EPSG','1042',1,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1037','Forward','y','Ahead','EPSG','1042',2,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1038','Platform Up','z','Upward','EPSG','1042',3,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32855','Forward','x','forward','EPSG','1040',1,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32856','Starboard','y','starboard','EPSG','1040',2,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32857','Platform Up','z','up','EPSG','1040',3,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32858','Forward','x','forward','EPSG','1041',1,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32859','Starboard','y','starboard','EPSG','1041',2,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32860','Platform Down','z','down','EPSG','1041',3,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32861','Starboard','x','starboard','EPSG','1042',1,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32862','Forward','y','forward','EPSG','1042',2,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32863','Platform Up','z','up','EPSG','1042',3,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','1525','Northing','N','North along 180°E','EPSG','1044',1,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','1526','Easting','E','North along 90°W','EPSG','1044',2,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1044','Starboard','x','Starboard','EPSG','1045',1,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1045','Forward','y','Ahead','EPSG','1045',2,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','1046','Platform Down','z','Downward','EPSG','1045',3,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32864','Starboard','x','starboard','EPSG','1045',1,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32865','Forward','y','forward','EPSG','1045',2,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32866','Platform Down','z','down','EPSG','1045',3,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','1042','Local northing','n','north','EPSG','1047',1,'EPSG','9001'); 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'); @@ -71,8 +71,8 @@ INSERT INTO "axis" VALUES('EPSG','19','Easting','E','east','EPSG','4409',1,'EPSG INSERT INTO "axis" VALUES('EPSG','20','Northing','N','north','EPSG','4409',2,'EPSG','9040'); INSERT INTO "axis" VALUES('EPSG','181','Easting','E','east','EPSG','4410',1,'EPSG','9301'); INSERT INTO "axis" VALUES('EPSG','182','Northing','N','north','EPSG','4410',2,'EPSG','9301'); -INSERT INTO "axis" VALUES('EPSG','236','Easting','E','South along 90°E.','EPSG','4460',1,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','237','Northing','N','South along 180°E','EPSG','4460',2,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32875','Easting','E','South along 90°E','EPSG','4460',1,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32876','Northing','N','South along 180°E','EPSG','4460',2,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','205','Topocentric East','U','east','EPSG','4461',1,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','206','Topocentric North','V','north','EPSG','4461',2,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','207','Topocentric height','W','up','EPSG','4461',3,'EPSG','9001'); @@ -183,10 +183,10 @@ INSERT INTO "axis" VALUES('EPSG','120','Westing','Y','west','EPSG','6502',1,'EPS INSERT INTO "axis" VALUES('EPSG','121','Southing','X','south','EPSG','6502',2,'EPSG','9031'); INSERT INTO "axis" VALUES('EPSG','122','Westing','Y','west','EPSG','6503',1,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','123','Southing','X','south','EPSG','6503',2,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','125','Plant North','n','northwest','EPSG','6504',1,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','124','Plant East','e','northeast','EPSG','6504',2,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','126','First local axis','n','northwest','EPSG','6505',1,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','127','Second local axis','e','northeast','EPSG','6505',2,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32877','Plant North','n','northWest','EPSG','6504',1,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32878','Plant East','e','northEast','EPSG','6504',2,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32873','First local axis','n','northWest','EPSG','6505',1,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32874','Second local axis','e','northEast','EPSG','6505',2,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','128','First local axis','I','east-south-east','EPSG','6506',1,'EPSG','9205'); INSERT INTO "axis" VALUES('EPSG','129','Second local axis','J','north-north-east','EPSG','6506',2,'EPSG','9204'); INSERT INTO "axis" VALUES('EPSG','130','First local axis','X','north','EPSG','6507',1,'EPSG','9001'); @@ -195,15 +195,15 @@ INSERT INTO "axis" VALUES('EPSG','133','Bin grid J','J','north north east','EPSG INSERT INTO "axis" VALUES('EPSG','132','Bin grid I','I','east south east','EPSG','6508',2,'EPSG','9208'); INSERT INTO "axis" VALUES('EPSG','135','Southing','P','south','EPSG','6509',1,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','134','Westing','M','west','EPSG','6509',2,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','173','Plant East','x','northeast','EPSG','6510',1,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','174','Plant North','y','northwest','EPSG','6510',2,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32871','Plant East','x','northEast','EPSG','6510',1,'EPSG','9001'); +INSERT INTO "axis" VALUES('EPSG','32872','Plant North','y','northWest','EPSG','6510',2,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','211','Plant East','x','east','EPSG','6512',1,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','212','Plant North','y','north','EPSG','6512',2,'EPSG','9001'); INSERT INTO "axis" VALUES('EPSG','213','Local height','z','up','EPSG','6512',3,'EPSG','9001'); -INSERT INTO "axis" VALUES('EPSG','32845','Bin grid I','I','J-axis plus 90 degrees','EPSG','32760',1,NULL,NULL); -INSERT INTO "axis" VALUES('EPSG','32846','Bin grid J','J','See associated operation','EPSG','32760',2,NULL,NULL); -INSERT INTO "axis" VALUES('EPSG','32847','Bin grid I','I','J-axis minus 90 degrees','EPSG','32761',1,NULL,NULL); -INSERT INTO "axis" VALUES('EPSG','32848','Bin grid J','J','See associated operation','EPSG','32761',2,NULL,NULL); +INSERT INTO "axis" VALUES('EPSG','32890','Bin grid I','I','columnPositive','EPSG','32760',1,NULL,NULL); +INSERT INTO "axis" VALUES('EPSG','32891','Bin grid J','J','rowPositive','EPSG','32760',2,NULL,NULL); +INSERT INTO "axis" VALUES('EPSG','32894','Bin grid I','I','columnNegative','EPSG','32761',1,NULL,NULL); +INSERT INTO "axis" VALUES('EPSG','32895','Bin grid J','J','rowPositive','EPSG','32761',2,NULL,NULL); INSERT INTO "axis" VALUES('EPSG','1082','Gravity-related height','H','up','EPSG','1030',1,'EPSG','9002'); INSERT INTO "axis" VALUES('EPSG','1516','Depth','D','down','EPSG','1043',1,'EPSG','9003'); INSERT INTO "axis" VALUES('EPSG','1051','Local depth','d','down','EPSG','1049',1,'EPSG','9001'); @@ -215,9 +215,9 @@ INSERT INTO "axis" VALUES('EPSG','56','Geodetic latitude','Lat','north','EPSG',' INSERT INTO "axis" VALUES('EPSG','57','Geodetic longitude','Long','east','EPSG','6402',2,'EPSG','9108'); INSERT INTO "axis" VALUES('EPSG','58','Geodetic latitude','Lat','north','EPSG','6403',1,'EPSG','9105'); INSERT INTO "axis" VALUES('EPSG','59','Geodetic longitude','Lon','east','EPSG','6403',2,'EPSG','9105'); -INSERT INTO "axis" VALUES('EPSG','60','Spherical latitude','Lat','north','EPSG','6404',1,'EPSG','9122'); -INSERT INTO "axis" VALUES('EPSG','61','Spherical longitude','Long','east','EPSG','6404',2,'EPSG','9122'); -INSERT INTO "axis" VALUES('EPSG','62','Geocentric radius','R','up','EPSG','6404',3,'EPSG','9001'); +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','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'); diff --git a/data/sql/compound_crs.sql b/data/sql/compound_crs.sql index 07934075..38d34e66 100644 --- a/data/sql/compound_crs.sql +++ b/data/sql/compound_crs.sql @@ -206,7 +206,7 @@ INSERT INTO "compound_crs" VALUES('EPSG','6175','ETRS89 / UTM zone 35N + NN54 he INSERT INTO "usage" VALUES('EPSG','4495','compound_crs','EPSG','6175','EPSG','4069','EPSG','1153'); 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','Belge 1972 / Belgian Lambert 72 + Ostend height',NULL,'EPSG','31370','EPSG','5710',0); +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'); @@ -712,3 +712,7 @@ INSERT INTO "compound_crs" VALUES('EPSG','9725','ETRS89 + Cagliari 1956 height', INSERT INTO "usage" VALUES('EPSG','15257','compound_crs','EPSG','9725','EPSG','2339','EPSG','1270'); INSERT INTO "compound_crs" VALUES('EPSG','9742','EOS21 Grid + ODN height',NULL,'EPSG','9741','EPSG','5701',0); INSERT INTO "usage" VALUES('EPSG','15318','compound_crs','EPSG','9742','EPSG','4620','EPSG','1141'); +INSERT INTO "compound_crs" VALUES('EPSG','9762','ECML14_NB Grid + ODN height',NULL,'EPSG','9761','EPSG','5701',0); +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'); diff --git a/data/sql/conversion.sql b/data/sql/conversion.sql index e6c6e7c3..b692f3ed 100644 --- a/data/sql/conversion.sql +++ b/data/sql/conversion.sql @@ -688,19 +688,19 @@ INSERT INTO "conversion" VALUES('EPSG','6308','Cyprus Transverse Mercator','Intr INSERT INTO "usage" VALUES('EPSG','9713','conversion','EPSG','6308','EPSG','3236','EPSG','1056'); INSERT INTO "conversion" VALUES('EPSG','6361','Mexico LCC','','EPSG','9802','Lambert Conic Conformal (2SP)','EPSG','8821','Latitude of false origin',12.0,'EPSG','9102','EPSG','8822','Longitude of false origin',-102.0,'EPSG','9102','EPSG','8823','Latitude of 1st standard parallel',17.5,'EPSG','9102','EPSG','8824','Latitude of 2nd standard parallel',29.5,'EPSG','9102','EPSG','8826','Easting at false origin',2500000.0,'EPSG','9001','EPSG','8827','Northing at false origin',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9719','conversion','EPSG','6361','EPSG','1160','EPSG','1241'); -INSERT INTO "conversion" VALUES('EPSG','6374','Ukraine TM zone 7','Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','6374','Ukraine TM zone 7','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9721','conversion','EPSG','6374','EPSG','3906','EPSG','1207'); -INSERT INTO "conversion" VALUES('EPSG','6375','Ukraine TM zone 8','Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',24.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','6375','Ukraine TM zone 8','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',24.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9722','conversion','EPSG','6375','EPSG','3907','EPSG','1207'); -INSERT INTO "conversion" VALUES('EPSG','6376','Ukraine TM zone 9','Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','6376','Ukraine TM zone 9','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9723','conversion','EPSG','6376','EPSG','3908','EPSG','1207'); -INSERT INTO "conversion" VALUES('EPSG','6377','Ukraine TM zone 10','Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',30.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','6377','Ukraine TM zone 10','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',30.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9724','conversion','EPSG','6377','EPSG','3909','EPSG','1207'); -INSERT INTO "conversion" VALUES('EPSG','6378','Ukraine TM zone 11','Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','6378','Ukraine TM zone 11','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9725','conversion','EPSG','6378','EPSG','3910','EPSG','1207'); -INSERT INTO "conversion" VALUES('EPSG','6379','Ukraine TM zone 12','Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',36.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','6379','Ukraine TM zone 12','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',36.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9726','conversion','EPSG','6379','EPSG','3912','EPSG','1207'); -INSERT INTO "conversion" VALUES('EPSG','6380','Ukraine TM zone 13','Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','6380','Ukraine TM zone 13','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',300000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9727','conversion','EPSG','6380','EPSG','3913','EPSG','1207'); INSERT INTO "conversion" VALUES('EPSG','6390','Cayman Islands LCC (ft)','','EPSG','9802','Lambert Conic Conformal (2SP)','EPSG','8821','Latitude of false origin',19.2,'EPSG','9110','EPSG','8822','Longitude of false origin',-80.34,'EPSG','9110','EPSG','8823','Latitude of 1st standard parallel',19.2,'EPSG','9110','EPSG','8824','Latitude of 2nd standard parallel',19.42,'EPSG','9110','EPSG','8826','Easting at false origin',2950000.0,'EPSG','9002','EPSG','8827','Northing at false origin',1900000.0,'EPSG','9002',NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9730','conversion','EPSG','6390','EPSG','1063','EPSG','1027'); @@ -1742,6 +1742,14 @@ INSERT INTO "conversion" VALUES('EPSG','9677','Bangladesh Transverse Mercator',' INSERT INTO "usage" VALUES('EPSG','14878','conversion','EPSG','9677','EPSG','3217','EPSG','1274'); INSERT INTO "conversion" VALUES('EPSG','9738','EOS21-TM','In conjunction with transformation ETRS89 to EOS-IRF (1) (code 9740), emulates the EOS21 Snake projection.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',56.21,'EPSG','9110','EPSG','8802','Longitude of natural origin',-2.45,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',74996.927,'EPSG','9001','EPSG','8807','False northing',133508.35,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','15339','conversion','EPSG','9738','EPSG','4620','EPSG','1141'); +INSERT INTO "conversion" VALUES('EPSG','9746','SPCS83 Alabama East zone (US Survey feet)','This map projection is not formally recognised by the NGS because there is no State legislation for NAD83 defining the foot to be used. See code 10131 for official metric definition. ftUS required by AL DOT and used by other professional practioners.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.3,'EPSG','9110','EPSG','8802','Longitude of natural origin',-85.5,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.99996,'EPSG','9201','EPSG','8806','False easting',656166.667,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15382','conversion','EPSG','9746','EPSG','2154','EPSG','1142'); +INSERT INTO "conversion" VALUES('EPSG','9747','SPCS83 Alabama West zone (US Survey feet)','This map projection is not formally recognised by the NGS because there is no State legislation for NAD83 defining the foot to be used. See code 10132 for official metric definition. ftUS required by AL DOT and used by other professional practioners.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-87.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.999933333,'EPSG','9201','EPSG','8806','False easting',1968500.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15381','conversion','EPSG','9747','EPSG','2155','EPSG','1142'); +INSERT INTO "conversion" VALUES('EPSG','9760','ECML14_NB-TM','In conjunction with transformation ETRS89 to ECML14_NB-IRF (1) (code 9759), emulates the ECML14_NB Snake projection.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',55.03,'EPSG','9110','EPSG','8802','Longitude of natural origin',-1.33,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',112242.8512,'EPSG','9001','EPSG','8807','False northing',402313.7432,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16497','conversion','EPSG','9760','EPSG','4621','EPSG','1141'); +INSERT INTO "conversion" VALUES('EPSG','9765','EWR2-TM','In conjunction with transformation ETRS89 to EWR2-IRF (1) (code 9764), emulates the EWR2 Snake projection.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',51.57,'EPSG','9110','EPSG','8802','Longitude of natural origin',-0.54,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',192519.9715,'EPSG','9001','EPSG','8807','False northing',146942.6806,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16511','conversion','EPSG','9765','EPSG','4622','EPSG','1141'); INSERT INTO "conversion" VALUES('EPSG','10101','Alabama CS27 East zone','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.3,'EPSG','9110','EPSG','8802','Longitude of natural origin',-85.5,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.99996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','11101','conversion','EPSG','10101','EPSG','2154','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','10102','Alabama CS27 West zone','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-87.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.999933333,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); @@ -2909,7 +2917,7 @@ INSERT INTO "conversion" VALUES('EPSG','16093','3-degree Gauss-Kruger zone 63',' INSERT INTO "usage" VALUES('EPSG','12096','conversion','EPSG','16093','EPSG','2651','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16094','3-degree Gauss-Kruger zone 64','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 168W (code 16194). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-168.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',64500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12097','conversion','EPSG','16094','EPSG','2652','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16099','3-degree Gauss-Kruger zone 60','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 180 (code 16190). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',180.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',60500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16099','3-degree Gauss-Kruger zone 60','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger CM 180E (code 16190).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',180.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',60500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12098','conversion','EPSG','16099','EPSG','2648','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16100','UTM grid system (southern hemisphere)','Use UTM zone xx S (codes 16101-16160) for use outwith zone boundary or when easting is not prefixed by zone number.','EPSG','9824','Transverse Mercator Zoned Grid System','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8830','Initial longitude',-180.0,'EPSG','9102','EPSG','8831','Zone width',6.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12099','conversion','EPSG','16100','EPSG','1999','EPSG','1163'); @@ -3075,7 +3083,7 @@ INSERT INTO "conversion" VALUES('EPSG','16188','3-degree Gauss-Kruger CM 174E',' INSERT INTO "usage" VALUES('EPSG','12179','conversion','EPSG','16188','EPSG','2646','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16189','3-degree Gauss-Kruger CM 177E','3-degree Gauss-Kruger zone 59N (code 16089) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1); INSERT INTO "usage" VALUES('EPSG','12180','conversion','EPSG','16189','EPSG','2647','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16190','3-degree Gauss-Kruger CM 180','3-degree Gauss-Kruger zone 60N (code 16099) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',180.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16190','3-degree Gauss-Kruger CM 180E','3-degree Gauss-Kruger zone 60N (code 16099) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',180.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12181','conversion','EPSG','16190','EPSG','2648','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16191','3-degree Gauss-Kruger CM 177W','3-degree Gauss-Kruger zone 61N (code 16091) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1); INSERT INTO "usage" VALUES('EPSG','12182','conversion','EPSG','16191','EPSG','2649','EPSG','1055'); @@ -3087,67 +3095,67 @@ INSERT INTO "conversion" VALUES('EPSG','16194','3-degree Gauss-Kruger CM 168W',' INSERT INTO "usage" VALUES('EPSG','12185','conversion','EPSG','16194','EPSG','2652','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16201','6-degree Gauss-Kruger zone 1','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 3E (code 16301). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',3.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',1500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12186','conversion','EPSG','16201','EPSG','1933','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16202','6-degree Gauss-Kruger zone 2','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 9E (code 16302). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',9.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',2500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16202','6-degree Gauss-Kruger zone 2','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 9E (code 16302).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',9.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',2500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12187','conversion','EPSG','16202','EPSG','2741','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16203','6-degree Gauss-Kruger zone 3','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 15E (code 16303). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',15.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',3500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16203','6-degree Gauss-Kruger zone 3','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 15E (code 16303).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',15.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',3500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12188','conversion','EPSG','16203','EPSG','2742','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16204','6-degree Gauss-Kruger zone 4','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 21E (code 16304). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',4500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16204','6-degree Gauss-Kruger zone 4','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 21E (code 16304).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',4500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12189','conversion','EPSG','16204','EPSG','2743','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16205','6-degree Gauss-Kruger zone 5','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 27E (code 16305). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',5500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16205','6-degree Gauss-Kruger zone 5','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 27E (code 16305).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',5500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12190','conversion','EPSG','16205','EPSG','2744','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16206','6-degree Gauss-Kruger zone 6','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 33E (code 16306). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',6500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16206','6-degree Gauss-Kruger zone 6','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 33E (code 16306).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',6500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12191','conversion','EPSG','16206','EPSG','2745','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16207','6-degree Gauss-Kruger zone 7','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 39E (code 16307). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',7500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16207','6-degree Gauss-Kruger zone 7','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 39E (code 16307).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',7500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12192','conversion','EPSG','16207','EPSG','2746','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16208','6-degree Gauss-Kruger zone 8','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 45E (code 16308). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',45.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',8500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16208','6-degree Gauss-Kruger zone 8','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 45E (code 16308).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',45.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',8500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12193','conversion','EPSG','16208','EPSG','1947','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16209','6-degree Gauss-Kruger zone 9','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 51E (code 16309). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',51.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',9500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16209','6-degree Gauss-Kruger zone 9','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 51E (code 16309).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',51.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',9500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12194','conversion','EPSG','16209','EPSG','1949','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16210','6-degree Gauss-Kruger zone 10','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 57E (code 16310). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',57.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',10500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16210','6-degree Gauss-Kruger zone 10','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 57E (code 16310).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',57.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',10500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12195','conversion','EPSG','16210','EPSG','1951','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16211','6-degree Gauss-Kruger zone 11','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 63E (code 16311). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',63.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',11500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16211','6-degree Gauss-Kruger zone 11','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 63E (code 16311).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',63.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',11500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12196','conversion','EPSG','16211','EPSG','1953','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16212','6-degree Gauss-Kruger zone 12','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 69E (code 16312). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',69.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',12500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16212','6-degree Gauss-Kruger zone 12','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 69E (code 16312).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',69.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',12500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12197','conversion','EPSG','16212','EPSG','1955','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16213','6-degree Gauss-Kruger zone 13','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 75E (code 16313). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',75.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',13500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16213','6-degree Gauss-Kruger zone 13','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 75E (code 16313).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',75.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',13500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12198','conversion','EPSG','16213','EPSG','1957','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16214','6-degree Gauss-Kruger zone 14','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 81E (code 16314). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',81.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',14500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16214','6-degree Gauss-Kruger zone 14','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 81E (code 16314).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',81.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',14500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12199','conversion','EPSG','16214','EPSG','1959','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16215','6-degree Gauss-Kruger zone 15','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 87E (code 16315). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',87.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',15500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16215','6-degree Gauss-Kruger zone 15','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 87E (code 16315).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',87.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',15500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12200','conversion','EPSG','16215','EPSG','1961','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16216','6-degree Gauss-Kruger zone 16','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 93E (code 16316). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',93.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',16500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16216','6-degree Gauss-Kruger zone 16','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 93E (code 16316).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',93.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',16500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12201','conversion','EPSG','16216','EPSG','1963','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16217','6-degree Gauss-Kruger zone 17','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 99E (code 16317). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',99.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',17500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16217','6-degree Gauss-Kruger zone 17','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 99E (code 16317).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',99.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',17500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12202','conversion','EPSG','16217','EPSG','1965','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16218','6-degree Gauss-Kruger zone 18','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 105E (code 16318). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',105.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',18500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16218','6-degree Gauss-Kruger zone 18','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 105E (code 16318).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',105.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',18500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12203','conversion','EPSG','16218','EPSG','1967','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16219','6-degree Gauss-Kruger zone 19','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 111E (code 16319). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',111.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',19500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16219','6-degree Gauss-Kruger zone 19','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 111E (code 16319).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',111.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',19500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12204','conversion','EPSG','16219','EPSG','1969','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16220','6-degree Gauss-Kruger zone 20','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 117E (code 16320). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',117.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',20500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16220','6-degree Gauss-Kruger zone 20','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 117E (code 16320).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',117.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',20500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12205','conversion','EPSG','16220','EPSG','1971','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16221','6-degree Gauss-Kruger zone 21','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 123E (code 16321). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',123.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',21500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16221','6-degree Gauss-Kruger zone 21','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 123E (code 16321).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',123.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',21500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12206','conversion','EPSG','16221','EPSG','1973','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16222','6-degree Gauss-Kruger zone 22','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 129E (code 16322). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',129.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',22500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16222','6-degree Gauss-Kruger zone 22','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 129E (code 16322).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',129.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',22500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12207','conversion','EPSG','16222','EPSG','1975','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16223','6-degree Gauss-Kruger zone 23','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 135E (code 16323). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',135.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',23500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16223','6-degree Gauss-Kruger zone 23','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 135E (code 16323).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',135.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',23500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12208','conversion','EPSG','16223','EPSG','1977','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16224','6-degree Gauss-Kruger zone 24','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 141E (code 16324). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',141.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',24500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16224','6-degree Gauss-Kruger zone 24','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 141E (code 16324).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',141.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',24500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12209','conversion','EPSG','16224','EPSG','1979','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16225','6-degree Gauss-Kruger zone 25','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 147E (code 16325). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',25500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16225','6-degree Gauss-Kruger zone 25','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 147E (code 16325).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',25500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12210','conversion','EPSG','16225','EPSG','1981','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16226','6-degree Gauss-Kruger zone 26','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 153E (code 16326). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',153.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',26500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16226','6-degree Gauss-Kruger zone 26','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 153E (code 16326).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',153.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',26500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12211','conversion','EPSG','16226','EPSG','1983','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16227','6-degree Gauss-Kruger zone 27','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 159E (code 16327). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',159.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',27500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16227','6-degree Gauss-Kruger zone 27','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 159E (code 16327).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',159.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',27500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12212','conversion','EPSG','16227','EPSG','1985','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16228','6-degree Gauss-Kruger zone 28','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 165E (code 16328). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',165.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',28500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16228','6-degree Gauss-Kruger zone 28','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 165E (code 16328).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',165.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',28500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12213','conversion','EPSG','16228','EPSG','1987','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16229','6-degree Gauss-Kruger zone 29','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 171E (code 16329). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',29500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16229','6-degree Gauss-Kruger zone 29','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 171E (code 16329).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',29500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12214','conversion','EPSG','16229','EPSG','1989','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16230','6-degree Gauss-Kruger zone 30','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 177E (code 16330). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',30500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16230','6-degree Gauss-Kruger zone 30','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 177E (code 16330).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',30500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12215','conversion','EPSG','16230','EPSG','1991','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16231','6-degree Gauss-Kruger zone 31','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 177W (code 16331). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',31500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16231','6-degree Gauss-Kruger zone 31','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 177W (code 16331).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',31500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12216','conversion','EPSG','16231','EPSG','1873','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16232','6-degree Gauss-Kruger zone 32','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 171W (code 16332). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',32500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16232','6-degree Gauss-Kruger zone 32','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger CM 171W (code 16332).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',32500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12217','conversion','EPSG','16232','EPSG','1875','EPSG','1211'); INSERT INTO "conversion" VALUES('EPSG','16233','6-degree Gauss-Kruger zone 33','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 165W (code 16333). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-165.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',33500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12218','conversion','EPSG','16233','EPSG','1877','EPSG','1211'); @@ -3205,35 +3213,35 @@ INSERT INTO "conversion" VALUES('EPSG','16259','6-degree Gauss-Kruger zone 59',' INSERT INTO "usage" VALUES('EPSG','12244','conversion','EPSG','16259','EPSG','1929','EPSG','1211'); INSERT INTO "conversion" VALUES('EPSG','16260','6-degree Gauss-Kruger zone 60','Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 3W (code 16360). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-3.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',60500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12245','conversion','EPSG','16260','EPSG','1931','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16261','3-degree Gauss-Kruger zone 1','Also found with zone truncated from false easting: see Gauss-Kruger cm 3E (code 16301). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',3.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',1500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16261','3-degree Gauss-Kruger zone 1','Also found with zone truncated from false easting: see Gauss-Kruger CM 3E (code 16301).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',3.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',1500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12246','conversion','EPSG','16261','EPSG','2299','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16262','3-degree Gauss-Kruger zone 2','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 6E (code 16362). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',6.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',2500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16262','3-degree Gauss-Kruger zone 2','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger CM 6E (code 16362).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',6.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',2500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12247','conversion','EPSG','16262','EPSG','2300','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16263','3-degree Gauss-Kruger zone 3','Also found with zone truncated from false easting: see Gauss-Kruger cm 9E (code 16302). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',9.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',3500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16263','3-degree Gauss-Kruger zone 3','Also found with zone truncated from false easting: see Gauss-Kruger CM 9E (code 16302).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',9.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',3500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12248','conversion','EPSG','16263','EPSG','2301','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16264','3-degree Gauss-Kruger zone 4','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 12E (code 16364). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',12.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',4500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16264','3-degree Gauss-Kruger zone 4','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger CM 12E (code 16364).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',12.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',4500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12249','conversion','EPSG','16264','EPSG','2302','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16265','3-degree Gauss-Kruger zone 5','Also found with zone truncated from false easting: see Gauss-Kruger cm 15E (code 16303). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',15.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',5500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16265','3-degree Gauss-Kruger zone 5','Also found with zone truncated from false easting: see Gauss-Kruger CM 15E (code 16303).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',15.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',5500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12250','conversion','EPSG','16265','EPSG','2303','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16266','3-degree Gauss-Kruger zone 6','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 18E (code 16366). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',18.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',6500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16266','3-degree Gauss-Kruger zone 6','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger CM 18E (code 16366).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',18.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',6500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12251','conversion','EPSG','16266','EPSG','2304','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16267','3-degree Gauss-Kruger zone 7','Also found with zone truncated from false easting: see Gauss-Kruger cm 21E (code 16304). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',7500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16267','3-degree Gauss-Kruger zone 7','Also found with zone truncated from false easting: see Gauss-Kruger CM 21E (code 16304).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',7500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12252','conversion','EPSG','16267','EPSG','2305','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16268','3-degree Gauss-Kruger zone 8','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 24E (code 16368). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',24.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',8500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16268','3-degree Gauss-Kruger zone 8','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger CM 24E (code 16368).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',24.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',8500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12253','conversion','EPSG','16268','EPSG','2306','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16269','3-degree Gauss-Kruger zone 9','Also found with zone truncated from false easting: see Gauss-Kruger cm 27E (code 16305). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',9500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16269','3-degree Gauss-Kruger zone 9','Also found with zone truncated from false easting: see Gauss-Kruger CM 27E (code 16305).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',9500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12254','conversion','EPSG','16269','EPSG','2534','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16270','3-degree Gauss-Kruger zone 10','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 30E (code 16370). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',30.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',10500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16270','3-degree Gauss-Kruger zone 10','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger CM 30E (code 16370).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',30.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',10500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12255','conversion','EPSG','16270','EPSG','2535','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16271','3-degree Gauss-Kruger zone 11','Also found with zone truncated from false easting: see Gauss-Kruger cm 33E (code 16306). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',11500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16271','3-degree Gauss-Kruger zone 11','Also found with zone truncated from false easting: see Gauss-Kruger CM 33E (code 16306).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',11500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12256','conversion','EPSG','16271','EPSG','2536','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16272','3-degree Gauss-Kruger zone 12','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 36E (code 16372). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',36.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',12500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16272','3-degree Gauss-Kruger zone 12','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger CM 36E (code 16372).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',36.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',12500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12257','conversion','EPSG','16272','EPSG','2537','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16273','3-degree Gauss-Kruger zone 13','Also found with zone truncated from false easting: see Gauss-Kruger cm 39E (code 16307). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',13500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16273','3-degree Gauss-Kruger zone 13','Also found with zone truncated from false easting: see Gauss-Kruger CM 39E (code 16307).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',13500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12258','conversion','EPSG','16273','EPSG','2538','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16274','3-degree Gauss-Kruger zone 14','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 42E (code 16374). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',42.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',14500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16274','3-degree Gauss-Kruger zone 14','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger CM 42E (code 16374).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',42.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',14500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12259','conversion','EPSG','16274','EPSG','2539','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16275','3-degree Gauss-Kruger zone 15','Also found with zone truncated from false easting: see Gauss-Kruger cm 45E (code 16308). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',45.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',15500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16275','3-degree Gauss-Kruger zone 15','Also found with zone truncated from false easting: see Gauss-Kruger CM 45E (code 16308).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',45.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',15500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12260','conversion','EPSG','16275','EPSG','2540','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16276','3-degree Gauss-Kruger zone 16','Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 48E (code 16376). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',48.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',16500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12261','conversion','EPSG','16276','EPSG','2604','EPSG','1055'); @@ -3285,67 +3293,67 @@ INSERT INTO "conversion" VALUES('EPSG','16299','3-degree Gauss-Kruger zone 39',' INSERT INTO "usage" VALUES('EPSG','12284','conversion','EPSG','16299','EPSG','2627','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16301','Gauss-Kruger CM 3E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 1N (code 16201), or for a restricted longitude range 3-degree Gauss-Kruger zone 1N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',3.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12285','conversion','EPSG','16301','EPSG','1933','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16302','Gauss-Kruger CM 9E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 2N (code 16202), or for a restricted longitude range 3-degree Gauss-Kruger zone 3N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',9.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16302','Gauss-Kruger CM 9E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 2N (code 16202).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',9.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12286','conversion','EPSG','16302','EPSG','1935','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16303','Gauss-Kruger CM 15E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 3N (code 16203), or for a restricted longitude range 3-degree Gauss-Kruger zone 5N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',15.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16303','Gauss-Kruger CM 15E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 3N (code 16203).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',15.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12287','conversion','EPSG','16303','EPSG','1937','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16304','Gauss-Kruger CM 21E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 4N (code 16204), or for a restricted longitude range 3-degree Gauss-Kruger zone 7N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16304','Gauss-Kruger CM 21E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 4N (code 16204).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12288','conversion','EPSG','16304','EPSG','1939','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16305','Gauss-Kruger CM 27E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 5N (code 16205), or for a restricted longitude range 3-degree Gauss-Kruger zone 9N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16305','Gauss-Kruger CM 27E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 5N (code 16205).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12289','conversion','EPSG','16305','EPSG','1941','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16306','Gauss-Kruger CM 33E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 6N (code 16206), or for a restricted longitude range 3-degree Gauss-Kruger zone 11N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16306','Gauss-Kruger CM 33E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 6N (code 16206).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12290','conversion','EPSG','16306','EPSG','1943','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16307','Gauss-Kruger CM 39E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 7N (code 16207), or for a restricted longitude range 3-degree Gauss-Kruger zone 13N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16307','Gauss-Kruger CM 39E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 7N (code 16207).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12291','conversion','EPSG','16307','EPSG','1945','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16308','Gauss-Kruger CM 45E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 8N (code 16208), or for a restricted longitude range 3-degree Gauss-Kruger zone 15N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',45.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16308','Gauss-Kruger CM 45E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 8N (code 16208).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',45.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12292','conversion','EPSG','16308','EPSG','1947','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16309','Gauss-Kruger CM 51E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 9N (code 16209), or for a restricted longitude range 3-degree Gauss-Kruger zone 17N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',51.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16309','Gauss-Kruger CM 51E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 9N (code 16209).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',51.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12293','conversion','EPSG','16309','EPSG','1949','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16310','Gauss-Kruger CM 57E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 10N (code 16210), or for a restricted longitude range 3-degree Gauss-Kruger zone 19N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',57.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16310','Gauss-Kruger CM 57E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 10N (code 16210).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',57.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12294','conversion','EPSG','16310','EPSG','1951','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16311','Gauss-Kruger CM 63E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 11N (code 16211), or for a restricted longitude range 3-degree Gauss-Kruger zone 21N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',63.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16311','Gauss-Kruger CM 63E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 11N (code 16211).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',63.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12295','conversion','EPSG','16311','EPSG','1953','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16312','Gauss-Kruger CM 69E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 12N (code 16212), or for a restricted longitude range 3-degree Gauss-Kruger zone 23N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',69.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16312','Gauss-Kruger CM 69E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 12N (code 16212).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',69.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12296','conversion','EPSG','16312','EPSG','1955','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16313','Gauss-Kruger CM 75E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 13N (code 16213), or for a restricted longitude range 3-degree Gauss-Kruger zone 25N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',75.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16313','Gauss-Kruger CM 75E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 13N (code 16213).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',75.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12297','conversion','EPSG','16313','EPSG','1957','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16314','Gauss-Kruger CM 81E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 14N (code 16214), or for a restricted longitude range 3-degree Gauss-Kruger zone 27N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',81.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16314','Gauss-Kruger CM 81E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 14N (code 16214).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',81.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12298','conversion','EPSG','16314','EPSG','1959','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16315','Gauss-Kruger CM 87E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 15N (code 16215), or for a restricted longitude range 3-degree Gauss-Kruger zone 29N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',87.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16315','Gauss-Kruger CM 87E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 15N (code 16215).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',87.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12299','conversion','EPSG','16315','EPSG','1961','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16316','Gauss-Kruger CM 93E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 16N (code 16216), or for a restricted longitude range 3-degree Gauss-Kruger zone 31N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',93.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16316','Gauss-Kruger CM 93E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 16N (code 16216).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',93.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12300','conversion','EPSG','16316','EPSG','1963','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16317','Gauss-Kruger CM 99E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 17N (code 16217), or for a restricted longitude range 3-degree Gauss-Kruger zone 33N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',99.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16317','Gauss-Kruger CM 99E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 17N (code 16217).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',99.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12301','conversion','EPSG','16317','EPSG','1965','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16318','Gauss-Kruger CM 105E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 18N (code 16218), or for a restricted longitude range 3-degree Gauss-Kruger zone 35N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',105.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16318','Gauss-Kruger CM 105E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 18N (code 16218).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',105.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12302','conversion','EPSG','16318','EPSG','1967','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16319','Gauss-Kruger CM 111E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 19N (code 16219), or for a restricted longitude range 3-degree Gauss-Kruger zone 37N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',111.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16319','Gauss-Kruger CM 111E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 19N (code 16219).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',111.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12303','conversion','EPSG','16319','EPSG','1969','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16320','Gauss-Kruger CM 117E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 20N (code 16220), or for a restricted longitude range 3-degree Gauss-Kruger zone 39N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',117.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16320','Gauss-Kruger CM 117E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 20N (code 16220).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',117.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12304','conversion','EPSG','16320','EPSG','1971','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16321','Gauss-Kruger CM 123E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 21N (code 16221), or for a restricted longitude range 3-degree Gauss-Kruger zone 41N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',123.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16321','Gauss-Kruger CM 123E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 21N (code 16221).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',123.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12305','conversion','EPSG','16321','EPSG','1973','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16322','Gauss-Kruger CM 129E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 22N (code 16222), or for a restricted longitude range 3-degree Gauss-Kruger zone 43N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',129.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16322','Gauss-Kruger CM 129E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 22N (code 16222).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',129.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12306','conversion','EPSG','16322','EPSG','1975','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16323','Gauss-Kruger CM 135E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 23N (code 16223), or for a restricted longitude range 3-degree Gauss-Kruger zone 45N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',135.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16323','Gauss-Kruger CM 135E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 23N (code 16223).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',135.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12307','conversion','EPSG','16323','EPSG','1977','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16324','Gauss-Kruger CM 141E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 24N (code 16224), or for a restricted longitude range 3-degree Gauss-Kruger zone 47N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',141.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16324','Gauss-Kruger CM 141E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 24N (code 16224).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',141.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12308','conversion','EPSG','16324','EPSG','1979','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16325','Gauss-Kruger CM 147E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 25N (code 16225), or for a restricted longitude range 3-degree Gauss-Kruger zone 49N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16325','Gauss-Kruger CM 147E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 25N (code 16225).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12309','conversion','EPSG','16325','EPSG','1981','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16326','Gauss-Kruger CM 153E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 26N (code 16226), or for a restricted longitude range 3-degree Gauss-Kruger zone 51N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',153.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16326','Gauss-Kruger CM 153E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 26N (code 16226).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',153.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12310','conversion','EPSG','16326','EPSG','1983','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16327','Gauss-Kruger CM 159E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 27N (code 16227), or for a restricted longitude range 3-degree Gauss-Kruger zone 53N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',159.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16327','Gauss-Kruger CM 159E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 27N (code 16227).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',159.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12311','conversion','EPSG','16327','EPSG','1985','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16328','Gauss-Kruger CM 165E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 28N (code 16228), or for a restricted longitude range 3-degree Gauss-Kruger zone 55N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',165.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16328','Gauss-Kruger CM 165E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 28N (code 16228).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',165.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12312','conversion','EPSG','16328','EPSG','1987','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16329','Gauss-Kruger CM 171E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 29N (code 16229), or for a restricted longitude range 3-degree Gauss-Kruger zone 57N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16329','Gauss-Kruger CM 171E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 29N (code 16229).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12313','conversion','EPSG','16329','EPSG','1989','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16330','Gauss-Kruger CM 177E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 30N (code 16230), or for a restricted longitude range 3-degree Gauss-Kruger zone 59N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16330','Gauss-Kruger CM 177E','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 30N (code 16230).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12314','conversion','EPSG','16330','EPSG','1991','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16331','Gauss-Kruger CM 177W','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 31N (code 16231), or for a restricted longitude range 3-degree Gauss-Kruger zone 61N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16331','Gauss-Kruger CM 177W','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 31N (code 16231).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12315','conversion','EPSG','16331','EPSG','1873','EPSG','1211'); -INSERT INTO "conversion" VALUES('EPSG','16332','Gauss-Kruger CM 171W','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 32N (code 16232), or for a restricted longitude range 3-degree Gauss-Kruger zone 62N (code 16261). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16332','Gauss-Kruger CM 171W','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 32N (code 16232).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12316','conversion','EPSG','16332','EPSG','1875','EPSG','1211'); INSERT INTO "conversion" VALUES('EPSG','16333','Gauss-Kruger CM 165W','Usually used with zone prefix to FE - see 6-degree Gauss-Kruger zone 33N (code 16233). Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-165.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12317','conversion','EPSG','16333','EPSG','1877','EPSG','1211'); @@ -3413,23 +3421,23 @@ INSERT INTO "conversion" VALUES('EPSG','16364','3-degree Gauss-Kruger CM 12E','3 INSERT INTO "usage" VALUES('EPSG','12348','conversion','EPSG','16364','EPSG','2302','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16365','3-degree Gauss-Kruger CM 15E','3-degree Gauss-Kruger zone 5N (code 16265) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',15.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1); INSERT INTO "usage" VALUES('EPSG','12349','conversion','EPSG','16365','EPSG','2303','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16366','3-degree Gauss-Kruger CM 18E','3-degree Gauss-Kruger zone 6N (code 16266) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',18.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16366','3-degree Gauss-Kruger CM 18E','3-degree Gauss-Kruger zone 6N (code 16266) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',18.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12350','conversion','EPSG','16366','EPSG','2304','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16367','3-degree Gauss-Kruger CM 21E','3-degree Gauss-Kruger zone 7N (code 16267) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1); INSERT INTO "usage" VALUES('EPSG','12351','conversion','EPSG','16367','EPSG','2305','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16368','3-degree Gauss-Kruger CM 24E','3-degree Gauss-Kruger zone 8N (code 16268) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',24.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16368','3-degree Gauss-Kruger CM 24E','3-degree Gauss-Kruger zone 8N (code 16268) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',24.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12352','conversion','EPSG','16368','EPSG','2306','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16369','3-degree Gauss-Kruger CM 27E','3-degree Gauss-Kruger zone 9N (code 16269) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1); INSERT INTO "usage" VALUES('EPSG','12353','conversion','EPSG','16369','EPSG','2534','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16370','3-degree Gauss-Kruger CM 30E','3-degree Gauss-Kruger zone 10N (code 16270) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',30.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16370','3-degree Gauss-Kruger CM 30E','3-degree Gauss-Kruger zone 10N (code 16270) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',30.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12354','conversion','EPSG','16370','EPSG','2535','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16371','3-degree Gauss-Kruger CM 33E','3-degree Gauss-Kruger zone 11N (code 16271) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1); INSERT INTO "usage" VALUES('EPSG','12355','conversion','EPSG','16371','EPSG','2536','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16372','3-degree Gauss-Kruger CM 36E','3-degree Gauss-Kruger zone 12N (code 16272) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',36.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16372','3-degree Gauss-Kruger CM 36E','3-degree Gauss-Kruger zone 12N (code 16272) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',36.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12356','conversion','EPSG','16372','EPSG','2537','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16373','3-degree Gauss-Kruger CM 39E','3-degree Gauss-Kruger zone 13N (code 16273) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1); INSERT INTO "usage" VALUES('EPSG','12357','conversion','EPSG','16373','EPSG','2538','EPSG','1055'); -INSERT INTO "conversion" VALUES('EPSG','16374','3-degree Gauss-Kruger CM 42E','3-degree Gauss-Kruger zone 14N (code 16274) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',42.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','16374','3-degree Gauss-Kruger CM 42E','3-degree Gauss-Kruger zone 14N (code 16274) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',42.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12358','conversion','EPSG','16374','EPSG','2539','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','16375','3-degree Gauss-Kruger CM 45E','3-degree Gauss-Kruger zone 15N (code 16275) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',45.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1); INSERT INTO "usage" VALUES('EPSG','12359','conversion','EPSG','16375','EPSG','2540','EPSG','1055'); @@ -3514,12 +3522,244 @@ INSERT INTO "conversion" VALUES('EPSG','16716','TM 116 SE','Used by BP for Teran INSERT INTO "usage" VALUES('EPSG','12398','conversion','EPSG','16716','EPSG','2588','EPSG','1136'); INSERT INTO "conversion" VALUES('EPSG','16732','TM 132 SE','Used for Tangguh developments.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',132.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',10000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12399','conversion','EPSG','16732','EPSG','2589','EPSG','1136'); +INSERT INTO "conversion" VALUES('EPSG','16907','GSK 3-degree Gauss-Kruger zone 7','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 21E (code 17107).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',7250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16011','conversion','EPSG','16907','EPSG','2305','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16908','GSK 3-degree Gauss-Kruger zone 8','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 24E (code 17108).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',24.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',8250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16015','conversion','EPSG','16908','EPSG','2748','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16909','GSK 3-degree Gauss-Kruger zone 9','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 27E (code 17109).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',9250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16016','conversion','EPSG','16909','EPSG','2749','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16910','GSK 3-degree Gauss-Kruger zone 10','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 30E (code 17110).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',30.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',10250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16017','conversion','EPSG','16910','EPSG','2535','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16911','GSK 3-degree Gauss-Kruger zone 11','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 33E (code 17111).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',11250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16018','conversion','EPSG','16911','EPSG','2751','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16912','GSK 3-degree Gauss-Kruger zone 12','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 36E (code 17112).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',36.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',12250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16019','conversion','EPSG','16912','EPSG','2752','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16913','GSK 3-degree Gauss-Kruger zone 13','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 39E (code 17113).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',13250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16020','conversion','EPSG','16913','EPSG','2753','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16914','GSK 3-degree Gauss-Kruger zone 14','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 42E (code 17114).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',42.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',14250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16021','conversion','EPSG','16914','EPSG','2754','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16915','GSK 3-degree Gauss-Kruger zone 15','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 45E (code 17115).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',45.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',15250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16022','conversion','EPSG','16915','EPSG','2755','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16916','GSK 3-degree Gauss-Kruger zone 16','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 48E (code 17116).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',48.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',16250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16023','conversion','EPSG','16916','EPSG','2756','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16917','GSK 3-degree Gauss-Kruger zone 17','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 51E (code 17117).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',51.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',17250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16024','conversion','EPSG','16917','EPSG','2757','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16918','GSK 3-degree Gauss-Kruger zone 18','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 54E (code 17118).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',54.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',18250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16025','conversion','EPSG','16918','EPSG','2758','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16919','GSK 3-degree Gauss-Kruger zone 19','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 57E (code 17119).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',57.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',19250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16026','conversion','EPSG','16919','EPSG','2759','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16920','GSK 3-degree Gauss-Kruger zone 20','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 60E (code 17120).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',60.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',20250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16027','conversion','EPSG','16920','EPSG','2760','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16921','GSK 3-degree Gauss-Kruger zone 21','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 63E (code 17121).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',63.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',21250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16028','conversion','EPSG','16921','EPSG','2609','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16922','GSK 3-degree Gauss-Kruger zone 22','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 66E (code 17122).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',66.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',22250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15917','conversion','EPSG','16922','EPSG','2762','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16923','GSK 3-degree Gauss-Kruger zone 23','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 69E (code 17123).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',69.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',23250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15916','conversion','EPSG','16923','EPSG','2763','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16924','GSK 3-degree Gauss-Kruger zone 24','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 72E (code 17124).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',72.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',24250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15915','conversion','EPSG','16924','EPSG','2764','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16925','GSK 3-degree Gauss-Kruger zone 25','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 75E (code 17125).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',75.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',25250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15914','conversion','EPSG','16925','EPSG','2765','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16926','GSK 3-degree Gauss-Kruger zone 26','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 78E (code 17126).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',78.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',26250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15913','conversion','EPSG','16926','EPSG','2766','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16927','GSK 3-degree Gauss-Kruger zone 27','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 81E (code 17127).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',81.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',27250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15912','conversion','EPSG','16927','EPSG','2767','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16928','GSK 3-degree Gauss-Kruger zone 28','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 84E (code 17128).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',84.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',28250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15911','conversion','EPSG','16928','EPSG','2768','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16929','GSK 3-degree Gauss-Kruger zone 29','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 87E (code 17129).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',87.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',29250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15910','conversion','EPSG','16929','EPSG','2769','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16930','GSK 3-degree Gauss-Kruger zone 30','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 90E (code 17130).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',90.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',30250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15909','conversion','EPSG','16930','EPSG','2676','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16931','GSK 3-degree Gauss-Kruger zone 31','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 93E (code 17131).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',93.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',31250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15908','conversion','EPSG','16931','EPSG','2677','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16932','GSK 3-degree Gauss-Kruger zone 32','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 96E (code 17132).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',96.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',32250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15907','conversion','EPSG','16932','EPSG','2678','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16933','GSK 3-degree Gauss-Kruger zone 33','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 99E (code 17133).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',99.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',33250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15925','conversion','EPSG','16933','EPSG','2679','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16934','GSK 3-degree Gauss-Kruger zone 34','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 102E (code 17134).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',102.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',34250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15926','conversion','EPSG','16934','EPSG','2680','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16935','GSK 3-degree Gauss-Kruger zone 35','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 105E (code 17135).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',105.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',35250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15927','conversion','EPSG','16935','EPSG','2681','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16936','GSK 3-degree Gauss-Kruger zone 36','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 108E (code 17136).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',108.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',36250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15928','conversion','EPSG','16936','EPSG','2682','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16937','GSK 3-degree Gauss-Kruger zone 37','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 111E (code 17137).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',111.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',37250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15938','conversion','EPSG','16937','EPSG','2683','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16938','GSK 3-degree Gauss-Kruger zone 38','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 114E (code 17138).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',114.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',38250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15939','conversion','EPSG','16938','EPSG','2684','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16939','GSK 3-degree Gauss-Kruger zone 39','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 117E (code 17139).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',117.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',39250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15940','conversion','EPSG','16939','EPSG','2685','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16940','GSK 3-degree Gauss-Kruger zone 40','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 120E (code 17140).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',120.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',40250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15941','conversion','EPSG','16940','EPSG','2686','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16941','GSK 3-degree Gauss-Kruger zone 41','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 123E (code 17141).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',123.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',41250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15942','conversion','EPSG','16941','EPSG','2687','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16942','GSK 3-degree Gauss-Kruger zone 42','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 126E (code 17142).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',126.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',42250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15943','conversion','EPSG','16942','EPSG','2688','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16943','GSK 3-degree Gauss-Kruger zone 43','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 129E (code 17143).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',129.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',43250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15944','conversion','EPSG','16943','EPSG','2689','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16944','GSK 3-degree Gauss-Kruger zone 44','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 132E (code 17144).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',132.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',44250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15945','conversion','EPSG','16944','EPSG','2690','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16945','GSK 3-degree Gauss-Kruger zone 45','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 135E (code 17145).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',135.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',45250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15946','conversion','EPSG','16945','EPSG','2691','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16946','GSK 3-degree Gauss-Kruger zone 46','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 138E (code 17146).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',138.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',46250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15947','conversion','EPSG','16946','EPSG','2692','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16947','GSK 3-degree Gauss-Kruger zone 47','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 141E (code 17147).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',141.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',47250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15948','conversion','EPSG','16947','EPSG','2693','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16948','GSK 3-degree Gauss-Kruger zone 48','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 144E (code 17148).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',144.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',48250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15949','conversion','EPSG','16948','EPSG','2694','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16949','GSK 3-degree Gauss-Kruger zone 49','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 147E (code 17149).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',49250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15950','conversion','EPSG','16949','EPSG','2695','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16950','GSK 3-degree Gauss-Kruger zone 50','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 150E (code 17150).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',150.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',50250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15951','conversion','EPSG','16950','EPSG','2696','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16951','GSK 3-degree Gauss-Kruger zone 51','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 153E (code 17151).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',153.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',51250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15983','conversion','EPSG','16951','EPSG','2697','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16952','GSK 3-degree Gauss-Kruger zone 52','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 156E (code 17152).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',156.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',52250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15984','conversion','EPSG','16952','EPSG','2698','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16953','GSK 3-degree Gauss-Kruger zone 53','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 159E (code 17153).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',159.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',53250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15985','conversion','EPSG','16953','EPSG','2699','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16954','GSK 3-degree Gauss-Kruger zone 54','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 162E (code 17154).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',162.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',54250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15986','conversion','EPSG','16954','EPSG','2700','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16955','GSK 3-degree Gauss-Kruger zone 55','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 165E (code 17155).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',165.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',55250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15987','conversion','EPSG','16955','EPSG','2701','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16956','GSK 3-degree Gauss-Kruger zone 56','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 168E (code 17156).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',168.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',56250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15988','conversion','EPSG','16956','EPSG','2702','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16957','GSK 3-degree Gauss-Kruger zone 57','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 171E (code 17157).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',57250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15989','conversion','EPSG','16957','EPSG','2703','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16958','GSK 3-degree Gauss-Kruger zone 58','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 174E (code 17158).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',174.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',58250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15990','conversion','EPSG','16958','EPSG','2704','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16959','GSK 3-degree Gauss-Kruger zone 59','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 177E (code 17159).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',59250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15994','conversion','EPSG','16959','EPSG','2705','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16960','GSK 3-degree Gauss-Kruger zone 60','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 180 (code 17160).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',180.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',60250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15991','conversion','EPSG','16960','EPSG','2706','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16961','GSK 3-degree Gauss-Kruger zone 61','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 177W (code 17161).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',61250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15992','conversion','EPSG','16961','EPSG','2707','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16962','GSK 3-degree Gauss-Kruger zone 62','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 174W (code 17162).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-174.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',62250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15993','conversion','EPSG','16962','EPSG','2708','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16963','GSK 3-degree Gauss-Kruger zone 63','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 171W (code 17163).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',63250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15995','conversion','EPSG','16963','EPSG','2709','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','16964','GSK 3-degree Gauss-Kruger zone 64','Also found with zone truncated from false easting: see GSK 3-degree Gauss-Kruger CM 168W (code 17164).','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-168.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',64250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15996','conversion','EPSG','16964','EPSG','2710','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','17001','TM 1 NW','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-1.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12400','conversion','EPSG','17001','EPSG','1505','EPSG','1136'); INSERT INTO "conversion" VALUES('EPSG','17005','TM 5 NW','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-5.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12401','conversion','EPSG','17005','EPSG','2296','EPSG','1136'); INSERT INTO "conversion" VALUES('EPSG','17054','TM 54 NW','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-54.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12402','conversion','EPSG','17054','EPSG','1727','EPSG','1136'); +INSERT INTO "conversion" VALUES('EPSG','17107','GSK 3-degree Gauss-Kruger CM 21E','GSK 3-degree Gauss-Kruger zone 7N (code 16907) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16012','conversion','EPSG','17107','EPSG','2305','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17108','GSK 3-degree Gauss-Kruger CM 24E','GSK 3-degree Gauss-Kruger zone 8N (code 16908) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',24.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16029','conversion','EPSG','17108','EPSG','2748','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17109','GSK 3-degree Gauss-Kruger CM 27E','GSK 3-degree Gauss-Kruger zone 9N (code 16909) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',27.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16030','conversion','EPSG','17109','EPSG','2749','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17110','GSK 3-degree Gauss-Kruger CM 30E','GSK 3-degree Gauss-Kruger zone 10N (code 16910) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',30.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16031','conversion','EPSG','17110','EPSG','2750','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17111','GSK 3-degree Gauss-Kruger CM 33E','GSK 3-degree Gauss-Kruger zone 11N (code 16911) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',33.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16032','conversion','EPSG','17111','EPSG','2751','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17112','GSK 3-degree Gauss-Kruger CM 36E','GSK 3-degree Gauss-Kruger zone 12N (code 16912) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',36.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16033','conversion','EPSG','17112','EPSG','2752','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17113','GSK 3-degree Gauss-Kruger CM 39E','GSK 3-degree Gauss-Kruger zone 13N (code 16913) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',39.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16034','conversion','EPSG','17113','EPSG','2753','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17114','GSK 3-degree Gauss-Kruger CM 42E','GSK 3-degree Gauss-Kruger zone 14N (code 16914) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',42.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16035','conversion','EPSG','17114','EPSG','2754','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17115','GSK 3-degree Gauss-Kruger CM 45E','GSK 3-degree Gauss-Kruger zone 15N (code 16915) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',45.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16036','conversion','EPSG','17115','EPSG','2755','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17116','GSK 3-degree Gauss-Kruger CM 48E','GSK 3-degree Gauss-Kruger zone 16N (code 16916) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',48.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16037','conversion','EPSG','17116','EPSG','2756','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17117','GSK 3-degree Gauss-Kruger CM 51E','GSK 3-degree Gauss-Kruger zone 17N (code 16917) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',51.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16040','conversion','EPSG','17117','EPSG','2757','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17118','GSK 3-degree Gauss-Kruger CM 54E','GSK 3-degree Gauss-Kruger zone 18N (code 16918) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',54.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16041','conversion','EPSG','17118','EPSG','2758','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17119','GSK 3-degree Gauss-Kruger CM 57E','GSK 3-degree Gauss-Kruger zone 19N (code 16919) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',57.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16039','conversion','EPSG','17119','EPSG','2759','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17120','GSK 3-degree Gauss-Kruger CM 60E','GSK 3-degree Gauss-Kruger zone 20N (code 16920) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',60.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16038','conversion','EPSG','17120','EPSG','2760','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17121','GSK 3-degree Gauss-Kruger CM 63E','GSK 3-degree Gauss-Kruger zone 21N (code 16921) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',63.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16042','conversion','EPSG','17121','EPSG','2761','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17122','GSK 3-degree Gauss-Kruger CM 66E','GSK 3-degree Gauss-Kruger zone 22N (code 16922) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',66.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15933','conversion','EPSG','17122','EPSG','2762','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17123','GSK 3-degree Gauss-Kruger CM 69E','GSK 3-degree Gauss-Kruger zone 23N (code 16923) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',69.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15937','conversion','EPSG','17123','EPSG','2763','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17124','GSK 3-degree Gauss-Kruger CM 72E','GSK 3-degree Gauss-Kruger zone 24N (code 16924) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',72.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15936','conversion','EPSG','17124','EPSG','2764','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17125','GSK 3-degree Gauss-Kruger CM 75E','GSK 3-degree Gauss-Kruger zone 25N (code 16925) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',75.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15935','conversion','EPSG','17125','EPSG','2765','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17126','GSK 3-degree Gauss-Kruger CM 78E','GSK 3-degree Gauss-Kruger zone 26N (code 16926) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',78.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15934','conversion','EPSG','17126','EPSG','2766','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17127','GSK 3-degree Gauss-Kruger CM 81E','GSK 3-degree Gauss-Kruger zone 27N (code 16927) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',81.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15932','conversion','EPSG','17127','EPSG','2767','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17128','GSK 3-degree Gauss-Kruger CM 84E','GSK 3-degree Gauss-Kruger zone 28N (code 16928) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',84.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15931','conversion','EPSG','17128','EPSG','2768','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17129','GSK 3-degree Gauss-Kruger CM 87E','GSK 3-degree Gauss-Kruger zone 29N (code 16929) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',87.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15930','conversion','EPSG','17129','EPSG','2769','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17130','GSK 3-degree Gauss-Kruger CM 90E','GSK 3-degree Gauss-Kruger zone 30N (code 16930) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',90.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15929','conversion','EPSG','17130','EPSG','2676','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17131','GSK 3-degree Gauss-Kruger CM 93E','GSK 3-degree Gauss-Kruger zone 31N (code 16931) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',93.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15923','conversion','EPSG','17131','EPSG','2677','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17132','GSK 3-degree Gauss-Kruger CM 96E','GSK 3-degree Gauss-Kruger zone 32N (code 16932) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',96.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15924','conversion','EPSG','17132','EPSG','2678','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17133','GSK 3-degree Gauss-Kruger CM 99E','GSK 3-degree Gauss-Kruger zone 33N (code 16933) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',99.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15921','conversion','EPSG','17133','EPSG','2679','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17134','GSK 3-degree Gauss-Kruger CM 102E','GSK 3-degree Gauss-Kruger zone 34N (code 16934) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',102.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15920','conversion','EPSG','17134','EPSG','2680','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17135','GSK 3-degree Gauss-Kruger CM 105E','GSK 3-degree Gauss-Kruger zone 35N (code 16935) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',105.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15919','conversion','EPSG','17135','EPSG','2681','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17136','GSK 3-degree Gauss-Kruger CM 108E','GSK 3-degree Gauss-Kruger zone 36N (code 16936) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',108.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15918','conversion','EPSG','17136','EPSG','2682','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17137','GSK 3-degree Gauss-Kruger CM 111E','GSK 3-degree Gauss-Kruger zone 37N (code 16937) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',111.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15953','conversion','EPSG','17137','EPSG','2683','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17138','GSK 3-degree Gauss-Kruger CM 114E','GSK 3-degree Gauss-Kruger zone 38N (code 16938) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',114.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15954','conversion','EPSG','17138','EPSG','2684','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17139','GSK 3-degree Gauss-Kruger CM 117E','GSK 3-degree Gauss-Kruger zone 39N (code 16939) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',117.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15955','conversion','EPSG','17139','EPSG','2685','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17140','GSK 3-degree Gauss-Kruger CM 120E','GSK 3-degree Gauss-Kruger zone 40N (code 16940) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',120.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15956','conversion','EPSG','17140','EPSG','2686','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17141','GSK 3-degree Gauss-Kruger CM 123E','GSK 3-degree Gauss-Kruger zone 41N (code 16941) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',123.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15957','conversion','EPSG','17141','EPSG','2687','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17142','GSK 3-degree Gauss-Kruger CM 126E','GSK 3-degree Gauss-Kruger zone 42N (code 16942) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',126.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15958','conversion','EPSG','17142','EPSG','2688','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17143','GSK 3-degree Gauss-Kruger CM 129E','GSK 3-degree Gauss-Kruger zone 43N (code 16943) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',129.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15959','conversion','EPSG','17143','EPSG','2689','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17144','GSK 3-degree Gauss-Kruger CM 132E','GSK 3-degree Gauss-Kruger zone 44N (code 16944) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',132.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15960','conversion','EPSG','17144','EPSG','2690','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17145','GSK 3-degree Gauss-Kruger CM 135E','GSK 3-degree Gauss-Kruger zone 45N (code 16945) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',135.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15961','conversion','EPSG','17145','EPSG','2691','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17146','GSK 3-degree Gauss-Kruger CM 138E','GSK 3-degree Gauss-Kruger zone 46N (code 16946) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',138.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15962','conversion','EPSG','17146','EPSG','2692','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17147','GSK 3-degree Gauss-Kruger CM 141E','GSK 3-degree Gauss-Kruger zone 47N (code 16947) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',141.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15963','conversion','EPSG','17147','EPSG','2693','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17148','GSK 3-degree Gauss-Kruger CM 144E','GSK 3-degree Gauss-Kruger zone 48N (code 16948) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',144.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15964','conversion','EPSG','17148','EPSG','2694','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17149','GSK 3-degree Gauss-Kruger CM 147E','GSK 3-degree Gauss-Kruger zone 49N (code 16949) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',147.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15965','conversion','EPSG','17149','EPSG','2695','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17150','GSK 3-degree Gauss-Kruger CM 150E','GSK 3-degree Gauss-Kruger zone 50N (code 16950) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',150.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15966','conversion','EPSG','17150','EPSG','2696','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17151','GSK 3-degree Gauss-Kruger CM 153E','GSK 3-degree Gauss-Kruger zone 51N (code 16951) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',153.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15997','conversion','EPSG','17151','EPSG','2697','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17152','GSK 3-degree Gauss-Kruger CM 156E','GSK 3-degree Gauss-Kruger zone 52N (code 16952) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',156.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15998','conversion','EPSG','17152','EPSG','2698','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17153','GSK 3-degree Gauss-Kruger CM 159E','GSK 3-degree Gauss-Kruger zone 53N (code 16953) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',159.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','15999','conversion','EPSG','17153','EPSG','2699','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17154','GSK 3-degree Gauss-Kruger CM 162E','GSK 3-degree Gauss-Kruger zone 54N (code 16954) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',162.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16000','conversion','EPSG','17154','EPSG','2700','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17155','GSK 3-degree Gauss-Kruger CM 165E','GSK 3-degree Gauss-Kruger zone 55N (code 16955) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',165.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16001','conversion','EPSG','17155','EPSG','2701','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17156','GSK 3-degree Gauss-Kruger CM 168E','GSK 3-degree Gauss-Kruger zone 56N (code 16956) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',168.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16002','conversion','EPSG','17156','EPSG','2702','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17157','GSK 3-degree Gauss-Kruger CM 171E','GSK 3-degree Gauss-Kruger zone 57N (code 16957) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16003','conversion','EPSG','17157','EPSG','2703','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17158','GSK 3-degree Gauss-Kruger CM 174E','GSK 3-degree Gauss-Kruger zone 58N (code 16958) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',174.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16004','conversion','EPSG','17158','EPSG','2704','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17159','GSK 3-degree Gauss-Kruger CM 177E','GSK 3-degree Gauss-Kruger zone 59N (code 16959) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16005','conversion','EPSG','17159','EPSG','2705','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17160','GSK 3-degree Gauss-Kruger CM 180E','GSK 3-degree Gauss-Kruger zone 60N (code 16960) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',180.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16482','conversion','EPSG','17160','EPSG','2706','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17161','GSK 3-degree Gauss-Kruger CM 177W','GSK 3-degree Gauss-Kruger zone 61N (code 16961) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-177.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16007','conversion','EPSG','17161','EPSG','2707','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17162','GSK 3-degree Gauss-Kruger CM 174W','GSK 3-degree Gauss-Kruger zone 62N (code 16962) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-174.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16008','conversion','EPSG','17162','EPSG','2708','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17163','GSK 3-degree Gauss-Kruger CM 171W','GSK 3-degree Gauss-Kruger zone 63N (code 16963) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-171.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16009','conversion','EPSG','17163','EPSG','2709','EPSG','1055'); +INSERT INTO "conversion" VALUES('EPSG','17164','GSK 3-degree Gauss-Kruger CM 168W','GSK 3-degree Gauss-Kruger zone 64N (code 16964) without zone prefix to false easting value.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-168.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',250000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16010','conversion','EPSG','17164','EPSG','2710','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','17204','SCAR IMW SP19-20','After: Sievers, J. and H. Bennat (1989). "Reference systems of maps and geographic information systems of Antarctica." Antarctic Science 1(4): 351-362.','EPSG','9802','Lambert Conic Conformal (2SP)','EPSG','8821','Latitude of false origin',-90.0,'EPSG','9102','EPSG','8822','Longitude of false origin',-66.0,'EPSG','9102','EPSG','8823','Latitude of 1st standard parallel',-60.4,'EPSG','9110','EPSG','8824','Latitude of 2nd standard parallel',-63.2,'EPSG','9110','EPSG','8826','Easting at false origin',0.0,'EPSG','9001','EPSG','8827','Northing at false origin',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12403','conversion','EPSG','17204','EPSG','2991','EPSG','1211'); INSERT INTO "conversion" VALUES('EPSG','17205','SCAR IMW SP21-22','After: Sievers, J. and H. Bennat (1989). "Reference systems of maps and geographic information systems of Antarctica." Antarctic Science 1(4): 351-362.','EPSG','9802','Lambert Conic Conformal (2SP)','EPSG','8821','Latitude of false origin',-90.0,'EPSG','9102','EPSG','8822','Longitude of false origin',-54.0,'EPSG','9102','EPSG','8823','Latitude of 1st standard parallel',-60.4,'EPSG','9110','EPSG','8824','Latitude of 2nd standard parallel',-63.2,'EPSG','9110','EPSG','8826','Easting at false origin',0.0,'EPSG','9001','EPSG','8827','Northing at false origin',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,0); diff --git a/data/sql/extent.sql b/data/sql/extent.sql index 834fb41f..792ce786 100644 --- a/data/sql/extent.sql +++ b/data/sql/extent.sql @@ -3150,10 +3150,10 @@ INSERT INTO "extent" VALUES('EPSG','4170','Japan - northern Honshu','Japan - nor INSERT INTO "extent" VALUES('EPSG','4171','Northern Mariana Islands - Rota, Saipan and Tinian','Northern Mariana Islands - onshore - Rota, Saipan and Tinian.',14.06,15.35,145.06,145.89,0); INSERT INTO "extent" VALUES('EPSG','4172','Falkland Islands - offshore 63°W to 57°W','Falkland Islands (Malvinas) - offshore - between 63°W and 57°W.',-56.25,-47.68,-63.01,-56.99,0); INSERT INTO "extent" VALUES('EPSG','4173','Heard Island and McDonald Islands - west of 66°E','Heard Island and McDonald Islands - offshore west of 66°E.',-57.5,-53.43,62.92,66.0,0); -INSERT INTO "extent" VALUES('EPSG','4174','Australia','Australia - onshore and offshore. Includes Lord Howe Island, Macquarie Islands, Ashmore and Cartier Islands.',-60.56,-8.88,105.8,164.7,0); +INSERT INTO "extent" VALUES('EPSG','4174','Australia','Australia - onshore and offshore. Includes Lord Howe Island, Macquarie Island, Ashmore and Cartier Islands.',-60.55,-8.88,105.8,164.69,0); INSERT INTO "extent" VALUES('EPSG','4175','Australasia - Australia and Norfolk Island - 162°E to 168°E','Australia - offshore east of 162°E. Norfolk Island - onshore and offshore west of 168°E.',-59.39,-25.94,162.0,168.0,0); INSERT INTO "extent" VALUES('EPSG','4176','Australasia - Australia and Christmas Island - 108°E to 114°E','Australia - onshore and offshore west of 114°E. Christmas Island - offshore east of 108°E.',-37.84,-10.72,108.0,114.01,0); -INSERT INTO "extent" VALUES('EPSG','4177','Australia - GDA','Australia including Lord Howe Island, Macquarie Islands, Ashmore and Cartier Islands, Christmas Island, Cocos (Keeling) Islands, Norfolk Island. All onshore and offshore.',-60.56,-8.47,93.41,173.35,0); +INSERT INTO "extent" VALUES('EPSG','4177','Australia - GDA','Australia including Lord Howe Island, Macquarie Island, Ashmore and Cartier Islands, Christmas Island, Cocos (Keeling) Islands, Norfolk Island. All onshore and offshore.',-60.55,-8.47,93.41,173.34,0); INSERT INTO "extent" VALUES('EPSG','4178','Australia - 114°E to 120°E','Australia - onshore and offshore between 114°E and 120°E.',-38.53,-12.06,114.0,120.01,0); INSERT INTO "extent" VALUES('EPSG','4179','Norfolk Island - east of 168°E','Norfolk Island - offshore east of 168°E.',-32.48,-25.61,168.0,173.35,0); INSERT INTO "extent" VALUES('EPSG','4180','USA - Oregon - Baker City','United States (USA) - Oregon - Baker City area.',44.6,45.19,-118.15,-117.37,0); @@ -3172,7 +3172,7 @@ INSERT INTO "extent" VALUES('EPSG','4192','USA - Oregon - Bend-Klamath Falls','U INSERT INTO "extent" VALUES('EPSG','4193','Vietnam - west of 103°30''E onshore','Vietnam - onshore west of 103°30''E.',9.2,22.82,102.14,103.51,0); INSERT INTO "extent" VALUES('EPSG','4194','Japan onshore excluding northern main province','Japan - onshore, excluding northern prefectures of ''main province'' (see remarks).',20.37,45.54,122.83,154.05,0); INSERT INTO "extent" VALUES('EPSG','4195','USA - Oregon - Bend-Redmond-Prineville','United States (USA) - Oregon - Bend-Redmond-Prineville area.',43.76,44.98,-121.88,-119.79,0); -INSERT INTO "extent" VALUES('EPSG','4196','Australia and Macquarie - 156°E to 162°E','Australia including Lord Howe Island and Macquarie Islands - onshore and offshore between 156°E and 162°E.',-60.56,-14.08,156.0,162.01,0); +INSERT INTO "extent" VALUES('EPSG','4196','Australia - 156°E to 162°E including Macquarie','Australia including Lord Howe Island and Macquarie Island - onshore and offshore between 156°E and 162°E.',-60.55,-14.08,156.0,162.0,0); INSERT INTO "extent" VALUES('EPSG','4197','USA - Oregon - Eugene','United States (USA) - Oregon - Eugene area.',43.74,44.71,-123.8,-122.18,0); INSERT INTO "extent" VALUES('EPSG','4198','USA - Oregon - Grants Pass-Ashland','United States (USA) - Oregon - Grants Pass-Ashland area.',41.88,42.85,-123.95,-122.37,0); INSERT INTO "extent" VALUES('EPSG','4199','USA - Oregon - Canyonville-Grants Pass','United States (USA) - Oregon - Canyonville-Grants Pass area.',42.49,43.24,-123.83,-122.43,0); @@ -3557,14 +3557,14 @@ INSERT INTO "extent" VALUES('EPSG','4578','Argentina - 67.5°W to 64.5°W mainla INSERT INTO "extent" VALUES('EPSG','4579','Argentina - 64.5°W to 61.5°W mainland onshore','Argentina - between 64°30''W and 61°30''W, onshore mainland.',-43.14,-21.99,-64.5,-61.49,0); INSERT INTO "extent" VALUES('EPSG','4580','Germany - Baden-Wurttemberg','Germany - Baden-Wurttemberg.',47.54,49.8,7.51,10.5,0); INSERT INTO "extent" VALUES('EPSG','4581','Africa - Morocco and Western Sahara - onshore','Africa - Morocco and Western Sahara - onshore.',20.71,35.97,-17.16,-1.01,0); -INSERT INTO "extent" VALUES('EPSG','4582','UK - London to Birmingham and Crewe','UK - HS2 phases 1 and 2a railway corridor from London to Birmingham, Lichfield and Crewe.',51.45,53.3,-2.75,0.0,0); -INSERT INTO "extent" VALUES('EPSG','4583','UK - Liverpool to Leeds','UK - on or related to the Trans-Pennine rail route from Liverpool via Manchester to Bradford and Leeds.',53.32,53.9,-3.14,-1.34,0); +INSERT INTO "extent" VALUES('EPSG','4582','UK - London to Birmingham and Crewe','United Kingdom (UK) - HS2 phases 1 and 2a railway corridor from London to Birmingham, Lichfield and Crewe.',51.45,53.3,-2.75,0.0,0); +INSERT INTO "extent" VALUES('EPSG','4583','UK - Liverpool to Leeds','United Kingdom (UK) - on or related to the Trans-Pennine rail route from Liverpool via Manchester to Bradford and Leeds.',53.32,53.9,-3.14,-1.35,0); INSERT INTO "extent" VALUES('EPSG','4584','Germany - Saarland','Germany - Saarland.',49.11,49.64,6.35,7.41,0); INSERT INTO "extent" VALUES('EPSG','4585','Austria - Vienna','Austria - Vienna city state.',48.12,48.34,16.18,16.59,0); INSERT INTO "extent" VALUES('EPSG','4586','World - south of 50°S','Southern hemisphere - south of 50°S onshore and offshore, including Antarctica.',-90.0,-50.0,-180.0,180.0,0); INSERT INTO "extent" VALUES('EPSG','4587','Congo DR (Zaire) - 6th parallel south 21.5°E to 23°E','The Democratic Republic of the Congo (Zaire) - adjacent to 6th parallel south traverse between 21°30''E and 23°E.',-7.31,-5.31,21.5,23.01,0); -INSERT INTO "extent" VALUES('EPSG','4588','UK - London to Sheffield','UK - on or related to the Midland Mainline rail route from Sheffield to London.',51.46,53.42,-1.89,0.16,0); -INSERT INTO "extent" VALUES('EPSG','4589','UK - Aberdeen to Inverness','UK - on or related to the A96 highway from Aberdeen to Inverness.',57.1,57.71,-4.31,-2.1,0); +INSERT INTO "extent" VALUES('EPSG','4588','UK - London to Sheffield','United Kingdom (UK) - on or related to the Midland Mainline rail route from Sheffield to London.',51.46,53.41,-1.89,0.15,0); +INSERT INTO "extent" VALUES('EPSG','4589','UK - Aberdeen to Inverness','United Kingdom (UK) - on or related to the A96 highway from Aberdeen to Inverness.',57.1,57.7,-4.3,-2.1,0); INSERT INTO "extent" VALUES('EPSG','4590','Spain - Ceuta','Spain - Ceuta onshore.',35.82,35.97,-5.4,-5.24,0); INSERT INTO "extent" VALUES('EPSG','4591','Spain - Canary Islands - Lanzarote','Spain - Canary Islands - Lanzarote onshore.',28.78,29.47,-13.95,-13.37,0); INSERT INTO "extent" VALUES('EPSG','4592','Spain - Canary Islands - Fuerteventura','Spain - Canary Islands - Fuerteventura onshore.',27.99,28.81,-14.58,-13.75,0); @@ -3582,7 +3582,7 @@ INSERT INTO "extent" VALUES('EPSG','4603','Spain - Balearic Islands - Menorca',' INSERT INTO "extent" VALUES('EPSG','4604','Spain - Balearic Islands - Ibiza and Formentera','Spain - Balearic Islands - Ibiza and Formentera - onshore.',38.59,39.17,1.12,1.68,0); INSERT INTO "extent" VALUES('EPSG','4605','Spain - mainland onshore and Ceuta','Spain - mainland and Ceuta - onshore.',35.82,43.82,-9.37,3.39,0); INSERT INTO "extent" VALUES('EPSG','4606','Europe - British Isles - UK and Ireland onshore, UKCS','United Kingdom (UK) - offshore to boundary of UKCS within 49°45''N to 61°N and 9°W to 2°E; onshore Great Britain (England, Wales and Scotland) and Northern Ireland. Ireland onshore. Isle of Man onshore.',49.75,61.01,-9.0,2.01,0); -INSERT INTO "extent" VALUES('EPSG','4607','UK - Glasgow to Kilmarnock','UK - on or related to the rail route from Glasgow via Barrhead to Kilmarnock and the branch to East Kilbride.',55.55,55.95,-4.65,-4.05,0); +INSERT INTO "extent" VALUES('EPSG','4607','UK - Glasgow to Kilmarnock','United Kingdom (UK) - on or related to the rail route from Glasgow to Kilmarnock via Barrhead and the branch to East Kilbride.',55.55,55.95,-4.65,-4.05,0); INSERT INTO "extent" VALUES('EPSG','4608','Europe - EVRF2019','Europe - onshore - Andorra; Austria; Belarus; Belgium; Bosnia and Herzegovina; Bulgaria; Croatia; Czechia; Denmark; Estonia; Finland; France - mainland; Germany; Gibraltar, Hungary; Italy - mainland and Sicily; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; North Macedonia; Norway; Poland; Portugal - mainland; Romania; Russia – west of approximately 60°E; San Marino; Slovakia; Slovenia; Spain - mainland; Sweden; Switzerland; United Kingdom (UK) - Great Britain mainland; Ukraine; Vatican City State.',35.95,77.07,-9.56,69.15,0); INSERT INTO "extent" VALUES('EPSG','4609','Europe - ETRF EVRF2019','Europe - onshore - Andorra; Austria; Belgium; Bosnia and Herzegovina; Bulgaria; Croatia; Czechia; Denmark; Estonia; Finland; France - mainland; Germany; Gibraltar, Hungary; Italy - mainland and Sicily; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; North Macedonia; Norway; Poland; Portugal - mainland; Romania; San Marino; Slovakia; Slovenia; Spain - mainland; Sweden; Switzerland; United Kingdom (UK) - Great Britain mainland; Vatican City State.',35.95,71.21,-9.56,31.59,0); INSERT INTO "extent" VALUES('EPSG','4610','Argentina - Buenos Aires city','Argentina - autonomous city of Buenos Aires.',-34.71,-34.5,-58.54,-58.29,0); @@ -3591,8 +3591,10 @@ INSERT INTO "extent" VALUES('EPSG','4612','Canada - Newfoundland','Canada - Newf INSERT INTO "extent" VALUES('EPSG','4613','Europe - Lyon-Turin','France and Italy - on or related to the rail route from Lyon to Turin.',44.87,45.89,4.65,7.88,0); INSERT INTO "extent" VALUES('EPSG','4614','Argentina - Comodoro Rivadavia - west of 67.5°W','Argentina - Comodoro Rivadavia area west of 67°30''W.',-46.7,-45.19,-69.5,-67.5,0); INSERT INTO "extent" VALUES('EPSG','4615','Norway, Svalbard and Jan Mayen - offshore','Norway (offshore) and Svalbard and Jan Mayen (offshore).',56.08,84.73,-13.63,38.0,0); -INSERT INTO "extent" VALUES('EPSG','4616','UK - Great Britain onshore; Isle of Man','United Kingdom (UK) - Great Britain - England, Scotland and Wales onshore; Isle of Man onshore.',49.81,60.93,-8.69,1.91,0); +INSERT INTO "extent" VALUES('EPSG','4616','UK - Great Britain onshore; Isle of Man','United Kingdom (UK) - Great Britain - England, Scotland and Wales onshore; Isle of Man onshore.',49.81,60.93,-8.69,1.9,0); INSERT INTO "extent" VALUES('EPSG','4617','Canada - east of 42°W','Canada offshore Atlantic - east of 42°W.',45.53,49.53,-42.0,-40.73,0); INSERT INTO "extent" VALUES('EPSG','4618','Canada - 41°N to 85°N, west of 50°W','Canada - onshore and offshore between 41°N and 85°N and west of 50°W - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon.',41.0,85.0,-141.01,-50.0,0); INSERT INTO "extent" VALUES('EPSG','4619','Italy - 6°22''E to 18°40''E and north of 35°16''N; San Marino, Vatican City State','Italy - onshore and offshore between 6°22''E and 18°40''E and north of 35°16''N; San Marino, Vatican City State.',35.26,47.1,6.36,18.67,0); -INSERT INTO "extent" VALUES('EPSG','4620','UK - Tweedmouth to Aberdeen','On or related to the complex of rail routes in the East of Scotland, incorporating the route from Tweedbank through the Borders to Edinburgh; the line from Edinburgh to Aberdeen; routes via Kirkaldy and Cowdenbeath; and routes via Leuchars and Perth to Dundee. ',55.55,57.2,-3.55,-1.95,0); +INSERT INTO "extent" VALUES('EPSG','4620','UK - Tweedmouth to Aberdeen','United Kingdom (UK) - on or related to the complex of rail routes in the East of Scotland, incorporating the route from Tweedbank through the Borders to Edinburgh; the line from Edinburgh to Aberdeen; routes via Kirkaldy and Cowdenbeath; and routes via Leuchars and Perth to Dundee. ',55.55,57.2,-3.55,-1.95,0); +INSERT INTO "extent" VALUES('EPSG','4621','UK - Newcastle to Ashington','United Kingdom (UK) - on or related to rail routes from Newcastle Central to Ashington via Benton North Junction, and the section from Bedlington to Morpeth.',54.85,55.3,-1.9,-1.3,0); +INSERT INTO "extent" VALUES('EPSG','4622','UK - Oxford to Bedford','United Kingdom (UK) - on or related to East West Rail (Phase 2) routes from Oxford to Bicester, Bletchley and Bedford, and from Claydon Junction to Aylesbury and Princes Risborough.',51.7,52.24,-1.43,-0.36,0); diff --git a/data/sql/geodetic_crs.sql b/data/sql/geodetic_crs.sql index ae1336e8..ecb99c41 100644 --- a/data/sql/geodetic_crs.sql +++ b/data/sql/geodetic_crs.sql @@ -190,7 +190,7 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','4149','CH1903',NULL,'geographic 2D','E INSERT INTO "usage" VALUES('EPSG','3034','geodetic_crs','EPSG','4149','EPSG','1286','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','4150','CH1903+',NULL,'geographic 2D','EPSG','6422','EPSG','6150',NULL,0); INSERT INTO "usage" VALUES('EPSG','3035','geodetic_crs','EPSG','4150','EPSG','1286','EPSG','1027'); -INSERT INTO "geodetic_crs" VALUES('EPSG','4151','CHTRF95',NULL,'geographic 2D','EPSG','6422','EPSG','6151',NULL,0); +INSERT INTO "geodetic_crs" VALUES('EPSG','4151','CHTRS95',NULL,'geographic 2D','EPSG','6422','EPSG','6151',NULL,0); INSERT INTO "usage" VALUES('EPSG','3036','geodetic_crs','EPSG','4151','EPSG','1286','EPSG','1183'); INSERT INTO "geodetic_crs" VALUES('EPSG','4152','NAD83(HARN)',NULL,'geographic 2D','EPSG','6422','EPSG','6152',NULL,0); INSERT INTO "usage" VALUES('EPSG','3037','geodetic_crs','EPSG','4152','EPSG','1337','EPSG','1183'); @@ -312,7 +312,7 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','4213','Beduaram',NULL,'geographic 2D', INSERT INTO "usage" VALUES('EPSG','3095','geodetic_crs','EPSG','4213','EPSG','2771','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','4214','Beijing 1954',NULL,'geographic 2D','EPSG','6422','EPSG','6214',NULL,0); INSERT INTO "usage" VALUES('EPSG','3096','geodetic_crs','EPSG','4214','EPSG','1067','EPSG','1027'); -INSERT INTO "geodetic_crs" VALUES('EPSG','4215','Belge 1950',NULL,'geographic 2D','EPSG','6422','EPSG','6215',NULL,0); +INSERT INTO "geodetic_crs" VALUES('EPSG','4215','BD50',NULL,'geographic 2D','EPSG','6422','EPSG','6215',NULL,0); INSERT INTO "usage" VALUES('EPSG','3097','geodetic_crs','EPSG','4215','EPSG','1347','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','4216','Bermuda 1957',NULL,'geographic 2D','EPSG','6422','EPSG','6216',NULL,0); INSERT INTO "usage" VALUES('EPSG','3098','geodetic_crs','EPSG','4216','EPSG','3221','EPSG','1027'); @@ -502,7 +502,7 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','4311','Zanderij',NULL,'geographic 2D', INSERT INTO "usage" VALUES('EPSG','3191','geodetic_crs','EPSG','4311','EPSG','1222','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','4312','MGI',NULL,'geographic 2D','EPSG','6422','EPSG','6312',NULL,0); INSERT INTO "usage" VALUES('EPSG','3192','geodetic_crs','EPSG','4312','EPSG','1037','EPSG','1027'); -INSERT INTO "geodetic_crs" VALUES('EPSG','4313','Belge 1972',NULL,'geographic 2D','EPSG','6422','EPSG','6313',NULL,0); +INSERT INTO "geodetic_crs" VALUES('EPSG','4313','BD72',NULL,'geographic 2D','EPSG','6422','EPSG','6313',NULL,0); INSERT INTO "usage" VALUES('EPSG','3193','geodetic_crs','EPSG','4313','EPSG','1347','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','4314','DHDN',NULL,'geographic 2D','EPSG','6422','EPSG','6314',NULL,0); INSERT INTO "usage" VALUES('EPSG','3194','geodetic_crs','EPSG','4314','EPSG','2326','EPSG','1027'); @@ -1014,7 +1014,7 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','4807','NTF (Paris)',NULL,'geographic 2 INSERT INTO "usage" VALUES('EPSG','3637','geodetic_crs','EPSG','4807','EPSG','3694','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','4808','Padang (Jakarta)',NULL,'geographic 2D','EPSG','6422','EPSG','6808',NULL,1); INSERT INTO "usage" VALUES('EPSG','3638','geodetic_crs','EPSG','4808','EPSG','1355','EPSG','1027'); -INSERT INTO "geodetic_crs" VALUES('EPSG','4809','Belge 1950 (Brussels)',NULL,'geographic 2D','EPSG','6422','EPSG','6809',NULL,0); +INSERT INTO "geodetic_crs" VALUES('EPSG','4809','BD50 (Brussels)',NULL,'geographic 2D','EPSG','6422','EPSG','6809',NULL,0); INSERT INTO "usage" VALUES('EPSG','3639','geodetic_crs','EPSG','4809','EPSG','1347','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','4810','Tananarive (Paris)',NULL,'geographic 2D','EPSG','6403','EPSG','6810',NULL,0); INSERT INTO "usage" VALUES('EPSG','3640','geodetic_crs','EPSG','4810','EPSG','3273','EPSG','1027'); @@ -1140,9 +1140,9 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','4930','Australian Antarctic',NULL,'geo INSERT INTO "usage" VALUES('EPSG','3730','geodetic_crs','EPSG','4930','EPSG','1278','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','4931','Australian Antarctic',NULL,'geographic 3D','EPSG','6423','EPSG','6176',NULL,0); INSERT INTO "usage" VALUES('EPSG','3731','geodetic_crs','EPSG','4931','EPSG','1278','EPSG','1027'); -INSERT INTO "geodetic_crs" VALUES('EPSG','4932','CHTRF95',NULL,'geocentric','EPSG','6500','EPSG','6151',NULL,0); +INSERT INTO "geodetic_crs" VALUES('EPSG','4932','CHTRS95',NULL,'geocentric','EPSG','6500','EPSG','6151',NULL,0); INSERT INTO "usage" VALUES('EPSG','3732','geodetic_crs','EPSG','4932','EPSG','1286','EPSG','1027'); -INSERT INTO "geodetic_crs" VALUES('EPSG','4933','CHTRF95',NULL,'geographic 3D','EPSG','6423','EPSG','6151',NULL,0); +INSERT INTO "geodetic_crs" VALUES('EPSG','4933','CHTRS95',NULL,'geographic 3D','EPSG','6423','EPSG','6151',NULL,0); INSERT INTO "usage" VALUES('EPSG','3733','geodetic_crs','EPSG','4933','EPSG','1286','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','4934','EST97',NULL,'geocentric','EPSG','6500','EPSG','6180',NULL,0); INSERT INTO "usage" VALUES('EPSG','3734','geodetic_crs','EPSG','4934','EPSG','1090','EPSG','1027'); @@ -2128,3 +2128,7 @@ INSERT INTO "geodetic_crs" VALUES('EPSG','9702','ETRF2000-PL',NULL,'geographic 2 INSERT INTO "usage" VALUES('EPSG','15131','geodetic_crs','EPSG','9702','EPSG','1192','EPSG','1183'); INSERT INTO "geodetic_crs" VALUES('EPSG','9739','EOS21-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1308',NULL,0); INSERT INTO "usage" VALUES('EPSG','15341','geodetic_crs','EPSG','9739','EPSG','4620','EPSG','1141'); +INSERT INTO "geodetic_crs" VALUES('EPSG','9758','ECML14_NB-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1310',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16495','geodetic_crs','EPSG','9758','EPSG','4621','EPSG','1141'); +INSERT INTO "geodetic_crs" VALUES('EPSG','9763','EWR2-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1311',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16507','geodetic_crs','EPSG','9763','EPSG','4622','EPSG','1141'); diff --git a/data/sql/geodetic_datum.sql b/data/sql/geodetic_datum.sql index b90feffa..f7971981 100644 --- a/data/sql/geodetic_datum.sql +++ b/data/sql/geodetic_datum.sql @@ -332,6 +332,10 @@ INSERT INTO "geodetic_datum" VALUES('EPSG','1305','ETRF2000 Poland',NULL,'EPSG', INSERT INTO "usage" VALUES('EPSG','15061','geodetic_datum','EPSG','1305','EPSG','1192','EPSG','1180'); INSERT INTO "geodetic_datum" VALUES('EPSG','1308','EOS21 Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2021-01-01',NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','15312','geodetic_datum','EPSG','1308','EPSG','4620','EPSG','1141'); +INSERT INTO "geodetic_datum" VALUES('EPSG','1310','ECML14_NB Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2021-01-01',NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16494','geodetic_datum','EPSG','1310','EPSG','4621','EPSG','1141'); +INSERT INTO "geodetic_datum" VALUES('EPSG','1311','EWR2 Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2021-01-01',NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','16506','geodetic_datum','EPSG','1311','EPSG','4622','EPSG','1141'); INSERT INTO "geodetic_datum" VALUES('EPSG','6001','Not specified (based on Airy 1830 ellipsoid)',NULL,'EPSG','7001','EPSG','8901',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13422','geodetic_datum','EPSG','6001','EPSG','1263','EPSG','1213'); INSERT INTO "geodetic_datum" VALUES('EPSG','6002','Not specified (based on Airy Modified 1849 ellipsoid)',NULL,'EPSG','7002','EPSG','8901',NULL,NULL,NULL,0); @@ -480,7 +484,7 @@ INSERT INTO "geodetic_datum" VALUES('EPSG','6149','CH1903',NULL,'EPSG','7004','E INSERT INTO "usage" VALUES('EPSG','13494','geodetic_datum','EPSG','6149','EPSG','1286','EPSG','1153'); INSERT INTO "geodetic_datum" VALUES('EPSG','6150','CH1903+',NULL,'EPSG','7004','EPSG','8901','1995-01-01',NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13495','geodetic_datum','EPSG','6150','EPSG','1286','EPSG','1180'); -INSERT INTO "geodetic_datum" VALUES('EPSG','6151','Swiss Terrestrial Reference Frame 1995',NULL,'EPSG','7019','EPSG','8901','1995-01-01',NULL,NULL,0); +INSERT INTO "geodetic_datum" VALUES('EPSG','6151','Swiss Terrestrial Reference System 1995',NULL,'EPSG','7019','EPSG','8901','1995-01-01',NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13496','geodetic_datum','EPSG','6151','EPSG','1286','EPSG','1181'); INSERT INTO "geodetic_datum" VALUES('EPSG','6152','NAD83 (High Accuracy Reference Network)',NULL,'EPSG','7019','EPSG','8901',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13497','geodetic_datum','EPSG','6152','EPSG','1337','EPSG','1027'); diff --git a/data/sql/grid_transformation.sql b/data/sql/grid_transformation.sql index b0b6ab4f..8b5b533a 100644 --- a/data/sql/grid_transformation.sql +++ b/data/sql/grid_transformation.sql @@ -420,13 +420,13 @@ INSERT INTO "grid_transformation" VALUES('EPSG','7650','NAD83(PA11) to ASVD02 he INSERT INTO "usage" VALUES('EPSG','14372','grid_transformation','EPSG','7650','EPSG','2288','EPSG','1132'); INSERT INTO "grid_transformation" VALUES('EPSG','7655','PNG94 to PNG08 height (1)','','EPSG','1059','Geographic3D to GravityRelatedHeight (PNG)','EPSG','5545','EPSG','7447',0.2,'EPSG','8666','Geoid (height correction) model file','PNG08.DAT',NULL,NULL,NULL,NULL,NULL,NULL,'QC-Png',0); INSERT INTO "usage" VALUES('EPSG','10197','grid_transformation','EPSG','7655','EPSG','4384','EPSG','1133'); -INSERT INTO "grid_transformation" VALUES('EPSG','7673','CH1903 to CHTRF95 (1)','Equivalent to concatenation of transformations 15486 and 1509 to within 2cm. Also used as transformation between CH1903 and ETRS89 (see code 7674).','EPSG','9615','NTv2','EPSG','4149','EPSG','4151',0.25,'EPSG','8656','Latitude and longitude difference file','CHENyx06_ETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BfL-Che NTv2',0); -INSERT INTO "usage" VALUES('EPSG','10205','grid_transformation','EPSG','7673','EPSG','1286','EPSG','1084'); -INSERT INTO "grid_transformation" VALUES('EPSG','7674','CH1903 to ETRS89 (2)','Replaces tfm code 1646. Equivalent to concatenation of transformations 15486 and 1647 to within 2cm. Also used as transformation between CH1903 and CHTRF95 (see code 7673). May be used as approximate tfm CH1903 to WGS 84 - see code 7788.','EPSG','9615','NTv2','EPSG','4149','EPSG','4258',0.25,'EPSG','8656','Latitude and longitude difference file','CHENyx06_ETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BfL-Che NTv2',0); +INSERT INTO "grid_transformation" VALUES('EPSG','7673','CH1903 to CHTRS95 (1)','Equivalent to concatenation of transformations 15486 (CH1903 to CH1903+) and 1509 (CH1903+ to CHTRS95) to within 2cm. Also used as transformation between CH1903 and ETRS89 (see code 7674).','EPSG','9615','NTv2','EPSG','4149','EPSG','4151',0.25,'EPSG','8656','Latitude and longitude difference file','CHENyx06_ETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BfL-Che NTv2',0); +INSERT INTO "usage" VALUES('EPSG','10205','grid_transformation','EPSG','7673','EPSG','1286','EPSG','1083'); +INSERT INTO "grid_transformation" VALUES('EPSG','7674','CH1903 to ETRS89 (2)','Equivalent to concatenation of CTs 15486 (CH1903 to CH1903+) and 1647 (CH1903+ to CHTRS95) to within 2cm. Also used as CT between CH1903 and CHTRS95 (see code 7673). Replaces CT code 1646. May be used as approximate CT CH1903 to WGS 84 - see code 7788.','EPSG','9615','NTv2','EPSG','4149','EPSG','4258',0.25,'EPSG','8656','Latitude and longitude difference file','CHENyx06_ETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BfL-Che NTv2',0); INSERT INTO "usage" VALUES('EPSG','10206','grid_transformation','EPSG','7674','EPSG','1286','EPSG','1083'); INSERT INTO "grid_transformation" VALUES('EPSG','7709','OSGB36 to ETRS89 (2)','Approximate alternative to official OSTN15 method (tfm code 7953). May be taken as approximate transformation OSGB36 to WGS 84 - see code 7710. Replaces OSGB36 to ETRS89 (1) (tfm code 5338).','EPSG','9615','NTv2','EPSG','4277','EPSG','4258',0.03,'EPSG','8656','Latitude and longitude difference file','OSTN15_NTv2_OSGBtoETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'OSGB-UK Gbr15 NT',0); INSERT INTO "usage" VALUES('EPSG','10222','grid_transformation','EPSG','7709','EPSG','4390','EPSG','1273'); -INSERT INTO "grid_transformation" VALUES('EPSG','7710','OSGB36 to WGS 84 (9)','Parameter values taken from OSGB36 to ETRS89 (3) (tfm code 7709) assuming that ETRS89 is coincident with WGS 84 within the accuracy of the tfm. Replaces OSGB36 to WGS 84 (7) (tfm code 5339).','EPSG','9615','NTv2','EPSG','4277','EPSG','4326',1.0,'EPSG','8656','Latitude and longitude difference file','OSTN15_NTv2_OSGBtoETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'OGP-UK Gbr15 NT',0); +INSERT INTO "grid_transformation" VALUES('EPSG','7710','OSGB36 to WGS 84 (9)','Parameter values taken from OSGB36 to ETRS89 (2) (tfm code 7709) assuming that ETRS89 is coincident with WGS 84 within the accuracy of the tfm. Replaces OSGB36 to WGS 84 (7) (tfm code 5339).','EPSG','9615','NTv2','EPSG','4277','EPSG','4326',1.0,'EPSG','8656','Latitude and longitude difference file','OSTN15_NTv2_OSGBtoETRS.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'OGP-UK Gbr15 NT',0); INSERT INTO "usage" VALUES('EPSG','10223','grid_transformation','EPSG','7710','EPSG','4390','EPSG','1252'); INSERT INTO "grid_transformation" VALUES('EPSG','7711','ETRS89 to ODN height (2)','OSGM15 supersedes OSGM02 geoid model. Replaces ETRS89 to Newlyn height (1) (tfm code 10021). For reversible alternative to this transformation see ETRS89 to ETRS89 + ODN height (2) (code 9587).','EPSG','9663','Geographic3D to GravityRelatedHeight (OSGM-GB)','EPSG','4937','EPSG','5701',0.008,'EPSG','8666','Geoid (height correction) model file','OSTN15_OSGM15_GB.txt',NULL,NULL,NULL,NULL,NULL,NULL,'OS-UK Gbr 2015',0); INSERT INTO "usage" VALUES('EPSG','14515','grid_transformation','EPSG','7711','EPSG','2792','EPSG','1133'); @@ -1104,6 +1104,12 @@ INSERT INTO "grid_transformation" VALUES('EPSG','9737','IGM95 to RDN2008 (1)','F INSERT INTO "usage" VALUES('EPSG','15336','grid_transformation','EPSG','9737','EPSG','4619','EPSG','1150'); INSERT INTO "grid_transformation" VALUES('EPSG','9740','ETRS89 to EOS21-IRF (1)','In conjunction with the EOS-TM map projection (code 9738) applied to EOS21-IRF (code 9739), emulates the EOS21 Snake projection. Applied to ETRS89 (as realized through the OSNet v2009 CORS) defines EOS21-IRF hence is errorless.','EPSG','9615','NTv2','EPSG','4258','EPSG','9739',0.0,'EPSG','8656','Latitude and longitude difference file','TN15-ETRS89-to-EOS21-IRF.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NR-Gbr EOS21 OSNet2009',0); INSERT INTO "usage" VALUES('EPSG','15342','grid_transformation','EPSG','9740','EPSG','4620','EPSG','1141'); +INSERT INTO "grid_transformation" VALUES('EPSG','9759','ETRS89 to ECML14_NB-IRF (1)','In conjunction with the ECML14_NB-TM map projection (code 9760) applied to ECML14_NB-IRF (code 9758), emulates the ECML14_NB Snake projection. Applied to ETRS89 (as realized through the OSNet v2009 CORS) defines ECML14_NB-IRF hence is errorless.','EPSG','9615','NTv2','EPSG','4258','EPSG','9758',0.0,'EPSG','8656','Latitude and longitude difference file','TN15-ETRS89-to-ECML14_NB-IRF.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NR-Gbr ECML_NB OSNet2009',0); +INSERT INTO "usage" VALUES('EPSG','16500','grid_transformation','EPSG','9759','EPSG','4621','EPSG','1141'); +INSERT INTO "grid_transformation" VALUES('EPSG','9764','ETRS89 to EWR2-IRF (1)','In conjunction with the EWR2-TM map projection (code 9765) applied to EWR2-IRF (code 9763), emulates the EWR2 Snake projection. Applied to ETRS89 (as realized through the OSNet v2009 CORS) defines EWR2-IRF hence is errorless.','EPSG','9615','NTv2','EPSG','4258','EPSG','9763',0.0,'EPSG','8656','Latitude and longitude difference file','TN15-ETRS89-to-EWR2-IRF.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NR-Gbr EWR2 OSNet2009',0); +INSERT INTO "usage" VALUES('EPSG','16505','grid_transformation','EPSG','9764','EPSG','4622','EPSG','1141'); +INSERT INTO "grid_transformation" VALUES('EPSG','9795','NAD83 to NAD83(CSRS)v7 (1)','Also distributed through Alberta Environment and Parks Lands Division named ABCSRSV7.DAC.','EPSG','9615','NTv2','EPSG','4269','EPSG','8255',0.1,'EPSG','8656','Latitude and longitude difference file','ABCSRSV7.GSB',NULL,NULL,NULL,NULL,NULL,NULL,'NRCan-Can AB',0); +INSERT INTO "usage" VALUES('EPSG','16635','grid_transformation','EPSG','9795','EPSG','2376','EPSG','1031'); INSERT INTO "grid_transformation" VALUES('EPSG','10000','RGF93 to NGF-IGN69 height (1)','May be used for transformations from WGS 84 to NGF-IGN69 height. Accuracy at each 0.1 deg x 0.1 degree grid node is given within the geoid model file.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4965','EPSG','5720',0.5,'EPSG','8666','Geoid (height correction) model file','ggf97a.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra',0); INSERT INTO "usage" VALUES('EPSG','11001','grid_transformation','EPSG','10000','EPSG','1326','EPSG','1133'); INSERT INTO "grid_transformation" VALUES('EPSG','10001','ETRS89 to NGF-IGN69 height (1)','Parameter values taken from RGF93 to NGF-IGN69 height (1) (code 10000) assuming that RGF93 is equivalent to ETRS89 within the accuracy of the transformation. Accuracy at each 0.1 deg x 0.1 degree grid node is given within the geoid model file.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4937','EPSG','5720',0.5,'EPSG','8666','Geoid (height correction) model file','ggf97a.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra',0); diff --git a/data/sql/helmert_transformation.sql b/data/sql/helmert_transformation.sql index 80bb93c0..597af59e 100644 --- a/data/sql/helmert_transformation.sql +++ b/data/sql/helmert_transformation.sql @@ -564,11 +564,11 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','1505','Hartebeesthoek94 to W INSERT INTO "usage" VALUES('EPSG','8426','helmert_transformation','EPSG','1505','EPSG','4540','EPSG','1159'); INSERT INTO "helmert_transformation" VALUES('EPSG','1508','CH1903 to WGS 84 (1)','Implemented in Bundesamt für Landestopographie programme GRANIT.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4149','EPSG','4326',NULL,660.077,13.551,369.344,'EPSG','9001',2.484,1.783,2.939,'EPSG','9113',5.66,'EPSG','9201',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'BfL-CH 1',1); INSERT INTO "usage" VALUES('EPSG','8429','helmert_transformation','EPSG','1508','EPSG','1286','EPSG','1025'); -INSERT INTO "helmert_transformation" VALUES('EPSG','1509','CH1903+ to CHTRF95 (1)','This transformation is also given as CH1903+ to ETRS89 (1) (code 1647). CHTRF95 is a realisation of ETRS89. May be taken as approximate transformation CH1903+ to WGS 84 - see code 1676.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4150','EPSG','4151',0.1,674.374,15.056,405.346,'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,'BfL-CH',0); +INSERT INTO "helmert_transformation" VALUES('EPSG','1509','CH1903+ to CHTRS95 (1)','This transformation is also given as CH1903+ to ETRS89 (1) (code 1647). CHTRS95 is a national realization of ETRS89.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4150','EPSG','4151',0.1,674.374,15.056,405.346,'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,'BfL-CH',0); INSERT INTO "usage" VALUES('EPSG','8430','helmert_transformation','EPSG','1509','EPSG','1286','EPSG','1031'); INSERT INTO "helmert_transformation" VALUES('EPSG','1510','CH1903 to WGS 84 (2)','These parameters are strictly between CH1903+ and CHTRF95 but are used from CH1903 as an approximation which is within the accuracy of the distortions in the CH1903 network.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4149','EPSG','4326',NULL,674.374,15.056,405.346,'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,'BfL-CH 2',1); INSERT INTO "usage" VALUES('EPSG','8431','helmert_transformation','EPSG','1510','EPSG','1286','EPSG','1252'); -INSERT INTO "helmert_transformation" VALUES('EPSG','1511','CHTRF95 to WGS 84 (1)','For many purposes CHTRF95 can be considered to be coincident with WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4151','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-CH',0); +INSERT INTO "helmert_transformation" VALUES('EPSG','1511','CHTRS95 to WGS 84 (1)','For many purposes CHTRS95 can be considered to be coincident with WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4151','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-CH',0); INSERT INTO "usage" VALUES('EPSG','8432','helmert_transformation','EPSG','1511','EPSG','1286','EPSG','1159'); INSERT INTO "helmert_transformation" VALUES('EPSG','1512','Rassadiran to WGS 84 (1)','Derived in 1998 at Assaluyeh (Taheri refinery) by Geoid for Total. Used only for terminal site for South Pars phases 2 and 3.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4153','EPSG','4326',0.5,-133.63,-157.5,-158.62,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'TOT-Irn Taheri',0); INSERT INTO "usage" VALUES('EPSG','8433','helmert_transformation','EPSG','1512','EPSG','1338','EPSG','1136'); @@ -767,8 +767,8 @@ INSERT INTO "usage" VALUES('EPSG','8565','helmert_transformation','EPSG','1644', INSERT INTO "helmert_transformation" VALUES('EPSG','1645','Pulkovo 1942(58) to WGS 84 (1)','Parameter values from Pulkovo 1942(58) to ETRS89 (1) (code 1644). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','4179','EPSG','4326',1.0,33.4,-146.6,-76.3,'EPSG','9001',-0.359,-0.053,0.844,'EPSG','9104',-0.84,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-Pol',0); INSERT INTO "usage" VALUES('EPSG','8566','helmert_transformation','EPSG','1645','EPSG','3293','EPSG','1252'); INSERT INTO "helmert_transformation" VALUES('EPSG','1646','CH1903 to ETRS89 (1)','Parameter values from CH1903+ to ETRS89 (tfm code 1647). In EPSG db v5.2 to v8.9 given to 1dm; the difference in output of cms is considered by swisstopo to be insignificant given the tfm accuracy. Superseded by CH1903 to ETRS89 (2) (tfm code 7674).','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4149','EPSG','4258',1.5,674.374,15.056,405.346,'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,'BfL-Che',0); -INSERT INTO "usage" VALUES('EPSG','8567','helmert_transformation','EPSG','1646','EPSG','1286','EPSG','1252'); -INSERT INTO "helmert_transformation" VALUES('EPSG','1647','CH1903+ to ETRS89 (1)','This transformation is also given as CH1903+ to CHTRF95 (1) (code 1509). CHTRF95 is a local realisation of ETRS89.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4150','EPSG','4258',0.1,674.374,15.056,405.346,'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,'BfL-Che',0); +INSERT INTO "usage" VALUES('EPSG','8567','helmert_transformation','EPSG','1646','EPSG','1286','EPSG','1084'); +INSERT INTO "helmert_transformation" VALUES('EPSG','1647','CH1903+ to ETRS89 (1)','This transformation is also given as CH1903+ to CHTRS95 (1) (code 1509). CHTRS95 is a national realization of ETRS89. May be taken as approximate transformation CH1903+ to WGS 84 - see code 1676.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4150','EPSG','4258',0.1,674.374,15.056,405.346,'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,'BfL-Che',0); INSERT INTO "usage" VALUES('EPSG','8568','helmert_transformation','EPSG','1647','EPSG','1286','EPSG','1031'); INSERT INTO "helmert_transformation" VALUES('EPSG','1648','EST97 to ETRS89 (1)','EST97 is a national realization of ETRS89. May be taken as approximate transformation EST97 to WGS 84 - see code 1649.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4180','EPSG','4258',0.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NLB-Est',0); INSERT INTO "usage" VALUES('EPSG','8569','helmert_transformation','EPSG','1648','EPSG','1090','EPSG','1161'); @@ -824,7 +824,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','1674','Pulkovo 1942(83) to E INSERT INTO "usage" VALUES('EPSG','8595','helmert_transformation','EPSG','1674','EPSG','1343','EPSG','1042'); INSERT INTO "helmert_transformation" VALUES('EPSG','1675','Pulkovo 1942(83) to WGS 84 (1)','Parameter values from Pulkovo 1942(83) to ETRS89 (1) (code 1674) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4178','EPSG','4326',2.0,24.0,-123.0,-94.0,'EPSG','9001',-0.02,0.25,0.13,'EPSG','9104',1.1,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-Deu E',0); INSERT INTO "usage" VALUES('EPSG','8596','helmert_transformation','EPSG','1675','EPSG','1343','EPSG','1042'); -INSERT INTO "helmert_transformation" VALUES('EPSG','1676','CH1903+ to WGS 84 (1)','Parameter values are from CH1903+ to CHTRF95 (1) (code 1509) assuming that CHTRF95 is equivalent to WGS 84. That transformation is also given as CH1903+ to ETRS89 (1) (code 1647). CHTRF95 is a realisation of ETRS89.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4150','EPSG','4326',1.0,674.374,15.056,405.346,'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,'BfL-CH',0); +INSERT INTO "helmert_transformation" VALUES('EPSG','1676','CH1903+ to WGS 84 (1)','Parameter values are from CH1903+ to ETRS89 (1) (code 1647) assuming that ETRS89 is equivalent to WGS 84.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4150','EPSG','4326',1.0,674.374,15.056,405.346,'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,'BfL-CH',0); INSERT INTO "usage" VALUES('EPSG','8597','helmert_transformation','EPSG','1676','EPSG','1286','EPSG','1252'); INSERT INTO "helmert_transformation" VALUES('EPSG','1677','HD72 to WGS 84 (1)','Parameter values taken from HD72 to ETRS89 (1) (code 1273) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4237','EPSG','4326',NULL,56.0,75.77,15.31,'EPSG','9001',-0.37,-0.2,-0.21,'EPSG','9104',-1.01,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-Hun',1); INSERT INTO "usage" VALUES('EPSG','8598','helmert_transformation','EPSG','1677','EPSG','1119','EPSG','1041'); @@ -2196,7 +2196,7 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','8893','SRB_ETRS89 to ETRS89 INSERT INTO "usage" VALUES('EPSG','10833','helmert_transformation','EPSG','8893','EPSG','4543','EPSG','1161'); INSERT INTO "helmert_transformation" VALUES('EPSG','8894','SRB_ETRS89 to WGS 84 (1)','Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84. SRB_ETRS89 is a national realisation of ETRS89.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','8685','EPSG','4326',1.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IOGP-Srb',0); INSERT INTO "usage" VALUES('EPSG','10834','helmert_transformation','EPSG','8894','EPSG','4543','EPSG','1041'); -INSERT INTO "helmert_transformation" VALUES('EPSG','8895','CHTRF95 to ETRS89 (1)','CHTRF95 is a national realization of ETRS89. May be taken as approximate transformation CHTRF95 to WGS 84 - see code 1511.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4151','EPSG','4258',0.0,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IOGP-Che',0); +INSERT INTO "helmert_transformation" VALUES('EPSG','8895','CHTRS95 to ETRS89 (1)','CHTRS95 is a national realization of ETRS89. May be taken as approximate transformation CHTRS95 to WGS 84 - see code 1511.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4151','EPSG','4258',0.01,0.0,0.0,0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IOGP-Che',0); INSERT INTO "usage" VALUES('EPSG','10835','helmert_transformation','EPSG','8895','EPSG','1286','EPSG','1161'); INSERT INTO "helmert_transformation" VALUES('EPSG','8913','CR05 to CR-SIRGAS (1)','Derived at 16 stations. CR05 is static, CR-SIRGAS is dynamic: transformation is valid at epoch 2014.59 but accuracy will deteriorate due to tectonic motion. May be taken as an approximate transformation to ITRF08 / IGb08 / WGS 84 - see code 8914.','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','5364','EPSG','8906',0.5,-0.16959,0.35312,0.51846,'EPSG','9001',-0.03385,0.16325,-0.03446,'EPSG','9104',0.03693,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Cri 2014',1); INSERT INTO "usage" VALUES('EPSG','10836','helmert_transformation','EPSG','8913','EPSG','1074','EPSG','1035'); @@ -2234,9 +2234,9 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','8966','IGb08 to SIRGAS-CON S INSERT INTO "usage" VALUES('EPSG','10852','helmert_transformation','EPSG','8966','EPSG','4530','EPSG','1027'); INSERT INTO "helmert_transformation" VALUES('EPSG','8967','IGS14 to SIRGAS-CON SIR17P01 (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m.','EPSG','1065','Time-specific Position Vector transform (geocen)','EPSG','8227','EPSG','8945',0.01,0.0,0.0,0.0,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.0,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'SIR-SC Am',0); INSERT INTO "usage" VALUES('EPSG','10853','helmert_transformation','EPSG','8967','EPSG','4530','EPSG','1027'); -INSERT INTO "helmert_transformation" VALUES('EPSG','8968','CR05 to CR-SIRGAS (1)','Derived at 16 stations. CR05 is static, CR-SIRGAS is dynamic: transformation is valid at epoch 2014.59 but accuracy will deteriorate due to tectonic motion. May be taken as an approximate transformation to ITRF08 / IGb08 / WGS 84 - see code 8969.','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','5365','EPSG','8907',0.5,-0.16959,0.35312,0.51846,'EPSG','9001',-0.03385,0.16325,-0.03446,'EPSG','9104',0.03693,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Cri 2014',0); +INSERT INTO "helmert_transformation" VALUES('EPSG','8968','CR05 to CR-SIRGAS (1)','Derived at 16 stations. CR05 is static, CR-SIRGAS is dynamic: transformation is valid at epoch 2014.59 but accuracy will deteriorate due to tectonic motion. May be taken as an approximate transformation to ITRF08 / IGb08 / WGS 84 - see code 8969.','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','5365','EPSG','8907',0.5,-0.16959,0.35312,0.51846,'EPSG','9001',-0.03385,0.16325,-0.03446,'EPSG','9104',0.03693,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Cri 2014',1); INSERT INTO "usage" VALUES('EPSG','10854','helmert_transformation','EPSG','8968','EPSG','1074','EPSG','1035'); -INSERT INTO "helmert_transformation" VALUES('EPSG','8969','CR05 to WGS 84 (2)','Parameter vales are from CR05 to CR-SIRGAS (1) (code 8968) assuming that CR-SIRGAS (ITRF08 (IGb08)@2014.59) is equivalent to WGS 84 within the accuracy of the transformation.','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','5365','EPSG','4326',1.0,-0.16959,0.35312,0.51846,'EPSG','9001',-0.03385,0.16325,-0.03446,'EPSG','9104',0.03693,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Cri 2014',0); +INSERT INTO "helmert_transformation" VALUES('EPSG','8969','CR05 to WGS 84 (2)','Parameter vales are from CR05 to CR-SIRGAS (1) (code 8968) assuming that CR-SIRGAS (ITRF08 (IGb08)@2014.59) is equivalent to WGS 84 within the accuracy of the transformation.','EPSG','9606','Position Vector transformation (geog2D domain)','EPSG','5365','EPSG','4326',1.0,-0.16959,0.35312,0.51846,'EPSG','9001',-0.03385,0.16325,-0.03446,'EPSG','9104',0.03693,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Cri 2014',1); INSERT INTO "usage" VALUES('EPSG','10855','helmert_transformation','EPSG','8969','EPSG','1074','EPSG','1041'); INSERT INTO "helmert_transformation" VALUES('EPSG','8970','ITRF2014 to NAD83(2011) (1)','Concatenation of joint US-Canada transformation NAD83(CORS96)>ITRF96 (CT code 6864) with IGS value for ITRF96>ITRF97 and IERS values for ITRF97>ITRF2014 CTs. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m.','EPSG','1056','Time-dependent Coordinate Frame rotation (geocen)','EPSG','7789','EPSG','6317',0.0,1.0053,-1.9092,-0.5416,'EPSG','9001',26.7814,-0.4203,10.9321,'EPSG','1031',0.37,'EPSG','1028',0.0008,-0.0006,-0.0014,'EPSG','1042',0.0667,-0.7574,-0.0513,'EPSG','1032',-0.07,'EPSG','1030',2010.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IOGP-Usa CONUS-AK PRVI',0); INSERT INTO "usage" VALUES('EPSG','10856','helmert_transformation','EPSG','8970','EPSG','1511','EPSG','1136'); @@ -2428,6 +2428,10 @@ INSERT INTO "helmert_transformation" VALUES('EPSG','9703','ETRF2000-PL to ETRS89 INSERT INTO "usage" VALUES('EPSG','15011','helmert_transformation','EPSG','9703','EPSG','1192','EPSG','1161'); INSERT INTO "helmert_transformation" VALUES('EPSG','9743','PN68 to WGS 84 (1)','Determined at 1 satellite station. Accuracy +/- 25m in each axis. Unclear from information source whether the source CRS is PN68 or PN84 - see also CT code 15815. Given the accuracy, can be considered to apply to either.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','9403','EPSG','4326',44.0,-307.0,-92.0,127.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'DMA-Esp Canary',0); INSERT INTO "usage" VALUES('EPSG','15321','helmert_transformation','EPSG','9743','EPSG','3873','EPSG','1160'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9751','CR05 to CR-SIRGAS (1)','Derived at 16 stations. Transformation is valid at epoch 2014.59 but accuracy will deteriorate due to tectonic deformation. May be taken as an approximate transformation to ITRF08 / IGb08 / WGS 84 - see code 9752.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','5365','EPSG','8907',0.5,-0.16959,0.35312,0.51846,'EPSG','9001',-0.03385,0.16325,-0.03446,'EPSG','9104',0.03693,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Cri 2014',0); +INSERT INTO "usage" VALUES('EPSG','15596','helmert_transformation','EPSG','9751','EPSG','1074','EPSG','1035'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9752','CR05 to WGS 84 (2)','Parameter vales are from CR05 to CR-SIRGAS (1) (code 9751) assuming that CR-SIRGAS (ITRF08 (IGb08)@2014.59) is equivalent to WGS 84 within the accuracy of the transformation.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','5365','EPSG','4326',1.0,-0.16959,0.35312,0.51846,'EPSG','9001',-0.03385,0.16325,-0.03446,'EPSG','9104',0.03693,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Cri 2014',0); +INSERT INTO "usage" VALUES('EPSG','15832','helmert_transformation','EPSG','9752','EPSG','1074','EPSG','1041'); INSERT INTO "helmert_transformation" VALUES('EPSG','10085','Trinidad 1903 to WGS 84 (2)','Parameter values provided to EOG by Trinidad Ministry of Energy and Energy Industries. Used by EOG offshore Trinidad (including Pelican, Kiskadee and Ibis fields) since 1996.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4302','EPSG','4326',3.0,-61.0,285.2,471.6,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EOG-Tto Trin',0); INSERT INTO "usage" VALUES('EPSG','11086','helmert_transformation','EPSG','10085','EPSG','1339','EPSG','1136'); INSERT INTO "helmert_transformation" VALUES('EPSG','10086','JAD69 to WGS 72 (1)','Derived in 1977 through Transit observations at 2 stations by US DMA.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4242','EPSG','4322',15.0,48.0,208.0,382.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'SD-Jam',0); diff --git a/data/sql/metadata.sql b/data/sql/metadata.sql index e57b7aca..373c92b7 100644 --- a/data/sql/metadata.sql +++ b/data/sql/metadata.sql @@ -9,8 +9,8 @@ INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MAJOR', 1); INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MINOR', 1); -INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.024'); -INSERT INTO "metadata" VALUES('EPSG.DATE', '2021-05-27'); +INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.033'); +INSERT INTO "metadata" VALUES('EPSG.DATE', '2021-08-26'); -- The value of ${PROJ_VERSION} is substituted at build time by the actual -- value. diff --git a/data/sql/other_transformation.sql b/data/sql/other_transformation.sql index c9dfa173..396d3ec8 100644 --- a/data/sql/other_transformation.sql +++ b/data/sql/other_transformation.sql @@ -12,7 +12,7 @@ INSERT INTO "other_transformation" VALUES('EPSG','1262','Monte Mario (Rome) to M INSERT INTO "usage" VALUES('EPSG','8183','other_transformation','EPSG','1262','EPSG','3343','EPSG','1100'); INSERT INTO "other_transformation" VALUES('EPSG','1263','Padang (Jakarta) to Padang (Greenwich)','','EPSG','9601','Longitude rotation','EPSG','4808','EPSG','4280',NULL,'EPSG','8602','Longitude offset',106.482779,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-Idn Sumatra',1); INSERT INTO "usage" VALUES('EPSG','8184','other_transformation','EPSG','1263','EPSG','1355','EPSG','1100'); -INSERT INTO "other_transformation" VALUES('EPSG','1264','Belge 1950 (Brussels) to Belge 1950 (1)','','EPSG','9601','Longitude rotation','EPSG','4809','EPSG','4215',0.0,'EPSG','8602','Longitude offset',4.220471,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Bel',0); +INSERT INTO "other_transformation" VALUES('EPSG','1264','BD50 (Brussels) to BD50 (1)','','EPSG','9601','Longitude rotation','EPSG','4809','EPSG','4215',0.0,'EPSG','8602','Longitude offset',4.220471,'EPSG','9110',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'IGN-Bel',0); INSERT INTO "usage" VALUES('EPSG','8185','other_transformation','EPSG','1264','EPSG','1347','EPSG','1100'); INSERT INTO "other_transformation" VALUES('EPSG','1265','Tananarive (Paris) to Tananarive (1)','','EPSG','9601','Longitude rotation','EPSG','4810','EPSG','4297',0.0,'EPSG','8602','Longitude offset',2.5969213,'EPSG','9105',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-Mdg',0); INSERT INTO "usage" VALUES('EPSG','8186','other_transformation','EPSG','1265','EPSG','3273','EPSG','1100'); diff --git a/data/sql/projected_crs.sql b/data/sql/projected_crs.sql index df597bcf..b14d0677 100644 --- a/data/sql/projected_crs.sql +++ b/data/sql/projected_crs.sql @@ -7323,6 +7323,14 @@ INSERT INTO "projected_crs" VALUES('EPSG','9716','IGM95 / UTM zone 34N',NULL,'EP INSERT INTO "usage" VALUES('EPSG','15325','projected_crs','EPSG','9716','EPSG','4187','EPSG','1027'); INSERT INTO "projected_crs" VALUES('EPSG','9741','EOS21 Grid',NULL,'EPSG','4400','EPSG','9739','EPSG','9738',NULL,0); INSERT INTO "usage" VALUES('EPSG','15317','projected_crs','EPSG','9741','EPSG','4620','EPSG','1141'); +INSERT INTO "projected_crs" VALUES('EPSG','9748','NAD83(2011) / Alabama East (ftUS)',NULL,'EPSG','4497','EPSG','6318','EPSG','9746',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15376','projected_crs','EPSG','9748','EPSG','2154','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','9749','NAD83(2011) / Alabama West (ftUS)',NULL,'EPSG','4497','EPSG','6318','EPSG','9747',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15375','projected_crs','EPSG','9749','EPSG','2155','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','9761','ECML14_NB Grid',NULL,'EPSG','4400','EPSG','9758','EPSG','9760',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16498','projected_crs','EPSG','9761','EPSG','4621','EPSG','1141'); +INSERT INTO "projected_crs" VALUES('EPSG','9766','EWR2 Grid',NULL,'EPSG','4400','EPSG','9763','EPSG','9765',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16509','projected_crs','EPSG','9766','EPSG','4622','EPSG','1141'); INSERT INTO "projected_crs" VALUES('EPSG','20004','Pulkovo 1995 / Gauss-Kruger zone 4',NULL,'EPSG','4530','EPSG','4200','EPSG','16204',NULL,0); INSERT INTO "usage" VALUES('EPSG','6177','projected_crs','EPSG','20004','EPSG','1763','EPSG','1211'); INSERT INTO "projected_crs" VALUES('EPSG','20005','Pulkovo 1995 / Gauss-Kruger zone 5',NULL,'EPSG','4530','EPSG','4200','EPSG','16205',NULL,0); @@ -7517,12 +7525,128 @@ INSERT INTO "projected_crs" VALUES('EPSG','20823','Aratu / UTM zone 23S',NULL,'E INSERT INTO "usage" VALUES('EPSG','6272','projected_crs','EPSG','20823','EPSG','1573','EPSG','1136'); INSERT INTO "projected_crs" VALUES('EPSG','20824','Aratu / UTM zone 24S',NULL,'EPSG','4400','EPSG','4208','EPSG','16124',NULL,0); INSERT INTO "usage" VALUES('EPSG','6273','projected_crs','EPSG','20824','EPSG','1574','EPSG','1136'); +INSERT INTO "projected_crs" VALUES('EPSG','20904','GSK-2011 / Gauss-Kruger zone 4',NULL,'EPSG','4530','EPSG','7683','EPSG','16204',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15388','projected_crs','EPSG','20904','EPSG','1763','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20905','GSK-2011 / Gauss-Kruger zone 5',NULL,'EPSG','4530','EPSG','7683','EPSG','16205',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15473','projected_crs','EPSG','20905','EPSG','1764','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20906','GSK-2011 / Gauss-Kruger zone 6',NULL,'EPSG','4530','EPSG','7683','EPSG','16206',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15447','projected_crs','EPSG','20906','EPSG','1765','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20907','GSK-2011 / Gauss-Kruger zone 7',NULL,'EPSG','4530','EPSG','7683','EPSG','16207',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15448','projected_crs','EPSG','20907','EPSG','1766','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20908','GSK-2011 / Gauss-Kruger zone 8',NULL,'EPSG','4530','EPSG','7683','EPSG','16208',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15474','projected_crs','EPSG','20908','EPSG','1767','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20909','GSK-2011 / Gauss-Kruger zone 9',NULL,'EPSG','4530','EPSG','7683','EPSG','16209',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15475','projected_crs','EPSG','20909','EPSG','1768','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20910','GSK-2011 / Gauss-Kruger zone 10',NULL,'EPSG','4530','EPSG','7683','EPSG','16210',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15476','projected_crs','EPSG','20910','EPSG','1769','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20911','GSK-2011 / Gauss-Kruger zone 11',NULL,'EPSG','4530','EPSG','7683','EPSG','16211',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15477','projected_crs','EPSG','20911','EPSG','1770','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20912','GSK-2011 / Gauss-Kruger zone 12',NULL,'EPSG','4530','EPSG','7683','EPSG','16212',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15478','projected_crs','EPSG','20912','EPSG','1771','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20913','GSK-2011 / Gauss-Kruger zone 13',NULL,'EPSG','4530','EPSG','7683','EPSG','16213',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15479','projected_crs','EPSG','20913','EPSG','1772','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20914','GSK-2011 / Gauss-Kruger zone 14',NULL,'EPSG','4530','EPSG','7683','EPSG','16214',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15480','projected_crs','EPSG','20914','EPSG','1773','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20915','GSK-2011 / Gauss-Kruger zone 15',NULL,'EPSG','4530','EPSG','7683','EPSG','16215',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15481','projected_crs','EPSG','20915','EPSG','1774','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20916','GSK-2011 / Gauss-Kruger zone 16',NULL,'EPSG','4530','EPSG','7683','EPSG','16216',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15482','projected_crs','EPSG','20916','EPSG','1775','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20917','GSK-2011 / Gauss-Kruger zone 17',NULL,'EPSG','4530','EPSG','7683','EPSG','16217',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15483','projected_crs','EPSG','20917','EPSG','1776','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20918','GSK-2011 / Gauss-Kruger zone 18',NULL,'EPSG','4530','EPSG','7683','EPSG','16218',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15567','projected_crs','EPSG','20918','EPSG','1777','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20919','GSK-2011 / Gauss-Kruger zone 19',NULL,'EPSG','4530','EPSG','7683','EPSG','16219',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15485','projected_crs','EPSG','20919','EPSG','1778','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20920','GSK-2011 / Gauss-Kruger zone 20',NULL,'EPSG','4530','EPSG','7683','EPSG','16220',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15487','projected_crs','EPSG','20920','EPSG','1779','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20921','GSK-2011 / Gauss-Kruger zone 21',NULL,'EPSG','4530','EPSG','7683','EPSG','16221',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15488','projected_crs','EPSG','20921','EPSG','1780','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20922','GSK-2011 / Gauss-Kruger zone 22',NULL,'EPSG','4530','EPSG','7683','EPSG','16222',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15489','projected_crs','EPSG','20922','EPSG','1781','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20923','GSK-2011 / Gauss-Kruger zone 23',NULL,'EPSG','4530','EPSG','7683','EPSG','16223',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15490','projected_crs','EPSG','20923','EPSG','1782','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20924','GSK-2011 / Gauss-Kruger zone 24',NULL,'EPSG','4530','EPSG','7683','EPSG','16224',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15491','projected_crs','EPSG','20924','EPSG','1783','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20925','GSK-2011 / Gauss-Kruger zone 25',NULL,'EPSG','4530','EPSG','7683','EPSG','16225',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15492','projected_crs','EPSG','20925','EPSG','1784','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20926','GSK-2011 / Gauss-Kruger zone 26',NULL,'EPSG','4530','EPSG','7683','EPSG','16226',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15493','projected_crs','EPSG','20926','EPSG','1785','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20927','GSK-2011 / Gauss-Kruger zone 27',NULL,'EPSG','4530','EPSG','7683','EPSG','16227',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15494','projected_crs','EPSG','20927','EPSG','1786','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20928','GSK-2011 / Gauss-Kruger zone 28',NULL,'EPSG','4530','EPSG','7683','EPSG','16228',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15499','projected_crs','EPSG','20928','EPSG','1787','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20929','GSK-2011 / Gauss-Kruger zone 29',NULL,'EPSG','4530','EPSG','7683','EPSG','16229',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15495','projected_crs','EPSG','20929','EPSG','1788','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20930','GSK-2011 / Gauss-Kruger zone 30',NULL,'EPSG','4530','EPSG','7683','EPSG','16230',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15496','projected_crs','EPSG','20930','EPSG','1789','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20931','GSK-2011 / Gauss-Kruger zone 31',NULL,'EPSG','4530','EPSG','7683','EPSG','16231',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15497','projected_crs','EPSG','20931','EPSG','1790','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','20932','GSK-2011 / Gauss-Kruger zone 32',NULL,'EPSG','4530','EPSG','7683','EPSG','16232',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15498','projected_crs','EPSG','20932','EPSG','1791','EPSG','1211'); INSERT INTO "projected_crs" VALUES('EPSG','20934','Arc 1950 / UTM zone 34S',NULL,'EPSG','4400','EPSG','4209','EPSG','16134',NULL,0); INSERT INTO "usage" VALUES('EPSG','6274','projected_crs','EPSG','20934','EPSG','1575','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','20935','Arc 1950 / UTM zone 35S',NULL,'EPSG','4400','EPSG','4209','EPSG','16135',NULL,0); INSERT INTO "usage" VALUES('EPSG','6275','projected_crs','EPSG','20935','EPSG','1576','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','20936','Arc 1950 / UTM zone 36S',NULL,'EPSG','4400','EPSG','4209','EPSG','16136',NULL,0); INSERT INTO "usage" VALUES('EPSG','6276','projected_crs','EPSG','20936','EPSG','1577','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','21004','GSK-2011 / Gauss-Kruger CM 21E',NULL,'EPSG','4530','EPSG','7683','EPSG','16304',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15563','projected_crs','EPSG','21004','EPSG','1763','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21005','GSK-2011 / Gauss-Kruger CM 27E',NULL,'EPSG','4530','EPSG','7683','EPSG','16305',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15535','projected_crs','EPSG','21005','EPSG','1764','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21006','GSK-2011 / Gauss-Kruger CM 33E',NULL,'EPSG','4530','EPSG','7683','EPSG','16306',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15536','projected_crs','EPSG','21006','EPSG','1765','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21007','GSK-2011 / Gauss-Kruger CM 39E',NULL,'EPSG','4530','EPSG','7683','EPSG','16307',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15537','projected_crs','EPSG','21007','EPSG','1766','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21008','GSK-2011 / Gauss-Kruger CM 45E',NULL,'EPSG','4530','EPSG','7683','EPSG','16308',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15538','projected_crs','EPSG','21008','EPSG','1767','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21009','GSK-2011 / Gauss-Kruger CM 51E',NULL,'EPSG','4530','EPSG','7683','EPSG','16309',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15564','projected_crs','EPSG','21009','EPSG','1768','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21010','GSK-2011 / Gauss-Kruger CM 57E',NULL,'EPSG','4530','EPSG','7683','EPSG','16310',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15540','projected_crs','EPSG','21010','EPSG','1769','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21011','GSK-2011 / Gauss-Kruger CM 63E',NULL,'EPSG','4530','EPSG','7683','EPSG','16311',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15541','projected_crs','EPSG','21011','EPSG','1770','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21012','GSK-2011 / Gauss-Kruger CM 69E',NULL,'EPSG','4530','EPSG','7683','EPSG','16312',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15542','projected_crs','EPSG','21012','EPSG','1771','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21013','GSK-2011 / Gauss-Kruger CM 75E',NULL,'EPSG','4530','EPSG','7683','EPSG','16313',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15543','projected_crs','EPSG','21013','EPSG','1772','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21014','GSK-2011 / Gauss-Kruger CM 81E',NULL,'EPSG','4530','EPSG','7683','EPSG','16314',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15544','projected_crs','EPSG','21014','EPSG','1773','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21015','GSK-2011 / Gauss-Kruger CM 87E',NULL,'EPSG','4530','EPSG','7683','EPSG','16315',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15545','projected_crs','EPSG','21015','EPSG','1774','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21016','GSK-2011 / Gauss-Kruger CM 93E',NULL,'EPSG','4530','EPSG','7683','EPSG','16316',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15546','projected_crs','EPSG','21016','EPSG','1775','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21017','GSK-2011 / Gauss-Kruger CM 99E',NULL,'EPSG','4530','EPSG','7683','EPSG','16317',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15547','projected_crs','EPSG','21017','EPSG','1776','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21018','GSK-2011 / Gauss-Kruger CM 105E',NULL,'EPSG','4530','EPSG','7683','EPSG','16318',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15548','projected_crs','EPSG','21018','EPSG','1777','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21019','GSK-2011 / Gauss-Kruger CM 111E',NULL,'EPSG','4530','EPSG','7683','EPSG','16319',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15549','projected_crs','EPSG','21019','EPSG','1778','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21020','GSK-2011 / Gauss-Kruger CM 117E',NULL,'EPSG','4530','EPSG','7683','EPSG','16320',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15550','projected_crs','EPSG','21020','EPSG','1779','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21021','GSK-2011 / Gauss-Kruger CM 123E',NULL,'EPSG','4530','EPSG','7683','EPSG','16321',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15551','projected_crs','EPSG','21021','EPSG','1780','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21022','GSK-2011 / Gauss-Kruger CM 129E',NULL,'EPSG','4530','EPSG','7683','EPSG','16322',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15552','projected_crs','EPSG','21022','EPSG','1781','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21023','GSK-2011 / Gauss-Kruger CM 135E',NULL,'EPSG','4530','EPSG','7683','EPSG','16323',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15553','projected_crs','EPSG','21023','EPSG','1782','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21024','GSK-2011 / Gauss-Kruger CM 141E',NULL,'EPSG','4530','EPSG','7683','EPSG','16324',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15554','projected_crs','EPSG','21024','EPSG','1783','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21025','GSK-2011 / Gauss-Kruger CM 147E',NULL,'EPSG','4530','EPSG','7683','EPSG','16325',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15555','projected_crs','EPSG','21025','EPSG','1784','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21026','GSK-2011 / Gauss-Kruger CM 153E',NULL,'EPSG','4530','EPSG','7683','EPSG','16326',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15556','projected_crs','EPSG','21026','EPSG','1785','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21027','GSK-2011 / Gauss-Kruger CM 159E',NULL,'EPSG','4530','EPSG','7683','EPSG','16327',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15557','projected_crs','EPSG','21027','EPSG','1786','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21028','GSK-2011 / Gauss-Kruger CM 165E',NULL,'EPSG','4530','EPSG','7683','EPSG','16328',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15558','projected_crs','EPSG','21028','EPSG','1787','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21029','GSK-2011 / Gauss-Kruger CM 171E',NULL,'EPSG','4530','EPSG','7683','EPSG','16329',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15559','projected_crs','EPSG','21029','EPSG','1788','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21030','GSK-2011 / Gauss-Kruger CM 177E',NULL,'EPSG','4530','EPSG','7683','EPSG','16330',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15560','projected_crs','EPSG','21030','EPSG','1789','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21031','GSK-2011 / Gauss-Kruger CM 177W',NULL,'EPSG','4530','EPSG','7683','EPSG','16331',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15561','projected_crs','EPSG','21031','EPSG','1790','EPSG','1211'); +INSERT INTO "projected_crs" VALUES('EPSG','21032','GSK-2011 / Gauss-Kruger CM 171W',NULL,'EPSG','4530','EPSG','7683','EPSG','16332',NULL,0); +INSERT INTO "usage" VALUES('EPSG','15562','projected_crs','EPSG','21032','EPSG','1791','EPSG','1211'); INSERT INTO "projected_crs" VALUES('EPSG','21035','Arc 1960 / UTM zone 35S',NULL,'EPSG','4400','EPSG','4210','EPSG','16135',NULL,0); INSERT INTO "usage" VALUES('EPSG','6277','projected_crs','EPSG','21035','EPSG','1579','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','21036','Arc 1960 / UTM zone 36S',NULL,'EPSG','4400','EPSG','4210','EPSG','16136',NULL,0); @@ -7543,10 +7667,242 @@ INSERT INTO "projected_crs" VALUES('EPSG','21149','Batavia / UTM zone 49S',NULL, INSERT INTO "usage" VALUES('EPSG','6285','projected_crs','EPSG','21149','EPSG','1586','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','21150','Batavia / UTM zone 50S',NULL,'EPSG','4400','EPSG','4211','EPSG','16150',NULL,0); INSERT INTO "usage" VALUES('EPSG','6286','projected_crs','EPSG','21150','EPSG','1585','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','21207','GSK-2011 / GSK 3GK zone 7',NULL,'EPSG','4530','EPSG','7683','EPSG','16907',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16450','projected_crs','EPSG','21207','EPSG','2747','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21208','GSK-2011 / GSK 3GK zone 8',NULL,'EPSG','4530','EPSG','7683','EPSG','16908',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16452','projected_crs','EPSG','21208','EPSG','2748','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21209','GSK-2011 / GSK 3GK zone 9',NULL,'EPSG','4530','EPSG','7683','EPSG','16909',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16453','projected_crs','EPSG','21209','EPSG','2749','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21210','GSK-2011 / GSK 3GK zone 10',NULL,'EPSG','4530','EPSG','7683','EPSG','16910',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16454','projected_crs','EPSG','21210','EPSG','2750','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21211','GSK-2011 / GSK 3GK zone 11',NULL,'EPSG','4530','EPSG','7683','EPSG','16911',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16455','projected_crs','EPSG','21211','EPSG','2751','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21212','GSK-2011 / GSK 3GK zone 12',NULL,'EPSG','4530','EPSG','7683','EPSG','16912',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16456','projected_crs','EPSG','21212','EPSG','2752','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21213','GSK-2011 / GSK 3GK zone 13',NULL,'EPSG','4530','EPSG','7683','EPSG','16913',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16457','projected_crs','EPSG','21213','EPSG','2753','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21214','GSK-2011 / GSK 3GK zone 14',NULL,'EPSG','4530','EPSG','7683','EPSG','16914',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16458','projected_crs','EPSG','21214','EPSG','2754','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21215','GSK-2011 / GSK 3GK zone 15',NULL,'EPSG','4530','EPSG','7683','EPSG','16915',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16459','projected_crs','EPSG','21215','EPSG','2755','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21216','GSK-2011 / GSK 3GK zone 16',NULL,'EPSG','4530','EPSG','7683','EPSG','16916',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16460','projected_crs','EPSG','21216','EPSG','2756','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21217','GSK-2011 / GSK 3GK zone 17',NULL,'EPSG','4530','EPSG','7683','EPSG','16917',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16461','projected_crs','EPSG','21217','EPSG','2757','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21218','GSK-2011 / GSK 3GK zone 18',NULL,'EPSG','4530','EPSG','7683','EPSG','16918',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16462','projected_crs','EPSG','21218','EPSG','2758','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21219','GSK-2011 / GSK 3GK zone 19',NULL,'EPSG','4530','EPSG','7683','EPSG','16919',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16463','projected_crs','EPSG','21219','EPSG','2759','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21220','GSK-2011 / GSK 3GK zone 20',NULL,'EPSG','4530','EPSG','7683','EPSG','16920',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16464','projected_crs','EPSG','21220','EPSG','2760','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21221','GSK-2011 / GSK 3GK zone 21',NULL,'EPSG','4530','EPSG','7683','EPSG','16921',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16465','projected_crs','EPSG','21221','EPSG','2761','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21222','GSK-2011 / GSK 3GK zone 22',NULL,'EPSG','4530','EPSG','7683','EPSG','16922',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16420','projected_crs','EPSG','21222','EPSG','2762','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21223','GSK-2011 / GSK 3GK zone 23',NULL,'EPSG','4530','EPSG','7683','EPSG','16923',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16421','projected_crs','EPSG','21223','EPSG','2763','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21224','GSK-2011 / GSK 3GK zone 24',NULL,'EPSG','4530','EPSG','7683','EPSG','16924',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16422','projected_crs','EPSG','21224','EPSG','2764','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21225','GSK-2011 / GSK 3GK zone 25',NULL,'EPSG','4530','EPSG','7683','EPSG','16925',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16423','projected_crs','EPSG','21225','EPSG','2765','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21226','GSK-2011 / GSK 3GK zone 26',NULL,'EPSG','4530','EPSG','7683','EPSG','16926',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16424','projected_crs','EPSG','21226','EPSG','2766','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21227','GSK-2011 / GSK 3GK zone 27',NULL,'EPSG','4530','EPSG','7683','EPSG','16927',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16425','projected_crs','EPSG','21227','EPSG','2767','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21228','GSK-2011 / GSK 3GK zone 28',NULL,'EPSG','4530','EPSG','7683','EPSG','16928',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16426','projected_crs','EPSG','21228','EPSG','2768','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21229','GSK-2011 / GSK 3GK zone 29',NULL,'EPSG','4530','EPSG','7683','EPSG','16929',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16501','projected_crs','EPSG','21229','EPSG','2769','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21230','GSK-2011 / GSK 3GK zone 30',NULL,'EPSG','4530','EPSG','7683','EPSG','16930',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16502','projected_crs','EPSG','21230','EPSG','2676','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21231','GSK-2011 / GSK 3GK zone 31',NULL,'EPSG','4530','EPSG','7683','EPSG','16931',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16442','projected_crs','EPSG','21231','EPSG','2677','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21232','GSK-2011 / GSK 3GK zone 32',NULL,'EPSG','4530','EPSG','7683','EPSG','16932',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16443','projected_crs','EPSG','21232','EPSG','2678','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21233','GSK-2011 / GSK 3GK zone 33',NULL,'EPSG','4530','EPSG','7683','EPSG','16933',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16444','projected_crs','EPSG','21233','EPSG','2679','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21234','GSK-2011 / GSK 3GK zone 34',NULL,'EPSG','4530','EPSG','7683','EPSG','16934',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16445','projected_crs','EPSG','21234','EPSG','2680','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21235','GSK-2011 / GSK 3GK zone 35',NULL,'EPSG','4530','EPSG','7683','EPSG','16935',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16446','projected_crs','EPSG','21235','EPSG','2681','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21236','GSK-2011 / GSK 3GK zone 36',NULL,'EPSG','4530','EPSG','7683','EPSG','16936',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16447','projected_crs','EPSG','21236','EPSG','2682','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21237','GSK-2011 / GSK 3GK zone 37',NULL,'EPSG','4530','EPSG','7683','EPSG','16937',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16392','projected_crs','EPSG','21237','EPSG','2683','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21238','GSK-2011 / GSK 3GK zone 38',NULL,'EPSG','4530','EPSG','7683','EPSG','16938',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16393','projected_crs','EPSG','21238','EPSG','2684','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21239','GSK-2011 / GSK 3GK zone 39',NULL,'EPSG','4530','EPSG','7683','EPSG','16939',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16394','projected_crs','EPSG','21239','EPSG','2685','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21240','GSK-2011 / GSK 3GK zone 40',NULL,'EPSG','4530','EPSG','7683','EPSG','16940',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16395','projected_crs','EPSG','21240','EPSG','2686','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21241','GSK-2011 / GSK 3GK zone 41',NULL,'EPSG','4530','EPSG','7683','EPSG','16941',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16396','projected_crs','EPSG','21241','EPSG','2687','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21242','GSK-2011 / GSK 3GK zone 42',NULL,'EPSG','4530','EPSG','7683','EPSG','16942',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16397','projected_crs','EPSG','21242','EPSG','2688','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21243','GSK-2011 / GSK 3GK zone 43',NULL,'EPSG','4530','EPSG','7683','EPSG','16943',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16398','projected_crs','EPSG','21243','EPSG','2689','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21244','GSK-2011 / GSK 3GK zone 44',NULL,'EPSG','4530','EPSG','7683','EPSG','16944',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16399','projected_crs','EPSG','21244','EPSG','2690','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21245','GSK-2011 / GSK 3GK zone 45',NULL,'EPSG','4530','EPSG','7683','EPSG','16945',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16400','projected_crs','EPSG','21245','EPSG','2691','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21246','GSK-2011 / GSK 3GK zone 46',NULL,'EPSG','4530','EPSG','7683','EPSG','16946',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16401','projected_crs','EPSG','21246','EPSG','2692','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21247','GSK-2011 / GSK 3GK zone 47',NULL,'EPSG','4530','EPSG','7683','EPSG','16947',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16402','projected_crs','EPSG','21247','EPSG','2693','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21248','GSK-2011 / GSK 3GK zone 48',NULL,'EPSG','4530','EPSG','7683','EPSG','16948',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16403','projected_crs','EPSG','21248','EPSG','2694','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21249','GSK-2011 / GSK 3GK zone 49',NULL,'EPSG','4530','EPSG','7683','EPSG','16949',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16404','projected_crs','EPSG','21249','EPSG','2695','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21250','GSK-2011 / GSK 3GK zone 50',NULL,'EPSG','4530','EPSG','7683','EPSG','16950',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16405','projected_crs','EPSG','21250','EPSG','2696','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21251','GSK-2011 / GSK 3GK zone 51',NULL,'EPSG','4530','EPSG','7683','EPSG','16951',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16365','projected_crs','EPSG','21251','EPSG','2697','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21252','GSK-2011 / GSK 3GK zone 52',NULL,'EPSG','4530','EPSG','7683','EPSG','16952',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16366','projected_crs','EPSG','21252','EPSG','2698','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21253','GSK-2011 / GSK 3GK zone 53',NULL,'EPSG','4530','EPSG','7683','EPSG','16953',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16367','projected_crs','EPSG','21253','EPSG','2699','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21254','GSK-2011 / GSK 3GK zone 54',NULL,'EPSG','4530','EPSG','7683','EPSG','16954',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16368','projected_crs','EPSG','21254','EPSG','2700','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21255','GSK-2011 / GSK 3GK zone 55',NULL,'EPSG','4530','EPSG','7683','EPSG','16955',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16369','projected_crs','EPSG','21255','EPSG','2701','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21256','GSK-2011 / GSK 3GK zone 56',NULL,'EPSG','4530','EPSG','7683','EPSG','16956',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16370','projected_crs','EPSG','21256','EPSG','2702','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21257','GSK-2011 / GSK 3GK zone 57',NULL,'EPSG','4530','EPSG','7683','EPSG','16957',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16371','projected_crs','EPSG','21257','EPSG','2703','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21258','GSK-2011 / GSK 3GK zone 58',NULL,'EPSG','4530','EPSG','7683','EPSG','16958',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16372','projected_crs','EPSG','21258','EPSG','2704','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21259','GSK-2011 / GSK 3GK zone 59',NULL,'EPSG','4530','EPSG','7683','EPSG','16959',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16373','projected_crs','EPSG','21259','EPSG','2705','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21260','GSK-2011 / GSK 3GK zone 60',NULL,'EPSG','4530','EPSG','7683','EPSG','16960',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16375','projected_crs','EPSG','21260','EPSG','2706','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21261','GSK-2011 / GSK 3GK zone 61',NULL,'EPSG','4530','EPSG','7683','EPSG','16961',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16376','projected_crs','EPSG','21261','EPSG','2707','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21262','GSK-2011 / GSK 3GK zone 62',NULL,'EPSG','4530','EPSG','7683','EPSG','16962',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16377','projected_crs','EPSG','21262','EPSG','2708','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21263','GSK-2011 / GSK 3GK zone 63',NULL,'EPSG','4530','EPSG','7683','EPSG','16963',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16378','projected_crs','EPSG','21263','EPSG','2709','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21264','GSK-2011 / GSK 3GK zone 64',NULL,'EPSG','4530','EPSG','7683','EPSG','16964',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16379','projected_crs','EPSG','21264','EPSG','2710','EPSG','1055'); INSERT INTO "projected_crs" VALUES('EPSG','21291','Barbados 1938 / British West Indies Grid',NULL,'EPSG','4400','EPSG','4212','EPSG','19942',NULL,0); INSERT INTO "usage" VALUES('EPSG','6287','projected_crs','EPSG','21291','EPSG','3218','EPSG','1092'); INSERT INTO "projected_crs" VALUES('EPSG','21292','Barbados 1938 / Barbados National Grid',NULL,'EPSG','4400','EPSG','4212','EPSG','19943',NULL,0); INSERT INTO "usage" VALUES('EPSG','6288','projected_crs','EPSG','21292','EPSG','3218','EPSG','1092'); +INSERT INTO "projected_crs" VALUES('EPSG','21307','GSK-2011 / GSK 3GK CM 21E',NULL,'EPSG','4530','EPSG','7683','EPSG','17107',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16451','projected_crs','EPSG','21307','EPSG','2747','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21308','GSK-2011 / GSK 3GK CM 24E',NULL,'EPSG','4530','EPSG','7683','EPSG','17108',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16466','projected_crs','EPSG','21308','EPSG','2748','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21309','GSK-2011 / GSK 3GK CM 27E',NULL,'EPSG','4530','EPSG','7683','EPSG','17109',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16467','projected_crs','EPSG','21309','EPSG','2749','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21310','GSK-2011 / GSK 3GK CM 30E',NULL,'EPSG','4530','EPSG','7683','EPSG','17110',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16468','projected_crs','EPSG','21310','EPSG','2750','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21311','GSK-2011 / GSK 3GK CM 33E',NULL,'EPSG','4530','EPSG','7683','EPSG','17111',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16469','projected_crs','EPSG','21311','EPSG','2751','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21312','GSK-2011 / GSK 3GK CM 36E',NULL,'EPSG','4530','EPSG','7683','EPSG','17112',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16470','projected_crs','EPSG','21312','EPSG','2752','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21313','GSK-2011 / GSK 3GK CM 39E',NULL,'EPSG','4530','EPSG','7683','EPSG','17113',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16479','projected_crs','EPSG','21313','EPSG','2753','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21314','GSK-2011 / GSK 3GK CM 42E',NULL,'EPSG','4530','EPSG','7683','EPSG','17114',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16471','projected_crs','EPSG','21314','EPSG','2754','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21315','GSK-2011 / GSK 3GK CM 45E',NULL,'EPSG','4530','EPSG','7683','EPSG','17115',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16472','projected_crs','EPSG','21315','EPSG','2755','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21316','GSK-2011 / GSK 3GK CM 48E',NULL,'EPSG','4530','EPSG','7683','EPSG','17116',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16473','projected_crs','EPSG','21316','EPSG','2756','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21317','GSK-2011 / GSK 3GK CM 51E',NULL,'EPSG','4530','EPSG','7683','EPSG','17117',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16474','projected_crs','EPSG','21317','EPSG','2757','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21318','GSK-2011 / GSK 3GK CM 54E',NULL,'EPSG','4530','EPSG','7683','EPSG','17118',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16475','projected_crs','EPSG','21318','EPSG','2758','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21319','GSK-2011 / GSK 3GK CM 57E',NULL,'EPSG','4530','EPSG','7683','EPSG','17119',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16476','projected_crs','EPSG','21319','EPSG','2759','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21320','GSK-2011 / GSK 3GK CM 60E',NULL,'EPSG','4530','EPSG','7683','EPSG','17120',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16477','projected_crs','EPSG','21320','EPSG','2760','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21321','GSK-2011 / GSK 3GK CM 63E',NULL,'EPSG','4530','EPSG','7683','EPSG','17121',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16478','projected_crs','EPSG','21321','EPSG','2761','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21322','GSK-2011 / GSK 3GK CM 66E',NULL,'EPSG','4530','EPSG','7683','EPSG','17122',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16448','projected_crs','EPSG','21322','EPSG','2762','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21323','GSK-2011 / GSK 3GK CM 69E',NULL,'EPSG','4530','EPSG','7683','EPSG','17123',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16430','projected_crs','EPSG','21323','EPSG','2763','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21324','GSK-2011 / GSK 3GK CM 72E',NULL,'EPSG','4530','EPSG','7683','EPSG','17124',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16449','projected_crs','EPSG','21324','EPSG','2764','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21325','GSK-2011 / GSK 3GK CM 75E',NULL,'EPSG','4530','EPSG','7683','EPSG','17125',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16431','projected_crs','EPSG','21325','EPSG','2765','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21326','GSK-2011 / GSK 3GK CM 78E',NULL,'EPSG','4530','EPSG','7683','EPSG','17126',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16432','projected_crs','EPSG','21326','EPSG','2766','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21327','GSK-2011 / GSK 3GK CM 81E',NULL,'EPSG','4530','EPSG','7683','EPSG','17127',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16433','projected_crs','EPSG','21327','EPSG','2767','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21328','GSK-2011 / GSK 3GK CM 84E',NULL,'EPSG','4530','EPSG','7683','EPSG','17128',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16434','projected_crs','EPSG','21328','EPSG','2768','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21329','GSK-2011 / GSK 3GK CM 87E',NULL,'EPSG','4530','EPSG','7683','EPSG','17129',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16435','projected_crs','EPSG','21329','EPSG','2769','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21330','GSK-2011 / GSK 3GK CM 90E',NULL,'EPSG','4530','EPSG','7683','EPSG','17130',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16436','projected_crs','EPSG','21330','EPSG','2676','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21331','GSK-2011 / GSK 3GK CM 93E',NULL,'EPSG','4530','EPSG','7683','EPSG','17131',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16437','projected_crs','EPSG','21331','EPSG','2677','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21332','GSK-2011 / GSK 3GK CM 96E',NULL,'EPSG','4530','EPSG','7683','EPSG','17132',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16429','projected_crs','EPSG','21332','EPSG','2678','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21333','GSK-2011 / GSK 3GK CM 99E',NULL,'EPSG','4530','EPSG','7683','EPSG','17133',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16438','projected_crs','EPSG','21333','EPSG','2679','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21334','GSK-2011 / GSK 3GK CM 102E',NULL,'EPSG','4530','EPSG','7683','EPSG','17134',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16439','projected_crs','EPSG','21334','EPSG','2680','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21335','GSK-2011 / GSK 3GK CM 105E',NULL,'EPSG','4530','EPSG','7683','EPSG','17135',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16440','projected_crs','EPSG','21335','EPSG','2681','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21336','GSK-2011 / GSK 3GK CM 108E',NULL,'EPSG','4530','EPSG','7683','EPSG','17136',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16441','projected_crs','EPSG','21336','EPSG','2682','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21337','GSK-2011 / GSK 3GK CM 111E',NULL,'EPSG','4530','EPSG','7683','EPSG','17137',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16406','projected_crs','EPSG','21337','EPSG','2683','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21338','GSK-2011 / GSK 3GK CM 114E',NULL,'EPSG','4530','EPSG','7683','EPSG','17138',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16407','projected_crs','EPSG','21338','EPSG','2684','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21339','GSK-2011 / GSK 3GK CM 117E',NULL,'EPSG','4530','EPSG','7683','EPSG','17139',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16408','projected_crs','EPSG','21339','EPSG','2685','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21340','GSK-2011 / GSK 3GK CM 120E',NULL,'EPSG','4530','EPSG','7683','EPSG','17140',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16409','projected_crs','EPSG','21340','EPSG','2686','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21341','GSK-2011 / GSK 3GK CM 123E',NULL,'EPSG','4530','EPSG','7683','EPSG','17141',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16481','projected_crs','EPSG','21341','EPSG','2687','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21342','GSK-2011 / GSK 3GK CM 126E',NULL,'EPSG','4530','EPSG','7683','EPSG','17142',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16411','projected_crs','EPSG','21342','EPSG','2688','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21343','GSK-2011 / GSK 3GK CM 129E',NULL,'EPSG','4530','EPSG','7683','EPSG','17143',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16412','projected_crs','EPSG','21343','EPSG','2689','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21344','GSK-2011 / GSK 3GK CM 132E',NULL,'EPSG','4530','EPSG','7683','EPSG','17144',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16413','projected_crs','EPSG','21344','EPSG','2690','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21345','GSK-2011 / GSK 3GK CM 135E',NULL,'EPSG','4530','EPSG','7683','EPSG','17145',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16414','projected_crs','EPSG','21345','EPSG','2691','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21346','GSK-2011 / GSK 3GK CM 138E',NULL,'EPSG','4530','EPSG','7683','EPSG','17146',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16415','projected_crs','EPSG','21346','EPSG','2692','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21347','GSK-2011 / GSK 3GK CM 141E',NULL,'EPSG','4530','EPSG','7683','EPSG','17147',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16416','projected_crs','EPSG','21347','EPSG','2693','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21348','GSK-2011 / GSK 3GK CM 144E',NULL,'EPSG','4530','EPSG','7683','EPSG','17148',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16417','projected_crs','EPSG','21348','EPSG','2694','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21349','GSK-2011 / GSK 3GK CM 147E',NULL,'EPSG','4530','EPSG','7683','EPSG','17149',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16418','projected_crs','EPSG','21349','EPSG','2695','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21350','GSK-2011 / GSK 3GK CM 150E',NULL,'EPSG','4530','EPSG','7683','EPSG','17150',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16419','projected_crs','EPSG','21350','EPSG','2696','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21351','GSK-2011 / GSK 3GK CM 153E',NULL,'EPSG','4530','EPSG','7683','EPSG','17151',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16380','projected_crs','EPSG','21351','EPSG','2697','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21352','GSK-2011 / GSK 3GK CM 156E',NULL,'EPSG','4530','EPSG','7683','EPSG','17152',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16381','projected_crs','EPSG','21352','EPSG','2698','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21353','GSK-2011 / GSK 3GK CM 159E',NULL,'EPSG','4530','EPSG','7683','EPSG','17153',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16382','projected_crs','EPSG','21353','EPSG','2699','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21354','GSK-2011 / GSK 3GK CM 162E',NULL,'EPSG','4530','EPSG','7683','EPSG','17154',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16383','projected_crs','EPSG','21354','EPSG','2700','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21355','GSK-2011 / GSK 3GK CM 165E',NULL,'EPSG','4530','EPSG','7683','EPSG','17155',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16384','projected_crs','EPSG','21355','EPSG','2701','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21356','GSK-2011 / GSK 3GK CM 168E',NULL,'EPSG','4530','EPSG','7683','EPSG','17156',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16385','projected_crs','EPSG','21356','EPSG','2702','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21357','GSK-2011 / GSK 3GK CM 171E',NULL,'EPSG','4530','EPSG','7683','EPSG','17157',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16386','projected_crs','EPSG','21357','EPSG','2703','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21358','GSK-2011 / GSK 3GK CM 174E',NULL,'EPSG','4530','EPSG','7683','EPSG','17158',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16374','projected_crs','EPSG','21358','EPSG','2704','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21359','GSK-2011 / GSK 3GK CM 177E',NULL,'EPSG','4530','EPSG','7683','EPSG','17159',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16387','projected_crs','EPSG','21359','EPSG','2705','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21360','GSK-2011 / GSK 3GK CM 180E',NULL,'EPSG','4530','EPSG','7683','EPSG','17160',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16388','projected_crs','EPSG','21360','EPSG','2706','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21361','GSK-2011 / GSK 3GK CM 177W',NULL,'EPSG','4530','EPSG','7683','EPSG','17161',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16389','projected_crs','EPSG','21361','EPSG','2707','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21362','GSK-2011 / GSK 3GK CM 174W',NULL,'EPSG','4530','EPSG','7683','EPSG','17162',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16390','projected_crs','EPSG','21362','EPSG','2708','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21363','GSK-2011 / GSK 3GK CM 171W',NULL,'EPSG','4530','EPSG','7683','EPSG','17163',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16483','projected_crs','EPSG','21363','EPSG','2709','EPSG','1055'); +INSERT INTO "projected_crs" VALUES('EPSG','21364','GSK-2011 / GSK 3GK CM 168W',NULL,'EPSG','4530','EPSG','7683','EPSG','17164',NULL,0); +INSERT INTO "usage" VALUES('EPSG','16484','projected_crs','EPSG','21364','EPSG','2710','EPSG','1055'); INSERT INTO "projected_crs" VALUES('EPSG','21413','Beijing 1954 / Gauss-Kruger zone 13',NULL,'EPSG','4530','EPSG','4214','EPSG','16213',NULL,0); INSERT INTO "usage" VALUES('EPSG','6289','projected_crs','EPSG','21413','EPSG','1587','EPSG','1211'); INSERT INTO "projected_crs" VALUES('EPSG','21414','Beijing 1954 / Gauss-Kruger zone 14',NULL,'EPSG','4530','EPSG','4214','EPSG','16214',NULL,0); @@ -7613,7 +7969,7 @@ INSERT INTO "projected_crs" VALUES('EPSG','21482','Beijing 1954 / Gauss-Kruger 2 INSERT INTO "usage" VALUES('EPSG','6320','projected_crs','EPSG','21482','EPSG','1596','EPSG','1209'); INSERT INTO "projected_crs" VALUES('EPSG','21483','Beijing 1954 / Gauss-Kruger 23N',NULL,'EPSG','4530','EPSG','4214','EPSG','16323',NULL,1); INSERT INTO "usage" VALUES('EPSG','6321','projected_crs','EPSG','21483','EPSG','1597','EPSG','1209'); -INSERT INTO "projected_crs" VALUES('EPSG','21500','Belge 1950 (Brussels) / Belge Lambert 50',NULL,'EPSG','4499','EPSG','4809','EPSG','19901',NULL,0); +INSERT INTO "projected_crs" VALUES('EPSG','21500','BD50 (Brussels) / Belge Lambert 50',NULL,'EPSG','4499','EPSG','4809','EPSG','19901',NULL,0); INSERT INTO "usage" VALUES('EPSG','6322','projected_crs','EPSG','21500','EPSG','1347','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','21780','Bern 1898 (Bern) / LV03C',NULL,'EPSG','4498','EPSG','4801','EPSG','19923',NULL,0); INSERT INTO "usage" VALUES('EPSG','6323','projected_crs','EPSG','21780','EPSG','1286','EPSG','1142'); @@ -9101,9 +9457,9 @@ INSERT INTO "projected_crs" VALUES('EPSG','31296','MGI / M34',NULL,'EPSG','4499' INSERT INTO "usage" VALUES('EPSG','7063','projected_crs','EPSG','31296','EPSG','1708','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','31297','MGI / Austria Lambert',NULL,'EPSG','4499','EPSG','4312','EPSG','19947',NULL,1); INSERT INTO "usage" VALUES('EPSG','7064','projected_crs','EPSG','31297','EPSG','1037','EPSG','1210'); -INSERT INTO "projected_crs" VALUES('EPSG','31300','Belge 1972 / Belge Lambert 72',NULL,'EPSG','4499','EPSG','4313','EPSG','19902',NULL,0); +INSERT INTO "projected_crs" VALUES('EPSG','31300','BD72 / Belge Lambert 72',NULL,'EPSG','4499','EPSG','4313','EPSG','19902',NULL,0); INSERT INTO "usage" VALUES('EPSG','7065','projected_crs','EPSG','31300','EPSG','1347','EPSG','1142'); -INSERT INTO "projected_crs" VALUES('EPSG','31370','Belge 1972 / Belgian Lambert 72',NULL,'EPSG','4499','EPSG','4313','EPSG','19961',NULL,0); +INSERT INTO "projected_crs" VALUES('EPSG','31370','BD72 / Belgian Lambert 72',NULL,'EPSG','4499','EPSG','4313','EPSG','19961',NULL,0); INSERT INTO "usage" VALUES('EPSG','7066','projected_crs','EPSG','31370','EPSG','1347','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','31461','DHDN / 3-degree Gauss zone 1',NULL,'EPSG','4499','EPSG','4314','EPSG','16261',NULL,1); INSERT INTO "usage" VALUES('EPSG','7067','projected_crs','EPSG','31461','EPSG','1628','EPSG','1142'); diff --git a/data/sql/scope.sql b/data/sql/scope.sql index e76a9b01..79e4b653 100644 --- a/data/sql/scope.sql +++ b/data/sql/scope.sql @@ -60,7 +60,7 @@ INSERT INTO "scope" VALUES('EPSG','1080','Angola LNG project.',0); INSERT INTO "scope" VALUES('EPSG','1081','Seismic survey.',0); INSERT INTO "scope" VALUES('EPSG','1082','Approximate transformation of seismic data acquired before 1985 to CRS used post 1985.',0); INSERT INTO "scope" VALUES('EPSG','1083','Approximation (to better than 2cm) using NTv2 method of results of FINELTRA programme concatenated with LV-95 parameters.',0); -INSERT INTO "scope" VALUES('EPSG','1084','Approximation (to better than 2m) using NTv2 method of results of FINELTRA programme concatenated with LV-95 parameters.',0); +INSERT INTO "scope" VALUES('EPSG','1084','Parameter values from CH1903+ to ETRS89 (tfm code 1647) and are used as an approximation from CH1903 with a lesser accuracy of 1.5m which equates to the magnitude of distortions in the CH1903 network.',0); INSERT INTO "scope" VALUES('EPSG','1085','Approximation using NTv2 method of results of FINELTRA programme to an accuracy of 0.01m except at boundary of the Geneva and Vaud cantons, in city of Geneva and in the main valleys of Valais canton where differences are up to 20 cm.',0); INSERT INTO "scope" VALUES('EPSG','1086','Approximation of horizontal component of official 3D RDNAPTRANS(TM) transformation, which since 1st October 2000 has defined Amersfoort geodetic datum.',0); INSERT INTO "scope" VALUES('EPSG','1087','Approximation for pan-European small-scale mapping in extended ETRS89.',0); diff --git a/docs/source/apps/cct.rst b/docs/source/apps/cct.rst index 700261fa..75d67972 100644 --- a/docs/source/apps/cct.rst +++ b/docs/source/apps/cct.rst @@ -29,7 +29,7 @@ by :c:func:`proj_create`, provided it expresses a coordinate operation uniqueness is not guaranteed, heuristics are applied to determine the appropriate best match. - a OGC URN combining references for concatenated operations (e.g. "urn:ogc:def:coordinateOperation,coordinateOperation:EPSG::3895,coordinateOperation:EPSG::1618") - - a PROJJSON string. The jsonschema is at https://proj.org/schemas/v0.2/projjson.schema.json + - a PROJJSON string. The jsonschema is at https://proj.org/schemas/v0.3/projjson.schema.json .. versionadded:: 8.0.0 diff --git a/docs/source/apps/cs2cs.rst b/docs/source/apps/cs2cs.rst index 909912df..00443d9c 100644 --- a/docs/source/apps/cs2cs.rst +++ b/docs/source/apps/cs2cs.rst @@ -35,7 +35,7 @@ Synopsis (*added in 6.2*) - a OGC URN combining references for concatenated operations (e.g. "urn:ogc:def:coordinateOperation,coordinateOperation:EPSG::3895,coordinateOperation:EPSG::1618") - - a PROJJSON string. The jsonschema is at https://proj.org/schemas/v0.2/projjson.schema.json (*added in 6.2*) + - a PROJJSON string. The jsonschema is at https://proj.org/schemas/v0.3/projjson.schema.json (*added in 6.2*) - a compound CRS made from two object names separated with " + ". e.g. "WGS 84 + EGM96 height" (*added in 7.1*) .. versionadded:: 6.0.0 @@ -261,7 +261,7 @@ The following script :: cs2cs +proj=latlong +datum=NAD83 +to +proj=utm +zone=10 +datum=NAD27 -r <<EOF - 45d15'33.1" 111.5W + 45°15'33.1" 111.5W 45d15.551666667N -111d30 +45.25919444444 111d30'000w EOF diff --git a/docs/source/apps/projinfo.rst b/docs/source/apps/projinfo.rst index a92de6ea..f9445f1b 100644 --- a/docs/source/apps/projinfo.rst +++ b/docs/source/apps/projinfo.rst @@ -55,7 +55,7 @@ Synopsis (*added in 6.2*) - a OGC URN combining references for concatenated operations (e.g. "urn:ogc:def:coordinateOperation,coordinateOperation:EPSG::3895,coordinateOperation:EPSG::1618") - - a PROJJSON string. The jsonschema is at https://proj.org/schemas/v0.2/projjson.schema.json (*added in 6.2*) + - a PROJJSON string. The jsonschema is at https://proj.org/schemas/v0.3/projjson.schema.json (*added in 6.2*) - a compound CRS made from two object names separated with " + ". e.g. "WGS 84 + EGM96 height" (*added in 7.1*) {object_reference} is a filename preceded by the '@' character. The diff --git a/docs/source/conf.py b/docs/source/conf.py index bffc62ad..16b23398 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -77,8 +77,8 @@ copyright = u'1983-{0}'.format(now.year) # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. -version = '8.1.0' -data_version = '1.5' +version = '8.2.0' +data_version = '1.7' # use same |release| as |version| release = version @@ -411,6 +411,9 @@ texinfo_documents = [ breathe_projects = { "doxygen_api":"../build/xml/", } +breathe_domain_by_extension = { + "h" : "c", +} import redirects redirect_files = redirects.gather_redirects() diff --git a/docs/source/development/reference/functions.rst b/docs/source/development/reference/functions.rst index 29b52149..142c7ca9 100644 --- a/docs/source/development/reference/functions.rst +++ b/docs/source/development/reference/functions.rst @@ -52,7 +52,7 @@ paragraph for more details. syntax "EPSG:2393+5717"), - a OGC URN combining references for concatenated operations (e.g. "urn:ogc:def:coordinateOperation,coordinateOperation:EPSG::3895,coordinateOperation:EPSG::1618") - - a PROJJSON string. The jsonschema is at https://proj.org/schemas/v0.2/projjson.schema.json (*added in 6.2*) + - a PROJJSON string. The jsonschema is at https://proj.org/schemas/v0.3/projjson.schema.json (*added in 6.2*) - a compound CRS made from two object names separated with " + ". e.g. "WGS 84 + EGM96 height" (*added in 7.1*) Example call: diff --git a/docs/source/download.rst b/docs/source/download.rst index 03a61c76..438de82e 100644 --- a/docs/source/download.rst +++ b/docs/source/download.rst @@ -13,8 +13,8 @@ distribution of the source code and various resource file archives. See Current Release -------------------------------------------------------------------------------- -* **2021-03-01** `proj-8.0.0.tar.gz`_ (`md5`_) -* **2021-03-01** `proj-data-1.5.tar.gz`_ +* **2021-07-01** `proj-8.1.0.tar.gz`_ (`md5`_) +* **2021-07-01** `proj-data-1.7.tar.gz`_ * **PDF Manual** `proj.pdf`_ .. note:: @@ -28,6 +28,9 @@ Current Release Past Releases -------------------------------------------------------------------------------- +* **2021-07-01** `proj-8.1.0.tar.gz`_ +* **2021-05-05** `proj-8.0.1.tar.gz`_ +* **2021-03-01** `proj-8.0.0.tar.gz`_ * **2021-01-01** `proj-7.2.1.tar.gz`_ * **2020-11-01** `proj-7.2.0.tar.gz`_ * **2020-09-01** `proj-7.1.1.tar.gz`_ @@ -50,6 +53,9 @@ Past Releases * **2015-09-13** `proj-4.9.2.tar.gz`_ * **2015-03-04** `proj-4.9.1.tar.gz`_ +* **2021-07-01** `proj-data-1.7.tar.gz`_ +* **2021-05-05** `proj-data-1.6.tar.gz`_ +* **2021-03-01** `proj-data-1.5.tar.gz`_ * **2021-01-01** `proj-data-1.4.tar.gz`_ * **2020-11-01** `proj-data-1.3.tar.gz`_ * **2020-09-01** `proj-data-1.2.tar.gz`_ @@ -76,8 +82,10 @@ Past Releases * **2018-03-01** `proj-datumgrid-oceania-1.1.zip`_ * **2018-03-01** `proj-datumgrid-oceania-1.0.zip`_ +.. _`proj-8.1.0.tar.gz`: https://download.osgeo.org/proj/proj-8.1.0.tar.gz +.. _`md5`: https://download.osgeo.org/proj/proj-8.1.0.tar.gz.md5 +.. _`proj-8.0.1.tar.gz`: https://download.osgeo.org/proj/proj-8.0.1.tar.gz .. _`proj-8.0.0.tar.gz`: https://download.osgeo.org/proj/proj-8.0.0.tar.gz -.. _`md5`: https://download.osgeo.org/proj/proj-8.0.0.tar.gz.md5 .. _`proj-7.2.1.tar.gz`: https://download.osgeo.org/proj/proj-7.2.1.tar.gz .. _`proj-7.2.0.tar.gz`: https://download.osgeo.org/proj/proj-7.2.0.tar.gz .. _`proj-7.1.1.tar.gz`: https://download.osgeo.org/proj/proj-7.1.1.tar.gz @@ -100,6 +108,8 @@ Past Releases .. _`proj-4.9.2.tar.gz`: https://download.osgeo.org/proj/proj-4.9.2.tar.gz .. _`proj-4.9.3.tar.gz`: https://download.osgeo.org/proj/proj-4.9.3.tar.gz +.. _`proj-data-1.7.tar.gz`: https://download.osgeo.org/proj/proj-data-1.7.tar.gz +.. _`proj-data-1.6.tar.gz`: https://download.osgeo.org/proj/proj-data-1.6.tar.gz .. _`proj-data-1.5.tar.gz`: https://download.osgeo.org/proj/proj-data-1.5.tar.gz .. _`proj-data-1.4.tar.gz`: https://download.osgeo.org/proj/proj-data-1.4.tar.gz .. _`proj-data-1.3.tar.gz`: https://download.osgeo.org/proj/proj-data-1.3.tar.gz diff --git a/docs/source/install.rst b/docs/source/install.rst index 21487e7a..325e47b1 100644 --- a/docs/source/install.rst +++ b/docs/source/install.rst @@ -155,6 +155,12 @@ FSF's configuration procedure is used to ease installation of the PROJ system. Follow the CMake installation guide if you are not using a UNIX-like operating system. +If you are building from the git repository you have to first run:: + + ./autogen.sh + +which will generate a ``configure`` script that can be used in the next step. + The default destination path prefix for installed files is ``/usr/local``. Results from the installation script will be placed into subdirectories ``bin``, ``include``, ``lib``, and ``man/man1``. If this default path prefix @@ -169,12 +175,6 @@ If another path prefix is required, then execute:: In either case, the directory of the prefix path must exist and be writable by the installer. -If you are building from the git repository you have to first run:: - - ./autogen.sh - -which will generate a configure script that can be used as described above. - With the data files in place we can now build and install PROJ:: make diff --git a/docs/source/news.rst b/docs/source/news.rst index 8b37eb96..038bf142 100644 --- a/docs/source/news.rst +++ b/docs/source/news.rst @@ -3,6 +3,138 @@ News ############################################################################### +8.1.0 Release Notes +++++++++++++++++++++++++++++++++++++++++ +*July 1st 2021* + +Updates +------- + ++ **Database** + + * Update to EPSG v10.027 (`#2751 <https://github.com/OSGeo/PROJ/issues/2751>`_) + + * Decrease DB size by using ``WITHOUT ROWID`` tables (`#2730 <https://github.com/OSGeo/PROJ/issues/2730>`_) (#2647) + + * Add a ``ANALYZE`` step during ``proj.db`` creation allowing for faster lookups (`#2729 <https://github.com/OSGeo/PROJ/issues/2729>`_) + + * Added a ``PROJ.VERSION`` metadata entry (`#2646 <https://github.com/OSGeo/PROJ/issues/2646>`_) + + * Added NGO48 (EPSG:4273) to ETRS89 (EPSG:4258) triangulation-based transformation (`#2554 <https://github.com/OSGeo/PROJ/issues/2554>`_) + + * Additions to the norwegian NKG2020 transformation (`#2548 <https://github.com/OSGeo/PROJ/issues/2548>`_) + + * ESRI projection database updated to version 12.8 (`#2717 <https://github.com/OSGeo/PROJ/issues/2717>`_) + ++ **API additions** + + * Added :c:func:`proj_get_geoid_models_from_database()` function that returns a list of geoid models available for a given CRS (`#2681 <https://github.com/OSGeo/PROJ/issues/2681>`_) + + * Added :c:func`proj_get_celestial_body_list_from_database()` that returns a list of celestial bodies in the PROJ database (`#2667 <https://github.com/OSGeo/PROJ/issues/2667>`_) + + * Added :c:func:`proj_get_celestial_body_name()` (`#2662 <https://github.com/OSGeo/PROJ/issues/2662>`_) + ++ **Various improvements** + + * :c:func:`proj_trans()`/:program:`cs2cs`: If two operations have the same accuracy, use the one that is contained within a larger one (`#2750 <https://github.com/OSGeo/PROJ/issues/2750>`_) + + * Share SQLite database handle among all contexts (`#2738 <https://github.com/OSGeo/PROJ/issues/2738>`_) + + * Added ``proj/internal/mutex.hpp`` as compat layer for mingw32 for std::mutex (`#2736 <https://github.com/OSGeo/PROJ/issues/2736>`_) + + * :program:`projsync`: make it filter out files not intended for the current version (`#2725 <https://github.com/OSGeo/PROJ/issues/2725>`_) + + * Improvements related to ``DerivedVerticalCRS`` using Change Unit and + Height/Depth reversal methods (`#2696 <https://github.com/OSGeo/PROJ/issues/2696>`_) + + * Update internal ``nlohmann/json`` to 3.9.1, and add a CMake option to + be able to use external ``nlohmann/json`` (`#2686 <https://github.com/OSGeo/PROJ/issues/2686>`_) + + * :cpp:func:`createFromUserInput()`: change name of CRS built from URN combined references to match the convention of EPSG projected CRS (`#2677 <https://github.com/OSGeo/PROJ/issues/2677>`_) + + * Parse compound id with two authorities, like ESRI:103668+EPSG:5703 (`#2669 <https://github.com/OSGeo/PROJ/issues/2669>`_) + + * Added :program:`projinfo` option option ``--list-crs`` (supports ``--area``) (`#2663 <https://github.com/OSGeo/PROJ/issues/2663>`_) + + * Added support for hyperbolic Cassini-Soldner (`#2637 <https://github.com/OSGeo/PROJ/issues/2637>`_) + + * Added capability to get SQL statements to add custom CRS in the database (`#2577 <https://github.com/OSGeo/PROJ/issues/2577>`_) + +Bug fixes +--------- + +* Fix 'Please include winsock2.h before windows.h' warning with msys (`#2692 <https://github.com/OSGeo/PROJ/issues/2692>`_) + +* Minor changes to address lint in ``geodesic.c`` (`#2752 <https://github.com/OSGeo/PROJ/issues/2752>`_) + +* :cpp:func:`BoundCRS::identify()`: avoid incompatible transformation for WKT1 / TOWGS84 export (`#2747 <https://github.com/OSGeo/PROJ/issues/2747>`_) + +* :c:func:`proj_create()`: do not open proj.db if string is a PROJ string, even if :c:func:`proj_context_set_autoclose_database()` has been set (`#2735 <https://github.com/OSGeo/PROJ/issues/2735>`_) + +* Fix export of transformation to PROJ string in a particular situation where CompoundCRS are involved (`#2721 <https://github.com/OSGeo/PROJ/issues/2721>`_) + + +8.0.1 Release Notes +++++++++++++++++++++++++++++++++++++++++ +*May 5th 2021* + +Updates +------- + +* Database: update to EPSG v10.018 (`#2636 <https://github.com/OSGeo/PROJ/issues/2636>`_) + +* Add transformations for CHGeo2004, Swiss geoid model (`#2604 <https://github.com/OSGeo/PROJ/issues/2604>`_) + +* Additions to the norwegian NKG2020 transformation (`#2600 <https://github.com/OSGeo/PROJ/issues/2600>`_) + +Bug fixes +--------- + +* :c:func:`pj_vlog()`: fix buffer overflow in case of super lengthy error message (`#2693 <https://github.com/OSGeo/PROJ/issues/2693>`_) + +* Revert ":c:func:`proj_create_crs_to_crs_from_pj()`: do not use PROJ_SPATIAL_CRITERION_PARTIAL_INTERSECTION if area is specified" (`#2679 <https://github.com/OSGeo/PROJ/issues/2679>`_) + +* UTM: error out when value of ``+zone=`` is not an integer (`#2672 <https://github.com/OSGeo/PROJ/issues/2672>`_) + +* :cpp:func:`getCRSInfoList()`: make result order deterministic (by increasing auth_name, + code) (`#2661 <https://github.com/OSGeo/PROJ/issues/2661>`_) + +* :cpp:func:`createOperation()`: make sure no to discard deprecated operations if the + replacement uses an unknow grid (`#2623 <https://github.com/OSGeo/PROJ/issues/2623>`_) + +* Fix build on Solaris 11.4 (`#2621 <https://github.com/OSGeo/PROJ/issues/2621>`_) + +* Add mapping of ESRI Equal_Area projection method to EPSG (`#2612 <https://github.com/OSGeo/PROJ/issues/2612>`_) + +* Fix incorrect EPGS extent code for EPSG:7789>EPSG:4976 NKG transformation (`#2599 <https://github.com/OSGeo/PROJ/issues/2599>`_) + +* fix wrong capitalization of CHENyx06_ETRS.gsb (`#2597 <https://github.com/OSGeo/PROJ/issues/2597>`_) + +* :cpp:func:`createOperations()`: improve handling of vertical transforms when + when compound CRSs are used (`#2592 <https://github.com/OSGeo/PROJ/issues/2592>`_) + +* :cpp:func:`CRS::promoteTo3D()`: propagate the extent from the 2D CRS (`#2589 <https://github.com/OSGeo/PROJ/issues/2589>`_) + +* :cpp:func:`createFromCRSCodesWithIntermediates()`: improve performance when there is + no match (`#2583 <https://github.com/OSGeo/PROJ/issues/2583>`_) + +* Fix :c:func:`proj_clone()` to work on 'meta' coordinate operation ``PJ*`` objects that + can be returned by :c:func:`proj_create_crs_to_crs()` (`#2582 <https://github.com/OSGeo/PROJ/issues/2582>`_) + +* add ``PROJ_COMPUTE_VERSION``, ``PROJ_VERSION_NUMBER``, + ``PROJ_AT_LEAST_VERSION`` macros (`#2581 <https://github.com/OSGeo/PROJ/issues/2581>`_) + +* Make :c:func:`proj_lp_dist()` and :c:func:`proj_geod()` work on a ``PJ*`` CRS object (`#2570 <https://github.com/OSGeo/PROJ/issues/2570>`_) + +* Fix gcc 11 ``-Wnonnull`` compilation warnings (`#2559 <https://github.com/OSGeo/PROJ/issues/2559>`_) + +* Fix use of uninitialized memory in gie tests (`#2558 <https://github.com/OSGeo/PROJ/issues/2558>`_) + +* :c:func:`createOperations()`: fix incorrect height transformation between 3D promoted RGF93 and CH1903+ (`#2555 <https://github.com/OSGeo/PROJ/issues/2555>`_) + + + +>>>>>>> Stashed changes 8.0.0 Release Notes ++++++++++++++++++++++++++++++++++++++++ *March 1st 2021* diff --git a/docs/source/operations/operations_computation.rst b/docs/source/operations/operations_computation.rst index 0bc57ff0..5c2596e6 100644 --- a/docs/source/operations/operations_computation.rst +++ b/docs/source/operations/operations_computation.rst @@ -59,9 +59,9 @@ From a code point of view, the entry point of the algorithm is the C++ It combines several strategies: -- look up in the PROJ database for available operations -- consider the pair (source CRS, target CRS) to synthetize operations depending - on the nature of the source and target CRS. + - look up in the PROJ database for available operations + - consider the pair (source CRS, target CRS) to synthetize operations depending + on the nature of the source and target CRS. Geographic CRS to Geographic CRS, with known identifiers -------------------------------------------------------- @@ -156,6 +156,18 @@ performed in the order they are listed below: lexicographic order (e.g. "FOO to BAR (3)" will have higher precedence than "FOO to BAR (2)") +.. note:: + + :c:func:`proj_trans`, on the results returned by :c:func:`proj_create_crs_to_crs`, + will not necessarily use the operation that + is listed in first position due to the above algorithm. :c:func:`proj_trans` + has more context, since it has the coordinate to transform, so it can compare + this coordinate to the area of use of operations. Typically, the above criteria + will favor an operation that has a larger area of use over another one with a + smaller area, due to it being more generally applicable. But once coordinates are known, + :c:func:`proj_trans` can select an operation with a smaller + area of use that applies to the coordinate to transform. + Geodetic/geographic CRS to Geodetic/geographic CRS, without known identifiers ----------------------------------------------------------------------------- diff --git a/docs/source/operations/projections/index.rst b/docs/source/operations/projections/index.rst index 48420971..4f76dab2 100644 --- a/docs/source/operations/projections/index.rst +++ b/docs/source/operations/projections/index.rst @@ -126,6 +126,7 @@ Projections map the spherical 3D space to a flat 2D space. robin rouss rpoly + s2 sch sinu somerc diff --git a/docs/source/operations/projections/s2.rst b/docs/source/operations/projections/s2.rst new file mode 100644 index 00000000..46ae715e --- /dev/null +++ b/docs/source/operations/projections/s2.rst @@ -0,0 +1,120 @@ +.. _s2: + +******************************************************************************** +S2 +******************************************************************************** + ++---------------------+----------------------------------------------------------+ +| **Classification** | Miscellaneous | ++---------------------+----------------------------------------------------------+ +| **Available forms** | Forward and inverse, ellipsoidal | ++---------------------+----------------------------------------------------------+ +| **Defined area** | Global | ++---------------------+----------------------------------------------------------+ +| **Alias** | s2 | ++---------------------+----------------------------------------------------------+ +| **Domain** | 2D | ++---------------------+----------------------------------------------------------+ +| **Input type** | Geodetic coordinates | ++---------------------+----------------------------------------------------------+ +| **Output type** | Projected coordinates | ++---------------------+----------------------------------------------------------+ + +.. versionadded:: 8.2 + +The S2 projection, like the Quadrilateralized Spherical Cube (QSC) projection, projects +a sphere surface onto the six sides of a cube: + +.. image:: ../../../images/qsc_concept.jpg + :width: 500 px + :align: center + :alt: Quadrilateralized Spherical Cube + +S2 was created by Google to represent geographic data on the whole earth. The documentation can be found +at `S2 Geometry <https://s2geometry.io/>`_ It works by first +projecting a point on the sphere to a face of the cube. These are called u,v-coordinates, and they are in [-1,1] x [-1,1]. +This step is followed by a non-linear transformation to normalize the area of rectangles on the sphere. There are three +different choices available for this transformation, meaning that S2 is a family of projections. The final output is in +s,t-coordinates, which are in [0,1] x [0,1]. +See the comments in `S2 Code <https://github.com/google/s2geometry/blob/0c4c460bdfe696da303641771f9def900b3e440f/src/s2/s2coords.h#L226>`_ +for an explanation of the tradeoff between speed and area-preservation. Note that the projection is azimuthal when "none" or +"linear" is selected for the area-normalization, but it is not azimuthal when "quadratic" or "tangent" is chosen. See +S2's `Earthcube page <https://s2geometry.io/resources/earthcube>`_ +to visualize the unfolded cube and the orientation of each face. + +In this implementation, the cube side is selected by choosing one of the following six projection centers: + ++-------------------------+--------------------+ +| ``+lat_0=0 +lon_0=0`` | front cube side | ++-------------------------+--------------------+ +| ``+lat_0=0 +lon_0=90`` | right cube side | ++-------------------------+--------------------+ +| ``+lat_0=0 +lon_0=180`` | back cube side | ++-------------------------+--------------------+ +| ``+lat_0=0 +lon_0=-90`` | left cube side | ++-------------------------+--------------------+ +| ``+lat_0=90`` | top cube side | ++-------------------------+--------------------+ +| ``+lat_0=-90`` | bottom cube side | ++-------------------------+--------------------+ + +The specific transformation can be chosen with the UVtoST parameter: + ++-------------------------+-----------------------------+ +| ``+UVtoST=linear`` | fastest, no normalization | ++-------------------------+-----------------------------+ +| ``+UVtoST=quadratic`` | fast, good normalization | ++-------------------------+-----------------------------+ +| ``+UVtoST=tangent`` | slowest, best normalization | ++-------------------------+-----------------------------+ +| ``+UVtoST=none`` | returns u,v-coordinates | ++-------------------------+-----------------------------+ + +Furthermore, this implementation allows the projection to be applied to ellipsoids. +A preceding shift to a sphere is performed automatically; see :cite:`LambersKolb2012` for details. +The output of the projection is in s,t-coordinates ([0,1] x [0,1]), so only the +eccentricity of the ellipse is taken into account: the absolute value of the axes does +not affect the output. + + +Usage +############################################################################### + +The following example uses S2 on the right face:: + + echo 90 0 | ../bin/proj +proj=s2 +lat_0=0 +lon_0=90 +ellps=WGS84 +UVtoST=linear + + 0.5 0.5 + +Explanation: + +* S2 projection is selected with ``+proj=s2``. +* The WGS84 ellipsoid is specified with ``+ellps=WGS84``. +* The cube side is selected with ``+lat_0=... +lon_0=...``. +* The normalization transformation is selected with ``+UVtoST=...``. + +Parameters +################################################################################ + +.. note:: All parameters for the projection are optional. + +.. include:: ../options/lon_0.rst + +.. include:: ../options/lat_0.rst + +.. include:: ../options/ellps.rst + +.. option:: +UVtoST=<value> + + The area-normalization transformation. Choose from {linear, quadratic, tangent, none} + + *Defaults to "quadratic".* + +.. include:: ../options/x_0.rst + +.. include:: ../options/y_0.rst + +Further reading +################################################################################ + +#. `S2's Website <https://s2geometry.io/>`_ diff --git a/docs/source/specifications/projjson.rst b/docs/source/specifications/projjson.rst index 3484fce9..13ef19b5 100644 --- a/docs/source/specifications/projjson.rst +++ b/docs/source/specifications/projjson.rst @@ -13,17 +13,18 @@ the same as WKT2:2019. PROJJSON is available as input and output of PROJ since PROJ 6.2. -The current version is 0.2. +The current version is 0.3. Schema ------ A JSON schema of its grammar is available at -https://proj.org/schemas/v0.2/projjson.schema.json +https://proj.org/schemas/v0.3/projjson.schema.json History ------- +* v0.3: additional properties allowed in BoundCRS object (name, scope, area, bbox, usages, remarks, id, ids) * v0.2: addition of geoid_model in VerticalCRS object. * v0.1: initial version for PROJ 6.2 diff --git a/include/proj/crs.hpp b/include/proj/crs.hpp index 0f8c5e42..dcab094a 100644 --- a/include/proj/crs.hpp +++ b/include/proj/crs.hpp @@ -173,6 +173,10 @@ class PROJ_GCC_DLL CRS : public common::ObjectUsage, PROJ_INTERNAL virtual std::list<std::pair<CRSNNPtr, int>> _identify(const io::AuthorityFactoryPtr &authorityFactory) const; + PROJ_INTERNAL void + setProperties(const util::PropertyMap + &properties); // throw(InvalidValueTypeException) + private: PROJ_OPAQUE_PRIVATE_DATA }; @@ -1007,6 +1011,11 @@ class PROJ_GCC_DLL BoundCRS final : public CRS, //! @endcond PROJ_DLL static BoundCRSNNPtr + create(const util::PropertyMap &properties, const CRSNNPtr &baseCRSIn, + const CRSNNPtr &hubCRSIn, + const operation::TransformationNNPtr &transformationIn); + + PROJ_DLL static BoundCRSNNPtr create(const CRSNNPtr &baseCRSIn, const CRSNNPtr &hubCRSIn, const operation::TransformationNNPtr &transformationIn); @@ -1168,6 +1177,10 @@ class PROJ_GCC_DLL DerivedGeographicCRS final : public GeographicCRS, const operation::ConversionNNPtr &derivingConversionIn, const cs::EllipsoidalCSNNPtr &csIn); + PROJ_DLL DerivedGeographicCRSNNPtr + demoteTo2D(const std::string &newName, + const io::DatabaseContextPtr &dbContext) const; + //! @cond Doxygen_Suppress PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter) const override; // throw(io::FormattingException) diff --git a/include/proj/internal/io_internal.hpp b/include/proj/internal/io_internal.hpp index ccc3787e..e0426b59 100644 --- a/include/proj/internal/io_internal.hpp +++ b/include/proj/internal/io_internal.hpp @@ -173,7 +173,6 @@ struct projCppContext { PJ_CONTEXT *ctx_ = nullptr; std::string dbPath_{}; std::vector<std::string> auxDbPaths_{}; - bool autoCloseDb_ = false; projCppContext(const projCppContext &) = delete; projCppContext &operator=(const projCppContext &) = delete; @@ -201,18 +200,9 @@ struct projCppContext { return auxDbPaths_; } - void setAutoCloseDb(bool autoClose) { - autoCloseDb_ = autoClose; - autoCloseDbIfNeeded(); - } - inline bool getAutoCloseDb() const { return autoCloseDb_; } - - // cppcheck-suppress functionStatic - void closeDb(); - - void autoCloseDbIfNeeded(); - NS_PROJ::io::DatabaseContextNNPtr getDatabaseContext(); + + void closeDb() { databaseContext_ = nullptr; } }; //! @endcond diff --git a/include/proj/internal/lru_cache.hpp b/include/proj/internal/lru_cache.hpp index b7aff6b9..b2e997b3 100644 --- a/include/proj/internal/lru_cache.hpp +++ b/include/proj/internal/lru_cache.hpp @@ -160,6 +160,21 @@ class Cache { keys_.splice(keys_.begin(), keys_, iter->second); return iter->second->value; } + + /** + * The const reference returned here is only + * guaranteed to be valid till the next insert/delete + */ + const Value* getPtr(const Key& k) { + Guard g(lock_); + const auto iter = cache_.find(k); + if (iter == cache_.end()) { + return nullptr; + } + keys_.splice(keys_.begin(), keys_, iter->second); + return &(iter->second->value); + } + /** * returns a copy of the stored object (if found) */ diff --git a/include/proj/io.hpp b/include/proj/io.hpp index 11912e3d..1c858248 100644 --- a/include/proj/io.hpp +++ b/include/proj/io.hpp @@ -537,7 +537,11 @@ class PROJ_GCC_DLL JSONFormatter { // cppcheck-suppress functionStatic PROJ_INTERNAL bool outputId() const; - PROJ_INTERNAL bool outputUsage() const; + PROJ_INTERNAL bool + outputUsage(bool calledBeforeObjectContext = false) const; + + PROJ_INTERNAL static const char *PROJJSON_v0_2; + PROJ_INTERNAL static const char *PROJJSON_v0_3; //! @endcond diff --git a/man/man1/cct.1 b/man/man1/cct.1 index 5c4b145d..f6673b2d 100644 --- a/man/man1/cct.1 +++ b/man/man1/cct.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CCT" "1" "Mar 1, 2021" "8.0.0" "PROJ" +.TH "CCT" "1" "Jul 1, 2021" "8.1.0" "PROJ" .SH NAME cct \- Coordinate Conversion and Transformation . @@ -56,7 +56,7 @@ a WKT string, .IP \(bu 2 an object code (like "EPSG:1671" "urn:ogc:def:coordinateOperation:EPSG::1671"), .IP \(bu 2 -an object name. e.g "ITRF2014 to ETRF2014 (1)". In that case as +an object name. e.g. "ITRF2014 to ETRF2014 (1)". In that case as uniqueness is not guaranteed, heuristics are applied to determine the appropriate best match. .IP \(bu 2 a OGC URN combining references for concatenated operations @@ -354,7 +354,7 @@ Hence, in honour of \fIcct\fP (the geodesist) this is \fBcct\fP (the program). \fBproj(1)\fP, \fBcs2cs(1)\fP, \fBgeod(1)\fP, \fBgie(1)\fP, \fBprojinfo(1)\fP, \fBprojsync(1)\fP .SH BUGS .sp -A list of know bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP +A list of known bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP where new bug reports can be submitted to. .SH HOME PAGE .sp diff --git a/man/man1/cs2cs.1 b/man/man1/cs2cs.1 index 6b7c9704..5334ba9a 100644 --- a/man/man1/cs2cs.1 +++ b/man/man1/cs2cs.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "CS2CS" "1" "Mar 1, 2021" "8.0.0" "PROJ" +.TH "CS2CS" "1" "Jul 1, 2021" "8.1.0" "PROJ" .SH NAME cs2cs \- Cartographic coordinate system filter . @@ -398,7 +398,7 @@ outputs \fBproj(1)\fP, \fBcct(1)\fP, \fBgeod(1)\fP, \fBgie(1)\fP, \fBprojinfo(1)\fP, \fBprojsync(1)\fP .SH BUGS .sp -A list of know bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP +A list of known bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP where new bug reports can be submitted to. .SH HOME PAGE .sp diff --git a/man/man1/geod.1 b/man/man1/geod.1 index b6b261c2..1a9a8a3a 100644 --- a/man/man1/geod.1 +++ b/man/man1/geod.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "GEOD" "1" "Mar 1, 2021" "8.0.0" "PROJ" +.TH "GEOD" "1" "Jul 1, 2021" "8.1.0" "PROJ" .SH NAME geod \- Geodesic computations . @@ -80,21 +80,19 @@ Gives a listing of all the ellipsoids that may be selected with the .TP .B \-lu Gives a listing of all the units that may be selected with the \fI+units=\fP -option. +option. (Default units are meters.) .UNINDENT .INDENT 0.0 .TP .B \-f <format> Where \fIformat\fP is a printf format string to control the output form of the -geographic coordinate values. The default mode is DMS for geographic -coordinates and \fB"%.3f"\fP for distance. +geographic coordinate values. The default mode is DMS. .UNINDENT .INDENT 0.0 .TP .B \-F <format> Where \fIformat\fP is a printf format string to control the output form of the distance -value (\fB\-F\fP). The default mode is DMS for geographic coordinates and -\fB"%.3f"\fP for distance. +value. The default mode is \fB"%.3f"\fP\&. .UNINDENT .INDENT 0.0 .TP @@ -249,7 +247,7 @@ C. F. F. Karney, \fI\%Algorithms for Geodesics\fP, J. Geodesy \fB87\fP(1), 43– \fBproj(1)\fP, \fBcs2cs(1)\fP, \fBcct(1)\fP, \fBgie(1)\fP, \fBprojinfo(1)\fP, \fBprojsync(1)\fP .SH BUGS .sp -A list of know bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP +A list of known bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP where new bug reports can be submitted to. .SH HOME PAGE .sp diff --git a/man/man1/gie.1 b/man/man1/gie.1 index 5a47ec0e..3134a75a 100644 --- a/man/man1/gie.1 +++ b/man/man1/gie.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "GIE" "1" "Mar 1, 2021" "8.0.0" "PROJ" +.TH "GIE" "1" "Jul 1, 2021" "8.1.0" "PROJ" .SH NAME gie \- The Geospatial Integrity Investigation Environment . @@ -511,7 +511,7 @@ So in honour, and hopefully also in the spirit, of Gerald Ian Evenden \fBproj(1)\fP, \fBcs2cs(1)\fP, \fBcct(1)\fP, \fBgeod(1)\fP, \fBprojinfo(1)\fP, \fBprojsync(1)\fP .SH BUGS .sp -A list of know bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP +A list of known bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP where new bug reports can be submitted to. .SH HOME PAGE .sp diff --git a/man/man1/proj.1 b/man/man1/proj.1 index 4485c3fa..29fd63b1 100644 --- a/man/man1/proj.1 +++ b/man/man1/proj.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "PROJ" "1" "Mar 1, 2021" "8.0.0" "PROJ" +.TH "PROJ" "1" "Jul 1, 2021" "8.1.0" "PROJ" .SH NAME proj \- Cartographic projection filter . @@ -258,7 +258,7 @@ support for datum translation. \fBcs2cs(1)\fP, \fBcct(1)\fP, \fBgeod(1)\fP, \fBgie(1)\fP, \fBprojinfo(1)\fP, \fBprojsync(1)\fP .SH BUGS .sp -A list of know bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP +A list of known bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP where new bug reports can be submitted to. .SH HOME PAGE .sp diff --git a/man/man1/projinfo.1 b/man/man1/projinfo.1 index 24041bbe..d32c5d39 100644 --- a/man/man1/projinfo.1 +++ b/man/man1/projinfo.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "PROJINFO" "1" "Mar 1, 2021" "8.0.0" "PROJ" +.TH "PROJINFO" "1" "Jul 1, 2021" "8.1.0" "PROJ" .SH NAME projinfo \- Geodetic object and coordinate operation queries . @@ -45,11 +45,16 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] [\-\-show\-superseded] [\-\-hide\-ballpark] [\-\-accuracy {accuracy}] [\-\-allow\-ellipsoidal\-height\-as\-vertical\-crs] [\-\-boundcrs\-to\-wgs84] +[\-\-authority name] [\-\-main\-db\-path path] [\-\-aux\-db\-path path]* +[\-\-dump\-db\-structure] [\-\-identify] [\-\-3d] +[\-\-output\-id AUTH:CODE] [\-\-c\-ify] [\-\-single\-line] -\-\-searchpaths | \-\-remote\-data | {object_definition} | -{object_reference} | (\-s {srs_def} \-t {srs_def}) +\-\-searchpaths | \-\-remote\-data | +\-\-list\-crs [list\-crs\-filter] | +\-\-dump\-db\-structure [{object_definition} | {object_reference}] | +{object_definition} | {object_reference} | (\-s {srs_def} \-t {srs_def}) .in -2 .fi @@ -108,7 +113,7 @@ The following control parameters can appear in any order: .TP .B \-o formats formats is a comma separated combination of: -\fBall\fP, \fBdefault\fP, \fBPROJ\fP, \fBWKT_ALL\fP, \fBWKT2:2015\fP, \fBWKT2:2019\fP, \fBWKT1:GDAL\fP, \fBWKT1:ESRI\fP, \fBPROJJSON\fP\&. +\fBall\fP, \fBdefault\fP, \fBPROJ\fP, \fBWKT_ALL\fP, \fBWKT2:2015\fP, \fBWKT2:2019\fP, \fBWKT1:GDAL\fP, \fBWKT1:ESRI\fP, \fBPROJJSON\fP, \fBSQL\fP\&. .sp Except \fBall\fP and \fBdefault\fP, other formats can be preceded by \fB\-\fP to disable them. .sp @@ -126,6 +131,13 @@ Before PROJ 6.3.0, WKT1:GDAL was implicitly calling \-\-boundcrs\-to\-wgs84. This is no longer the case. .UNINDENT .UNINDENT +.sp +\fBNOTE:\fP +.INDENT 7.0 +.INDENT 3.5 +When SQL is specified, \fI\%\-\-output\-id\fP must be specified. +.UNINDENT +.UNINDENT .UNINDENT .INDENT 0.0 .TP @@ -195,7 +207,7 @@ only used for coordinate operation computation Specify how the area of use of coordinate operations found in the database are compared to the area of use specified explicitly with \fI\%\-\-area\fP or \fI\%\-\-bbox\fP, or derived implicitly from the area of use of the source and target CRS. -By default, projinfo will only keep coordinate operations whose are of use +By default, \fBprojinfo\fP will only keep coordinate operations whose are of use is strictly within the area of interest (\fBcontains\fP strategy). If using the \fBintersects\fP strategy, the spatial test is relaxed, and any coordinate operation whose area of use at least partly intersects the @@ -263,7 +275,7 @@ only used for coordinate operation computation .B \-\-pivot\-crs always|if_no_direct_transformation|never|{auth:code[,auth:code]*} Determine if intermediate (pivot) CRS can be used when researching coordinate operation between 2 CRS. A typical example is the WGS84 pivot. By default, -projinfo will consider any potential pivot if there is no direct transformation +\fBprojinfo\fP will consider any potential pivot if there is no direct transformation ( \fBif_no_direct_transformation\fP). If using the \fBnever\fP strategy, only direct transformations between the source and target CRS will be used. If using the \fBalways\fP strategy, intermediate CRS will be considered @@ -351,9 +363,20 @@ This is mostly to be used for early\-binding approaches. .UNINDENT .INDENT 0.0 .TP +.B \-\-authority name +Specify the name of the authority into which to restrict looks up for +objects, when specifying an object by name or when coordinate operations are +computed. The default is to allow all authorities. +.sp +When used with SQL output, this restricts the authorities to which intermediate +objects can belong to (the default is EPSG and PROJ). Note that the authority +of the \fI\%\-\-output\-id\fP option will also be implicitly added. +.UNINDENT +.INDENT 0.0 +.TP .B \-\-main\-db\-path path -Specify the name and path of the database to be used by projinfo. The -default is proj.db in the PROJ resource directories. +Specify the name and path of the database to be used by \fBprojinfo\fP\&. +The default is \fBproj.db\fP in the PROJ resource directories. .UNINDENT .INDENT 0.0 .TP @@ -377,6 +400,29 @@ with a likelihood of 70% to EPSG:32631 .UNINDENT .INDENT 0.0 .TP +.B \-\-dump\-db\-structure +New in version 8.1. + +.sp +Outputs the sequence of SQL statements to create a new empty valid auxiliary +database. This option can be specified as the only switch of the utility. +If also specifying a CRS object and the \fI\%\-\-output\-id\fP option, the +definition of the object as SQL statements will be appended. +.UNINDENT +.INDENT 0.0 +.TP +.B \-\-list\-crs [list\-crs\-filter] +New in version 8.1. + +.sp +Outputs a list (authority name:code and CRS name) of the filtered CRSs from the database. +If no filter is provided all authority names and types of non deprecated CRSs are dumped. +list\-crs\-filter is a comma separated combination of: allow_deprecated,geodetic,geocentric, +geographic,geographic_2d,geographic_3d,vertical,projected,compound. +Affected by options \fI\%\-\-authority\fP, \fI\%\-\-area\fP, \fI\%\-\-bbox\fP and \fI\%\-\-spatial\-test\fP +.UNINDENT +.INDENT 0.0 +.TP .B \-\-3d New in version 6.3. @@ -390,6 +436,28 @@ ellipsoidal height in metres, using the ellipsoid of the base geodetic CRS. .UNINDENT .INDENT 0.0 .TP +.B \-\-output\-id=AUTH:NAME +New in version 8.1. + +.sp +Identifier to assign to the object (for SQL output). +.sp +It is strongly recommended that new objects should not be added in common +registries, such as \fBEPSG\fP, \fBESRI\fP, \fBIAU\fP, etc. +Users should use a custom authority name instead. If a new object should be +added to the official EPSG registry, users are invited to follow the +procedure explained at \fI\%https://epsg.org/dataset\-change\-requests.html\fP\&. +.sp +Combined with \fI\%\-\-dump\-db\-structure\fP, users can create +auxiliary databases, instead of directly modifying the main \fBproj.db\fP database. +See the \fI\%example how to export to an auxiliary database\fP\&. +.sp +Those auxiliary databases can be specified through +\fBproj_context_set_database_path()\fP or the \fBPROJ_AUX_DB\fP +environment variable. +.UNINDENT +.INDENT 0.0 +.TP .B \-\-c\-ify For developers only. Modify the string output of the utility so that it is easy to put those strings in C/C++ code @@ -604,12 +672,148 @@ Output: .fi .UNINDENT .UNINDENT +.INDENT 0.0 +.IP 4. 3 +Exporting the SQL statements to insert a new CRS in an auxiliary database. +.UNINDENT +.INDENT 0.0 +.INDENT 3.5 +.sp +.nf +.ft C +# Get the SQL statements for a custom CRS +projinfo "+proj=merc +lat_ts=5 +datum=WGS84 +type=crs +title=my_crs" \-\-output\-id HOBU:MY_CRS \-o SQL \-q > my_crs.sql +cat my_crs.sql + +# Initialize an auxiliary database with the schema of the reference database +echo ".schema" | sqlite3 /path/to/proj.db | sqlite3 aux.db + +# Append the content of the definition of HOBU:MY_CRS +sqlite3 aux.db < my_crs.db + +# Check that everything works OK +projinfo \-\-aux\-db\-path aux.db HOBU:MY_CRS +.ft P +.fi +.UNINDENT +.UNINDENT +.sp +or more simply: +.INDENT 0.0 +.INDENT 3.5 +.sp +.nf +.ft C +# Create an auxiliary database with the definition of a custom CRS. +projinfo "+proj=merc +lat_ts=5 +datum=WGS84 +type=crs +title=my_crs" \-\-output\-id HOBU:MY_CRS \-\-dump\-db\-structure | sqlite3 aux.db + +# Check that everything works OK +projinfo \-\-aux\-db\-path aux.db HOBU:MY_CRS +.ft P +.fi +.UNINDENT +.UNINDENT +.sp +Output: +.INDENT 0.0 +.INDENT 3.5 +.sp +.nf +.ft C +INSERT INTO geodetic_crs VALUES(\(aqHOBU\(aq,\(aqGEODETIC_CRS_MY_CRS\(aq,\(aqunknown\(aq,\(aq\(aq,\(aqgeographic 2D\(aq,\(aqEPSG\(aq,\(aq6424\(aq,\(aqEPSG\(aq,\(aq6326\(aq,NULL,0); +INSERT INTO usage VALUES(\(aqHOBU\(aq,\(aqUSAGE_GEODETIC_CRS_MY_CRS\(aq,\(aqgeodetic_crs\(aq,\(aqHOBU\(aq,\(aqGEODETIC_CRS_MY_CRS\(aq,\(aqPROJ\(aq,\(aqEXTENT_UNKNOWN\(aq,\(aqPROJ\(aq,\(aqSCOPE_UNKNOWN\(aq); +INSERT INTO conversion VALUES(\(aqHOBU\(aq,\(aqCONVERSION_MY_CRS\(aq,\(aqunknown\(aq,\(aq\(aq,\(aqEPSG\(aq,\(aq9805\(aq,\(aqMercator (variant B)\(aq,\(aqEPSG\(aq,\(aq8823\(aq,\(aqLatitude of 1st standard parallel\(aq,5,\(aqEPSG\(aq,\(aq9122\(aq,\(aqEPSG\(aq,\(aq8802\(aq,\(aqLongitude of natural origin\(aq,0,\(aqEPSG\(aq,\(aq9122\(aq,\(aqEPSG\(aq,\(aq8806\(aq,\(aqFalse easting\(aq,0,\(aqEPSG\(aq,\(aq9001\(aq,\(aqEPSG\(aq,\(aq8807\(aq,\(aqFalse northing\(aq,0,\(aqEPSG\(aq,\(aq9001\(aq,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO usage VALUES(\(aqHOBU\(aq,\(aqUSAGE_CONVERSION_MY_CRS\(aq,\(aqconversion\(aq,\(aqHOBU\(aq,\(aqCONVERSION_MY_CRS\(aq,\(aqPROJ\(aq,\(aqEXTENT_UNKNOWN\(aq,\(aqPROJ\(aq,\(aqSCOPE_UNKNOWN\(aq); +INSERT INTO projected_crs VALUES(\(aqHOBU\(aq,\(aqMY_CRS\(aq,\(aqmy_crs\(aq,\(aq\(aq,\(aqEPSG\(aq,\(aq4400\(aq,\(aqHOBU\(aq,\(aqGEODETIC_CRS_MY_CRS\(aq,\(aqHOBU\(aq,\(aqCONVERSION_MY_CRS\(aq,NULL,0); +INSERT INTO usage VALUES(\(aqHOBU\(aq,\(aqUSAGE_PROJECTED_CRS_MY_CRS\(aq,\(aqprojected_crs\(aq,\(aqHOBU\(aq,\(aqMY_CRS\(aq,\(aqPROJ\(aq,\(aqEXTENT_UNKNOWN\(aq,\(aqPROJ\(aq,\(aqSCOPE_UNKNOWN\(aq); +.ft P +.fi +.UNINDENT +.UNINDENT +.INDENT 0.0 +.INDENT 3.5 +.sp +.nf +.ft C +PROJ.4 string: ++proj=merc +lat_ts=5 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +type=crs + +WKT2:2019 string: +PROJCRS["my_crs", + BASEGEOGCRS["unknown", + ENSEMBLE["World Geodetic System 1984 ensemble", + MEMBER["World Geodetic System 1984 (Transit)"], + MEMBER["World Geodetic System 1984 (G730)"], + MEMBER["World Geodetic System 1984 (G873)"], + MEMBER["World Geodetic System 1984 (G1150)"], + MEMBER["World Geodetic System 1984 (G1674)"], + MEMBER["World Geodetic System 1984 (G1762)"], + ELLIPSOID["WGS 84",6378137,298.257223563, + LENGTHUNIT["metre",1]], + ENSEMBLEACCURACY[2.0]], + PRIMEM["Greenwich",0, + ANGLEUNIT["degree",0.0174532925199433]], + ID["HOBU","GEODETIC_CRS_MY_CRS"]], + CONVERSION["unknown", + METHOD["Mercator (variant B)", + ID["EPSG",9805]], + PARAMETER["Latitude of 1st standard parallel",5, + ANGLEUNIT["degree",0.0174532925199433], + ID["EPSG",8823]], + PARAMETER["Longitude of natural origin",0, + ANGLEUNIT["degree",0.0174532925199433], + ID["EPSG",8802]], + PARAMETER["False easting",0, + LENGTHUNIT["metre",1], + ID["EPSG",8806]], + PARAMETER["False northing",0, + LENGTHUNIT["metre",1], + ID["EPSG",8807]]], + CS[Cartesian,2], + AXIS["(E)",east, + ORDER[1], + LENGTHUNIT["metre",1]], + AXIS["(N)",north, + ORDER[2], + LENGTHUNIT["metre",1]], + ID["HOBU","MY_CRS"]] +.ft P +.fi +.UNINDENT +.UNINDENT +.INDENT 0.0 +.IP 5. 3 +Get the WKT representation of EPSG:25832 in the WKT1:GDAL output format and on a single line +.UNINDENT +.INDENT 0.0 +.INDENT 3.5 +.sp +.nf +.ft C +projinfo \-o WKT1:GDAL \-\-single\-line EPSG:25832 +.ft P +.fi +.UNINDENT +.UNINDENT +.sp +Output: +.INDENT 0.0 +.INDENT 3.5 +.sp +.nf +.ft C +WKT1:GDAL string: +PROJCS["ETRS89 / UTM zone 32N",GEOGCS["ETRS89",DATUM["European_Terrestrial_Reference_System_1989",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6258"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4258"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",9],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","25832"]] +.ft P +.fi +.UNINDENT +.UNINDENT .SH SEE ALSO .sp \fBcs2cs(1)\fP, \fBcct(1)\fP, \fBgeod(1)\fP, \fBgie(1)\fP, \fBproj(1)\fP, \fBprojsync(1)\fP .SH BUGS .sp -A list of know bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP +A list of known bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP where new bug reports can be submitted to. .SH HOME PAGE .sp diff --git a/man/man1/projsync.1 b/man/man1/projsync.1 index 8099bee4..57141647 100644 --- a/man/man1/projsync.1 +++ b/man/man1/projsync.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "PROJSYNC" "1" "Mar 1, 2021" "8.0.0" "PROJ" +.TH "PROJSYNC" "1" "Jul 1, 2021" "8.1.0" "PROJ" .SH NAME projsync \- Downloading tool of resource files . @@ -44,7 +44,8 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] [\-\-source\-id ID] [\-\-area\-of\-use NAME] [\-\-file NAME] [\-\-all] [\-\-exclude\-world\-coverage] -[\-\-quiet] [\-\-dry\-run] [\-\-list\-files] +[\-\-quiet | \-\-verbose] [\-\-dry\-run] [\-\-list\-files] +[\-\-no\-version\-filtering] .in -2 .fi .sp @@ -67,7 +68,7 @@ the resource files. Defaults to the value set in proj\-ini .TP .B \-\-local\-geojson\-file FILENAME Defines the filename for the master GeoJSON files that references resources. -Defaults to ${endpoint}/files.geojson +Defaults to \fB${endpoint}/files.geojson\fP .UNINDENT .INDENT 0.0 .TP @@ -143,6 +144,14 @@ Quiet mode .UNINDENT .INDENT 0.0 .TP +.B \-\-verbose +New in version 8.1. + +.sp +Verbose mode (more than default) +.UNINDENT +.INDENT 0.0 +.TP .B \-\-dry\-run Simulate the behavior of the tool without downloading resource files. .UNINDENT @@ -151,6 +160,18 @@ Simulate the behavior of the tool without downloading resource files. .B \-\-list\-files List file names, with the source_id and area_of_use properties. .UNINDENT +.INDENT 0.0 +.TP +.B \-\-no\-version\-filtering +New in version 8.1. + +.sp +By default, projsync only downloads files that are compatible of +the PROJ_DATA.VERSION metadata of \fBproj.db\fP, taking into account the +\fBversion_added\fP and \fBversion_removed\fP properties of entries in \fBfiles.geojson\fP\&. +When specifying this switch, all files referenced in \fBfiles.geojson\fP +will be candidate (combined with other filters). +.UNINDENT .sp At least one of \fI\%\-\-list\-files\fP, \fI\%\-\-file\fP, \fI\%\-\-source\-id\fP, \fI\%\-\-area\-of\-use\fP, \fI\%\-\-bbox\fP or \fI\%\-\-all\fP must be specified. @@ -191,7 +212,7 @@ projsync \-\-source\-id fr_ign \-\-bbox 2,49,2,49 \fBcs2cs(1)\fP, \fBcct(1)\fP, \fBgeod(1)\fP, \fBgie(1)\fP, \fBproj(1)\fP, \fBprojinfo(1)\fP .SH BUGS .sp -A list of know bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP +A list of known bugs can be found at \fI\%https://github.com/OSGeo/PROJ/issues\fP where new bug reports can be submitted to. Bugs specific to resource files should be submitted to \fI\%https://github.com/OSGeo/PROJ\-data/issues\fP @@ -10,5 +10,5 @@ Description: Coordinate transformation software library Requires: Version: @VERSION@ Libs: -L${libdir} -lproj -Libs.private: @SQLITE3_LIBS@ @TIFF_LIBS@ @CURL_LIBS@ -lstdc++ +Libs.private: @SQLITE3_LIBS@ @TIFF_LIBS@ @CURL_LIBS@ @EXTRA_LIBS@ Cflags: -I${includedir} diff --git a/schemas/v0.3/projjson.schema.json b/schemas/v0.3/projjson.schema.json new file mode 100644 index 00000000..c347b3e1 --- /dev/null +++ b/schemas/v0.3/projjson.schema.json @@ -0,0 +1,997 @@ +{ + "$id": "https://proj.org/schemas/v0.3/projjson.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "description": "Schema for PROJJSON (v0.3)", + "$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" }, + { "$ref": "#/definitions/datum" }, + { "$ref": "#/definitions/datum_ensemble" }, + { "$ref": "#/definitions/ellipsoid" }, + { "$ref": "#/definitions/prime_meridian" }, + { "$ref": "#/definitions/single_operation" }, + { "$ref": "#/definitions/concatenated_operation" } + ], + + "definitions": { + + "abridged_transformation": { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["AbridgedTransformation"] }, + "name": { "type": "string" }, + "method": { "$ref": "#/definitions/method" }, + "parameters": { + "type": "array", + "items": { "$ref": "#/definitions/parameter_value" } + }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name", "method", "parameters" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + }, + + "axis": { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["Axis"] }, + "name": { "type": "string" }, + "abbreviation": { "type": "string" }, + "direction": { "type": "string", + "enum": [ "north", + "northNorthEast", + "northEast", + "eastNorthEast", + "east", + "eastSouthEast", + "southEast", + "southSouthEast", + "south", + "southSouthWest", + "southWest", + "westSouthWest", + "west", + "westNorthWest", + "northWest", + "northNorthWest", + "up", + "down", + "geocentricX", + "geocentricY", + "geocentricZ", + "columnPositive", + "columnNegative", + "rowPositive", + "rowNegative", + "displayRight", + "displayLeft", + "displayUp", + "displayDown", + "forward", + "aft", + "port", + "starboard", + "clockwise", + "counterClockwise", + "towards", + "awayFrom", + "future", + "past", + "unspecified" ] }, + "unit": { "$ref": "#/definitions/unit" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name", "abbreviation", "direction" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + }, + + "bbox": { + "type": "object", + "properties": { + "east_longitude": { "type": "number" }, + "west_longitude": { "type": "number" }, + "south_latitude": { "type": "number" }, + "north_latitude": { "type": "number" } + }, + "required" : [ "east_longitude", "west_longitude", + "south_latitude", "north_latitude" ], + "additionalProperties": false + }, + + "bound_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["BoundCRS"] }, + "name": { "type": "string" }, + "source_crs": { "$ref": "#/definitions/crs" }, + "target_crs": { "$ref": "#/definitions/crs" }, + "transformation": { "$ref": "#/definitions/abridged_transformation" }, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "source_crs", "target_crs", "transformation" ], + "additionalProperties": false + }, + + "compound_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["CompoundCRS"] }, + "name": { "type": "string" }, + "components": { + "type": "array", + "items": { "$ref": "#/definitions/crs" } + }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "components" ], + "additionalProperties": false + }, + + "concatenated_operation": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["ConcatenatedOperation"] }, + "name": { "type": "string" }, + "source_crs": { "$ref": "#/definitions/crs" }, + "target_crs": { "$ref": "#/definitions/crs" }, + "steps": { + "type": "array", + "items": { "$ref": "#/definitions/single_operation" } + }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "source_crs", "target_crs", "steps" ], + "additionalProperties": false + }, + + "conversion": { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["Conversion"] }, + "name": { "type": "string" }, + "method": { "$ref": "#/definitions/method" }, + "parameters": { + "type": "array", + "items": { "$ref": "#/definitions/parameter_value" } + }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name", "method" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + }, + + "coordinate_system": { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["CoordinateSystem"] }, + "name": { "type": "string" }, + "subtype": { "type": "string", + "enum": ["Cartesian", + "spherical", + "ellipsoidal", + "vertical", + "ordinal", + "parametric", + "TemporalDateTime", + "TemporalCount", + "TemporalMeasure"] }, + "axis": { + "type": "array", + "items": { "$ref": "#/definitions/axis" } + }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "subtype", "axis" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + }, + + "crs": { + "oneOf": [ + { "$ref": "#/definitions/bound_crs" }, + { "$ref": "#/definitions/compound_crs" }, + { "$ref": "#/definitions/derived_engineering_crs" }, + { "$ref": "#/definitions/derived_geodetic_crs" }, + { "$ref": "#/definitions/derived_parametric_crs" }, + { "$ref": "#/definitions/derived_projected_crs" }, + { "$ref": "#/definitions/derived_temporal_crs" }, + { "$ref": "#/definitions/derived_vertical_crs" }, + { "$ref": "#/definitions/engineering_crs" }, + { "$ref": "#/definitions/geodetic_crs" }, + { "$ref": "#/definitions/parametric_crs" }, + { "$ref": "#/definitions/projected_crs" }, + { "$ref": "#/definitions/temporal_crs" }, + { "$ref": "#/definitions/vertical_crs" } + ] + }, + + "datum": { + "oneOf": [ + { "$ref": "#/definitions/geodetic_reference_frame" }, + { "$ref": "#/definitions/vertical_reference_frame" }, + { "$ref": "#/definitions/dynamic_geodetic_reference_frame" }, + { "$ref": "#/definitions/dynamic_vertical_reference_frame" }, + { "$ref": "#/definitions/temporal_datum" }, + { "$ref": "#/definitions/parametric_datum" }, + { "$ref": "#/definitions/engineering_datum" } + ] + }, + + "datum_ensemble": { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["DatumEnsemble"] }, + "name": { "type": "string" }, + "members": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + } + }, + "ellipsoid": { "$ref": "#/definitions/ellipsoid" }, + "accuracy": { "type": "string" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name", "members", "accuracy" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + }, + + "derived_engineering_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", + "enum": ["DerivedEngineeringCRS"] }, + "name": { "type": "string" }, + "base_crs": { "$ref": "#/definitions/engineering_crs" }, + "conversion": { "$ref": "#/definitions/conversion" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], + "additionalProperties": false + }, + + "derived_geodetic_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", + "enum": ["DerivedGeodeticCRS", + "DerivedGeographicCRS"] }, + "name": { "type": "string" }, + "base_crs": { "$ref": "#/definitions/geodetic_crs" }, + "conversion": { "$ref": "#/definitions/conversion" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], + "additionalProperties": false + }, + + "derived_parametric_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", + "enum": ["DerivedParametricCRS"] }, + "name": { "type": "string" }, + "base_crs": { "$ref": "#/definitions/parametric_crs" }, + "conversion": { "$ref": "#/definitions/conversion" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], + "additionalProperties": false + }, + + "derived_projected_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", + "enum": ["DerivedProjectedCRS"] }, + "name": { "type": "string" }, + "base_crs": { "$ref": "#/definitions/projected_crs" }, + "conversion": { "$ref": "#/definitions/conversion" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], + "additionalProperties": false + }, + + "derived_temporal_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", + "enum": ["DerivedTemporalCRS"] }, + "name": { "type": "string" }, + "base_crs": { "$ref": "#/definitions/temporal_crs" }, + "conversion": { "$ref": "#/definitions/conversion" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], + "additionalProperties": false + }, + + "derived_vertical_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", + "enum": ["DerivedVerticalCRS"] }, + "name": { "type": "string" }, + "base_crs": { "$ref": "#/definitions/vertical_crs" }, + "conversion": { "$ref": "#/definitions/conversion" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], + "additionalProperties": false + }, + + "dynamic_geodetic_reference_frame": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/geodetic_reference_frame" }], + "properties": { + "type": { "type": "string", "enum": ["DynamicGeodeticReferenceFrame"] }, + "name": {}, + "anchor": {}, + "ellipsoid": {}, + "prime_meridian": {}, + "frame_reference_epoch": { "type": "number" }, + "deformation_model": { "type": "string" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "ellipsoid", "frame_reference_epoch" ], + "additionalProperties": false + }, + + "dynamic_vertical_reference_frame": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/vertical_reference_frame" }], + "properties": { + "type": { "type": "string", "enum": ["DynamicVerticalReferenceFrame"] }, + "name": {}, + "anchor": {}, + "frame_reference_epoch": { "type": "number" }, + "deformation_model": { "type": "string" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "frame_reference_epoch" ], + "additionalProperties": false + }, + + "ellipsoid": { + "type": "object", + "oneOf":[ + { + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["Ellipsoid"] }, + "name": { "type": "string" }, + "semi_major_axis": { "$ref": "#/definitions/value_in_metre_or_value_and_unit" }, + "semi_minor_axis": { "$ref": "#/definitions/value_in_metre_or_value_and_unit" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name", "semi_major_axis", "semi_minor_axis" ], + "additionalProperties": false + }, + { + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["Ellipsoid"] }, + "name": { "type": "string" }, + "semi_major_axis": { "$ref": "#/definitions/value_in_metre_or_value_and_unit" }, + "inverse_flattening": { "type": "number" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name", "semi_major_axis", "inverse_flattening" ], + "additionalProperties": false + }, + { + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["Ellipsoid"] }, + "name": { "type": "string" }, + "radius": { "$ref": "#/definitions/value_in_metre_or_value_and_unit" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name", "radius" ], + "additionalProperties": false + } + ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ] + }, + + "engineering_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["EngineeringCRS"] }, + "name": { "type": "string" }, + "datum": { "$ref": "#/definitions/engineering_datum" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "datum" ], + "additionalProperties": false + }, + + "engineering_datum": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["EngineeringDatum"] }, + "name": { "type": "string" }, + "anchor": { "type": "string" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name" ], + "additionalProperties": false + }, + + "geodetic_crs": { + "type": "object", + "properties": { + "type": { "type": "string", "enum": ["GeodeticCRS", "GeographicCRS"] }, + "name": { "type": "string" }, + "datum": { + "oneOf": [ + { "$ref": "#/definitions/geodetic_reference_frame" }, + { "$ref": "#/definitions/dynamic_geodetic_reference_frame" } + ] + }, + "datum_ensemble": { "$ref": "#/definitions/datum_ensemble" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name" ], + "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" } + ], + "additionalProperties": false + }, + + "geodetic_reference_frame": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["GeodeticReferenceFrame"] }, + "name": { "type": "string" }, + "anchor": { "type": "string" }, + "ellipsoid": { "$ref": "#/definitions/ellipsoid" }, + "prime_meridian": { "$ref": "#/definitions/prime_meridian" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "ellipsoid" ], + "additionalProperties": false + }, + + "id": { + "type": "object", + "properties": { + "authority": { "type": "string" }, + "code": { + "oneOf": [ { "type": "string" }, { "type": "integer" } ] + } + }, + "required" : [ "authority", "code" ], + "additionalProperties": false + }, + + "ids": { + "type": "array", + "items": { "$ref": "#/definitions/id" } + }, + + "method": { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["OperationMethod"]}, + "name": { "type": "string" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + }, + + "id_ids_mutually_exclusive": { + "not": { + "type": "object", + "required": [ "id", "ids" ] + } + }, + + "one_and_only_one_of_datum_or_datum_ensemble": { + "allOf": [ + { + "not": { + "type": "object", + "required": [ "datum", "datum_ensemble" ] + } + }, + { + "oneOf": [ + { "type": "object", "required": ["datum"] }, + { "type": "object", "required": ["datum_ensemble"] } + ] + } + ] + }, + + "object_usage": { + "anyOf": [ + { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "scope": { "type": "string" }, + "area": { "type": "string" }, + "bbox": { "$ref": "#/definitions/bbox" }, + "remarks": { "type": "string" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ] + }, + { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "usages": { "$ref": "#/definitions/usages" }, + "remarks": { "type": "string" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ] + } + ] + }, + + "parameter_value": { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["ParameterValue"] }, + "name": { "type": "string" }, + "value": { + "oneOf": [ + { "type": "string" }, + { "type": "number" } + ] + }, + "unit": { "$ref": "#/definitions/unit" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name", "value" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + }, + + "parametric_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["ParametricCRS"] }, + "name": { "type": "string" }, + "datum": { "$ref": "#/definitions/parametric_datum" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "datum" ], + "additionalProperties": false + }, + + "parametric_datum": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["ParametricDatum"] }, + "name": { "type": "string" }, + "anchor": { "type": "string" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name" ], + "additionalProperties": false + }, + + "prime_meridian": { + "type": "object", + "properties": { + "$schema" : { "type": "string" }, + "type": { "type": "string", "enum": ["PrimeMeridian"] }, + "name": { "type": "string" }, + "longitude": { "$ref": "#/definitions/value_in_degree_or_value_and_unit" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "name" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + }, + + "single_operation": { + "oneOf": [ + { "$ref": "#/definitions/conversion" }, + { "$ref": "#/definitions/transformation" } + ] + }, + + "projected_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", + "enum": ["ProjectedCRS"] }, + "name": { "type": "string" }, + "base_crs": { "$ref": "#/definitions/geodetic_crs" }, + "conversion": { "$ref": "#/definitions/conversion" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], + "additionalProperties": false + }, + + "temporal_crs": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["TemporalCRS"] }, + "name": { "type": "string" }, + "datum": { "$ref": "#/definitions/temporal_datum" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "datum" ], + "additionalProperties": false + }, + + "temporal_datum": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["TemporalDatum"] }, + "name": { "type": "string" }, + "calendar": { "type": "string" }, + "time_origin": { "type": "string" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "calendar" ], + "additionalProperties": false + }, + + "transformation": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["Transformation"] }, + "name": { "type": "string" }, + "source_crs": { "$ref": "#/definitions/crs" }, + "target_crs": { "$ref": "#/definitions/crs" }, + "interpolation_crs": { "$ref": "#/definitions/crs" }, + "method": { "$ref": "#/definitions/method" }, + "parameters": { + "type": "array", + "items": { "$ref": "#/definitions/parameter_value" } + }, + "accuracy": { "type": "string" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name", "source_crs", "target_crs", "method", "parameters" ], + "additionalProperties": false + }, + + "unit": { + "oneOf": [ + { + "type": "string", + "enum": ["metre", "degree", "unity"] + }, + { + "type": "object", + "properties": { + "type": { "type": "string", + "enum": ["LinearUnit", "AngularUnit", "ScaleUnit", + "TimeUnit", "ParametricUnit", "Unit"] }, + "name": { "type": "string" }, + "conversion_factor": { "type": "number" }, + "id": { "$ref": "#/definitions/id" }, + "ids": { "$ref": "#/definitions/ids" } + }, + "required" : [ "type", "name" ], + "allOf": [ + { "$ref": "#/definitions/id_ids_mutually_exclusive" } + ], + "additionalProperties": false + } + ] + }, + + "usages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "scope": { "type": "string" }, + "area": { "type": "string" }, + "bbox": { "$ref": "#/definitions/bbox" } + }, + "additionalProperties": false + } + }, + + "value_and_unit": { + "type": "object", + "properties": { + "value": { "type": "number" }, + "unit": { "$ref": "#/definitions/unit" } + }, + "required" : [ "value", "unit" ], + "additionalProperties": false + }, + + "value_in_degree_or_value_and_unit": { + "oneOf": [ + { "type": "number" }, + { "$ref": "#/definitions/value_and_unit" } + ] + }, + + "value_in_metre_or_value_and_unit": { + "oneOf": [ + { "type": "number" }, + { "$ref": "#/definitions/value_and_unit" } + ] + }, + + "vertical_crs": { + "type": "object", + "properties": { + "type": { "type": "string", "enum": ["VerticalCRS"] }, + "name": { "type": "string" }, + "datum": { + "oneOf": [ + { "$ref": "#/definitions/vertical_reference_frame" }, + { "$ref": "#/definitions/dynamic_vertical_reference_frame" } + ] + }, + "datum_ensemble": { "$ref": "#/definitions/datum_ensemble" }, + "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, + "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": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name"], + "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" } + ], + "additionalProperties": false + }, + + "vertical_reference_frame": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/object_usage" }], + "properties": { + "type": { "type": "string", "enum": ["VerticalReferenceFrame"] }, + "name": { "type": "string" }, + "anchor": { "type": "string" }, + "$schema" : {}, + "scope": {}, + "area": {}, + "bbox": {}, + "usages": {}, + "remarks": {}, + "id": {}, "ids": {} + }, + "required" : [ "name" ], + "additionalProperties": false + } + + } +} diff --git a/scripts/build_db.py b/scripts/build_db.py index ec4b7397..772b2dad 100755 --- a/scripts/build_db.py +++ b/scripts/build_db.py @@ -650,8 +650,12 @@ def fill_grid_transformation(proj_db_cursor): ) #proj_db_cursor.execute("INSERT INTO coordinate_operation VALUES (?,?,'grid_transformation')", (EPSG_AUTHORITY, code)) - proj_db_cursor.execute('INSERT INTO grid_transformation VALUES (' + - '?,?,?, ?, ?,?,?, ?,?, ?,?, ?, ?,?,?,?, ?,?,?,?, ?,?, ?,?)', arg) + try: + proj_db_cursor.execute('INSERT INTO grid_transformation VALUES (' + + '?,?,?, ?, ?,?,?, ?,?, ?,?, ?, ?,?,?,?, ?,?,?,?, ?,?, ?,?)', arg) + except sqlite3.IntegrityError as e: + print(arg) + raise def fill_other_transformation(proj_db_cursor): # 9601: Longitude rotation diff --git a/scripts/build_esri_projection_mapping.py b/scripts/build_esri_projection_mapping.py index 3f3d4667..30f4ad6c 100644 --- a/scripts/build_esri_projection_mapping.py +++ b/scripts/build_esri_projection_mapping.py @@ -553,6 +553,13 @@ config_str = """ - XY_Plane_Rotation: EPSG_NAME_PARAMETER_ANGLE_RECTIFIED_TO_SKEW_GRID - Goode_Homolosine: + - WKT2_name: PROJ_WKT2_NAME_METHOD_GOODE_HOMOLOSINE + Params: + - False_Easting: EPSG_NAME_PARAMETER_FALSE_EASTING + - False_Northing: EPSG_NAME_PARAMETER_FALSE_NORTHING + - Central_Meridian: EPSG_NAME_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN + - Option: 0.0 + - WKT2_name: PROJ_WKT2_NAME_METHOD_INTERRUPTED_GOODE_HOMOLOSINE Params: - False_Easting: EPSG_NAME_PARAMETER_FALSE_EASTING diff --git a/scripts/create_c_api_projections.py b/scripts/create_c_api_projections.py index 1682b160..323b54ed 100755 --- a/scripts/create_c_api_projections.py +++ b/scripts/create_c_api_projections.py @@ -167,8 +167,11 @@ for sectiondef in compounddef.iter('sectiondef'): test_cppfile.write("{\n") test_cppfile.write(" auto projCRS = proj_create_conversion_" + c_shortName + "(\n") test_cppfile.write(" m_ctxt") - for param in params: - test_cppfile.write(", 0") + if c_shortName == 'utm': + test_cppfile.write(", 1") + else: + for param in params: + test_cppfile.write(", 0") if has_angle: test_cppfile.write(", \"Degree\", 0.0174532925199433") if has_linear: @@ -184,4 +187,4 @@ cppfile.write("/* END: Generated by scripts/create_c_api_projections.py*/\n") test_cppfile.write("/* END: Generated by scripts/create_c_api_projections.py*/\n") -print('projections.h and .cpp, and test_projections.cpp have been generated. Manually merge them now')
\ No newline at end of file +print('projections.h and .cpp, and test_projections.cpp have been generated. Manually merge them now') diff --git a/scripts/reference_exported_symbols.txt b/scripts/reference_exported_symbols.txt index 4f853090..9b84c09b 100644 --- a/scripts/reference_exported_symbols.txt +++ b/scripts/reference_exported_symbols.txt @@ -98,6 +98,7 @@ osgeo::proj::crs::BoundCRS::~BoundCRS() osgeo::proj::crs::BoundCRS::create(dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::Transformation> > const&) osgeo::proj::crs::BoundCRS::createFromNadgrids(dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, std::string const&) osgeo::proj::crs::BoundCRS::createFromTOWGS84(dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, std::vector<double, std::allocator<double> > const&) +osgeo::proj::crs::BoundCRS::create(osgeo::proj::util::PropertyMap const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::Transformation> > const&) osgeo::proj::crs::BoundCRS::hubCRS() const osgeo::proj::crs::BoundCRS::transformation() const osgeo::proj::crs::CompoundCRS::componentReferenceSystems() const @@ -131,6 +132,7 @@ osgeo::proj::crs::DerivedGeodeticCRS::~DerivedGeodeticCRS() osgeo::proj::crs::DerivedGeodeticCRS::_exportToWKT(osgeo::proj::io::WKTFormatter*) const osgeo::proj::crs::DerivedGeographicCRS::baseCRS() const osgeo::proj::crs::DerivedGeographicCRS::create(osgeo::proj::util::PropertyMap const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::GeodeticCRS> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::Conversion> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::cs::EllipsoidalCS> > const&) +osgeo::proj::crs::DerivedGeographicCRS::demoteTo2D(std::string const&, std::shared_ptr<osgeo::proj::io::DatabaseContext> const&) const osgeo::proj::crs::DerivedGeographicCRS::~DerivedGeographicCRS() osgeo::proj::crs::DerivedProjectedCRS::baseCRS() const osgeo::proj::crs::DerivedProjectedCRS::create(osgeo::proj::util::PropertyMap const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::ProjectedCRS> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::Conversion> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::cs::CoordinateSystem> > const&) diff --git a/src/4D_api.cpp b/src/4D_api.cpp index 8b676f9b..9c226647 100644 --- a/src/4D_api.cpp +++ b/src/4D_api.cpp @@ -243,7 +243,15 @@ int pj_get_suggested_operation(PJ_CONTEXT*, // onshore. So in a general way, prefer a onshore area to a // offshore one. if( iBest < 0 || - (alt.accuracy >= 0 && alt.accuracy < bestAccuracy && + (alt.accuracy >= 0 && + (alt.accuracy < bestAccuracy || + // If two operations have the same accuracy, use the one that + // is contained within a larger one + (alt.accuracy == bestAccuracy && + alt.minxSrc > opList[iBest].minxSrc && + alt.minySrc > opList[iBest].minySrc && + alt.maxxSrc < opList[iBest].maxxSrc && + alt.maxySrc < opList[iBest].maxySrc)) && !alt.isOffshore) ) { iBest = i; bestAccuracy = alt.accuracy; @@ -776,11 +784,8 @@ PJ *pj_create_internal (PJ_CONTEXT *ctx, const char *definition) { It may even use free formatting "proj = utm; zone =32 ellps= GRS80". Note that the semicolon separator is allowed, but not required. **************************************************************************************/ - PJ *P; char *args, **argv; size_t argc, n; - int ret; - int allow_init_epsg; if (nullptr==ctx) ctx = pj_get_default_ctx (); @@ -808,19 +813,11 @@ PJ *pj_create_internal (PJ_CONTEXT *ctx, const char *definition) { return nullptr; } - /* ...and let pj_init_ctx do the hard work */ - /* New interface: forbid init=epsg:XXXX syntax by default */ - allow_init_epsg = proj_context_get_use_proj4_init_rules(ctx, FALSE); - P = pj_init_ctx_with_allow_init_epsg (ctx, (int) argc, argv, allow_init_epsg); + PJ* P = pj_create_argv_internal (ctx, (int) argc, argv); free (argv); free (args); - /* Support cs2cs-style modifiers */ - ret = cs2cs_emulation_setup (P); - if (0==ret) - return proj_destroy (P); - return P; } @@ -859,11 +856,8 @@ indicator, as in {"+proj=utm", "+zone=32"}, or leave it out, as in {"proj=utm", /*************************************************************************************/ PJ *pj_create_argv_internal (PJ_CONTEXT *ctx, int argc, char **argv) { /************************************************************************************** -Same as proj_create_argv() but calls pj_create_internal() instead of proj_create() internally +For use by pipeline init function. **************************************************************************************/ - PJ *P; - const char *c; - if (nullptr==ctx) ctx = pj_get_default_ctx (); if (nullptr==argv) { @@ -871,16 +865,16 @@ Same as proj_create_argv() but calls pj_create_internal() instead of proj_create return nullptr; } - /* We assume that free format is used, and build a full proj_create compatible string */ - c = pj_make_args (argc, argv); - if (nullptr==c) { - proj_context_errno_set(ctx, PROJ_ERR_OTHER /*ENOMEM*/); - return nullptr; - } + /* ...and let pj_init_ctx do the hard work */ + /* New interface: forbid init=epsg:XXXX syntax by default */ + const int allow_init_epsg = proj_context_get_use_proj4_init_rules(ctx, FALSE); + PJ* P = pj_init_ctx_with_allow_init_epsg (ctx, argc, argv, allow_init_epsg); - P = pj_create_internal (ctx, c); + /* Support cs2cs-style modifiers */ + int ret = cs2cs_emulation_setup (P); + if (0==ret) + return proj_destroy (P); - free ((char *) c); return P; } diff --git a/src/Makefile.am b/src/Makefile.am index 2332a750..bae922d5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -50,7 +50,7 @@ geodtest_LDADD = libproj.la lib_LTLIBRARIES = libproj.la -libproj_la_LDFLAGS = -no-undefined -version-info 22:0:0 +libproj_la_LDFLAGS = -no-undefined -version-info 23:0:1 libproj_la_LIBADD = @SQLITE3_LIBS@ @TIFF_LIBS@ @CURL_LIBS@ libproj_la_SOURCES = \ @@ -181,6 +181,7 @@ libproj_la_SOURCES = \ projections/putp6.cpp \ projections/qsc.cpp \ projections/robin.cpp \ + projections/s2.cpp \ projections/sch.cpp \ projections/sts.cpp \ projections/urm5.cpp \ diff --git a/src/bin_cct.cmake b/src/bin_cct.cmake index b36f60de..39dfb2bc 100644 --- a/src/bin_cct.cmake +++ b/src/bin_cct.cmake @@ -12,7 +12,7 @@ target_link_libraries(cct PRIVATE ${PROJ_LIBRARIES}) target_compile_options(cct PRIVATE ${PROJ_CXX_WARN_FLAGS}) install(TARGETS cct - RUNTIME DESTINATION ${BINDIR}) + DESTINATION ${BINDIR}) if(MSVC AND BUILD_SHARED_LIBS) target_compile_definitions(cct PRIVATE PROJ_MSVC_DLL_IMPORT=1) diff --git a/src/bin_cs2cs.cmake b/src/bin_cs2cs.cmake index e3d35871..2fc8a6ad 100644 --- a/src/bin_cs2cs.cmake +++ b/src/bin_cs2cs.cmake @@ -11,7 +11,7 @@ target_link_libraries(cs2cs PRIVATE ${PROJ_LIBRARIES}) target_compile_options(cs2cs PRIVATE ${PROJ_CXX_WARN_FLAGS}) install(TARGETS cs2cs - RUNTIME DESTINATION ${BINDIR}) + DESTINATION ${BINDIR}) if(MSVC AND BUILD_SHARED_LIBS) target_compile_definitions(cs2cs PRIVATE PROJ_MSVC_DLL_IMPORT=1) diff --git a/src/bin_geod.cmake b/src/bin_geod.cmake index 98dbc4ee..4ec28b04 100644 --- a/src/bin_geod.cmake +++ b/src/bin_geod.cmake @@ -13,7 +13,7 @@ target_link_libraries(geod PRIVATE ${PROJ_LIBRARIES}) target_compile_options(geod PRIVATE ${PROJ_CXX_WARN_FLAGS}) install(TARGETS geod - RUNTIME DESTINATION ${BINDIR}) + DESTINATION ${BINDIR}) if(MSVC AND BUILD_SHARED_LIBS) target_compile_definitions(geod PRIVATE PROJ_MSVC_DLL_IMPORT=1) diff --git a/src/bin_gie.cmake b/src/bin_gie.cmake index 5cf9d86d..a26ead3e 100644 --- a/src/bin_gie.cmake +++ b/src/bin_gie.cmake @@ -12,7 +12,7 @@ target_link_libraries(gie PRIVATE ${PROJ_LIBRARIES}) target_compile_options(gie PRIVATE ${PROJ_CXX_WARN_FLAGS}) install(TARGETS gie - RUNTIME DESTINATION ${BINDIR}) + DESTINATION ${BINDIR}) if(MSVC AND BUILD_SHARED_LIBS) target_compile_definitions(gie PRIVATE PROJ_MSVC_DLL_IMPORT=1) diff --git a/src/bin_proj.cmake b/src/bin_proj.cmake index d2513386..b5a4c140 100644 --- a/src/bin_proj.cmake +++ b/src/bin_proj.cmake @@ -14,7 +14,7 @@ target_link_libraries(binproj PRIVATE ${PROJ_LIBRARIES}) target_compile_options(binproj PRIVATE ${PROJ_CXX_WARN_FLAGS}) install(TARGETS binproj - RUNTIME DESTINATION ${BINDIR}) + DESTINATION ${BINDIR}) if(MSVC AND BUILD_SHARED_LIBS) target_compile_definitions(binproj PRIVATE PROJ_MSVC_DLL_IMPORT=1) diff --git a/src/bin_projinfo.cmake b/src/bin_projinfo.cmake index 1b8ed637..6d123436 100644 --- a/src/bin_projinfo.cmake +++ b/src/bin_projinfo.cmake @@ -10,7 +10,7 @@ target_link_libraries(binprojinfo PRIVATE ${PROJ_LIBRARIES}) target_compile_options(binprojinfo PRIVATE ${PROJ_CXX_WARN_FLAGS}) install(TARGETS binprojinfo - RUNTIME DESTINATION ${BINDIR}) + DESTINATION ${BINDIR}) if(MSVC AND BUILD_SHARED_LIBS) target_compile_definitions(binprojinfo PRIVATE PROJ_MSVC_DLL_IMPORT=1) diff --git a/src/bin_projsync.cmake b/src/bin_projsync.cmake index ea6bb09c..6486b5d4 100644 --- a/src/bin_projsync.cmake +++ b/src/bin_projsync.cmake @@ -8,13 +8,9 @@ set_target_properties(bin_projsync OUTPUT_NAME projsync) target_link_libraries(bin_projsync PRIVATE ${PROJ_LIBRARIES}) target_compile_options(bin_projsync PRIVATE ${PROJ_CXX_WARN_FLAGS}) -if(NLOHMANN_JSON STREQUAL "external") - target_compile_definitions(bin_projsync PRIVATE EXTERNAL_NLOHMANN_JSON) - target_link_libraries(bin_projsync PRIVATE nlohmann_json::nlohmann_json) -endif() install(TARGETS bin_projsync - RUNTIME DESTINATION ${BINDIR}) + DESTINATION ${BINDIR}) if(MSVC AND BUILD_SHARED_LIBS) target_compile_definitions(bin_projsync PRIVATE PROJ_MSVC_DLL_IMPORT=1) diff --git a/src/ctx.cpp b/src/ctx.cpp index cc9df6c3..5ec10b9e 100644 --- a/src/ctx.cpp +++ b/src/ctx.cpp @@ -116,17 +116,6 @@ projCppContext* pj_ctx::get_cpp_context() return cpp_context; } -/**************************************************************************/ -/* safeAutoCloseDbIfNeeded() */ -/**************************************************************************/ - -void pj_ctx::safeAutoCloseDbIfNeeded() -{ - if (cpp_context) { - cpp_context->autoCloseDbIfNeeded(); - } -} - /************************************************************************/ /* set_search_paths() */ /************************************************************************/ diff --git a/src/dmstor.cpp b/src/dmstor.cpp index e65d4884..eeff1841 100644 --- a/src/dmstor.cpp +++ b/src/dmstor.cpp @@ -20,6 +20,12 @@ vm[] = { .0002908882086657216, .0000048481368110953599 }; +/* byte sequence for Degree Sign U+00B0 in UTF-8. */ + static constexpr char +DEG_SIGN1 = '\xc2'; + static constexpr char +DEG_SIGN2 = '\xb0'; + double dmstor(const char *is, char **rs) { return dmstor_ctx( pj_get_default_ctx(), is, rs ); @@ -29,57 +35,76 @@ dmstor(const char *is, char **rs) { dmstor_ctx(PJ_CONTEXT *ctx, const char *is, char **rs) { int n, nl; char *s, work[MAX_WORK]; - const char* p; + const char* p; double v, tv; if (rs) *rs = (char *)is; - /* copy sting into work space */ + /* copy string into work space */ while (isspace(*is)) ++is; n = MAX_WORK; s = work; p = (char *)is; - while (isgraph(*p) && --n) + + /* + * Copy characters into work until we hit a non-printable character or run + * out of space in the buffer. Make a special exception for the bytes of + * the Degree Sign in UTF-8. + * + * It is possible that a really odd input (like lots of leading zeros) + * could be truncated in copying into work. But ... + */ + while ((isgraph(*p) || *p == DEG_SIGN1 || *p == DEG_SIGN2) && --n) *s++ = *p++; *s = '\0'; - /* it is possible that a really odd input (like lots of leading - zeros) could be truncated in copying into work. But ... */ int sign = *(s = work); if (sign == '+' || sign == '-') s++; else sign = '+'; v = 0.; - for (nl = 0 ; nl < 3 ; nl = n + 1 ) { + for (nl = 0 ; nl < 3 ; nl = n + 1) { if (!(isdigit(*s) || *s == '.')) break; if ((tv = proj_strtod(s, &s)) == HUGE_VAL) return tv; - switch (*s) { - case 'D': case 'd': - n = 0; break; - case '\'': - n = 1; break; - case '"': - n = 2; break; - case 'r': case 'R': + int adv = 1; + + if (*s == 'D' || *s == 'd' || *s == DEG_SIGN2) { + /* + * Accept \xb0 as a single-byte degree symbol. This byte is the + * degree symbol in various single-byte encodings: multiple ISO + * 8859 parts, several Windows code pages and others. + */ + n = 0; + } else if (*s == '\'') { + n = 1; + } else if (*s == '"') { + n = 2; + } else if (s[0] == DEG_SIGN1 && s[1] == DEG_SIGN2) { + /* degree symbol in UTF-8 */ + n = 0; + adv = 2; + } else if (*s == 'r' || *s == 'R') { if (nl) { proj_context_errno_set( ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE ); return HUGE_VAL; } ++s; v = tv; - goto skip; - default: + n = 4; + continue; + } else { v += tv * vm[nl]; - skip: n = 4; + n = 4; continue; } + if (n < nl) { proj_context_errno_set( ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE ); return HUGE_VAL; } v += tv * vm[n]; - ++s; + s += adv; } - /* postfix sign */ + /* postfix sign */ if (*s && (p = strchr(sym, *s))) { sign = (p - sym) >= 4 ? '-' : '+'; ++s; diff --git a/src/fwd.cpp b/src/fwd.cpp index 97ba5999..8583a6e7 100644 --- a/src/fwd.cpp +++ b/src/fwd.cpp @@ -38,9 +38,12 @@ #define OUTPUT_UNITS P->right -static PJ_COORD fwd_prepare (PJ *P, PJ_COORD coo) { +static void fwd_prepare (PJ *P, PJ_COORD& coo) { if (HUGE_VAL==coo.v[0] || HUGE_VAL==coo.v[1] || HUGE_VAL==coo.v[2]) - return proj_coord_error (); + { + coo = proj_coord_error (); + return; + } /* The helmert datum shift will choke unless it gets a sensible 4D coordinate */ if (HUGE_VAL==coo.v[2] && P->helmert) coo.v[2] = 0.0; @@ -56,13 +59,15 @@ static PJ_COORD fwd_prepare (PJ *P, PJ_COORD coo) { { proj_log_error(P, _("Invalid latitude")); proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_INVALID_COORD); - return proj_coord_error (); + coo = proj_coord_error (); + return; } if (coo.lp.lam > 10 || coo.lp.lam < -10) { proj_log_error(P, _("Invalid longitude")); proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_INVALID_COORD); - return proj_coord_error (); + coo = proj_coord_error (); + return; } @@ -89,7 +94,7 @@ static PJ_COORD fwd_prepare (PJ *P, PJ_COORD coo) { coo = proj_trans (P->cart, PJ_INV, coo); /* Go back to angular using local ellps */ } if (coo.lp.lam==HUGE_VAL) - return coo; + return; if (P->vgridshift) coo = proj_trans (P->vgridshift, PJ_FWD, coo); /* Go orthometric from geometric */ @@ -100,18 +105,18 @@ static PJ_COORD fwd_prepare (PJ *P, PJ_COORD coo) { if (0==P->over) coo.lp.lam = adjlon(coo.lp.lam); - return coo; + return; } /* We do not support gridshifts on cartesian input */ if (INPUT_UNITS==PJ_IO_UNITS_CARTESIAN && P->helmert) - return proj_trans (P->helmert, PJ_INV, coo); - return coo; + coo = proj_trans (P->helmert, PJ_INV, coo); + return; } -static PJ_COORD fwd_finalize (PJ *P, PJ_COORD coo) { +static void fwd_finalize (PJ *P, PJ_COORD& coo) { switch (OUTPUT_UNITS) { @@ -161,29 +166,28 @@ static PJ_COORD fwd_finalize (PJ *P, PJ_COORD coo) { if (P->axisswap) coo = proj_trans (P->axisswap, PJ_FWD, coo); - - return coo; } -static PJ_COORD error_or_coord(PJ *P, PJ_COORD coord, int last_errno) { - if (proj_errno(P)) +static inline PJ_COORD error_or_coord(PJ *P, PJ_COORD coord, int last_errno) { + if (P->ctx->last_errno) return proj_coord_error(); - proj_errno_restore(P, last_errno); + P->ctx->last_errno = last_errno; + return coord; } PJ_XY pj_fwd(PJ_LP lp, PJ *P) { - int last_errno; PJ_COORD coo = {{0,0,0,0}}; coo.lp = lp; - last_errno = proj_errno_reset(P); + const int last_errno = P->ctx->last_errno; + P->ctx->last_errno = 0; if (!P->skip_fwd_prepare) - coo = fwd_prepare (P, coo); + fwd_prepare (P, coo); if (HUGE_VAL==coo.v[0] || HUGE_VAL==coo.v[1]) return proj_coord_error ().xy; @@ -202,7 +206,7 @@ PJ_XY pj_fwd(PJ_LP lp, PJ *P) { return proj_coord_error ().xy; if (!P->skip_fwd_finalize) - coo = fwd_finalize (P, coo); + fwd_finalize (P, coo); return error_or_coord(P, coo, last_errno).xy; } @@ -210,14 +214,14 @@ PJ_XY pj_fwd(PJ_LP lp, PJ *P) { PJ_XYZ pj_fwd3d(PJ_LPZ lpz, PJ *P) { - int last_errno; PJ_COORD coo = {{0,0,0,0}}; coo.lpz = lpz; - last_errno = proj_errno_reset(P); + const int last_errno = P->ctx->last_errno; + P->ctx->last_errno = 0; if (!P->skip_fwd_prepare) - coo = fwd_prepare (P, coo); + fwd_prepare (P, coo); if (HUGE_VAL==coo.v[0]) return proj_coord_error ().xyz; @@ -236,7 +240,7 @@ PJ_XYZ pj_fwd3d(PJ_LPZ lpz, PJ *P) { return proj_coord_error ().xyz; if (!P->skip_fwd_finalize) - coo = fwd_finalize (P, coo); + fwd_finalize (P, coo); return error_or_coord(P, coo, last_errno).xyz; } @@ -244,10 +248,12 @@ PJ_XYZ pj_fwd3d(PJ_LPZ lpz, PJ *P) { PJ_COORD pj_fwd4d (PJ_COORD coo, PJ *P) { - int last_errno = proj_errno_reset(P); + + const int last_errno = P->ctx->last_errno; + P->ctx->last_errno = 0; if (!P->skip_fwd_prepare) - coo = fwd_prepare (P, coo); + fwd_prepare (P, coo); if (HUGE_VAL==coo.v[0]) return proj_coord_error (); @@ -266,7 +272,7 @@ PJ_COORD pj_fwd4d (PJ_COORD coo, PJ *P) { return proj_coord_error (); if (!P->skip_fwd_finalize) - coo = fwd_finalize (P, coo); + fwd_finalize (P, coo); return error_or_coord(P, coo, last_errno); } diff --git a/src/geodesic.c b/src/geodesic.c index 65ca1458..c8835a7a 100644 --- a/src/geodesic.c +++ b/src/geodesic.c @@ -56,7 +56,7 @@ static unsigned digits, maxit1, maxit2; static real epsilon, realmin, pi, degree, NaN, tiny, tol0, tol1, tol2, tolb, xthresh; -static void Init() { +static void Init(void) { if (!init) { digits = DBL_MANT_DIG; epsilon = DBL_EPSILON; @@ -210,6 +210,7 @@ static real atan2dx(real y, real x) { case 1: ang = (y >= 0 ? 180 : -180) - ang; break; case 2: ang = 90 - ang; break; case 3: ang = -90 + ang; break; + default: break; } return ang; } diff --git a/src/grids.cpp b/src/grids.cpp index 3bde3cad..c49cbb8f 100644 --- a/src/grids.cpp +++ b/src/grids.cpp @@ -76,6 +76,13 @@ static void swap_words(void *dataIn, size_t word_size, size_t word_count) // --------------------------------------------------------------------------- +void ExtentAndRes::computeInvRes() { + invResX = 1.0 / resX; + invResY = 1.0 / resY; +} + +// --------------------------------------------------------------------------- + bool ExtentAndRes::fullWorldLongitude() const { return isGeographic && east - west + resX >= 2 * M_PI - 1e-10; } @@ -126,6 +133,7 @@ static ExtentAndRes globalExtent() { extent.north = M_PI / 2; extent.resX = M_PI; extent.resY = M_PI / 2; + extent.computeInvRes(); return extent; } @@ -249,6 +257,7 @@ GTXVerticalShiftGrid *GTXVerticalShiftGrid::open(PJ_CONTEXT *ctx, extent.resY = ystep * DEG_TO_RAD; extent.east = (xorigin + xstep * (columns - 1)) * DEG_TO_RAD; extent.north = (yorigin + ystep * (rows - 1)) * DEG_TO_RAD; + extent.computeInvRes(); return new GTXVerticalShiftGrid(ctx, std::move(fp), name, columns, rows, extent); @@ -328,54 +337,30 @@ class BlockCache { public: void insert(uint32_t ifdIdx, uint32_t blockNumber, const std::vector<unsigned char> &data); - std::shared_ptr<std::vector<unsigned char>> get(uint32_t ifdIdx, - uint32_t blockNumber); + const std::vector<unsigned char> *get(uint32_t ifdIdx, + uint32_t blockNumber); private: - struct Key { - uint32_t ifdIdx; - uint32_t blockNumber; - - Key(uint32_t ifdIdxIn, uint32_t blockNumberIn) - : ifdIdx(ifdIdxIn), blockNumber(blockNumberIn) {} - bool operator==(const Key &other) const { - return ifdIdx == other.ifdIdx && blockNumber == other.blockNumber; - } - }; - - struct KeyHasher { - std::size_t operator()(const Key &k) const { - return k.ifdIdx ^ (k.blockNumber << 16) ^ (k.blockNumber >> 16); - } - }; + typedef uint64_t Key; static constexpr int NUM_BLOCKS_AT_CROSSING_TILES = 4; static constexpr int MAX_SAMPLE_COUNT = 3; - lru11::Cache< - Key, std::shared_ptr<std::vector<unsigned char>>, lru11::NullLock, - std::unordered_map< - Key, - typename std::list<lru11::KeyValuePair< - Key, std::shared_ptr<std::vector<unsigned char>>>>::iterator, - KeyHasher>> - cache_{NUM_BLOCKS_AT_CROSSING_TILES * MAX_SAMPLE_COUNT}; + lru11::Cache<Key, std::vector<unsigned char>, lru11::NullLock> cache_{ + NUM_BLOCKS_AT_CROSSING_TILES * MAX_SAMPLE_COUNT}; }; // --------------------------------------------------------------------------- void BlockCache::insert(uint32_t ifdIdx, uint32_t blockNumber, const std::vector<unsigned char> &data) { - cache_.insert(Key(ifdIdx, blockNumber), - std::make_shared<std::vector<unsigned char>>(data)); + cache_.insert((static_cast<uint64_t>(ifdIdx) << 32) | blockNumber, data); } // --------------------------------------------------------------------------- -std::shared_ptr<std::vector<unsigned char>> -BlockCache::get(uint32_t ifdIdx, uint32_t blockNumber) { - std::shared_ptr<std::vector<unsigned char>> ret; - cache_.tryGet(Key(ifdIdx, blockNumber), ret); - return ret; +const std::vector<unsigned char> *BlockCache::get(uint32_t ifdIdx, + uint32_t blockNumber) { + return cache_.getPtr((static_cast<uint64_t>(ifdIdx) << 32) | blockNumber); } // --------------------------------------------------------------------------- @@ -388,7 +373,7 @@ class GTiffGrid : public Grid { uint32_t m_ifdIdx; TIFFDataType m_dt; uint16_t m_samplesPerPixel; - uint16_t m_planarConfig; + uint16_t m_planarConfig; // set to -1 if m_samplesPerPixel == 1 bool m_bottomUp; toff_t m_dirOffset; bool m_tiled; @@ -397,18 +382,19 @@ class GTiffGrid : public Grid { mutable std::vector<unsigned char> m_buffer{}; unsigned m_blocksPerRow = 0; unsigned m_blocksPerCol = 0; - std::map<int, double> m_mapOffset{}; - std::map<int, double> m_mapScale{}; + unsigned m_blocks = 0; + std::vector<double> m_adfOffset{}; + std::vector<double> m_adfScale{}; std::map<std::pair<int, std::string>, std::string> m_metadata{}; bool m_hasNodata = false; + bool m_blockIs256Pixel = false; + bool m_isSingleBlock = false; float m_noData = 0.0f; uint32_t m_subfileType = 0; GTiffGrid(const GTiffGrid &) = delete; GTiffGrid &operator=(const GTiffGrid &) = delete; - void getScaleOffset(double &scale, double &offset, uint16_t sample) const; - template <class T> float readValue(const std::vector<unsigned char> &buffer, uint32_t offsetInBlock, uint16_t sample) const; @@ -446,7 +432,9 @@ GTiffGrid::GTiffGrid(PJ_CONTEXT *ctx, TIFF *hTIFF, BlockCache &cache, File *fp, uint16_t planarConfig, bool bottomUpIn) : Grid(nameIn, widthIn, heightIn, extentIn), m_ctx(ctx), m_hTIFF(hTIFF), m_cache(cache), m_fp(fp), m_ifdIdx(ifdIdx), m_dt(dtIn), - m_samplesPerPixel(samplesPerPixelIn), m_planarConfig(planarConfig), + m_samplesPerPixel(samplesPerPixelIn), + m_planarConfig(samplesPerPixelIn == 1 ? static_cast<uint16_t>(-1) + : planarConfig), m_bottomUp(bottomUpIn), m_dirOffset(TIFFCurrentDirOffset(hTIFF)), m_tiled(TIFFIsTiled(hTIFF) != 0) { @@ -460,10 +448,15 @@ GTiffGrid::GTiffGrid(PJ_CONTEXT *ctx, TIFF *hTIFF, BlockCache &cache, File *fp, m_blockHeight = m_height; } + m_blockIs256Pixel = (m_blockWidth == 256) && (m_blockHeight == 256); + m_isSingleBlock = (m_blockWidth == static_cast<uint32_t>(m_width)) && + (m_blockHeight == static_cast<uint32_t>(m_height)); + TIFFGetField(m_hTIFF, TIFFTAG_SUBFILETYPE, &m_subfileType); m_blocksPerRow = (m_width + m_blockWidth - 1) / m_blockWidth; m_blocksPerCol = (m_height + m_blockHeight - 1) / m_blockHeight; + m_blocks = m_blocksPerRow * m_blocksPerCol; const char *text = nullptr; // Poor-man XML parsing of TIFFTAG_GDAL_METADATA tag. Hopefully good @@ -515,16 +508,26 @@ GTiffGrid::GTiffGrid(PJ_CONTEXT *ctx, TIFF *hTIFF, BlockCache &cache, File *fp, break; const auto role = tag.substr(rolePos, endQuote - rolePos); if (role == "offset") { - if (sample >= 0) { + if (sample >= 0 && + static_cast<unsigned>(sample) <= m_samplesPerPixel) { try { - m_mapOffset[sample] = c_locale_stod(value); + if (m_adfOffset.empty()) { + m_adfOffset.resize(m_samplesPerPixel); + m_adfScale.resize(m_samplesPerPixel, 1); + } + m_adfOffset[sample] = c_locale_stod(value); } catch (const std::exception &) { } } } else if (role == "scale") { - if (sample >= 0) { + if (sample >= 0 && + static_cast<unsigned>(sample) <= m_samplesPerPixel) { try { - m_mapScale[sample] = c_locale_stod(value); + if (m_adfOffset.empty()) { + m_adfOffset.resize(m_samplesPerPixel); + m_adfScale.resize(m_samplesPerPixel, 1); + } + m_adfScale[sample] = c_locale_stod(value); } catch (const std::exception &) { } } @@ -555,33 +558,16 @@ GTiffGrid::~GTiffGrid() = default; // --------------------------------------------------------------------------- -void GTiffGrid::getScaleOffset(double &scale, double &offset, - uint16_t sample) const { - { - auto iter = m_mapScale.find(sample); - if (iter != m_mapScale.end()) - scale = iter->second; - } - - { - auto iter = m_mapOffset.find(sample); - if (iter != m_mapOffset.end()) - offset = iter->second; - } -} - -// --------------------------------------------------------------------------- - template <class T> float GTiffGrid::readValue(const std::vector<unsigned char> &buffer, uint32_t offsetInBlock, uint16_t sample) const { const auto ptr = reinterpret_cast<const T *>(buffer.data()); assert(offsetInBlock < buffer.size() / sizeof(T)); const auto val = ptr[offsetInBlock]; - if (!m_hasNodata || static_cast<float>(val) != m_noData) { - double scale = 1; - double offset = 0; - getScaleOffset(scale, offset, sample); + if ((!m_hasNodata || static_cast<float>(val) != m_noData) && + sample < m_adfScale.size()) { + double scale = m_adfScale[sample]; + double offset = m_adfOffset[sample]; return static_cast<float>(val * scale + offset); } else { return static_cast<float>(val); @@ -595,27 +581,41 @@ bool GTiffGrid::valueAt(uint16_t sample, int x, int yFromBottom, assert(x >= 0 && yFromBottom >= 0 && x < m_width && yFromBottom < m_height); assert(sample < m_samplesPerPixel); - const int blockX = x / m_blockWidth; - // All non-TIFF grids have the first rows in the file being the one // corresponding to the southern-most row. In GeoTIFF, the convention is // *generally* different (when m_bottomUp == false), TIFF being an // image-oriented image. If m_bottomUp == true, then we had GeoTIFF hints // that the first row of the image is the southern-most. const int yTIFF = m_bottomUp ? yFromBottom : m_height - 1 - yFromBottom; - const int blockY = yTIFF / m_blockHeight; - uint32_t blockId = blockY * m_blocksPerRow + blockX; + int blockXOff; + int blockYOff; + uint32_t blockId; + + if (m_blockIs256Pixel) { + const int blockX = x / 256; + blockXOff = x % 256; + const int blockY = yTIFF / 256; + blockYOff = yTIFF % 256; + blockId = blockY * m_blocksPerRow + blockX; + } else if (m_isSingleBlock) { + blockXOff = x; + blockYOff = yTIFF; + blockId = 0; + } else { + const int blockX = x / m_blockWidth; + blockXOff = x % m_blockWidth; + const int blockY = yTIFF / m_blockHeight; + blockYOff = yTIFF % m_blockHeight; + blockId = blockY * m_blocksPerRow + blockX; + } + if (m_planarConfig == PLANARCONFIG_SEPARATE) { - blockId += sample * m_blocksPerCol * m_blocksPerRow; + blockId += sample * m_blocks; } - auto cachedBuffer = m_cache.get(m_ifdIdx, blockId); - std::vector<unsigned char> *pBuffer = &m_buffer; - if (cachedBuffer != nullptr) { - // Safe as we don't access the cache before pBuffer is used - pBuffer = cachedBuffer.get(); - } else { + const std::vector<unsigned char> *pBuffer = m_cache.get(m_ifdIdx, blockId); + if (pBuffer == nullptr) { if (TIFFCurrentDirOffset(m_hTIFF) != m_dirOffset && !TIFFSetSubDirectory(m_hTIFF, m_dirOffset)) { return false; @@ -643,6 +643,7 @@ bool GTiffGrid::valueAt(uint16_t sample, int x, int yFromBottom, } } + pBuffer = &m_buffer; try { m_cache.insert(m_ifdIdx, blockId, m_buffer); } catch (const std::exception &e) { @@ -651,8 +652,11 @@ bool GTiffGrid::valueAt(uint16_t sample, int x, int yFromBottom, } } - uint32_t offsetInBlock = - (x % m_blockWidth) + (yTIFF % m_blockHeight) * m_blockWidth; + uint32_t offsetInBlock; + if (m_blockIs256Pixel) + offsetInBlock = blockXOff + blockYOff * 256U; + else + offsetInBlock = blockXOff + blockYOff * m_blockWidth; if (m_planarConfig == PLANARCONFIG_CONTIG) offsetInBlock = offsetInBlock * m_samplesPerPixel + sample; @@ -1053,6 +1057,7 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { extent.resY = fabs(vRes) * mulFactor; extent.east = (west + hRes * (width - 1)) * mulFactor; extent.south = (north - vRes * (height - 1)) * mulFactor; + extent.computeInvRes(); if (vRes < 0) { std::swap(extent.north, extent.south); @@ -1451,7 +1456,7 @@ const VerticalShiftGrid *VerticalShiftGrid::gridAt(double lon, const VerticalShiftGrid *VerticalShiftGridSet::gridAt(double lon, double lat) const { for (const auto &grid : m_grids) { - if (dynamic_cast<NullVerticalShiftGrid *>(grid.get())) { + if (grid->isNullGrid()) { return grid.get(); } const auto &extent = grid->extentAndRes(); @@ -1604,6 +1609,8 @@ NTv1Grid *NTv1Grid::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, extent.north = to_double(header + 40) * DEG_TO_RAD; extent.resX = to_double(header + 104) * DEG_TO_RAD; extent.resY = to_double(header + 88) * DEG_TO_RAD; + extent.computeInvRes(); + if (!(fabs(extent.west) <= 4 * M_PI && fabs(extent.east) <= 4 * M_PI && fabs(extent.north) <= M_PI + 1e-5 && fabs(extent.south) <= M_PI + 1e-5 && extent.west < extent.east && @@ -1616,9 +1623,9 @@ NTv1Grid *NTv1Grid::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, return nullptr; } const int columns = static_cast<int>( - fabs((extent.east - extent.west) / extent.resX + 0.5) + 1); + fabs((extent.east - extent.west) * extent.invResX + 0.5) + 1); const int rows = static_cast<int>( - fabs((extent.north - extent.south) / extent.resY + 0.5) + 1); + fabs((extent.north - extent.south) * extent.invResY + 0.5) + 1); return new NTv1Grid(ctx, std::move(fp), filename, columns, rows, extent); } @@ -1948,6 +1955,7 @@ std::unique_ptr<NTv2GridSet> NTv2GridSet::open(PJ_CONTEXT *ctx, to_double(header + OFFSET_SOUTH_LAT + 16 * 4) * DEG_TO_RAD / 3600.0; extent.resX = to_double(header + OFFSET_SOUTH_LAT + 16 * 5) * DEG_TO_RAD / 3600.0; + extent.computeInvRes(); if (!(fabs(extent.west) <= 4 * M_PI && fabs(extent.east) <= 4 * M_PI && fabs(extent.north) <= M_PI + 1e-5 && @@ -1961,9 +1969,9 @@ std::unique_ptr<NTv2GridSet> NTv2GridSet::open(PJ_CONTEXT *ctx, return nullptr; } const int columns = static_cast<int>( - fabs((extent.east - extent.west) / extent.resX + 0.5) + 1); + fabs((extent.east - extent.west) * extent.invResX + 0.5) + 1); const int rows = static_cast<int>( - fabs((extent.north - extent.south) / extent.resY + 0.5) + 1); + fabs((extent.north - extent.south) * extent.invResY + 0.5) + 1); pj_log(ctx, PJ_LOG_TRACE, "NTv2 %s %dx%d: LL=(%.9g,%.9g) UR=(%.9g,%.9g)", gridName.c_str(), @@ -2429,7 +2437,7 @@ const HorizontalShiftGrid *HorizontalShiftGrid::gridAt(double lon, const HorizontalShiftGrid *HorizontalShiftGridSet::gridAt(double lon, double lat) const { for (const auto &grid : m_grids) { - if (dynamic_cast<NullHorizontalShiftGrid *>(grid.get())) { + if (grid->isNullGrid()) { return grid.get(); } const auto &extent = grid->extentAndRes(); @@ -2760,7 +2768,7 @@ const GenericShiftGrid *GenericShiftGrid::gridAt(double x, double y) const { const GenericShiftGrid *GenericShiftGridSet::gridAt(double x, double y) const { for (const auto &grid : m_grids) { - if (dynamic_cast<NullGenericShiftGrid *>(grid.get())) { + if (grid->isNullGrid()) { return grid.get(); } const auto &extent = grid->extentAndRes(); @@ -3196,7 +3204,7 @@ static double read_vgrid_value(PJ_CONTEXT *ctx, const ListOfVGrids &grids, } /* Interpolation of a location within the grid */ - double grid_x = (input.lam - extent.west) / extent.resX; + double grid_x = (input.lam - extent.west) * extent.invResX; if (input.lam < extent.west) { if (extent.fullWorldLongitude()) { // The first fmod goes to ]-lim, lim[ range @@ -3205,7 +3213,7 @@ static double read_vgrid_value(PJ_CONTEXT *ctx, const ListOfVGrids &grids, grid->width(), grid->width()); } else { - grid_x = (input.lam + 2 * M_PI - extent.west) / extent.resX; + grid_x = (input.lam + 2 * M_PI - extent.west) * extent.invResX; } } else if (input.lam > extent.east) { if (extent.fullWorldLongitude()) { @@ -3215,10 +3223,10 @@ static double read_vgrid_value(PJ_CONTEXT *ctx, const ListOfVGrids &grids, grid->width(), grid->width()); } else { - grid_x = (input.lam - 2 * M_PI - extent.west) / extent.resX; + grid_x = (input.lam - 2 * M_PI - extent.west) * extent.invResX; } } - double grid_y = (input.phi - extent.south) / extent.resY; + double grid_y = (input.phi - extent.south) * extent.invResY; int grid_ix = static_cast<int>(lround(floor(grid_x))); if (!(grid_ix >= 0 && grid_ix < grid->width())) { // in the unlikely case we end up here... @@ -3262,39 +3270,60 @@ static double read_vgrid_value(PJ_CONTEXT *ctx, const ListOfVGrids &grids, return HUGE_VAL; } - double total_weight = 0.0; - int n_weights = 0; - double value = 0.0f; + double value = 0.0; - if (!grid->isNodata(value_a, vmultiplier)) { - double weight = (1.0 - grid_x) * (1.0 - grid_y); - value += value_a * weight; - total_weight += weight; - n_weights++; - } - if (!grid->isNodata(value_b, vmultiplier)) { - double weight = (grid_x) * (1.0 - grid_y); - value += value_b * weight; - total_weight += weight; - n_weights++; - } - if (!grid->isNodata(value_c, vmultiplier)) { - double weight = (1.0 - grid_x) * (grid_y); - value += value_c * weight; - total_weight += weight; - n_weights++; - } - if (!grid->isNodata(value_d, vmultiplier)) { - double weight = (grid_x) * (grid_y); - value += value_d * weight; - total_weight += weight; - n_weights++; - } - if (n_weights == 0) { + const double grid_x_y = grid_x * grid_y; + const bool a_valid = !grid->isNodata(value_a, vmultiplier); + const bool b_valid = !grid->isNodata(value_b, vmultiplier); + const bool c_valid = !grid->isNodata(value_c, vmultiplier); + const bool d_valid = !grid->isNodata(value_d, vmultiplier); + const int countValid = + static_cast<int>(a_valid) + static_cast<int>(b_valid) + + static_cast<int>(c_valid) + static_cast<int>(d_valid); + if (countValid == 4) { + { + double weight = 1.0 - grid_x - grid_y + grid_x_y; + value = value_a * weight; + } + { + double weight = grid_x - grid_x_y; + value += value_b * weight; + } + { + double weight = grid_y - grid_x_y; + value += value_c * weight; + } + { + double weight = grid_x_y; + value += value_d * weight; + } + } else if (countValid == 0) { proj_context_errno_set(ctx, PROJ_ERR_COORD_TRANSFM_GRID_AT_NODATA); value = HUGE_VAL; - } else if (n_weights != 4) + } else { + double total_weight = 0.0; + if (a_valid) { + double weight = 1.0 - grid_x - grid_y + grid_x_y; + value = value_a * weight; + total_weight = weight; + } + if (b_valid) { + double weight = grid_x - grid_x_y; + value += value_b * weight; + total_weight += weight; + } + if (c_valid) { + double weight = grid_y - grid_x_y; + value += value_c * weight; + total_weight += weight; + } + if (d_valid) { + double weight = grid_x_y; + value += value_d * weight; + total_weight += weight; + } value /= total_weight; + } return value * vmultiplier; } @@ -3364,8 +3393,10 @@ double pj_vgrid_value(PJ *P, const ListOfVGrids &grids, PJ_LP lp, double value; value = read_vgrid_value(P->ctx, grids, lp, vmultiplier); - proj_log_trace(P, "proj_vgrid_value: (%f, %f) = %f", lp.lam * RAD_TO_DEG, - lp.phi * RAD_TO_DEG, value); + if (pj_log_active(P->ctx, PJ_LOG_TRACE)) { + proj_log_trace(P, "proj_vgrid_value: (%f, %f) = %f", + lp.lam * RAD_TO_DEG, lp.phi * RAD_TO_DEG, value); + } return value; } @@ -3413,14 +3444,14 @@ bool pj_bilinear_interpolation_three_samples( // by identifying the lower-left x,y of it (ix, iy), and the upper-right // (ix2, iy2) - double grid_x = (lp.lam - extent.west) / extent.resX; + double grid_x = (lp.lam - extent.west) * extent.invResX; // Special case for grids with world extent, and dealing with wrap-around if (lp.lam < extent.west) { - grid_x = (lp.lam + 2 * M_PI - extent.west) / extent.resX; + grid_x = (lp.lam + 2 * M_PI - extent.west) * extent.invResX; } else if (lp.lam > extent.east) { - grid_x = (lp.lam - 2 * M_PI - extent.west) / extent.resX; + grid_x = (lp.lam - 2 * M_PI - extent.west) * extent.invResX; } - double grid_y = (lp.phi - extent.south) / extent.resY; + double grid_y = (lp.phi - extent.south) * extent.invResY; int ix = static_cast<int>(grid_x); int iy = static_cast<int>(grid_y); int ix2 = std::min(ix + 1, grid->width() - 1); diff --git a/src/grids.hpp b/src/grids.hpp index d060fc95..459bde07 100644 --- a/src/grids.hpp +++ b/src/grids.hpp @@ -45,6 +45,10 @@ struct ExtentAndRes { double north; // in radian for geographic, in CRS units otherwise double resX; // in radian for geographic, in CRS units otherwise double resY; // in radian for geographic, in CRS units otherwise + double invResX; // = 1 / resX; + double invResY; // = 1 / resY; + + void computeInvRes(); bool fullWorldLongitude() const; bool contains(const ExtentAndRes &other) const; diff --git a/src/init.cpp b/src/init.cpp index a0d727cb..61457cb6 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -41,7 +41,6 @@ #include "filemanager.hpp" #include <math.h> - /**************************************************************************************/ static paralist *string_to_paralist (PJ_CONTEXT *ctx, char *definition) { /*************************************************************************************** diff --git a/src/inv.cpp b/src/inv.cpp index b4a42189..8925f0e9 100644 --- a/src/inv.cpp +++ b/src/inv.cpp @@ -36,10 +36,11 @@ #define INPUT_UNITS P->right #define OUTPUT_UNITS P->left -static PJ_COORD inv_prepare (PJ *P, PJ_COORD coo) { +static void inv_prepare (PJ *P, PJ_COORD& coo) { if (coo.v[0] == HUGE_VAL || coo.v[1] == HUGE_VAL || coo.v[2] == HUGE_VAL) { proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); - return proj_coord_error (); + coo = proj_coord_error (); + return; } /* The helmert datum shift will choke unless it gets a sensible 4D coordinate */ @@ -52,10 +53,10 @@ static PJ_COORD inv_prepare (PJ *P, PJ_COORD coo) { /* Handle remaining possible input types */ switch (INPUT_UNITS) { case PJ_IO_UNITS_WHATEVER: - return coo; + break; case PJ_IO_UNITS_DEGREES: - return coo; + break; /* de-scale and de-offset */ case PJ_IO_UNITS_CARTESIAN: @@ -65,8 +66,7 @@ static PJ_COORD inv_prepare (PJ *P, PJ_COORD coo) { if (P->is_geocent) { coo = proj_trans (P->cart, PJ_INV, coo); } - - return coo; + break; case PJ_IO_UNITS_PROJECTED: case PJ_IO_UNITS_CLASSIC: @@ -74,7 +74,7 @@ static PJ_COORD inv_prepare (PJ *P, PJ_COORD coo) { coo.xyz.y = P->to_meter * coo.xyz.y - P->y0; coo.xyz.z = P->vto_meter * coo.xyz.z - P->z0; if (INPUT_UNITS==PJ_IO_UNITS_PROJECTED) - return coo; + return; /* Classic proj.4 functions expect plane coordinates in units of the semimajor axis */ /* Multiplying by ra, rather than dividing by a because the CalCOFI projection */ @@ -82,23 +82,20 @@ static PJ_COORD inv_prepare (PJ *P, PJ_COORD coo) { /* (CalCOFI avoids further scaling by stomping - but a better solution is possible) */ coo.xyz.x *= P->ra; coo.xyz.y *= P->ra; - return coo; + break; case PJ_IO_UNITS_RADIANS: coo.lpz.z = P->vto_meter * coo.lpz.z - P->z0; break; } - - /* Should not happen, so we could return pj_coord_err here */ - return coo; } -static PJ_COORD inv_finalize (PJ *P, PJ_COORD coo) { +static void inv_finalize (PJ *P, PJ_COORD& coo) { if (coo.xyz.x == HUGE_VAL) { proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); - return proj_coord_error (); + coo = proj_coord_error (); } if (OUTPUT_UNITS==PJ_IO_UNITS_RADIANS) { @@ -113,7 +110,7 @@ static PJ_COORD inv_finalize (PJ *P, PJ_COORD coo) { if (P->vgridshift) coo = proj_trans (P->vgridshift, PJ_INV, coo); /* Go geometric from orthometric */ if (coo.lp.lam==HUGE_VAL) - return coo; + return; if (P->hgridshift) coo = proj_trans (P->hgridshift, PJ_FWD, coo); else if (P->helmert || (P->cart_wgs84 != nullptr && P->cart != nullptr)) { @@ -123,35 +120,32 @@ static PJ_COORD inv_finalize (PJ *P, PJ_COORD coo) { coo = proj_trans (P->cart_wgs84, PJ_INV, coo); /* Go back to angular using WGS84 ellps */ } if (coo.lp.lam==HUGE_VAL) - return coo; + return; /* If input latitude was geocentrical, convert back to geocentrical */ if (P->geoc) coo = pj_geocentric_latitude (P, PJ_FWD, coo); } - - return coo; } - -static PJ_COORD error_or_coord(PJ *P, PJ_COORD coord, int last_errno) { - if (proj_errno(P)) +static inline PJ_COORD error_or_coord(PJ *P, PJ_COORD coord, int last_errno) { + if (P->ctx->last_errno) return proj_coord_error(); - proj_errno_restore(P, last_errno); + P->ctx->last_errno = last_errno; + return coord; } - PJ_LP pj_inv(PJ_XY xy, PJ *P) { - int last_errno; PJ_COORD coo = {{0,0,0,0}}; coo.xy = xy; - last_errno = proj_errno_reset(P); + const int last_errno = P->ctx->last_errno; + P->ctx->last_errno = 0; if (!P->skip_inv_prepare) - coo = inv_prepare (P, coo); + inv_prepare (P, coo); if (HUGE_VAL==coo.v[0]) return proj_coord_error ().lp; @@ -170,7 +164,7 @@ PJ_LP pj_inv(PJ_XY xy, PJ *P) { return proj_coord_error ().lp; if (!P->skip_inv_finalize) - coo = inv_finalize (P, coo); + inv_finalize (P, coo); return error_or_coord(P, coo, last_errno).lp; } @@ -178,14 +172,14 @@ PJ_LP pj_inv(PJ_XY xy, PJ *P) { PJ_LPZ pj_inv3d (PJ_XYZ xyz, PJ *P) { - int last_errno; PJ_COORD coo = {{0,0,0,0}}; coo.xyz = xyz; - last_errno = proj_errno_reset(P); + const int last_errno = P->ctx->last_errno; + P->ctx->last_errno = 0; if (!P->skip_inv_prepare) - coo = inv_prepare (P, coo); + inv_prepare (P, coo); if (HUGE_VAL==coo.v[0]) return proj_coord_error ().lpz; @@ -204,7 +198,7 @@ PJ_LPZ pj_inv3d (PJ_XYZ xyz, PJ *P) { return proj_coord_error ().lpz; if (!P->skip_inv_finalize) - coo = inv_finalize (P, coo); + inv_finalize (P, coo); return error_or_coord(P, coo, last_errno).lpz; } @@ -212,10 +206,12 @@ PJ_LPZ pj_inv3d (PJ_XYZ xyz, PJ *P) { PJ_COORD pj_inv4d (PJ_COORD coo, PJ *P) { - int last_errno = proj_errno_reset(P); + + const int last_errno = P->ctx->last_errno; + P->ctx->last_errno = 0; if (!P->skip_inv_prepare) - coo = inv_prepare (P, coo); + inv_prepare (P, coo); if (HUGE_VAL==coo.v[0]) return proj_coord_error (); @@ -234,7 +230,7 @@ PJ_COORD pj_inv4d (PJ_COORD coo, PJ *P) { return proj_coord_error (); if (!P->skip_inv_finalize) - coo = inv_finalize (P, coo); + inv_finalize (P, coo); return error_or_coord(P, coo, last_errno); } diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp index 2431f734..ace699e4 100644 --- a/src/iso19111/c_api.cpp +++ b/src/iso19111/c_api.cpp @@ -153,24 +153,11 @@ projCppContext::toVector(const char *const *auxDbPaths) { projCppContext *projCppContext::clone(PJ_CONTEXT *ctx) const { projCppContext *newContext = new projCppContext(ctx, getDbPath().c_str(), getAuxDbPaths()); - newContext->setAutoCloseDb(getAutoCloseDb()); return newContext; } // --------------------------------------------------------------------------- -void projCppContext::closeDb() { databaseContext_ = nullptr; } - -// --------------------------------------------------------------------------- - -void projCppContext::autoCloseDbIfNeeded() { - if (getAutoCloseDb()) { - closeDb(); - } -} - -// --------------------------------------------------------------------------- - NS_PROJ::io::DatabaseContextNNPtr projCppContext::getDatabaseContext() { if (databaseContext_) { return NN_NO_CHECK(databaseContext_); @@ -215,7 +202,6 @@ static PJ *pj_obj_create(PJ_CONTEXT *ctx, const IdentifiedObjectNNPtr &objIn) { ctx->defer_grid_opening = false; if (pj) { pj->iso_obj = objIn; - ctx->safeAutoCloseDbIfNeeded(); return pj; } } catch (const std::exception &) { @@ -249,7 +235,6 @@ static PJ *pj_obj_create(PJ_CONTEXT *ctx, const IdentifiedObjectNNPtr &objIn) { } catch (const std::exception &) { } } - ctx->safeAutoCloseDbIfNeeded(); return pj; } //! @endcond @@ -289,19 +274,19 @@ PJ_OBJ_LIST::~PJ_OBJ_LIST() = default; // --------------------------------------------------------------------------- -/** \brief Set if the database must be closed after each C API call where it - * has been opened, and automatically re-opened when needed. +/** \brief Starting with PROJ 8.1, this function does nothing. * - * The default value is FALSE, that is the database remains open until the - * context is destroyed. + * If you want to take into account changes to the PROJ database, you need to + * re-create a new context. * - * @param ctx PROJ context, or NULL for default context - * @param autoclose Boolean parameter + * @param ctx Ignored + * @param autoclose Ignored * @since 6.2 + * @deprecated Since 8.1 */ void proj_context_set_autoclose_database(PJ_CONTEXT *ctx, int autoclose) { - SANITIZE_CTX(ctx); - ctx->get_cpp_context()->setAutoCloseDb(autoclose != FALSE); + (void)ctx; + (void)autoclose; } // --------------------------------------------------------------------------- @@ -330,27 +315,22 @@ int proj_context_set_database_path(PJ_CONTEXT *ctx, const char *dbPath, (void)options; std::string osPrevDbPath; std::vector<std::string> osPrevAuxDbPaths; - bool autoCloseDb = false; if (ctx->cpp_context) { osPrevDbPath = ctx->cpp_context->getDbPath(); osPrevAuxDbPaths = ctx->cpp_context->getAuxDbPaths(); - autoCloseDb = ctx->cpp_context->getAutoCloseDb(); } delete ctx->cpp_context; ctx->cpp_context = nullptr; try { ctx->cpp_context = new projCppContext( ctx, dbPath, projCppContext::toVector(auxDbPaths)); - ctx->cpp_context->setAutoCloseDb(autoCloseDb); ctx->cpp_context->getDatabaseContext(); - ctx->safeAutoCloseDbIfNeeded(); return true; } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); delete ctx->cpp_context; ctx->cpp_context = new projCppContext(ctx, osPrevDbPath.c_str(), osPrevAuxDbPaths); - ctx->cpp_context->setAutoCloseDb(autoCloseDb); return false; } } @@ -372,7 +352,6 @@ const char *proj_context_get_database_path(PJ_CONTEXT *ctx) { // ctx->cpp_context auto osPath(getDBcontext(ctx)->getPath()); ctx->get_cpp_context()->lastDbPath_ = osPath; - ctx->safeAutoCloseDbIfNeeded(); return ctx->cpp_context->lastDbPath_.c_str(); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); @@ -404,11 +383,9 @@ const char *proj_context_get_database_metadata(PJ_CONTEXT *ctx, // ctx->cpp_context auto osVal(getDBcontext(ctx)->getMetadata(key)); if (osVal == nullptr) { - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } ctx->get_cpp_context()->lastDbMetadataItem_ = osVal; - ctx->safeAutoCloseDbIfNeeded(); return ctx->cpp_context->lastDbMetadataItem_.c_str(); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); @@ -437,7 +414,6 @@ proj_context_get_database_structure(PJ_CONTEXT *ctx, (void)options; try { auto ret = to_string_list(getDBcontext(ctx)->getDatabaseStructure()); - ctx->safeAutoCloseDbIfNeeded(); return ret; } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); @@ -574,7 +550,6 @@ PJ *proj_create(PJ_CONTEXT *ctx, const char *text) { } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -697,7 +672,6 @@ PJ *proj_create_from_wkt(PJ_CONTEXT *ctx, const char *wkt, proj_log_error(ctx, __FUNCTION__, e.what()); } } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -762,7 +736,6 @@ PJ *proj_create_from_database(PJ_CONTEXT *ctx, const char *auth_name, } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -848,12 +821,10 @@ int proj_uom_get_info_from_database(PJ_CONTEXT *ctx, const char *auth_name, if (out_category) { *out_category = get_unit_category(obj->name(), obj->type()); } - ctx->safeAutoCloseDbIfNeeded(); return true; } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return false; } @@ -898,7 +869,6 @@ int PROJ_DLL proj_grid_get_info_from_database( ctx->get_cpp_context()->lastGridPackageName_, ctx->get_cpp_context()->lastGridUrl_, direct_download, open_license, available)) { - ctx->safeAutoCloseDbIfNeeded(); return false; } @@ -916,12 +886,10 @@ int PROJ_DLL proj_grid_get_info_from_database( if (out_available) *out_available = available ? 1 : 0; - ctx->safeAutoCloseDbIfNeeded(); return true; } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return false; } @@ -957,12 +925,10 @@ PJ_OBJ_LIST *proj_query_geodetic_crs_from_datum(PJ_CONTEXT *ctx, for (const auto &obj : res) { objects.push_back(obj); } - ctx->safeAutoCloseDbIfNeeded(); return new PJ_OBJ_LIST(std::move(objects)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -1141,12 +1107,10 @@ PJ_OBJ_LIST *proj_create_from_name(PJ_CONTEXT *ctx, const char *auth_name, for (const auto &obj : res) { objects.push_back(obj); } - ctx->safeAutoCloseDbIfNeeded(); return new PJ_OBJ_LIST(std::move(objects)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -1296,12 +1260,10 @@ PJ_OBJ_LIST *proj_get_non_deprecated(PJ_CONTEXT *ctx, const PJ *obj) { for (const auto &resObj : res) { objects.push_back(resObj); } - ctx->safeAutoCloseDbIfNeeded(); return new PJ_OBJ_LIST(std::move(objects)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -1352,9 +1314,6 @@ static int proj_is_equivalent_to_internal(PJ_CONTEXT *ctx, const PJ *obj, other->iso_obj.get(), cppCriterion, ctx ? getDBcontextNoException(ctx, "proj_is_equivalent_to_with_ctx") : nullptr); - if (ctx) { - ctx->safeAutoCloseDbIfNeeded(); - } return res; } @@ -1587,16 +1546,13 @@ const char *proj_as_wkt(PJ_CONTEXT *ctx, const PJ *obj, PJ_WKT_TYPE type, std::string msg("Unknown option :"); msg += *iter; proj_log_error(ctx, __FUNCTION__, msg.c_str()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } obj->lastWKT = obj->iso_obj->exportToWKT(formatter.get()); - ctx->safeAutoCloseDbIfNeeded(); return obj->lastWKT.c_str(); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } @@ -1683,11 +1639,9 @@ const char *proj_as_proj_string(PJ_CONTEXT *ctx, const PJ *obj, } } obj->lastPROJString = exportable->exportToPROJString(formatter.get()); - ctx->safeAutoCloseDbIfNeeded(); return obj->lastPROJString.c_str(); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } @@ -2089,7 +2043,6 @@ PJ *proj_crs_create_bound_crs_to_WGS84(PJ_CONTEXT *ctx, const PJ *crs, std::string msg("Unknown option :"); msg += *iter; proj_log_error(ctx, __FUNCTION__, msg.c_str()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } @@ -2097,7 +2050,6 @@ PJ *proj_crs_create_bound_crs_to_WGS84(PJ_CONTEXT *ctx, const PJ *crs, dbContext, allowIntermediateCRS)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } @@ -2154,7 +2106,6 @@ PJ *proj_crs_create_bound_vertical_crs(PJ_CONTEXT *ctx, const PJ *vert_crs, BoundCRS::create(nnCRS, nnHubCRS, transformation)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } @@ -2585,14 +2536,12 @@ PJ_OBJ_LIST *proj_identify(PJ_CONTEXT *ctx, const PJ *obj, *out_confidence = confidenceTemp; confidenceTemp = nullptr; } - ctx->safeAutoCloseDbIfNeeded(); return ret.release(); } catch (const std::exception &e) { delete[] confidenceTemp; proj_log_error(ctx, __FUNCTION__, e.what()); } } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -2617,12 +2566,10 @@ PROJ_STRING_LIST proj_get_authorities_from_database(PJ_CONTEXT *ctx) { SANITIZE_CTX(ctx); try { auto ret = to_string_list(getDBcontext(ctx)->getAuthorities()); - ctx->safeAutoCloseDbIfNeeded(); return ret; } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -2662,13 +2609,11 @@ PROJ_STRING_LIST proj_get_codes_from_database(PJ_CONTEXT *ctx, } auto ret = to_string_list( factory->getAuthorityCodes(typeInternal, allow_deprecated != 0)); - ctx->safeAutoCloseDbIfNeeded(); return ret; } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -2708,7 +2653,6 @@ PROJ_CELESTIAL_BODY_INFO **proj_get_celestial_body_list_from_database( ret[i] = nullptr; if (out_result_count) *out_result_count = i; - ctx->safeAutoCloseDbIfNeeded(); return ret; } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); @@ -2719,7 +2663,6 @@ PROJ_CELESTIAL_BODY_INFO **proj_get_celestial_body_list_from_database( if (out_result_count) *out_result_count = 0; } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -2937,7 +2880,6 @@ proj_get_crs_info_list_from_database(PJ_CONTEXT *ctx, const char *auth_name, ret[i] = nullptr; if (out_result_count) *out_result_count = i; - ctx->safeAutoCloseDbIfNeeded(); return ret; } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); @@ -2948,7 +2890,6 @@ proj_get_crs_info_list_from_database(PJ_CONTEXT *ctx, const char *auth_name, if (out_result_count) *out_result_count = 0; } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -3030,7 +2971,6 @@ PROJ_UNIT_INFO **proj_get_units_from_database(PJ_CONTEXT *ctx, ret[i] = nullptr; if (out_result_count) *out_result_count = i; - ctx->safeAutoCloseDbIfNeeded(); return ret; } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); @@ -3041,7 +2981,6 @@ PROJ_UNIT_INFO **proj_get_units_from_database(PJ_CONTEXT *ctx, if (out_result_count) *out_result_count = 0; } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -3335,7 +3274,6 @@ PJ *proj_create_geographic_crs(PJ_CONTEXT *ctx, const char *crs_name, } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -3382,7 +3320,6 @@ PJ *proj_create_geographic_crs_from_datum(PJ_CONTEXT *ctx, const char *crs_name, } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -4029,7 +3966,6 @@ PJ *proj_crs_promote_to_3D(PJ_CONTEXT *ctx, const char *crs_3D_name, dbContext)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } @@ -4116,7 +4052,6 @@ PJ *proj_crs_create_projected_3D_crs_from_2D(PJ_CONTEXT *ctx, cpp_projected_2D_crs->derivingConversion(), newCS)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } else { @@ -4129,7 +4064,6 @@ PJ *proj_crs_create_projected_3D_crs_from_2D(PJ_CONTEXT *ctx, dbContext)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } @@ -4175,7 +4109,6 @@ PJ *proj_crs_demote_to_2D(PJ_CONTEXT *ctx, const char *crs_2D_name, dbContext)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } } @@ -7187,10 +7120,8 @@ int proj_coordoperation_is_instantiable(PJ_CONTEXT *ctx, dbContext, proj_context_is_network_enabled(ctx) != FALSE) ? 1 : 0; - ctx->safeAutoCloseDbIfNeeded(); return ret; } catch (const std::exception &) { - ctx->safeAutoCloseDbIfNeeded(); return 0; } } @@ -7525,11 +7456,9 @@ int proj_coordoperation_get_grid_used_count(PJ_CONTEXT *ctx, coordoperation->gridsNeeded.emplace_back(gridDesc); } } - ctx->safeAutoCloseDbIfNeeded(); return static_cast<int>(coordoperation->gridsNeeded.size()); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); - ctx->safeAutoCloseDbIfNeeded(); return 0; } } @@ -7657,7 +7586,6 @@ proj_create_operation_factory_context(PJ_CONTEXT *ctx, const char *authority) { std::string(authority ? authority : "")); auto operationContext = CoordinateOperationContext::create(authFactory, nullptr, 0.0); - ctx->safeAutoCloseDbIfNeeded(); return new PJ_OPERATION_FACTORY_CONTEXT( std::move(operationContext)); } else { @@ -7669,7 +7597,6 @@ proj_create_operation_factory_context(PJ_CONTEXT *ctx, const char *authority) { } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } @@ -9195,12 +9122,10 @@ proj_get_geoid_models_from_database(PJ_CONTEXT *ctx, const char *auth_name, const std::string codeStr(code); auto factory = AuthorityFactory::create(getDBcontext(ctx), auth_name); auto geoidModels = factory->getGeoidModels(codeStr); - ctx->safeAutoCloseDbIfNeeded(); return to_string_list(std::move(geoidModels)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); } - ctx->safeAutoCloseDbIfNeeded(); return nullptr; } diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp index 51317c18..3e825ff0 100644 --- a/src/iso19111/crs.cpp +++ b/src/iso19111/crs.cpp @@ -46,6 +46,8 @@ #include "proj/internal/internal.hpp" #include "proj/internal/io_internal.hpp" +#include "operation/oputils.hpp" + #include "proj_constants.h" #include "proj_json_streaming_writer.hpp" @@ -823,6 +825,64 @@ bool CRS::mustAxisOrderBeSwitchedForVisualization() const { //! @cond Doxygen_Suppress +void CRS::setProperties( + const util::PropertyMap &properties) // throw(InvalidValueTypeException) +{ + std::string l_remarks; + std::string extensionProj4; + properties.getStringValue(IdentifiedObject::REMARKS_KEY, l_remarks); + properties.getStringValue("EXTENSION_PROJ4", extensionProj4); + + const char *PROJ_CRS_STRING_PREFIX = "PROJ CRS string: "; + const char *PROJ_CRS_STRING_SUFFIX = ". "; + const auto beginOfProjStringPos = l_remarks.find(PROJ_CRS_STRING_PREFIX); + if (beginOfProjStringPos == std::string::npos && extensionProj4.empty()) { + ObjectUsage::setProperties(properties); + return; + } + + util::PropertyMap newProperties(properties); + + // Parse remarks and extract EXTENSION_PROJ4 from it + if (extensionProj4.empty()) { + if (beginOfProjStringPos != std::string::npos) { + const auto endOfProjStringPos = + l_remarks.find(PROJ_CRS_STRING_SUFFIX, beginOfProjStringPos); + if (endOfProjStringPos == std::string::npos) { + extensionProj4 = l_remarks.substr( + beginOfProjStringPos + strlen(PROJ_CRS_STRING_PREFIX)); + } else { + extensionProj4 = l_remarks.substr( + beginOfProjStringPos + strlen(PROJ_CRS_STRING_PREFIX), + endOfProjStringPos - beginOfProjStringPos - + strlen(PROJ_CRS_STRING_PREFIX)); + } + } + } + + if (!extensionProj4.empty()) { + if (beginOfProjStringPos == std::string::npos) { + // Add EXTENSION_PROJ4 to remarks + l_remarks = + PROJ_CRS_STRING_PREFIX + extensionProj4 + + (l_remarks.empty() ? std::string() + : PROJ_CRS_STRING_SUFFIX + l_remarks); + } + } + + newProperties.set(IdentifiedObject::REMARKS_KEY, l_remarks); + + ObjectUsage::setProperties(newProperties); + + d->extensionProj4_ = extensionProj4; +} + +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress + CRSNNPtr CRS::normalizeForVisualization() const { const auto createProperties = [this](const std::string &newName = @@ -1077,8 +1137,24 @@ CRSNNPtr CRS::promoteTo3D(const std::string &newName, return props; }; - const auto geogCRS = dynamic_cast<const GeographicCRS *>(this); - if (geogCRS) { + if (auto derivedGeogCRS = + dynamic_cast<const DerivedGeographicCRS *>(this)) { + const auto &axisList = derivedGeogCRS->coordinateSystem()->axisList(); + if (axisList.size() == 2) { + auto cs = cs::EllipsoidalCS::create( + util::PropertyMap(), axisList[0], axisList[1], + verticalAxisIfNotAlreadyPresent); + auto baseGeog3DCRS = util::nn_dynamic_pointer_cast<GeodeticCRS>( + derivedGeogCRS->baseCRS()->promoteTo3D( + std::string(), dbContext, verticalAxisIfNotAlreadyPresent)); + return util::nn_static_pointer_cast<CRS>( + DerivedGeographicCRS::create( + createProperties(), NN_CHECK_THROW(baseGeog3DCRS), + derivedGeogCRS->derivingConversion(), cs)); + } + } + + else if (auto geogCRS = dynamic_cast<const GeographicCRS *>(this)) { const auto &axisList = geogCRS->coordinateSystem()->axisList(); if (axisList.size() == 2) { const auto &l_identifiers = identifiers(); @@ -1118,8 +1194,7 @@ CRSNNPtr CRS::promoteTo3D(const std::string &newName, } } - const auto projCRS = dynamic_cast<const ProjectedCRS *>(this); - if (projCRS) { + else if (auto projCRS = dynamic_cast<const ProjectedCRS *>(this)) { const auto &axisList = projCRS->coordinateSystem()->axisList(); if (axisList.size() == 2) { auto base3DCRS = @@ -1135,15 +1210,14 @@ CRSNNPtr CRS::promoteTo3D(const std::string &newName, } } - const auto boundCRS = dynamic_cast<const BoundCRS *>(this); - if (boundCRS) { + else if (auto boundCRS = dynamic_cast<const BoundCRS *>(this)) { auto base3DCRS = boundCRS->baseCRS()->promoteTo3D( newName, dbContext, verticalAxisIfNotAlreadyPresent); auto transf = boundCRS->transformation(); try { transf->getTOWGS84Parameters(); return BoundCRS::create( - base3DCRS, + createProperties(), base3DCRS, boundCRS->hubCRS()->promoteTo3D(std::string(), dbContext), transf->promoteTo3D(std::string(), dbContext)); } catch (const io::FormattingException &) { @@ -1172,18 +1246,21 @@ CRSNNPtr CRS::promoteTo3D(const std::string &newName, */ CRSNNPtr CRS::demoteTo2D(const std::string &newName, const io::DatabaseContextPtr &dbContext) const { - const auto geogCRS = dynamic_cast<const GeographicCRS *>(this); - if (geogCRS) { + + if (auto derivedGeogCRS = + dynamic_cast<const DerivedGeographicCRS *>(this)) { + return derivedGeogCRS->demoteTo2D(newName, dbContext); + } + + else if (auto geogCRS = dynamic_cast<const GeographicCRS *>(this)) { return geogCRS->demoteTo2D(newName, dbContext); } - const auto projCRS = dynamic_cast<const ProjectedCRS *>(this); - if (projCRS) { + else if (auto projCRS = dynamic_cast<const ProjectedCRS *>(this)) { return projCRS->demoteTo2D(newName, dbContext); } - const auto boundCRS = dynamic_cast<const BoundCRS *>(this); - if (boundCRS) { + else if (auto boundCRS = dynamic_cast<const BoundCRS *>(this)) { auto base2DCRS = boundCRS->baseCRS()->demoteTo2D(newName, dbContext); auto transf = boundCRS->transformation(); try { @@ -1197,8 +1274,7 @@ CRSNNPtr CRS::demoteTo2D(const std::string &newName, } } - const auto compoundCRS = dynamic_cast<const CompoundCRS *>(this); - if (compoundCRS) { + else if (auto compoundCRS = dynamic_cast<const CompoundCRS *>(this)) { const auto &components = compoundCRS->componentReferenceSystems(); if (components.size() >= 2) { return components[0]; @@ -1592,8 +1668,6 @@ GeodeticCRS::create(const util::PropertyMap &properties, GeodeticCRS::nn_make_shared<GeodeticCRS>(datum, datumEnsemble, cs)); crs->assignSelf(crs); crs->setProperties(properties); - properties.getStringValue("EXTENSION_PROJ4", - crs->CRS::getPrivate()->extensionProj4_); return crs; } @@ -1639,8 +1713,7 @@ GeodeticCRS::create(const util::PropertyMap &properties, GeodeticCRS::nn_make_shared<GeodeticCRS>(datum, datumEnsemble, cs)); crs->assignSelf(crs); crs->setProperties(properties); - properties.getStringValue("EXTENSION_PROJ4", - crs->CRS::getPrivate()->extensionProj4_); + return crs; } @@ -2556,8 +2629,6 @@ GeographicCRS::create(const util::PropertyMap &properties, GeographicCRS::nn_make_shared<GeographicCRS>(datum, datumEnsemble, cs)); crs->assignSelf(crs); crs->setProperties(properties); - properties.getStringValue("EXTENSION_PROJ4", - crs->CRS::getPrivate()->extensionProj4_); crs->CRS::getPrivate()->setImplicitCS(properties); return crs; } @@ -4031,8 +4102,6 @@ ProjectedCRS::create(const util::PropertyMap &properties, crs->assignSelf(crs); crs->setProperties(properties); crs->setDerivingConversionCRS(); - properties.getStringValue("EXTENSION_PROJ4", - crs->CRS::getPrivate()->extensionProj4_); crs->CRS::getPrivate()->setImplicitCS(properties); return crs; } @@ -5225,27 +5294,50 @@ BoundCRS::transformation() PROJ_PURE_DEFN { /** \brief Instantiate a BoundCRS from a base CRS, a hub CRS and a * transformation. * + * @param properties See \ref general_properties. * @param baseCRSIn base CRS. * @param hubCRSIn hub CRS. * @param transformationIn transformation from base CRS to hub CRS. * @return new BoundCRS. + * @since PROJ 8.2 */ BoundCRSNNPtr -BoundCRS::create(const CRSNNPtr &baseCRSIn, const CRSNNPtr &hubCRSIn, +BoundCRS::create(const util::PropertyMap &properties, const CRSNNPtr &baseCRSIn, + const CRSNNPtr &hubCRSIn, const operation::TransformationNNPtr &transformationIn) { auto crs = BoundCRS::nn_make_shared<BoundCRS>(baseCRSIn, hubCRSIn, transformationIn); crs->assignSelf(crs); const auto &l_name = baseCRSIn->nameStr(); - if (!l_name.empty()) { - crs->setProperties(util::PropertyMap().set( - common::IdentifiedObject::NAME_KEY, l_name)); + if (properties.get(common::IdentifiedObject::NAME_KEY) == nullptr && + !l_name.empty()) { + auto newProperties(properties); + newProperties.set(common::IdentifiedObject::NAME_KEY, l_name); + crs->setProperties(newProperties); + } else { + crs->setProperties(properties); } return crs; } // --------------------------------------------------------------------------- +/** \brief Instantiate a BoundCRS from a base CRS, a hub CRS and a + * transformation. + * + * @param baseCRSIn base CRS. + * @param hubCRSIn hub CRS. + * @param transformationIn transformation from base CRS to hub CRS. + * @return new BoundCRS. + */ +BoundCRSNNPtr +BoundCRS::create(const CRSNNPtr &baseCRSIn, const CRSNNPtr &hubCRSIn, + const operation::TransformationNNPtr &transformationIn) { + return create(util::PropertyMap(), baseCRSIn, hubCRSIn, transformationIn); +} + +// --------------------------------------------------------------------------- + /** \brief Instantiate a BoundCRS from a base CRS and TOWGS84 parameters * * @param baseCRSIn base CRS. @@ -5346,6 +5438,7 @@ void BoundCRS::_exportToWKT(io::WKTFormatter *formatter) const { formatter->setAbridgedTransformation(true); d->transformation()->_exportToWKT(formatter); formatter->setAbridgedTransformation(false); + ObjectUsage::baseExportToWKT(formatter); formatter->endNode(); } else { @@ -5386,8 +5479,21 @@ void BoundCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { auto writer = formatter->writer(); - auto objectContext( - formatter->MakeObjectContext("BoundCRS", !identifiers().empty())); + const auto &l_name = nameStr(); + if ((formatter->outputUsage(true) && !domains().empty()) || + (formatter->outputId() && !identifiers().empty()) || + !remarks().empty() || + (!l_name.empty() && l_name != d->baseCRS()->nameStr())) { + // Only upgrades to v0.3 schema if needed + formatter->setSchema(io::JSONFormatter::PROJJSON_v0_3); + } + + auto objectContext(formatter->MakeObjectContext("BoundCRS", false)); + + if (!l_name.empty() && l_name != d->baseCRS()->nameStr()) { + writer->AddObjKey("name"); + writer->Add(l_name); + } writer->AddObjKey("source_crs"); d->baseCRS()->_exportToJSON(formatter); @@ -5400,6 +5506,8 @@ void BoundCRS::_exportToJSON( formatter->setAbridgedTransformation(true); d->transformation()->_exportToJSON(formatter); formatter->setAbridgedTransformation(false); + + ObjectUsage::baseExportToJSON(formatter); } //! @endcond @@ -5519,7 +5627,12 @@ BoundCRS::_identify(const io::AuthorityFactoryPtr &authorityFactory) const { auto opNormalized = op->normalizeForVisualization(); std::string opTransfPROJString; bool opTransfPROJStringValid = false; - if (op->nameStr().find("Ballpark geographic") == 0) { + const auto &opName = op->nameStr(); + if (starts_with( + opName, + operation::BALLPARK_GEOCENTRIC_TRANSLATION) || + starts_with(opName, + operation::NULL_GEOGRAPHIC_OFFSET)) { if (refIsNullTransform) { res.emplace_back(create(candidateBaseCRS, d->hubCRS_, @@ -5891,6 +6004,38 @@ bool DerivedGeographicCRS::_isEquivalentTo( // --------------------------------------------------------------------------- +/** \brief Return a variant of this CRS "demoted" to a 2D one, if not already + * the case. + * + * + * @param newName Name of the new CRS. If empty, nameStr() will be used. + * @param dbContext Database context to look for potentially already registered + * 2D CRS. May be nullptr. + * @return a new CRS demoted to 2D, or the current one if already 2D or not + * applicable. + * @since 8.1.1 + */ +DerivedGeographicCRSNNPtr DerivedGeographicCRS::demoteTo2D( + const std::string &newName, const io::DatabaseContextPtr &dbContext) const { + + const auto &axisList = coordinateSystem()->axisList(); + if (axisList.size() == 3) { + auto cs = cs::EllipsoidalCS::create(util::PropertyMap(), axisList[0], + axisList[1]); + auto baseGeog2DCRS = util::nn_dynamic_pointer_cast<GeodeticCRS>( + baseCRS()->demoteTo2D(std::string(), dbContext)); + return DerivedGeographicCRS::create( + util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, + !newName.empty() ? newName : nameStr()), + NN_CHECK_THROW(baseGeog2DCRS), derivingConversion(), cs); + } + + return NN_NO_CHECK(std::dynamic_pointer_cast<DerivedGeographicCRS>( + shared_from_this().as_nullable())); +} + +// --------------------------------------------------------------------------- + //! @cond Doxygen_Suppress std::list<std::pair<CRSNNPtr, int>> diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp index cea0759c..508c3513 100644 --- a/src/iso19111/factory.cpp +++ b/src/iso19111/factory.cpp @@ -42,6 +42,7 @@ #include "proj/internal/internal.hpp" #include "proj/internal/io_internal.hpp" #include "proj/internal/lru_cache.hpp" +#include "proj/internal/mutex.hpp" #include "proj/internal/tracing.hpp" #include "operation/coordinateoperation_internal.hpp" @@ -145,6 +146,464 @@ using ListOfParams = std::list<SQLValues>; // --------------------------------------------------------------------------- +static double PROJ_SQLITE_GetValAsDouble(sqlite3_value *val, bool &gotVal) { + switch (sqlite3_value_type(val)) { + case SQLITE_FLOAT: + gotVal = true; + return sqlite3_value_double(val); + + case SQLITE_INTEGER: + gotVal = true; + return static_cast<double>(sqlite3_value_int64(val)); + + default: + gotVal = false; + return 0.0; + } +} + +// --------------------------------------------------------------------------- + +static void PROJ_SQLITE_pseudo_area_from_swne(sqlite3_context *pContext, + int /* argc */, + sqlite3_value **argv) { + bool b0, b1, b2, b3; + double south_lat = PROJ_SQLITE_GetValAsDouble(argv[0], b0); + double west_lon = PROJ_SQLITE_GetValAsDouble(argv[1], b1); + double north_lat = PROJ_SQLITE_GetValAsDouble(argv[2], b2); + double east_lon = PROJ_SQLITE_GetValAsDouble(argv[3], b3); + if (!b0 || !b1 || !b2 || !b3) { + sqlite3_result_null(pContext); + return; + } + // Deal with area crossing antimeridian + if (east_lon < west_lon) { + east_lon += 360.0; + } + // Integrate cos(lat) between south_lat and north_lat + double pseudo_area = (east_lon - west_lon) * + (std::sin(common::Angle(north_lat).getSIValue()) - + std::sin(common::Angle(south_lat).getSIValue())); + sqlite3_result_double(pContext, pseudo_area); +} + +// --------------------------------------------------------------------------- + +static void PROJ_SQLITE_intersects_bbox(sqlite3_context *pContext, + int /* argc */, sqlite3_value **argv) { + bool b0, b1, b2, b3, b4, b5, b6, b7; + double south_lat1 = PROJ_SQLITE_GetValAsDouble(argv[0], b0); + double west_lon1 = PROJ_SQLITE_GetValAsDouble(argv[1], b1); + double north_lat1 = PROJ_SQLITE_GetValAsDouble(argv[2], b2); + double east_lon1 = PROJ_SQLITE_GetValAsDouble(argv[3], b3); + double south_lat2 = PROJ_SQLITE_GetValAsDouble(argv[4], b4); + double west_lon2 = PROJ_SQLITE_GetValAsDouble(argv[5], b5); + double north_lat2 = PROJ_SQLITE_GetValAsDouble(argv[6], b6); + double east_lon2 = PROJ_SQLITE_GetValAsDouble(argv[7], b7); + if (!b0 || !b1 || !b2 || !b3 || !b4 || !b5 || !b6 || !b7) { + sqlite3_result_null(pContext); + return; + } + auto bbox1 = metadata::GeographicBoundingBox::create(west_lon1, south_lat1, + east_lon1, north_lat1); + auto bbox2 = metadata::GeographicBoundingBox::create(west_lon2, south_lat2, + east_lon2, north_lat2); + sqlite3_result_int(pContext, bbox1->intersects(bbox2) ? 1 : 0); +} + +// --------------------------------------------------------------------------- + +class SQLiteHandle { + sqlite3 *sqlite_handle_ = nullptr; + bool close_handle_ = true; + + int nLayoutVersionMajor_ = 0; + int nLayoutVersionMinor_ = 0; + +#ifdef ENABLE_CUSTOM_LOCKLESS_VFS + std::unique_ptr<SQLite3VFS> vfs_{}; +#endif + + SQLiteHandle(const SQLiteHandle &) = delete; + SQLiteHandle &operator=(const SQLiteHandle &) = delete; + + SQLiteHandle(sqlite3 *sqlite_handle, bool close_handle) + : sqlite_handle_(sqlite_handle), close_handle_(close_handle) { + assert(sqlite_handle_); + } + + // cppcheck-suppress functionStatic + void registerFunctions(); + + SQLResultSet run(const std::string &sql, + const ListOfParams ¶meters = ListOfParams(), + bool useMaxFloatPrecision = false); + + public: + ~SQLiteHandle(); + + sqlite3 *handle() { return sqlite_handle_; } + + static std::shared_ptr<SQLiteHandle> open(PJ_CONTEXT *ctx, + const std::string &path); + + // might not be shared between thread depending how the handle was opened! + static std::shared_ptr<SQLiteHandle> + initFromExisting(sqlite3 *sqlite_handle, bool close_handle, + int nLayoutVersionMajor, int nLayoutVersionMinor); + + static std::unique_ptr<SQLiteHandle> + initFromExistingUniquePtr(sqlite3 *sqlite_handle, bool close_handle); + + void checkDatabaseLayout(const std::string &mainDbPath, + const std::string &path, + const std::string &dbNamePrefix); + + SQLResultSet run(sqlite3_stmt *stmt, const std::string &sql, + const ListOfParams ¶meters = ListOfParams(), + bool useMaxFloatPrecision = false); + + inline int getLayoutVersionMajor() const { return nLayoutVersionMajor_; } + inline int getLayoutVersionMinor() const { return nLayoutVersionMinor_; } +}; + +// --------------------------------------------------------------------------- + +SQLiteHandle::~SQLiteHandle() { + if (close_handle_) { + sqlite3_close(sqlite_handle_); + } +} + +// --------------------------------------------------------------------------- + +std::shared_ptr<SQLiteHandle> SQLiteHandle::open(PJ_CONTEXT *ctx, + const std::string &path) { + + const int sqlite3VersionNumber = sqlite3_libversion_number(); + // Minimum version for correct performance: 3.11 + if (sqlite3VersionNumber < 3 * 1000000 + 11 * 1000) { + pj_log(ctx, PJ_LOG_ERROR, + "SQLite3 version is %s, whereas at least 3.11 should be used", + sqlite3_libversion()); + } + + std::string vfsName; +#ifdef ENABLE_CUSTOM_LOCKLESS_VFS + std::unique_ptr<SQLite3VFS> vfs; + if (ctx->custom_sqlite3_vfs_name.empty()) { + vfs = SQLite3VFS::create(false, true, true); + if (vfs == nullptr) { + throw FactoryException("Open of " + path + " failed"); + } + vfsName = vfs->name(); + } else +#endif + { + vfsName = ctx->custom_sqlite3_vfs_name; + } + sqlite3 *sqlite_handle = nullptr; + // SQLITE_OPEN_FULLMUTEX as this will be used from concurrent threads + if (sqlite3_open_v2(path.c_str(), &sqlite_handle, + SQLITE_OPEN_READONLY | SQLITE_OPEN_FULLMUTEX, + vfsName.empty() ? nullptr : vfsName.c_str()) != + SQLITE_OK || + !sqlite_handle) { + if (sqlite_handle != nullptr) { + sqlite3_close(sqlite_handle); + } + throw FactoryException("Open of " + path + " failed"); + } + auto handle = + std::shared_ptr<SQLiteHandle>(new SQLiteHandle(sqlite_handle, true)); +#ifdef ENABLE_CUSTOM_LOCKLESS_VFS + handle->vfs_ = std::move(vfs); +#endif + handle->registerFunctions(); + handle->checkDatabaseLayout(path, path, std::string()); + return handle; +} + +// --------------------------------------------------------------------------- + +std::shared_ptr<SQLiteHandle> +SQLiteHandle::initFromExisting(sqlite3 *sqlite_handle, bool close_handle, + int nLayoutVersionMajor, + int nLayoutVersionMinor) { + auto handle = std::shared_ptr<SQLiteHandle>( + new SQLiteHandle(sqlite_handle, close_handle)); + handle->nLayoutVersionMajor_ = nLayoutVersionMajor; + handle->nLayoutVersionMinor_ = nLayoutVersionMinor; + handle->registerFunctions(); + return handle; +} + +// --------------------------------------------------------------------------- + +std::unique_ptr<SQLiteHandle> +SQLiteHandle::initFromExistingUniquePtr(sqlite3 *sqlite_handle, + bool close_handle) { + auto handle = std::unique_ptr<SQLiteHandle>( + new SQLiteHandle(sqlite_handle, close_handle)); + handle->registerFunctions(); + return handle; +} + +// --------------------------------------------------------------------------- + +SQLResultSet SQLiteHandle::run(sqlite3_stmt *stmt, const std::string &sql, + const ListOfParams ¶meters, + bool useMaxFloatPrecision) { + int nBindField = 1; + for (const auto ¶m : parameters) { + const auto paramType = param.type(); + if (paramType == SQLValues::Type::STRING) { + auto strValue = param.stringValue(); + sqlite3_bind_text(stmt, nBindField, strValue.c_str(), + static_cast<int>(strValue.size()), + SQLITE_TRANSIENT); + } else if (paramType == SQLValues::Type::INT) { + sqlite3_bind_int(stmt, nBindField, param.intValue()); + } else { + assert(paramType == SQLValues::Type::DOUBLE); + sqlite3_bind_double(stmt, nBindField, param.doubleValue()); + } + nBindField++; + } + +#ifdef TRACE_DATABASE + size_t nPos = 0; + std::string sqlSubst(sql); + for (const auto ¶m : parameters) { + nPos = sqlSubst.find('?', nPos); + assert(nPos != std::string::npos); + std::string strValue; + const auto paramType = param.type(); + if (paramType == SQLValues::Type::STRING) { + strValue = '\'' + param.stringValue() + '\''; + } else if (paramType == SQLValues::Type::INT) { + strValue = toString(param.intValue()); + } else { + strValue = toString(param.doubleValue()); + } + sqlSubst = + sqlSubst.substr(0, nPos) + strValue + sqlSubst.substr(nPos + 1); + nPos += strValue.size(); + } + logTrace(sqlSubst, "DATABASE"); +#endif + + SQLResultSet result; + const int column_count = sqlite3_column_count(stmt); + while (true) { + int ret = sqlite3_step(stmt); + if (ret == SQLITE_ROW) { + SQLRow row(column_count); + for (int i = 0; i < column_count; i++) { + if (useMaxFloatPrecision && + sqlite3_column_type(stmt, i) == SQLITE_FLOAT) { + // sqlite3_column_text() does not use maximum precision + std::ostringstream buffer; + buffer.imbue(std::locale::classic()); + buffer << std::setprecision(18); + buffer << sqlite3_column_double(stmt, i); + row[i] = buffer.str(); + } else { + const char *txt = reinterpret_cast<const char *>( + sqlite3_column_text(stmt, i)); + if (txt) { + row[i] = txt; + } + } + } + result.emplace_back(std::move(row)); + } else if (ret == SQLITE_DONE) { + break; + } else { + throw FactoryException("SQLite error on " + sql + ": " + + sqlite3_errmsg(sqlite_handle_)); + } + } + return result; +} + +// --------------------------------------------------------------------------- + +SQLResultSet SQLiteHandle::run(const std::string &sql, + const ListOfParams ¶meters, + bool useMaxFloatPrecision) { + sqlite3_stmt *stmt = nullptr; + try { + if (sqlite3_prepare_v2(sqlite_handle_, sql.c_str(), + static_cast<int>(sql.size()), &stmt, + nullptr) != SQLITE_OK) { + throw FactoryException("SQLite error on " + sql + ": " + + sqlite3_errmsg(sqlite_handle_)); + } + auto ret = run(stmt, sql, parameters, useMaxFloatPrecision); + sqlite3_finalize(stmt); + return ret; + } catch (const std::exception &) { + if (stmt) + sqlite3_finalize(stmt); + throw; + } +} + +// --------------------------------------------------------------------------- + +void SQLiteHandle::checkDatabaseLayout(const std::string &mainDbPath, + const std::string &path, + const std::string &dbNamePrefix) { + if (!dbNamePrefix.empty() && run("SELECT 1 FROM " + dbNamePrefix + + "sqlite_master WHERE name = 'metadata'") + .empty()) { + // Accept auxiliary databases without metadata table (sparse DBs) + return; + } + auto res = run("SELECT key, value FROM " + dbNamePrefix + + "metadata WHERE key IN " + "('DATABASE.LAYOUT.VERSION.MAJOR', " + "'DATABASE.LAYOUT.VERSION.MINOR')"); + if (res.empty() && !dbNamePrefix.empty()) { + // Accept auxiliary databases without layout metadata. + return; + } + if (res.size() != 2) { + // The database layout of PROJ 7.2 that shipped with EPSG v10.003 is + // at the time of writing still compatible of the one we support. + static_assert( + // cppcheck-suppress knownConditionTrueFalse + DATABASE_LAYOUT_VERSION_MAJOR == 1 && + // cppcheck-suppress knownConditionTrueFalse + DATABASE_LAYOUT_VERSION_MINOR == 1, + "remove that assertion and below lines next time we upgrade " + "database structure"); + res = run("SELECT 1 FROM metadata WHERE key = 'EPSG.VERSION' AND " + "value = 'v10.003'"); + if (!res.empty()) { + return; + } + + throw FactoryException( + path + " lacks DATABASE.LAYOUT.VERSION.MAJOR / " + "DATABASE.LAYOUT.VERSION.MINOR " + "metadata. It comes from another PROJ installation."); + } + int major = 0; + int minor = 0; + for (const auto &row : res) { + if (row[0] == "DATABASE.LAYOUT.VERSION.MAJOR") { + major = atoi(row[1].c_str()); + } else if (row[0] == "DATABASE.LAYOUT.VERSION.MINOR") { + minor = atoi(row[1].c_str()); + } + } + if (major != DATABASE_LAYOUT_VERSION_MAJOR) { + throw FactoryException( + path + + " contains DATABASE.LAYOUT.VERSION.MAJOR = " + toString(major) + + " whereas " + toString(DATABASE_LAYOUT_VERSION_MAJOR) + + " is expected. " + "It comes from another PROJ installation."); + } + // Database layout v1.0 of PROJ 8.0 is forward compatible with v1.1 + static_assert( + // cppcheck-suppress knownConditionTrueFalse + DATABASE_LAYOUT_VERSION_MAJOR == 1 && + // cppcheck-suppress knownConditionTrueFalse + DATABASE_LAYOUT_VERSION_MINOR == 1, + "re-enable the check below if database layout v1.0 and v1.1 is no " + "longer compatible"); +#if 0 + if (minor < DATABASE_LAYOUT_VERSION_MINOR) { + throw FactoryException( + path + + " contains DATABASE.LAYOUT.VERSION.MINOR = " + toString(minor) + + " whereas a number >= " + toString(DATABASE_LAYOUT_VERSION_MINOR) + + " is expected. " + "It comes from another PROJ installation."); + } +#endif + if (dbNamePrefix.empty()) { + nLayoutVersionMajor_ = major; + nLayoutVersionMinor_ = minor; + } else if (nLayoutVersionMajor_ != major || nLayoutVersionMinor_ != minor) { + throw FactoryException( + "Auxiliary database " + path + + " contains a DATABASE.LAYOUT.VERSION = " + toString(major) + '.' + + toString(minor) + + " which is different from the one from the main database " + + mainDbPath + " which is " + toString(nLayoutVersionMajor_) + '.' + + toString(nLayoutVersionMinor_)); + } +} + +// --------------------------------------------------------------------------- + +#ifndef SQLITE_DETERMINISTIC +#define SQLITE_DETERMINISTIC 0 +#endif + +void SQLiteHandle::registerFunctions() { + sqlite3_create_function(sqlite_handle_, "pseudo_area_from_swne", 4, + SQLITE_UTF8 | SQLITE_DETERMINISTIC, nullptr, + PROJ_SQLITE_pseudo_area_from_swne, nullptr, + nullptr); + + sqlite3_create_function(sqlite_handle_, "intersects_bbox", 8, + SQLITE_UTF8 | SQLITE_DETERMINISTIC, nullptr, + PROJ_SQLITE_intersects_bbox, nullptr, nullptr); +} + +// --------------------------------------------------------------------------- + +class SQLiteHandleCache { + NS_PROJ::mutex sMutex_{}; + + // Map dbname to SQLiteHandle + lru11::Cache<std::string, std::shared_ptr<SQLiteHandle>> cache_{}; + + public: + static SQLiteHandleCache &get(); + + std::shared_ptr<SQLiteHandle> getHandle(const std::string &path, + PJ_CONTEXT *ctx); + + void clear(); +}; + +// --------------------------------------------------------------------------- + +SQLiteHandleCache &SQLiteHandleCache::get() { + // Global cache + static SQLiteHandleCache gSQLiteHandleCache; + return gSQLiteHandleCache; +} + +// --------------------------------------------------------------------------- + +void SQLiteHandleCache::clear() { + NS_PROJ::lock_guard<NS_PROJ::mutex> lock(sMutex_); + cache_.clear(); +} + +// --------------------------------------------------------------------------- + +std::shared_ptr<SQLiteHandle> +SQLiteHandleCache::getHandle(const std::string &path, PJ_CONTEXT *ctx) { + NS_PROJ::lock_guard<NS_PROJ::mutex> lock(sMutex_); + std::shared_ptr<SQLiteHandle> handle; + std::string key = path + ctx->custom_sqlite3_vfs_name; + if (!cache_.tryGet(key, handle)) { + handle = SQLiteHandle::open(ctx, path); + cache_.insert(key, handle); + } + return handle; +} + +// --------------------------------------------------------------------------- + struct DatabaseContext::Private { Private(); ~Private(); @@ -152,7 +611,9 @@ struct DatabaseContext::Private { void open(const std::string &databasePath, PJ_CONTEXT *ctx); void setHandle(sqlite3 *sqlite_handle); - sqlite3 *handle() const { return sqlite_handle_; } + sqlite3 *handle() const { + return sqlite_handle_ ? sqlite_handle_->handle() : nullptr; + } PJ_CONTEXT *pjCtxt() const { return pjCtxt_; } void setPjCtxt(PJ_CONTEXT *ctxt) { pjCtxt_ = ctxt; } @@ -272,10 +733,7 @@ struct DatabaseContext::Private { std::string databasePath_{}; std::vector<std::string> auxiliaryDatabasePaths_{}; - bool close_handle_ = true; - sqlite3 *sqlite_handle_{}; - int nLayoutVersionMajor_ = 0; - int nLayoutVersionMinor_ = 0; + std::shared_ptr<SQLiteHandle> sqlite_handle_{}; std::map<std::string, sqlite3_stmt *> mapSqlToStatement_{}; PJ_CONTEXT *pjCtxt_ = nullptr; int recLevel_ = 0; @@ -285,7 +743,7 @@ struct DatabaseContext::Private { // Used by startInsertStatementsSession() and related functions std::string memoryDbForInsertPath_{}; - sqlite3 *memoryDbHandle_ = nullptr; + std::unique_ptr<SQLiteHandle> memoryDbHandle_{}; using LRUCacheOfObjects = lru11::Cache<std::string, util::BaseObjectPtr>; @@ -307,9 +765,6 @@ struct DatabaseContext::Private { lru11::Cache<std::string, std::list<std::string>> cacheAliasNames_{ CACHE_SIZE}; - void checkDatabaseLayout(const std::string &path, - const std::string &dbNamePrefix); - static void insertIntoCache(LRUCacheOfObjects &cache, const std::string &code, const util::BaseObjectPtr &obj); @@ -321,9 +776,6 @@ struct DatabaseContext::Private { void clearCaches(); - // cppcheck-suppress functionStatic - void registerFunctions(); - std::string findFreeCode(const std::string &tableName, const std::string &authName, const std::string &codePrototype); @@ -412,10 +864,6 @@ struct DatabaseContext::Private { bool numericCode, const std::vector<std::string> &allowedAuthorities); -#ifdef ENABLE_CUSTOM_LOCKLESS_VFS - std::unique_ptr<SQLite3VFS> vfs_{}; -#endif - Private(const Private &) = delete; Private &operator=(const Private &) = delete; }; @@ -460,10 +908,7 @@ void DatabaseContext::Private::closeDB() noexcept { } mapSqlToStatement_.clear(); - if (close_handle_ && sqlite_handle_ != nullptr) { - sqlite3_close(sqlite_handle_); - sqlite_handle_ = nullptr; - } + sqlite_handle_.reset(); } // --------------------------------------------------------------------------- @@ -665,14 +1110,6 @@ void DatabaseContext::Private::open(const std::string &databasePath, ctx = pj_get_default_ctx(); } - const int sqlite3VersionNumber = sqlite3_libversion_number(); - // Minimum version for correct performance: 3.11 - if (sqlite3VersionNumber < 3 * 1000000 + 11 * 1000) { - pj_log(ctx, PJ_LOG_ERROR, - "SQLite3 version is %s, whereas at least 3.11 should be used", - sqlite3_libversion()); - } - setPjCtxt(ctx); std::string path(databasePath); if (path.empty()) { @@ -685,117 +1122,9 @@ void DatabaseContext::Private::open(const std::string &databasePath, } } - std::string vfsName; -#ifdef ENABLE_CUSTOM_LOCKLESS_VFS - if (ctx->custom_sqlite3_vfs_name.empty()) { - vfs_ = SQLite3VFS::create(false, true, true); - if (vfs_ == nullptr) { - throw FactoryException("Open of " + path + " failed"); - } - vfsName = vfs_->name(); - } else -#endif - { - vfsName = ctx->custom_sqlite3_vfs_name; - } - if (sqlite3_open_v2(path.c_str(), &sqlite_handle_, - SQLITE_OPEN_READONLY | SQLITE_OPEN_NOMUTEX, - vfsName.empty() ? nullptr : vfsName.c_str()) != - SQLITE_OK || - !sqlite_handle_) { - throw FactoryException("Open of " + path + " failed"); - } + sqlite_handle_ = SQLiteHandleCache::get().getHandle(path, ctx); databasePath_ = path; - registerFunctions(); -} - -// --------------------------------------------------------------------------- - -void DatabaseContext::Private::checkDatabaseLayout( - const std::string &path, const std::string &dbNamePrefix) { - if (!dbNamePrefix.empty() && run("SELECT 1 FROM " + dbNamePrefix + - "sqlite_master WHERE name = 'metadata'") - .empty()) { - // Accept auxiliary databases without metadata table (sparse DBs) - return; - } - auto res = run("SELECT key, value FROM " + dbNamePrefix + - "metadata WHERE key IN " - "('DATABASE.LAYOUT.VERSION.MAJOR', " - "'DATABASE.LAYOUT.VERSION.MINOR')"); - if (res.empty() && !dbNamePrefix.empty()) { - // Accept auxiliary databases without layout metadata. - return; - } - if (res.size() != 2) { - // The database layout of PROJ 7.2 that shipped with EPSG v10.003 is - // at the time of writing still compatible of the one we support. - static_assert( - // cppcheck-suppress knownConditionTrueFalse - DATABASE_LAYOUT_VERSION_MAJOR == 1 && - // cppcheck-suppress knownConditionTrueFalse - DATABASE_LAYOUT_VERSION_MINOR == 1, - "remove that assertion and below lines next time we upgrade " - "database structure"); - res = run("SELECT 1 FROM metadata WHERE key = 'EPSG.VERSION' AND " - "value = 'v10.003'"); - if (!res.empty()) { - return; - } - - throw FactoryException( - path + " lacks DATABASE.LAYOUT.VERSION.MAJOR / " - "DATABASE.LAYOUT.VERSION.MINOR " - "metadata. It comes from another PROJ installation."); - } - int major = 0; - int minor = 0; - for (const auto &row : res) { - if (row[0] == "DATABASE.LAYOUT.VERSION.MAJOR") { - major = atoi(row[1].c_str()); - } else if (row[0] == "DATABASE.LAYOUT.VERSION.MINOR") { - minor = atoi(row[1].c_str()); - } - } - if (major != DATABASE_LAYOUT_VERSION_MAJOR) { - throw FactoryException( - path + - " contains DATABASE.LAYOUT.VERSION.MAJOR = " + toString(major) + - " whereas " + toString(DATABASE_LAYOUT_VERSION_MAJOR) + - " is expected. " - "It comes from another PROJ installation."); - } - // Database layout v1.0 of PROJ 8.0 is forward compatible with v1.1 - static_assert( - // cppcheck-suppress knownConditionTrueFalse - DATABASE_LAYOUT_VERSION_MAJOR == 1 && - // cppcheck-suppress knownConditionTrueFalse - DATABASE_LAYOUT_VERSION_MINOR == 1, - "re-enable the check below if database layout v1.0 and v1.1 is no " - "longer compatible"); -#if 0 - if (minor < DATABASE_LAYOUT_VERSION_MINOR) { - throw FactoryException( - path + - " contains DATABASE.LAYOUT.VERSION.MINOR = " + toString(minor) + - " whereas a number >= " + toString(DATABASE_LAYOUT_VERSION_MINOR) + - " is expected. " - "It comes from another PROJ installation."); - } -#endif - if (dbNamePrefix.empty()) { - nLayoutVersionMajor_ = major; - nLayoutVersionMinor_ = minor; - } else if (nLayoutVersionMajor_ != major || nLayoutVersionMinor_ != minor) { - throw FactoryException( - "Auxiliary database " + path + - " contains a DATABASE.LAYOUT.VERSION = " + toString(major) + '.' + - toString(minor) + - " which is different from the one from the main database " + - databasePath_ + " which is " + toString(nLayoutVersionMajor_) + - '.' + toString(nLayoutVersionMinor_)); - } } // --------------------------------------------------------------------------- @@ -804,10 +1133,7 @@ void DatabaseContext::Private::setHandle(sqlite3 *sqlite_handle) { assert(sqlite_handle); assert(!sqlite_handle_); - sqlite_handle_ = sqlite_handle; - close_handle_ = false; - - registerFunctions(); + sqlite_handle_ = SQLiteHandle::initFromExisting(sqlite_handle, false, 0, 0); } // --------------------------------------------------------------------------- @@ -819,9 +1145,8 @@ std::vector<std::string> DatabaseContext::Private::getDatabaseStructure() { : "db_0."); const auto sqlBegin("SELECT sql||';' FROM " + dbNamePrefix + "sqlite_master WHERE type = "); - const char *const objectTypes[] = {"'table' AND " - "name NOT LIKE 'sqlite_stat%'", - "'view'", "'trigger'"}; + const char *tableType = "'table' AND name NOT LIKE 'sqlite_stat%'"; + const char *const objectTypes[] = {tableType, "'view'", "'trigger'"}; std::vector<std::string> res; for (const auto &objectType : objectTypes) { const auto sqlRes = run(sqlBegin + objectType); @@ -829,13 +1154,13 @@ std::vector<std::string> DatabaseContext::Private::getDatabaseStructure() { res.emplace_back(row[0]); } } - if (nLayoutVersionMajor_ > 0) { + if (sqlite_handle_->getLayoutVersionMajor() > 0) { res.emplace_back( "INSERT INTO metadata VALUES('DATABASE.LAYOUT.VERSION.MAJOR'," + - toString(nLayoutVersionMajor_) + ");"); + toString(sqlite_handle_->getLayoutVersionMajor()) + ");"); res.emplace_back( "INSERT INTO metadata VALUES('DATABASE.LAYOUT.VERSION.MINOR'," + - toString(nLayoutVersionMinor_) + ");"); + toString(sqlite_handle_->getLayoutVersionMinor()) + ");"); } return res; } @@ -844,7 +1169,7 @@ std::vector<std::string> DatabaseContext::Private::getDatabaseStructure() { void DatabaseContext::Private::attachExtraDatabases( const std::vector<std::string> &auxiliaryDatabasePaths) { - assert(close_handle_); + assert(sqlite_handle_); auto tables = @@ -861,18 +1186,24 @@ void DatabaseContext::Private::attachExtraDatabases( } } + const int nLayoutVersionMajor = sqlite_handle_->getLayoutVersionMajor(); + const int nLayoutVersionMinor = sqlite_handle_->getLayoutVersionMinor(); + closeDB(); if (auxiliaryDatabasePaths.empty()) { open(databasePath_, pjCtxt()); return; } + sqlite3 *sqlite_handle = nullptr; sqlite3_open_v2( - ":memory:", &sqlite_handle_, + ":memory:", &sqlite_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_URI, nullptr); - if (!sqlite_handle_) { + if (!sqlite_handle) { throw FactoryException("cannot create in memory database"); } + sqlite_handle_ = SQLiteHandle::initFromExisting( + sqlite_handle, true, nLayoutVersionMajor, nLayoutVersionMinor); run("ATTACH DATABASE '" + replaceAll(databasePath_, "'", "''") + "' AS db_0"); @@ -887,7 +1218,8 @@ void DatabaseContext::Private::attachExtraDatabases( count++; run(sql); - checkDatabaseLayout(otherDbPath, attachedDbName + '.'); + sqlite_handle_->checkDatabaseLayout(databasePath_, otherDbPath, + attachedDbName + '.'); } for (const auto &pair : tableStructure) { @@ -923,92 +1255,6 @@ void DatabaseContext::Private::attachExtraDatabases( } run(sql); } - - registerFunctions(); -} - -// --------------------------------------------------------------------------- - -static double PROJ_SQLITE_GetValAsDouble(sqlite3_value *val, bool &gotVal) { - switch (sqlite3_value_type(val)) { - case SQLITE_FLOAT: - gotVal = true; - return sqlite3_value_double(val); - - case SQLITE_INTEGER: - gotVal = true; - return static_cast<double>(sqlite3_value_int64(val)); - - default: - gotVal = false; - return 0.0; - } -} - -// --------------------------------------------------------------------------- - -static void PROJ_SQLITE_pseudo_area_from_swne(sqlite3_context *pContext, - int /* argc */, - sqlite3_value **argv) { - bool b0, b1, b2, b3; - double south_lat = PROJ_SQLITE_GetValAsDouble(argv[0], b0); - double west_lon = PROJ_SQLITE_GetValAsDouble(argv[1], b1); - double north_lat = PROJ_SQLITE_GetValAsDouble(argv[2], b2); - double east_lon = PROJ_SQLITE_GetValAsDouble(argv[3], b3); - if (!b0 || !b1 || !b2 || !b3) { - sqlite3_result_null(pContext); - return; - } - // Deal with area crossing antimeridian - if (east_lon < west_lon) { - east_lon += 360.0; - } - // Integrate cos(lat) between south_lat and north_lat - double pseudo_area = (east_lon - west_lon) * - (std::sin(common::Angle(north_lat).getSIValue()) - - std::sin(common::Angle(south_lat).getSIValue())); - sqlite3_result_double(pContext, pseudo_area); -} - -// --------------------------------------------------------------------------- - -static void PROJ_SQLITE_intersects_bbox(sqlite3_context *pContext, - int /* argc */, sqlite3_value **argv) { - bool b0, b1, b2, b3, b4, b5, b6, b7; - double south_lat1 = PROJ_SQLITE_GetValAsDouble(argv[0], b0); - double west_lon1 = PROJ_SQLITE_GetValAsDouble(argv[1], b1); - double north_lat1 = PROJ_SQLITE_GetValAsDouble(argv[2], b2); - double east_lon1 = PROJ_SQLITE_GetValAsDouble(argv[3], b3); - double south_lat2 = PROJ_SQLITE_GetValAsDouble(argv[4], b4); - double west_lon2 = PROJ_SQLITE_GetValAsDouble(argv[5], b5); - double north_lat2 = PROJ_SQLITE_GetValAsDouble(argv[6], b6); - double east_lon2 = PROJ_SQLITE_GetValAsDouble(argv[7], b7); - if (!b0 || !b1 || !b2 || !b3 || !b4 || !b5 || !b6 || !b7) { - sqlite3_result_null(pContext); - return; - } - auto bbox1 = metadata::GeographicBoundingBox::create(west_lon1, south_lat1, - east_lon1, north_lat1); - auto bbox2 = metadata::GeographicBoundingBox::create(west_lon2, south_lat2, - east_lon2, north_lat2); - sqlite3_result_int(pContext, bbox1->intersects(bbox2) ? 1 : 0); -} - -// --------------------------------------------------------------------------- - -#ifndef SQLITE_DETERMINISTIC -#define SQLITE_DETERMINISTIC 0 -#endif - -void DatabaseContext::Private::registerFunctions() { - sqlite3_create_function(sqlite_handle_, "pseudo_area_from_swne", 4, - SQLITE_UTF8 | SQLITE_DETERMINISTIC, nullptr, - PROJ_SQLITE_pseudo_area_from_swne, nullptr, - nullptr); - - sqlite3_create_function(sqlite_handle_, "intersects_bbox", 8, - SQLITE_UTF8 | SQLITE_DETERMINISTIC, nullptr, - PROJ_SQLITE_intersects_bbox, nullptr, nullptr); } // --------------------------------------------------------------------------- @@ -1023,87 +1269,17 @@ SQLResultSet DatabaseContext::Private::run(const std::string &sql, stmt = iter->second; sqlite3_reset(stmt); } else { - if (sqlite3_prepare_v2(sqlite_handle_, sql.c_str(), + if (sqlite3_prepare_v2(handle(), sql.c_str(), static_cast<int>(sql.size()), &stmt, nullptr) != SQLITE_OK) { throw FactoryException("SQLite error on " + sql + ": " + - sqlite3_errmsg(sqlite_handle_)); + sqlite3_errmsg(handle())); } mapSqlToStatement_.insert( std::pair<std::string, sqlite3_stmt *>(sql, stmt)); } - int nBindField = 1; - for (const auto ¶m : parameters) { - const auto paramType = param.type(); - if (paramType == SQLValues::Type::STRING) { - auto strValue = param.stringValue(); - sqlite3_bind_text(stmt, nBindField, strValue.c_str(), - static_cast<int>(strValue.size()), - SQLITE_TRANSIENT); - } else if (paramType == SQLValues::Type::INT) { - sqlite3_bind_int(stmt, nBindField, param.intValue()); - } else { - assert(paramType == SQLValues::Type::DOUBLE); - sqlite3_bind_double(stmt, nBindField, param.doubleValue()); - } - nBindField++; - } - -#ifdef TRACE_DATABASE - size_t nPos = 0; - std::string sqlSubst(sql); - for (const auto ¶m : parameters) { - nPos = sqlSubst.find('?', nPos); - assert(nPos != std::string::npos); - std::string strValue; - const auto paramType = param.type(); - if (paramType == SQLValues::Type::STRING) { - strValue = '\'' + param.stringValue() + '\''; - } else if (paramType == SQLValues::Type::INT) { - strValue = toString(param.intValue()); - } else { - strValue = toString(param.doubleValue()); - } - sqlSubst = - sqlSubst.substr(0, nPos) + strValue + sqlSubst.substr(nPos + 1); - nPos += strValue.size(); - } - logTrace(sqlSubst, "DATABASE"); -#endif - - SQLResultSet result; - const int column_count = sqlite3_column_count(stmt); - while (true) { - int ret = sqlite3_step(stmt); - if (ret == SQLITE_ROW) { - SQLRow row(column_count); - for (int i = 0; i < column_count; i++) { - if (useMaxFloatPrecision && - sqlite3_column_type(stmt, i) == SQLITE_FLOAT) { - // sqlite3_column_text() does not use maximum precision - std::ostringstream buffer; - buffer.imbue(std::locale::classic()); - buffer << std::setprecision(18); - buffer << sqlite3_column_double(stmt, i); - row[i] = buffer.str(); - } else { - const char *txt = reinterpret_cast<const char *>( - sqlite3_column_text(stmt, i)); - if (txt) { - row[i] = txt; - } - } - } - result.emplace_back(std::move(row)); - } else if (ret == SQLITE_DONE) { - break; - } else { - throw FactoryException("SQLite error on " + sql + ": " + - sqlite3_errmsg(sqlite_handle_)); - } - } - return result; + return sqlite_handle_->run(stmt, sql, parameters, useMaxFloatPrecision); } // --------------------------------------------------------------------------- @@ -1152,8 +1328,8 @@ void DatabaseContext::Private::appendSql( std::vector<std::string> &sqlStatements, const std::string &sql) { sqlStatements.emplace_back(sql); char *errMsg = nullptr; - if (sqlite3_exec(memoryDbHandle_, sql.c_str(), nullptr, nullptr, &errMsg) != - SQLITE_OK) { + if (sqlite3_exec(memoryDbHandle_->handle(), sql.c_str(), nullptr, nullptr, + &errMsg) != SQLITE_OK) { std::string s("Cannot execute " + sql); if (errMsg) { s += " : "; @@ -2551,7 +2727,6 @@ DatabaseContext::create(const std::string &databasePath, auto dbCtx = DatabaseContext::nn_make_shared<DatabaseContext>(); auto dbCtxPrivate = dbCtx->getPrivate(); dbCtxPrivate->open(databasePath, ctx); - dbCtxPrivate->checkDatabaseLayout(databasePath, std::string()); auto auxDbs(auxiliaryDatabasePaths); if (auxDbs.empty()) { const char *auxDbStr = getenv("PROJ_AUX_DB"); @@ -2647,19 +2822,27 @@ void DatabaseContext::startInsertStatementsSession() { buffer << this; buffer << ".db?mode=memory&cache=shared"; d->memoryDbForInsertPath_ = buffer.str(); + sqlite3 *memoryDbHandle = nullptr; sqlite3_open_v2( - d->memoryDbForInsertPath_.c_str(), &d->memoryDbHandle_, + d->memoryDbForInsertPath_.c_str(), &memoryDbHandle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_URI, nullptr); - if (d->memoryDbHandle_ == nullptr) { + if (memoryDbHandle == nullptr) { throw FactoryException("Cannot create in-memory database"); } + d->memoryDbHandle_ = + SQLiteHandle::initFromExistingUniquePtr(memoryDbHandle, true); // Fill the structure of this database for (const auto &sql : sqlStatements) { - if (sqlite3_exec(d->memoryDbHandle_, sql.c_str(), nullptr, nullptr, - nullptr) != SQLITE_OK) { - throw FactoryException("Cannot execute " + sql); + char *errmsg = nullptr; + if (sqlite3_exec(d->memoryDbHandle_->handle(), sql.c_str(), nullptr, + nullptr, &errmsg) != SQLITE_OK) { + const auto sErrMsg = + "Cannot execute " + sql + ": " + (errmsg ? errmsg : ""); + sqlite3_free(errmsg); + throw FactoryException(sErrMsg); } + sqlite3_free(errmsg); } // Attach this database to the current one(s) @@ -2883,8 +3066,7 @@ void DatabaseContext::stopInsertStatementsSession() { if (d->memoryDbHandle_) { d->clearCaches(); d->attachExtraDatabases(d->auxiliaryDatabasePaths_); - sqlite3_close(d->memoryDbHandle_); - d->memoryDbHandle_ = nullptr; + d->memoryDbHandle_.reset(); d->memoryDbForInsertPath_.clear(); } } @@ -8961,3 +9143,7 @@ const std::string &NoSuchAuthorityCodeException::getAuthorityCode() const { } // namespace io NS_PROJ_END + +// --------------------------------------------------------------------------- + +void pj_clear_sqlite_cache() { NS_PROJ::io::SQLiteHandleCache::get().clear(); } diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index ccbb0ffe..161441ee 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -89,10 +89,6 @@ using json = nlohmann::json; //! @cond Doxygen_Suppress static const std::string emptyString{}; - -// If changing that value, change it in data/projjson.schema.json as well -#define PROJJSON_CURRENT_VERSION \ - "https://proj.org/schemas/v0.2/projjson.schema.json" //! @endcond #if 0 @@ -109,6 +105,18 @@ template<> nn<std::unique_ptr<NS_PROJ::io::WKTNode, std::default_delete<NS_PROJ: NS_PROJ_START namespace io { +//! @cond Doxygen_Suppress +const char *JSONFormatter::PROJJSON_v0_2 = + "https://proj.org/schemas/v0.2/projjson.schema.json"; + +const char *JSONFormatter::PROJJSON_v0_3 = + "https://proj.org/schemas/v0.3/projjson.schema.json"; + +// v0.2 is our base version. We only upgrade to 0.3 for usage node in BoundCRS +#define PROJJSON_DEFAULT_VERSION JSONFormatter::PROJJSON_v0_2 + +//! @endcond + // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress @@ -1231,6 +1239,7 @@ struct WKTParser::Private { std::vector<double> toWGS84Parameters_{}; std::string datumPROJ4Grids_{}; bool esriStyle_ = false; + bool maybeEsriStyle_ = false; DatabaseContextPtr dbContext_{}; static constexpr int MAX_PROPERTY_SIZE = 1024; @@ -2195,17 +2204,39 @@ GeodeticReferenceFrameNNPtr WKTParser::Private::buildGeodeticReferenceFrame( // Remap GDAL WGS_1984 to EPSG v9 "World Geodetic System 1984" official // name. // Also remap EPSG v10 datum ensemble names to non-ensemble EPSG v9 + bool nameSet = false; if (name == "WGS_1984" || name == "World Geodetic System 1984 ensemble") { + nameSet = true; properties.set(IdentifiedObject::NAME_KEY, GeodeticReferenceFrame::EPSG_6326->nameStr()); } else if (name == "European Terrestrial Reference System 1989 ensemble") { + nameSet = true; properties.set(IdentifiedObject::NAME_KEY, "European Terrestrial Reference System 1989"); - } else if (starts_with(name, "D_")) { + } + + // If we got hints this might be a ESRI WKT, then check in the DB to + // confirm + std::string officialName; + std::string authNameFromAlias; + std::string codeFromAlias; + if (!nameSet && maybeEsriStyle_ && dbContext_ && + !(starts_with(name, "D_") || esriStyle_)) { + std::string outTableName; + auto authFactory = + AuthorityFactory::create(NN_NO_CHECK(dbContext_), std::string()); + officialName = authFactory->getOfficialNameFromAlias( + name, "geodetic_datum", "ESRI", false, outTableName, + authNameFromAlias, codeFromAlias); + if (!officialName.empty()) { + maybeEsriStyle_ = false; + esriStyle_ = true; + } + } + + if (!nameSet && (starts_with(name, "D_") || esriStyle_)) { esriStyle_ = true; const char *tableNameForAlias = nullptr; - std::string authNameFromAlias; - std::string codeFromAlias; if (name == "D_WGS_1984") { name = "World Geodetic System 1984"; authNameFromAlias = Identifier::EPSG; @@ -2220,18 +2251,23 @@ GeodeticReferenceFrameNNPtr WKTParser::Private::buildGeodeticReferenceFrame( bool setNameAndId = true; if (dbContext_ && tableNameForAlias) { - std::string outTableName; - auto authFactory = AuthorityFactory::create(NN_NO_CHECK(dbContext_), - std::string()); - auto officialName = authFactory->getOfficialNameFromAlias( - name, tableNameForAlias, "ESRI", false, outTableName, - authNameFromAlias, codeFromAlias); if (officialName.empty()) { - // For the case of "D_GDA2020" where there is no D_GDA2020 ESRI - // alias, so just try without the D_ prefix. - const auto nameWithoutDPrefix = name.substr(2); - if (identifyFromName(nameWithoutDPrefix)) { - setNameAndId = false; // already done in identifyFromName() + std::string outTableName; + auto authFactory = AuthorityFactory::create( + NN_NO_CHECK(dbContext_), std::string()); + officialName = authFactory->getOfficialNameFromAlias( + name, tableNameForAlias, "ESRI", false, outTableName, + authNameFromAlias, codeFromAlias); + } + if (officialName.empty()) { + if (starts_with(name, "D_")) { + // For the case of "D_GDA2020" where there is no D_GDA2020 + // ESRI alias, so just try without the D_ prefix. + const auto nameWithoutDPrefix = name.substr(2); + if (identifyFromName(nameWithoutDPrefix)) { + setNameAndId = + false; // already done in identifyFromName() + } } } else { if (primeMeridian->nameStr() != @@ -2258,7 +2294,7 @@ GeodeticReferenceFrameNNPtr WKTParser::Private::buildGeodeticReferenceFrame( properties.set(IdentifiedObject::IDENTIFIERS_KEY, identifiers); } } - } else if (name.find('_') != std::string::npos) { + } else if (!nameSet && name.find('_') != std::string::npos) { // Likely coming from WKT1 identifyFromName(name); } @@ -3433,6 +3469,7 @@ ConversionNNPtr WKTParser::Private::buildProjectionFromESRI( int bestMatchCount = -1; for (const auto &mapping : esriMappings) { int matchCount = 0; + int unmatchCount = 0; for (const auto *param = mapping->params; param->esri_name; ++param) { auto iter = mapParamNameToValue.find(param->esri_name); if (iter != mapParamNameToValue.end()) { @@ -3457,9 +3494,12 @@ ConversionNNPtr WKTParser::Private::buildProjectionFromESRI( } } else if (param->is_fixed_value) { mapParamNameToValue[param->esri_name] = param->fixed_value; + } else { + unmatchCount++; } } - if (matchCount > bestMatchCount) { + if (matchCount > bestMatchCount && + !(maybeEsriStyle_ && unmatchCount >= matchCount)) { esriMapping = mapping; bestMatchCount = matchCount; } @@ -3594,7 +3634,7 @@ ConversionNNPtr WKTParser::Private::buildProjection( if (projectionNode->GP()->childrenSize() == 0) { ThrowNotEnoughChildren(WKTConstants::PROJECTION); } - if (esriStyle_) { + if (esriStyle_ || maybeEsriStyle_) { return buildProjectionFromESRI(baseGeodCRS, projCRSNode, projectionNode, defaultLinearUnit, defaultAngularUnit); } @@ -4593,8 +4633,8 @@ BoundCRSNNPtr WKTParser::Private::buildBoundCRS(const WKTNodeNNPtr &node) { NN_NO_CHECK(targetCRS), nullptr, buildProperties(methodNode), parameters, values, std::vector<PositionalAccuracyNNPtr>()); - return BoundCRS::create(NN_NO_CHECK(sourceCRS), NN_NO_CHECK(targetCRS), - transformation); + return BoundCRS::create(buildProperties(node), NN_NO_CHECK(sourceCRS), + NN_NO_CHECK(targetCRS), transformation); } // --------------------------------------------------------------------------- @@ -5057,7 +5097,8 @@ class JSONParser { IdentifierNNPtr buildId(const json &j, bool removeInverseOf); static ObjectDomainPtr buildObjectDomain(const json &j); - PropertyMap buildProperties(const json &j, bool removeInverseOf = false); + PropertyMap buildProperties(const json &j, bool removeInverseOf = false, + bool nameRequired = true); GeographicCRSNNPtr buildGeographicCRS(const json &j); GeodeticCRSNNPtr buildGeodeticCRS(const json &j); @@ -5358,13 +5399,17 @@ IdentifierNNPtr JSONParser::buildId(const json &j, bool removeInverseOf) { // --------------------------------------------------------------------------- -PropertyMap JSONParser::buildProperties(const json &j, bool removeInverseOf) { +PropertyMap JSONParser::buildProperties(const json &j, bool removeInverseOf, + bool nameRequired) { PropertyMap map; - std::string name(getName(j)); - if (removeInverseOf && starts_with(name, "Inverse of ")) { - name = name.substr(strlen("Inverse of ")); + + if (j.contains("name") || nameRequired) { + std::string name(getName(j)); + if (removeInverseOf && starts_with(name, "Inverse of ")) { + name = name.substr(strlen("Inverse of ")); + } + map.set(IdentifiedObject::NAME_KEY, name); } - map.set(IdentifiedObject::NAME_KEY, name); if (j.contains("ids")) { auto idsJ = getArray(j, "ids"); @@ -5782,7 +5827,10 @@ BoundCRSNNPtr JSONParser::buildBoundCRS(const json &j) { nullptr, buildProperties(methodJ), parameters, values, std::vector<PositionalAccuracyNNPtr>()); - return BoundCRS::create(sourceCRS, targetCRS, transformation); + return BoundCRS::create(buildProperties(j, + /* removeInverseOf= */ false, + /* nameRequired=*/false), + sourceCRS, targetCRS, transformation); } // --------------------------------------------------------------------------- @@ -6972,6 +7020,16 @@ BaseObjectNNPtr createFromUserInput(const std::string &text, PJ_CONTEXT *ctx) { * @throw ParsingException */ BaseObjectNNPtr WKTParser::createFromWKT(const std::string &wkt) { + + const auto dialect = guessDialect(wkt); + d->maybeEsriStyle_ = (dialect == WKTGuessedDialect::WKT1_ESRI); + if (d->maybeEsriStyle_) { + if (wkt.find("PARAMETER[\"X_Scale\",") != std::string::npos) { + d->esriStyle_ = true; + d->maybeEsriStyle_ = false; + } + } + const auto build = [this, &wkt]() -> BaseObjectNNPtr { size_t indexEnd; WKTNodeNNPtr root = WKTNode::createFrom(wkt, 0, 0, indexEnd); @@ -7031,7 +7089,6 @@ BaseObjectNNPtr WKTParser::createFromWKT(const std::string &wkt) { auto obj = build(); - const auto dialect = guessDialect(wkt); if (dialect == WKTGuessedDialect::WKT1_GDAL || dialect == WKTGuessedDialect::WKT1_ESRI) { auto errorMsg = pj_wkt1_parse(wkt); @@ -7074,7 +7131,10 @@ WKTParser::guessDialect(const std::string &wkt) noexcept { for (const auto &pointerKeyword : wkt1_keywords) { if (ci_starts_with(wkt, *pointerKeyword)) { - if (ci_find(wkt, "GEOGCS[\"GCS_") != std::string::npos) { + if (ci_find(wkt, "GEOGCS[\"GCS_") != std::string::npos || + (!ci_starts_with(wkt, WKTConstants::LOCAL_CS) && + ci_find(wkt, "AXIS[") == std::string::npos && + ci_find(wkt, "AUTHORITY[") == std::string::npos)) { return WKTGuessedDialect::WKT1_ESRI; } @@ -7382,7 +7442,8 @@ const std::string &PROJStringFormatter::toString() const { d->result_.clear(); - for (auto iter = d->steps_.begin(); iter != d->steps_.end();) { + auto &steps = d->steps_; + for (auto iter = steps.begin(); iter != steps.end();) { // Remove no-op helmert auto &step = *iter; const auto paramCount = step.paramValues.size(); @@ -7396,25 +7457,29 @@ const std::string &PROJStringFormatter::toString() const { step.paramValues[5].equals("rz", "0") && step.paramValues[6].equals("s", "0") && step.paramValues[7].keyEquals("convention")))) { - iter = d->steps_.erase(iter); + iter = steps.erase(iter); } else if (d->coordOperationOptimizations_ && step.name == "unitconvert" && paramCount == 2 && step.paramValues[0].keyEquals("xy_in") && step.paramValues[1].keyEquals("xy_out") && step.paramValues[0].value == step.paramValues[1].value) { - iter = d->steps_.erase(iter); + iter = steps.erase(iter); } else if (step.name == "push" && step.inverted) { step.name = "pop"; step.inverted = false; + ++iter; } else if (step.name == "pop" && step.inverted) { step.name = "push"; step.inverted = false; + ++iter; + } else if (step.name == "noop" && steps.size() > 1) { + iter = steps.erase(iter); } else { ++iter; } } - for (auto &step : d->steps_) { + for (auto &step : steps) { if (!step.inverted) { continue; } @@ -7457,31 +7522,36 @@ const std::string &PROJStringFormatter::toString() const { } } - bool changeDone; - do { - changeDone = false; - auto iterPrev = d->steps_.begin(); - if (iterPrev == d->steps_.end()) { - break; + { + auto iterCur = steps.begin(); + if (iterCur != steps.end()) { + ++iterCur; } - auto iterCur = iterPrev; - iterCur++; - for (size_t i = 1; i < d->steps_.size(); ++i, ++iterCur, ++iterPrev) { + while (iterCur != steps.end()) { + assert(iterCur != steps.begin()); + auto iterPrev = std::prev(iterCur); auto &prevStep = *iterPrev; auto &curStep = *iterCur; const auto curStepParamCount = curStep.paramValues.size(); const auto prevStepParamCount = prevStep.paramValues.size(); + const auto deletePrevAndCurIter = [&steps, &iterPrev, &iterCur]() { + iterCur = steps.erase(iterPrev, std::next(iterCur)); + if (iterCur != steps.begin()) + iterCur = std::prev(iterCur); + if (iterCur == steps.begin()) + ++iterCur; + }; + // longlat (or its inverse) with ellipsoid only is a no-op // do that only for an internal step - if (i + 1 < d->steps_.size() && curStep.name == "longlat" && - curStepParamCount == 1 && + if (std::next(iterCur) != steps.end() && + curStep.name == "longlat" && curStepParamCount == 1 && curStep.paramValues[0].keyEquals("ellps")) { - d->steps_.erase(iterCur); - changeDone = true; - break; + iterCur = steps.erase(iterCur); + continue; } // push v_x followed by pop v_x is a no-op. @@ -7489,10 +7559,8 @@ const std::string &PROJStringFormatter::toString() const { !curStep.inverted && !prevStep.inverted && curStepParamCount == 1 && prevStepParamCount == 1 && curStep.paramValues[0].key == prevStep.paramValues[0].key) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); - changeDone = true; - break; + deletePrevAndCurIter(); + continue; } // pop v_x followed by push v_x is, almost, a no-op. For our @@ -7502,10 +7570,8 @@ const std::string &PROJStringFormatter::toString() const { !curStep.inverted && !prevStep.inverted && curStepParamCount == 1 && prevStepParamCount == 1 && curStep.paramValues[0].key == prevStep.paramValues[0].key) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); - changeDone = true; - break; + deletePrevAndCurIter(); + continue; } // unitconvert (xy) followed by its inverse is a no-op @@ -7519,10 +7585,8 @@ const std::string &PROJStringFormatter::toString() const { prevStep.paramValues[1].keyEquals("xy_out") && curStep.paramValues[0].value == prevStep.paramValues[1].value && curStep.paramValues[1].value == prevStep.paramValues[0].value) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); - changeDone = true; - break; + deletePrevAndCurIter(); + continue; } // unitconvert (z) followed by its inverse is a no-op @@ -7536,10 +7600,8 @@ const std::string &PROJStringFormatter::toString() const { prevStep.paramValues[1].keyEquals("z_out") && curStep.paramValues[0].value == prevStep.paramValues[1].value && curStep.paramValues[1].value == prevStep.paramValues[0].value) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); - changeDone = true; - break; + deletePrevAndCurIter(); + continue; } // unitconvert (xyz) followed by its inverse is a no-op @@ -7559,13 +7621,20 @@ const std::string &PROJStringFormatter::toString() const { curStep.paramValues[1].value == prevStep.paramValues[3].value && curStep.paramValues[2].value == prevStep.paramValues[0].value && curStep.paramValues[3].value == prevStep.paramValues[1].value) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); - changeDone = true; - break; + deletePrevAndCurIter(); + continue; } + const auto deletePrevIter = [&steps, &iterPrev, &iterCur]() { + steps.erase(iterPrev, iterCur); + if (iterCur != steps.begin()) + iterCur = std::prev(iterCur); + if (iterCur == steps.begin()) + ++iterCur; + }; + // combine unitconvert (xy) and unitconvert (z) + bool changeDone = false; for (int k = 0; k < 2; ++k) { auto &first = (k == 0) ? curStep : prevStep; auto &second = (k == 0) ? prevStep : curStep; @@ -7582,7 +7651,7 @@ const std::string &PROJStringFormatter::toString() const { auto xy_out = second.paramValues[1].value; auto z_in = first.paramValues[0].value; auto z_out = first.paramValues[1].value; - d->steps_.erase(iterPrev, iterCur); + iterCur->paramValues.clear(); iterCur->paramValues.emplace_back( Step::KeyValue("xy_in", xy_in)); @@ -7592,12 +7661,14 @@ const std::string &PROJStringFormatter::toString() const { Step::KeyValue("xy_out", xy_out)); iterCur->paramValues.emplace_back( Step::KeyValue("z_out", z_out)); + + deletePrevIter(); changeDone = true; break; } } if (changeDone) { - break; + continue; } // +step +proj=unitconvert +xy_in=X1 +xy_out=X2 @@ -7621,22 +7692,21 @@ const std::string &PROJStringFormatter::toString() const { auto z_in = first.paramValues[1].value; auto z_out = first.paramValues[3].value; if (z_in != z_out) { - d->steps_.erase(iterPrev, iterCur); iterCur->paramValues.clear(); iterCur->paramValues.emplace_back( Step::KeyValue("z_in", z_in)); iterCur->paramValues.emplace_back( Step::KeyValue("z_out", z_out)); + deletePrevIter(); } else { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); + deletePrevAndCurIter(); } changeDone = true; break; } } if (changeDone) { - break; + continue; } // +step +proj=unitconvert +xy_in=X1 +z_in=Z1 +xy_out=X2 +z_out=Z2 @@ -7658,7 +7728,7 @@ const std::string &PROJStringFormatter::toString() const { auto z_in = prevStep.paramValues[1].value; auto xy_out = prevStep.paramValues[2].value; auto z_out = curStep.paramValues[1].value; - d->steps_.erase(iterPrev, iterCur); + iterCur->paramValues.clear(); iterCur->paramValues.emplace_back( Step::KeyValue("xy_in", xy_in)); @@ -7667,23 +7737,24 @@ const std::string &PROJStringFormatter::toString() const { Step::KeyValue("xy_out", xy_out)); iterCur->paramValues.emplace_back( Step::KeyValue("z_out", z_out)); - changeDone = true; - break; + + deletePrevIter(); + continue; } // unitconvert (1), axisswap order=2,1, unitconvert(2) ==> // axisswap order=2,1, unitconvert (1), unitconvert(2) which // will get further optimized by previous case - if (i + 1 < d->steps_.size() && prevStep.name == "unitconvert" && - curStep.name == "axisswap" && curStepParamCount == 1 && + if (std::next(iterCur) != steps.end() && + prevStep.name == "unitconvert" && curStep.name == "axisswap" && + curStepParamCount == 1 && curStep.paramValues[0].equals("order", "2,1")) { - auto iterNext = iterCur; - ++iterNext; + auto iterNext = std::next(iterCur); auto &nextStep = *iterNext; if (nextStep.name == "unitconvert") { std::swap(*iterPrev, *iterCur); - changeDone = true; - break; + ++iterCur; + continue; } } @@ -7692,27 +7763,32 @@ const std::string &PROJStringFormatter::toString() const { curStepParamCount == 1 && prevStepParamCount == 1 && curStep.paramValues[0].equals("order", "2,1") && prevStep.paramValues[0].equals("order", "2,1")) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); - changeDone = true; - break; + deletePrevAndCurIter(); + continue; } // axisswap order=2,1, unitconvert, axisswap order=2,1 -> can // suppress axisswap - if (i + 1 < d->steps_.size() && prevStep.name == "axisswap" && - curStep.name == "unitconvert" && prevStepParamCount == 1 && + if (std::next(iterCur) != steps.end() && + prevStep.name == "axisswap" && curStep.name == "unitconvert" && + prevStepParamCount == 1 && prevStep.paramValues[0].equals("order", "2,1")) { - auto iterNext = iterCur; - ++iterNext; + auto iterNext = std::next(iterCur); auto &nextStep = *iterNext; if (nextStep.name == "axisswap" && nextStep.paramValues.size() == 1 && nextStep.paramValues[0].equals("order", "2,1")) { - d->steps_.erase(iterPrev); - d->steps_.erase(iterNext); - changeDone = true; - break; + steps.erase(iterPrev); + steps.erase(iterNext); + // Coverity complains about invalid usage of iterCur + // due to the above erase(iterNext). To the best of our + // understanding, this is a false-positive. + // coverity[use_iterator] + if (iterCur != steps.begin()) + iterCur = std::prev(iterCur); + if (iterCur == steps.begin()) + ++iterCur; + continue; } } @@ -7728,10 +7804,8 @@ const std::string &PROJStringFormatter::toString() const { prevStep.paramValues[0].equals("ellps", "GRS80")) || (curStep.paramValues[0].equals("ellps", "GRS80") && prevStep.paramValues[0].equals("ellps", "WGS84")))) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); - changeDone = true; - break; + deletePrevAndCurIter(); + continue; } if (curStep.name == "helmert" && prevStep.name == "helmert" && @@ -7764,8 +7838,7 @@ const std::string &PROJStringFormatter::toString() const { const double ySum = leftParamsMap[y] + rightParamsMap[y]; const double zSum = leftParamsMap[z] + rightParamsMap[z]; if (xSum == 0.0 && ySum == 0.0 && zSum == 0.0) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); + deletePrevAndCurIter(); } else { prevStep.paramValues[0] = Step::KeyValue("x", internal::toString(xSum)); @@ -7774,10 +7847,10 @@ const std::string &PROJStringFormatter::toString() const { prevStep.paramValues[2] = Step::KeyValue("z", internal::toString(zSum)); - d->steps_.erase(iterCur); + // Delete this iter + iterCur = steps.erase(iterCur); } - changeDone = true; - break; + continue; } } @@ -7818,10 +7891,8 @@ const std::string &PROJStringFormatter::toString() const { break; } if (doErase) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); - changeDone = true; - break; + deletePrevAndCurIter(); + continue; } } } @@ -7835,10 +7906,10 @@ const std::string &PROJStringFormatter::toString() const { // +step +proj=vgridshift [...] // +step +inv +proj=hgridshift +grids=grid_A +omit_fwd // +step +proj=pop +v_1 +v_2 - if (i + 1 < d->steps_.size() && prevStep.name == "hgridshift" && - prevStepParamCount == 1 && curStep.name == "vgridshift") { - auto iterNext = iterCur; - ++iterNext; + if (std::next(iterCur) != steps.end() && + prevStep.name == "hgridshift" && prevStepParamCount == 1 && + curStep.name == "vgridshift") { + auto iterNext = std::next(iterCur); auto &nextStep = *iterNext; if (nextStep.name == "hgridshift" && nextStep.inverted != prevStep.inverted && @@ -7848,7 +7919,7 @@ const std::string &PROJStringFormatter::toString() const { pushStep.name = "push"; pushStep.paramValues.emplace_back("v_1"); pushStep.paramValues.emplace_back("v_2"); - d->steps_.insert(iterPrev, pushStep); + steps.insert(iterPrev, pushStep); prevStep.paramValues.emplace_back("omit_inv"); @@ -7858,11 +7929,9 @@ const std::string &PROJStringFormatter::toString() const { popStep.name = "pop"; popStep.paramValues.emplace_back("v_1"); popStep.paramValues.emplace_back("v_2"); - ++iterNext; - d->steps_.insert(iterNext, popStep); + steps.insert(std::next(iterNext), popStep); - changeDone = true; - break; + continue; } } @@ -7878,19 +7947,19 @@ const std::string &PROJStringFormatter::toString() const { } } if (allSame) { - ++iterCur; - d->steps_.erase(iterPrev, iterCur); - changeDone = true; - break; + deletePrevAndCurIter(); + continue; } } + + ++iterCur; } - } while (changeDone); + } - if (d->steps_.size() > 1 || - (d->steps_.size() == 1 && - (d->steps_.front().inverted || d->steps_.front().hasKey("omit_inv") || - d->steps_.front().hasKey("omit_fwd") || + if (steps.size() > 1 || + (steps.size() == 1 && + (steps.front().inverted || steps.front().hasKey("omit_inv") || + steps.front().hasKey("omit_fwd") || !d->globalParamValues_.empty()))) { d->appendToResult("+proj=pipeline"); @@ -7909,7 +7978,7 @@ const std::string &PROJStringFormatter::toString() const { } } - for (const auto &step : d->steps_) { + for (const auto &step : steps) { std::string curLine; if (!d->result_.empty()) { if (d->multiLine_) { @@ -7939,7 +8008,7 @@ const std::string &PROJStringFormatter::toString() const { if (d->maxLineLength_ > 0 && d->multiLine_ && curLine.size() + newKV.size() > static_cast<size_t>(d->maxLineLength_)) { - if (d->multiLine_ && !d->result_.empty()) + if (!d->result_.empty()) d->result_ += '\n'; d->result_ += curLine; curLine = std::string( @@ -10529,7 +10598,7 @@ struct JSONFormatter::Private { bool allowIDInImmediateChild_ = false; bool omitTypeInImmediateChild_ = false; bool abridgedTransformation_ = false; - std::string schema_ = PROJJSON_CURRENT_VERSION; + std::string schema_ = PROJJSON_DEFAULT_VERSION; std::string result_{}; @@ -10580,7 +10649,10 @@ JSONFormatter &JSONFormatter::setIndentationWidth(int width) noexcept { * If set to empty string, it will not be written. */ JSONFormatter &JSONFormatter::setSchema(const std::string &schema) noexcept { - d->schema_ = schema; + // Upgrade only to v0.3 if the default was v0.2 + if (schema != PROJJSON_v0_3 || d->schema_ == PROJJSON_v0_2) { + d->schema_ = schema; + } return *this; } @@ -10604,8 +10676,9 @@ bool JSONFormatter::outputId() const { return d->outputIdStack_.back(); } // --------------------------------------------------------------------------- -bool JSONFormatter::outputUsage() const { - return outputId() && d->outputIdStack_.size() == 2; +bool JSONFormatter::outputUsage(bool calledBeforeObjectContext) const { + return outputId() && + d->outputIdStack_.size() == (calledBeforeObjectContext ? 1U : 2U); } // --------------------------------------------------------------------------- diff --git a/src/iso19111/operation/concatenatedoperation.cpp b/src/iso19111/operation/concatenatedoperation.cpp index 20bbce6f..185ebb4a 100644 --- a/src/iso19111/operation/concatenatedoperation.cpp +++ b/src/iso19111/operation/concatenatedoperation.cpp @@ -335,13 +335,26 @@ void ConcatenatedOperation::fixStepsDirection( } } } else if (conv && i > 0 && i < operationsInOut.size() - 1) { - // For an intermediate conversion, use the target CRS of the - // previous step and the source CRS of the next step + l_sourceCRS = operationsInOut[i - 1]->targetCRS(); l_targetCRS = operationsInOut[i + 1]->sourceCRS(); + // For an intermediate conversion, use the target CRS of the + // previous step and the source CRS of the next step if (l_sourceCRS && l_targetCRS) { - op->setCRSs(NN_NO_CHECK(l_sourceCRS), NN_NO_CHECK(l_targetCRS), - nullptr); + // If the sourceCRS is a projectedCRS and the target a + // geographic one, then we must inverse the operation. See + // https://github.com/OSGeo/PROJ/issues/2817 + if (dynamic_cast<const crs::ProjectedCRS *>( + l_sourceCRS.get()) && + dynamic_cast<const crs::GeographicCRS *>( + l_targetCRS.get())) { + op->setCRSs(NN_NO_CHECK(l_targetCRS), + NN_NO_CHECK(l_sourceCRS), nullptr); + op = op->inverse(); + } else { + op->setCRSs(NN_NO_CHECK(l_sourceCRS), + NN_NO_CHECK(l_targetCRS), nullptr); + } } else if (l_sourceCRS && l_targetCRS == nullptr && conv->method()->getEPSGCode() == EPSG_CODE_METHOD_HEIGHT_DEPTH_REVERSAL) { @@ -380,6 +393,11 @@ void ConcatenatedOperation::fixStepsDirection( // whereas we should instead use the reverse path. auto prevOpTarget = (i == 0) ? concatOpSourceCRS.as_nullable() : operationsInOut[i - 1]->targetCRS(); + if (prevOpTarget == nullptr) { + throw InvalidOperation( + "Cannot determine targetCRS of operation at step " + + toString(static_cast<int>(i))); + } if (compareStepCRS(l_sourceCRS.get(), prevOpTarget.get())) { // do nothing } else if (compareStepCRS(l_targetCRS.get(), prevOpTarget.get())) { diff --git a/src/iso19111/operation/conversion.cpp b/src/iso19111/operation/conversion.cpp index e2e77562..e884db3c 100644 --- a/src/iso19111/operation/conversion.cpp +++ b/src/iso19111/operation/conversion.cpp @@ -331,6 +331,9 @@ Conversion::create(const util::PropertyMap &properties, */ ConversionNNPtr Conversion::createUTM(const util::PropertyMap &properties, int zone, bool north) { + if (zone < 1 || zone > 60) { + throw InvalidOperation("Invalid zone number"); + } return create( getUTMConversionProperty(properties, zone, north), EPSG_CODE_METHOD_TRANSVERSE_MERCATOR, diff --git a/src/iso19111/operation/coordinateoperationfactory.cpp b/src/iso19111/operation/coordinateoperationfactory.cpp index 183926bf..fc64bd2e 100644 --- a/src/iso19111/operation/coordinateoperationfactory.cpp +++ b/src/iso19111/operation/coordinateoperationfactory.cpp @@ -3121,7 +3121,8 @@ void CoordinateOperationFactory::Private::createOperationsFromProj4Ext( projFormatter->setLegacyCRSToCRSContext(true); projFormatter->startInversion(); sourceProjExportable->_exportToPROJString(projFormatter.get()); - auto geogSrc = dynamic_cast<const crs::GeographicCRS *>(sourceCRS.get()); + auto geogSrc = dynamic_cast<const crs::GeographicCRS *>( + boundSrc ? boundSrc->baseCRS().get() : sourceCRS.get()); if (geogSrc) { auto tmpFormatter = io::PROJStringFormatter::create(); geogSrc->addAngularUnitConvertAndAxisSwap(tmpFormatter.get()); @@ -3131,7 +3132,8 @@ void CoordinateOperationFactory::Private::createOperationsFromProj4Ext( projFormatter->stopInversion(); targetProjExportable->_exportToPROJString(projFormatter.get()); - auto geogDst = dynamic_cast<const crs::GeographicCRS *>(targetCRS.get()); + auto geogDst = dynamic_cast<const crs::GeographicCRS *>( + boundDst ? boundDst->baseCRS().get() : targetCRS.get()); if (geogDst) { auto tmpFormatter = io::PROJStringFormatter::create(); geogDst->addAngularUnitConvertAndAxisSwap(tmpFormatter.get()); @@ -3476,7 +3478,7 @@ CoordinateOperationFactory::Private::createOperationsGeogToVertFromGeoid( vertDst->datum(), vertDst->datumEnsemble(), cs::VerticalCS::createGravityRelatedHeight( common::UnitOfMeasure::METRE))); - const auto properties = util::PropertyMap().set( + auto properties = util::PropertyMap().set( common::IdentifiedObject::NAME_KEY, buildOpName("Transformation", vertCRSMetre, geogSrcCRS)); @@ -3485,14 +3487,21 @@ CoordinateOperationFactory::Private::createOperationsGeogToVertFromGeoid( std::vector<metadata::PositionalAccuracyNNPtr> accuracies; const auto &modelAccuracies = model->coordinateOperationAccuracies(); + std::vector<CoordinateOperationNNPtr> transformationsForGrid; + double accuracy = -1; + size_t idx = static_cast<size_t>(-1); if (modelAccuracies.empty()) { if (authFactory) { - const auto transformationsForGrid = + transformationsForGrid = io::DatabaseContext::getTransformationsForGridName( authFactory->databaseContext(), projFilename); - double accuracy = -1; - for (const auto &transf : transformationsForGrid) { - accuracy = std::max(accuracy, getAccuracy(transf)); + for (size_t i = 0; i < transformationsForGrid.size(); ++i) { + const auto &transf = transformationsForGrid[i]; + const double transfAcc = getAccuracy(transf); + if (transfAcc - accuracy > 1e-10) { + accuracy = transfAcc; + idx = i; + } } if (accuracy >= 0) { accuracies.emplace_back( @@ -3502,6 +3511,31 @@ CoordinateOperationFactory::Private::createOperationsGeogToVertFromGeoid( } } + // Set extent + bool dummy = false; + // Use in priority the one of the geoid model transformation + auto extent = getExtent(model, true, dummy); + // Otherwise fallback to the extent of a transformation using + // the grid. + if (extent == nullptr && authFactory != nullptr) { + if (transformationsForGrid.empty()) { + transformationsForGrid = + io::DatabaseContext::getTransformationsForGridName( + authFactory->databaseContext(), projFilename); + } + if (idx != static_cast<size_t>(-1)) { + const auto &transf = transformationsForGrid[idx]; + extent = getExtent(transf, true, dummy); + } else if (!transformationsForGrid.empty()) { + const auto &transf = transformationsForGrid.front(); + extent = getExtent(transf, true, dummy); + } + } + if (extent) { + properties.set(common::ObjectUsage::DOMAIN_OF_VALIDITY_KEY, + NN_NO_CHECK(extent)); + } + return Transformation::createGravityRelatedHeightToGeographic3D( properties, vertCRSMetre, geogSrcCRS, nullptr, projFilename, !modelAccuracies.empty() ? modelAccuracies : accuracies); @@ -5314,6 +5348,12 @@ CoordinateOperationFactory::createOperations( metadata::ExtentPtr targetCRSExtent; auto l_resolvedTargetCRS = crs::CRS::getResolvedCRS(l_targetCRS, authFactory, targetCRSExtent); + if (context->getSourceAndTargetCRSExtentUse() == + CoordinateOperationContext::SourceTargetCRSExtentUse::NONE) { + // Make sure *not* to use CRS extent if requested to ignore it + sourceCRSExtent.reset(); + targetCRSExtent.reset(); + } Private::Context contextPrivate(sourceCRSExtent, targetCRSExtent, context); if (context->getSourceAndTargetCRSExtentUse() == diff --git a/src/iso19111/operation/esriparammappings.cpp b/src/iso19111/operation/esriparammappings.cpp index aea4b3d3..8021b95f 100644 --- a/src/iso19111/operation/esriparammappings.cpp +++ b/src/iso19111/operation/esriparammappings.cpp @@ -744,7 +744,7 @@ static const ESRIParamMapping paramsESRI_Goode_Homolosine_alt1[] = { EPSG_CODE_PARAMETER_FALSE_NORTHING, "0.0", false}, {"Central_Meridian", EPSG_NAME_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, EPSG_CODE_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, "0.0", false}, - {"Option", nullptr, 0, "1.0", false}, + {"Option", nullptr, 0, "0.0", false}, {nullptr, nullptr, 0, "0.0", false}}; static const ESRIParamMapping paramsESRI_Goode_Homolosine_alt2[] = { {"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING, @@ -753,6 +753,15 @@ static const ESRIParamMapping paramsESRI_Goode_Homolosine_alt2[] = { EPSG_CODE_PARAMETER_FALSE_NORTHING, "0.0", false}, {"Central_Meridian", EPSG_NAME_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, EPSG_CODE_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, "0.0", false}, + {"Option", nullptr, 0, "1.0", false}, + {nullptr, nullptr, 0, "0.0", false}}; +static const ESRIParamMapping paramsESRI_Goode_Homolosine_alt3[] = { + {"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING, + EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false}, + {"False_Northing", EPSG_NAME_PARAMETER_FALSE_NORTHING, + EPSG_CODE_PARAMETER_FALSE_NORTHING, "0.0", false}, + {"Central_Meridian", EPSG_NAME_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, + EPSG_CODE_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, "0.0", false}, {"Option", nullptr, 0, "2.0", false}, {nullptr, nullptr, 0, "0.0", false}}; @@ -1063,11 +1072,13 @@ static const ESRIMethodMapping esriMappings[] = { EPSG_NAME_METHOD_HOTINE_OBLIQUE_MERCATOR_VARIANT_B, EPSG_CODE_METHOD_HOTINE_OBLIQUE_MERCATOR_VARIANT_B, paramsESRI_Rectified_Skew_Orthomorphic_Center}, - {"Goode_Homolosine", PROJ_WKT2_NAME_METHOD_INTERRUPTED_GOODE_HOMOLOSINE, 0, + {"Goode_Homolosine", PROJ_WKT2_NAME_METHOD_GOODE_HOMOLOSINE, 0, paramsESRI_Goode_Homolosine_alt1}, + {"Goode_Homolosine", PROJ_WKT2_NAME_METHOD_INTERRUPTED_GOODE_HOMOLOSINE, 0, + paramsESRI_Goode_Homolosine_alt2}, {"Goode_Homolosine", PROJ_WKT2_NAME_METHOD_INTERRUPTED_GOODE_HOMOLOSINE_OCEAN, 0, - paramsESRI_Goode_Homolosine_alt2}, + paramsESRI_Goode_Homolosine_alt3}, {"Equidistant_Cylindrical_Ellipsoidal", EPSG_NAME_METHOD_EQUIDISTANT_CYLINDRICAL, EPSG_CODE_METHOD_EQUIDISTANT_CYLINDRICAL, diff --git a/src/iso19111/util.cpp b/src/iso19111/util.cpp index 7b69f4aa..82d36458 100644 --- a/src/iso19111/util.cpp +++ b/src/iso19111/util.cpp @@ -297,9 +297,10 @@ const BaseObjectNNPtr *PropertyMap::get(const std::string &key) const { //! @cond Doxygen_Suppress void PropertyMap::unset(const std::string &key) { - for (auto iter = d->list_.begin(); iter != d->list_.end(); ++iter) { + auto &list = d->list_; + for (auto iter = list.begin(); iter != list.end(); ++iter) { if (iter->first == key) { - d->list_.erase(iter); + list.erase(iter); return; } } diff --git a/src/lib_proj.cmake b/src/lib_proj.cmake index 71468c87..3d764440 100644 --- a/src/lib_proj.cmake +++ b/src/lib_proj.cmake @@ -138,6 +138,7 @@ set(SRC_LIBPROJ_PROJECTIONS projections/putp6.cpp projections/qsc.cpp projections/robin.cpp + projections/s2.cpp projections/sch.cpp projections/sts.cpp projections/urm5.cpp @@ -398,7 +399,8 @@ target_link_libraries(proj PRIVATE ${SQLITE3_LIBRARY}) if(NLOHMANN_JSON STREQUAL "external") target_compile_definitions(proj PRIVATE EXTERNAL_NLOHMANN_JSON) - target_link_libraries(proj PRIVATE nlohmann_json::nlohmann_json) + target_link_libraries(proj + PRIVATE $<BUILD_INTERFACE:nlohmann_json::nlohmann_json>) endif() if(TIFF_ENABLED) diff --git a/src/log.cpp b/src/log.cpp index 6bad34d4..9c96f53a 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -46,25 +46,36 @@ void pj_stderr_logger( void *app_data, int level, const char *msg ) } /************************************************************************/ -/* pj_vlog() */ +/* pj_log_active() */ /************************************************************************/ -void pj_vlog( PJ_CONTEXT *ctx, int level, const char *fmt, va_list args ); - -void pj_vlog( PJ_CONTEXT *ctx, int level, const char *fmt, va_list args ) +bool pj_log_active( PJ_CONTEXT *ctx, int level ) { - char *msg_buf; int debug_level = ctx->debug_level; int shutup_unless_errno_set = debug_level < 0; /* For negative debug levels, we first start logging when errno is set */ if (ctx->last_errno==0 && shutup_unless_errno_set) - return; + return false; if (debug_level < 0) debug_level = -debug_level; if( level > debug_level ) + return false; + return true; +} + +/************************************************************************/ +/* pj_vlog() */ +/************************************************************************/ + +static +void pj_vlog( PJ_CONTEXT *ctx, int level, const PJ* P, const char *fmt, va_list args ) + +{ + char *msg_buf; + if( !pj_log_active(ctx, level) ) return; constexpr size_t BUF_SIZE = 100000; @@ -72,7 +83,15 @@ void pj_vlog( PJ_CONTEXT *ctx, int level, const char *fmt, va_list args ) if( msg_buf == nullptr ) return; - vsnprintf( msg_buf, BUF_SIZE, fmt, args ); + if( P == nullptr || P->short_name == nullptr ) + vsnprintf( msg_buf, BUF_SIZE, fmt, args ); + else + { + std::string fmt_with_P_short_name(P->short_name); + fmt_with_P_short_name += ": "; + fmt_with_P_short_name += fmt; + vsnprintf( msg_buf, BUF_SIZE, fmt_with_P_short_name.c_str(), args ); + } msg_buf[BUF_SIZE-1] = '\0'; ctx->logger( ctx->logger_app_data, level, msg_buf ); @@ -80,7 +99,6 @@ void pj_vlog( PJ_CONTEXT *ctx, int level, const char *fmt, va_list args ) free( msg_buf ); } - /************************************************************************/ /* pj_log() */ /************************************************************************/ @@ -94,7 +112,7 @@ void pj_log( PJ_CONTEXT *ctx, int level, const char *fmt, ... ) return; va_start( args, fmt ); - pj_vlog( ctx, level, fmt, args ); + pj_vlog( ctx, level, nullptr, fmt, args ); va_end( args ); } @@ -118,25 +136,13 @@ PJ_LOG_LEVEL proj_log_level (PJ_CONTEXT *ctx, PJ_LOG_LEVEL log_level) { } /*****************************************************************************/ -static std::string add_short_name_prefix(const PJ* P, const char* fmt) -/*****************************************************************************/ -{ - if( P->short_name == nullptr ) - return fmt; - std::string ret(P->short_name); - ret += ": "; - ret += fmt; - return ret; -} - -/*****************************************************************************/ void proj_log_error (const PJ *P, const char *fmt, ...) { /****************************************************************************** For reporting the most severe events. ******************************************************************************/ va_list args; va_start( args, fmt ); - pj_vlog (pj_get_ctx ((PJ*)P), PJ_LOG_ERROR , add_short_name_prefix(P, fmt).c_str(), args); + pj_vlog (pj_get_ctx ((PJ*)P), PJ_LOG_ERROR, P, fmt, args); va_end( args ); } @@ -148,7 +154,7 @@ void proj_log_debug (PJ *P, const char *fmt, ...) { ******************************************************************************/ va_list args; va_start( args, fmt ); - pj_vlog (pj_get_ctx (P), PJ_LOG_DEBUG , add_short_name_prefix(P, fmt).c_str(), args); + pj_vlog (pj_get_ctx (P), PJ_LOG_DEBUG, P, fmt, args); va_end( args ); } @@ -159,7 +165,7 @@ void proj_context_log_debug (PJ_CONTEXT *ctx, const char *fmt, ...) { ******************************************************************************/ va_list args; va_start( args, fmt ); - pj_vlog (ctx, PJ_LOG_DEBUG , fmt, args); + pj_vlog (ctx, PJ_LOG_DEBUG, nullptr, fmt, args); va_end( args ); } @@ -170,7 +176,7 @@ void proj_log_trace (PJ *P, const char *fmt, ...) { ******************************************************************************/ va_list args; va_start( args, fmt ); - pj_vlog (pj_get_ctx (P), PJ_LOG_TRACE , add_short_name_prefix(P, fmt).c_str(), args); + pj_vlog (pj_get_ctx (P), PJ_LOG_TRACE, P, fmt, args); va_end( args ); } diff --git a/src/malloc.cpp b/src/malloc.cpp index 6b7fbf26..d60a3f92 100644 --- a/src/malloc.cpp +++ b/src/malloc.cpp @@ -33,6 +33,9 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ +#ifndef FROM_PROJ_CPP +#define FROM_PROJ_CPP +#endif /* allocate and deallocate memory */ /* These routines are used so that applications can readily replace @@ -46,6 +49,8 @@ #include <new> +#include "proj/internal/io_internal.hpp" + #include "proj.h" #include "proj_internal.h" #include "grids.hpp" @@ -176,8 +181,16 @@ PJ *pj_default_destructor (PJ *P, int errlev) { /* Destructor */ /*****************************************************************************/ void proj_cleanup() { /*****************************************************************************/ + + // Close the database context of the default PJ_CONTEXT + auto cpp_context = pj_get_default_ctx()->cpp_context; + if( cpp_context ) { + cpp_context->closeDb(); + } + pj_clear_initcache(); FileManager::clearMemoryCache(); pj_clear_hgridshift_knowngrids_cache(); pj_clear_vgridshift_knowngrids_cache(); + pj_clear_sqlite_cache(); } diff --git a/src/pipeline.cpp b/src/pipeline.cpp index 88793027..74ab2488 100644 --- a/src/pipeline.cpp +++ b/src/pipeline.cpp @@ -387,37 +387,6 @@ static void set_ellipsoid(PJ *P) { } -static enum pj_io_units get_next_non_whatever_unit(struct Pipeline* pipeline, size_t step, PJ_DIRECTION dir) { - const auto& steps = pipeline->steps; - const auto nsteps = steps.size(); - - if (dir == PJ_FWD) { - for (size_t i = step+1; i<nsteps; i++) { - auto pj = steps[i].pj; - if (pj_left(pj) != pj_right(pj)) - return pj_left(pj); - if (pj_left(pj) != PJ_IO_UNITS_WHATEVER) - return pj_left(pj); - if (pj_right(pj) != PJ_IO_UNITS_WHATEVER) - return pj_right(pj); - } - } else { - for (size_t i=step; i>0;) { - i--; - auto pj = steps[i].pj; - if (pj_right(pj) != pj_left(pj)) - return pj_right(pj); - if (pj_right(pj) != PJ_IO_UNITS_WHATEVER) - return pj_right(pj); - if (pj_left(pj) != PJ_IO_UNITS_WHATEVER) - return pj_left(pj); - } - } - return PJ_IO_UNITS_WHATEVER; -} - - - PJ *OPERATION(pipeline,0) { int i, nsteps = 0, argc; int i_pipeline = -1, i_first_step = -1, i_current_step; @@ -585,20 +554,42 @@ PJ *OPERATION(pipeline,0) { /* proj=pipeline step proj=unitconvert xy_in=deg xy_out=rad step ... */ /* where the left-hand side units of the first step shouldn't be changed to RADIANS */ /* as it will result in deg->rad conversions in cs2cs and other applications. */ - for (i=0; i<nsteps; i++) { + + for (i=nsteps-2; i>=0; --i) { auto pj = pipeline->steps[i].pj; if (pj_left(pj) == PJ_IO_UNITS_WHATEVER && pj_right(pj) == PJ_IO_UNITS_WHATEVER) { - pj->left = get_next_non_whatever_unit(pipeline, i, PJ_FWD); - pj->right = get_next_non_whatever_unit(pipeline, i, PJ_FWD); + const auto right_pj = pipeline->steps[i+1].pj; + const auto right_pj_left = pj_left(right_pj); + const auto right_pj_right = pj_right(right_pj); + if (right_pj_left != right_pj_right || right_pj_left != PJ_IO_UNITS_WHATEVER ) + { + pj->left = right_pj_left; + pj->right = right_pj_left; + } + else if (right_pj_right != PJ_IO_UNITS_WHATEVER) + { + pj->left = right_pj_right; + pj->right = right_pj_right; + } } } - for (i=nsteps; i>0;) { - --i; + for (i=1; i<nsteps; i++) { auto pj = pipeline->steps[i].pj; if (pj_left(pj) == PJ_IO_UNITS_WHATEVER && pj_right(pj) == PJ_IO_UNITS_WHATEVER) { - pj->right = get_next_non_whatever_unit(pipeline, i, PJ_INV); - pj->left = get_next_non_whatever_unit(pipeline, i, PJ_INV); + const auto left_pj = pipeline->steps[i-1].pj; + const auto left_pj_left = pj_left(left_pj); + const auto left_pj_right = pj_right(left_pj); + if (left_pj_left != left_pj_right || left_pj_right != PJ_IO_UNITS_WHATEVER ) + { + pj->left = left_pj_right; + pj->right = left_pj_right; + } + else if (left_pj_left != PJ_IO_UNITS_WHATEVER) + { + pj->left = left_pj_left; + pj->right = left_pj_left; + } } } diff --git a/src/pj_list.h b/src/pj_list.h index 226a8f7b..e4b8ab67 100644 --- a/src/pj_list.h +++ b/src/pj_list.h @@ -141,6 +141,7 @@ PROJ_HEAD(qsc, "Quadrilateralized Spherical Cube") PROJ_HEAD(robin, "Robinson") PROJ_HEAD(rouss, "Roussilhe Stereographic") PROJ_HEAD(rpoly, "Rectangular Polyconic") +PROJ_HEAD(s2, "S2") PROJ_HEAD(sch, "Spherical Cross-track Height") PROJ_HEAD(set, "Set coordinate value") PROJ_HEAD(sinu, "Sinusoidal (Sanson-Flamsteed)") @@ -171,7 +171,7 @@ extern "C" { /* The version numbers should be updated with every release! **/ #define PROJ_VERSION_MAJOR 8 -#define PROJ_VERSION_MINOR 1 +#define PROJ_VERSION_MINOR 2 #define PROJ_VERSION_PATCH 0 /* Note: the following 3 defines have been introduced in PROJ 8.0.1 */ @@ -559,7 +559,7 @@ PJ PROJ_DLL *proj_create_crs_to_crs_from_pj(PJ_CONTEXT *ctx, const PJ *target_crs, PJ_AREA *area, const char* const *options); -/*! @endcond Doxygen_Suppress */ +/*! @endcond */ PJ PROJ_DLL *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ* obj); /*! @cond Doxygen_Suppress */ void PROJ_DLL proj_assign_context(PJ* pj, PJ_CONTEXT* ctx); diff --git a/src/proj_constants.h b/src/proj_constants.h index 66d04294..7c6d018a 100644 --- a/src/proj_constants.h +++ b/src/proj_constants.h @@ -223,6 +223,9 @@ #define PROJ_WKT2_NAME_METHOD_QUADRILATERALIZED_SPHERICAL_CUBE \ "Quadrilateralized Spherical Cube" +#define PROJ_WKT2_NAME_METHOD_S2 \ + "S2" + #define PROJ_WKT2_NAME_METHOD_SPHERICAL_CROSS_TRACK_HEIGHT \ "Spherical Cross-Track Height" diff --git a/src/proj_internal.h b/src/proj_internal.h index 8ff38411..6edb6aec 100644 --- a/src/proj_internal.h +++ b/src/proj_internal.h @@ -719,7 +719,6 @@ struct pj_ctx{ pj_ctx& operator= (const pj_ctx&) = delete; projCppContext* get_cpp_context(); - void safeAutoCloseDbIfNeeded(); void set_search_paths(const std::vector<std::string>& search_paths_in); void set_ca_bundle_path(const std::string& ca_bundle_path_in); @@ -868,6 +867,8 @@ const PJ_UNITS *pj_list_angular_units(); void pj_clear_hgridshift_knowngrids_cache(); void pj_clear_vgridshift_knowngrids_cache(); +void pj_clear_sqlite_cache(); + PJ_LP pj_generic_inverse_2d(PJ_XY xy, PJ *P, PJ_LP lpInitial); @@ -917,6 +918,7 @@ void pj_acquire_lock(void); void pj_release_lock(void); void pj_cleanup_lock(void); +bool pj_log_active( PJ_CONTEXT *ctx, int level ); void pj_log( PJ_CONTEXT * ctx, int level, const char *fmt, ... ); void pj_stderr_logger( void *, int, const char * ); diff --git a/src/proj_symbol_rename.h b/src/proj_symbol_rename.h index 7fbe4242..6f9e8ab6 100644 --- a/src/proj_symbol_rename.h +++ b/src/proj_symbol_rename.h @@ -71,6 +71,7 @@ #define pj_is_latlong internal_pj_is_latlong #define pj_latlong_from_proj internal_pj_latlong_from_proj #define pj_log internal_pj_log +#define pj_log_active internal_pj_log_active #define pj_malloc internal_pj_malloc #define pj_open_lib internal_pj_open_lib #define pj_pr_list internal_pj_pr_list diff --git a/src/projections/laea.cpp b/src/projections/laea.cpp index 8c7797e8..22f00d3f 100644 --- a/src/projections/laea.cpp +++ b/src/projections/laea.cpp @@ -145,6 +145,7 @@ static PJ_LP laea_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse switch (Q->mode) { case EQUIT: case OBLIQ: + { xy.x /= Q->dd; xy.y *= Q->dd; rho = hypot(xy.x, xy.y); @@ -153,7 +154,13 @@ static PJ_LP laea_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse lp.phi = P->phi0; return lp; } - sCe = 2. * asin(.5 * rho / Q->rq); + const double asin_argument = .5 * rho / Q->rq; + if( asin_argument > 1 ) + { + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); + return lp; + } + sCe = 2. * asin(asin_argument); cCe = cos(sCe); sCe = sin(sCe); xy.x *= sCe; @@ -165,6 +172,7 @@ static PJ_LP laea_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse xy.y = rho * cCe; } break; + } case N_POLE: xy.y = -xy.y; /*-fallthrough*/ diff --git a/src/projections/ortho.cpp b/src/projections/ortho.cpp index 9e0d9bba..908f283d 100644 --- a/src/projections/ortho.cpp +++ b/src/projections/ortho.cpp @@ -89,7 +89,6 @@ static PJ_LP ortho_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers if (sinc > 1.) { if ((sinc - 1.) > EPS10) { proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); - proj_log_trace(P, "Point (%.3f, %.3f) is outside the projection boundary"); return lp; } sinc = 1.; @@ -177,7 +176,6 @@ static PJ_LP ortho_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver if (rh2 >= 1. - 1e-15) { if ((rh2 - 1.) > EPS10) { proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); - proj_log_trace(P, "Point (%.3f, %.3f) is outside the projection boundary"); lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; return lp; } @@ -201,7 +199,6 @@ static PJ_LP ortho_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver // Equation of the ellipse if( SQ(xy.x) + SQ(xy.y * (P->a / P->b)) > 1 + 1e-11 ) { proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); - proj_log_trace(P, "Point (%.3f, %.3f) is outside the projection boundary"); lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; return lp; } @@ -229,7 +226,6 @@ static PJ_LP ortho_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver xy_recentered.y = (xy.y - Q->y_shift) / Q->y_scale; if( SQ(xy.x) + SQ(xy_recentered.y) > 1 + 1e-11 ) { proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); - proj_log_trace(P, "Point (%.3f, %.3f) is outside the projection boundary"); lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; return lp; } diff --git a/src/projections/s2.cpp b/src/projections/s2.cpp new file mode 100644 index 00000000..0de54c00 --- /dev/null +++ b/src/projections/s2.cpp @@ -0,0 +1,394 @@ +/****************************************************************************** + * Project: PROJ + * Purpose: Implementing the S2 family of projections in PROJ + * Author: Marcus Elia, <marcus at geopi.pe> + * + ****************************************************************************** + * Copyright (c) 2021, Marcus Elia, <marcus at geopi.pe> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ***************************************************************************** + * + * This implements the S2 projection. This code is similar + * to the QSC projection. + * + * + * You have to choose one of the following projection centers, + * corresponding to the centers of the six cube faces: + * phi0 = 0.0, lam0 = 0.0 ("front" face) + * phi0 = 0.0, lam0 = 90.0 ("right" face) + * phi0 = 0.0, lam0 = 180.0 ("back" face) + * phi0 = 0.0, lam0 = -90.0 ("left" face) + * phi0 = 90.0 ("top" face) + * phi0 = -90.0 ("bottom" face) + * Other projection centers will not work! + * + * You must also choose which conversion from UV to ST coordinates + * is used (linear, quadratic, tangent). Read about them in + * https://github.com/google/s2geometry/blob/0c4c460bdfe696da303641771f9def900b3e440f/src/s2/s2coords.h + * The S2 projection functions are adapted from the above link and the S2 + * Math util functions are adapted from + * https://github.com/google/s2geometry/blob/0c4c460bdfe696da303641771f9def900b3e440f/src/s2/util/math/vector.h + ****************************************************************************/ + +#define PJ_LIB__ +#define _USE_MATH_DEFINES // needed for M_1_PI availability with MSVC + +#include <errno.h> +#include <cmath> + +#include "proj.h" +#include "proj_internal.h" + +/* The six cube faces. */ +namespace { // anonymous namespace +enum Face { + FACE_FRONT = 0, + FACE_RIGHT = 1, + FACE_TOP = 2, + FACE_BACK = 3, + FACE_LEFT = 4, + FACE_BOTTOM = 5 +}; +} // anonymous namespace + +enum S2ProjectionType {Linear, Quadratic, Tangent, NoUVtoST}; +std::map<std::string, S2ProjectionType> stringToS2ProjectionType { {"linear", Linear}, {"quadratic", Quadratic}, {"tangent", Tangent}, {"none", NoUVtoST} }; + +namespace { // anonymous namespace +struct pj_opaque { + enum Face face; + double a_squared; + double one_minus_f; + double one_minus_f_squared; + S2ProjectionType UVtoST; +}; +} // anonymous namespace +PROJ_HEAD(s2, "S2") "\n\tMisc, Sph&Ell"; + +#define EPS10 1.e-10 + +/* The four areas on a cube face. AREA_0 is the area of definition, + * the other three areas are counted counterclockwise. */ +namespace { // anonymous namespace +enum Area { + AREA_0 = 0, + AREA_1 = 1, + AREA_2 = 2, + AREA_3 = 3 +}; +} // anonymous namespace + +// ================================================= +// +// S2 Math Util +// +// ================================================= +static PJ_XYZ Abs(const PJ_XYZ& p) { + return {std::fabs(p.x), std::fabs(p.y), std::fabs(p.z)}; +} +// return the index of the largest component (fabs) +static int LargestAbsComponent(const PJ_XYZ& p) { + PJ_XYZ temp = Abs(p); + return temp.x > temp.y ? + temp.x > temp.z ? 0 : 2 : + temp.y > temp.z ? 1 : 2; +} + +// ================================================= +// +// S2 Projection Functions +// +// ================================================= + +// Unfortunately, tan(M_PI_4) is slightly less than 1.0. This isn't due to +// a flaw in the implementation of tan(), it's because the derivative of +// tan(x) at x=pi/4 is 2, and it happens that the two adjacent floating +// point numbers on either side of the infinite-precision value of pi/4 have +// tangents that are slightly below and slightly above 1.0 when rounded to +// the nearest double-precision result. +static double STtoUV(double s, S2ProjectionType s2_projection) { + switch(s2_projection) { + case Linear: + return 2 * s - 1; + break; + case Quadratic: + if (s >= 0.5) return (1/3.) * (4*s*s - 1); + else return (1/3.) * (1 - 4*(1-s)*(1-s)); + break; + case Tangent: + s = std::tan(M_PI_2 * s - M_PI_4); + return s + (1.0 / static_cast<double>(static_cast<std::int64_t>(1) << 53)) * s; + break; + default: + return s; + } +} + +static double UVtoST(double u, S2ProjectionType s2_projection) { + switch(s2_projection) { + case Linear: + return 0.5 * (u + 1); + break; + case Quadratic: + if (u >= 0) return 0.5 * std::sqrt(1 + 3*u); + else return 1 - 0.5 * std::sqrt(1 - 3*u); + break; + case Tangent: + { + volatile double a = std::atan(u); + return (2 * M_1_PI) * (a + M_PI_4); + } + break; + default: + return u; + } +} + +inline PJ_XYZ FaceUVtoXYZ(int face, double u, double v) { + switch (face) { + case 0: return { 1, u, v}; + case 1: return {-u, 1, v}; + case 2: return {-u, -v, 1}; + case 3: return {-1, -v, -u}; + case 4: return { v, -1, -u}; + default: return { v, u, -1}; + } +} + +inline PJ_XYZ FaceUVtoXYZ(int face, const PJ_XY& uv) { + return FaceUVtoXYZ(face, uv.x, uv.y); +} + +inline void ValidFaceXYZtoUV(int face, const PJ_XYZ& p, + double* pu, double* pv) { + switch (face) { + case 0: *pu = p.y / p.x; *pv = p.z / p.x; break; + case 1: *pu = -p.x / p.y; *pv = p.z / p.y; break; + case 2: *pu = -p.x / p.z; *pv = -p.y / p.z; break; + case 3: *pu = p.z / p.x; *pv = p.y / p.x; break; + case 4: *pu = p.z / p.y; *pv = -p.x / p.y; break; + default: *pu = -p.y / p.z; *pv = -p.x / p.z; break; + } +} + +inline void ValidFaceXYZtoUV(int face, const PJ_XYZ& p, PJ_XY* puv) { + ValidFaceXYZtoUV(face, p, &(*puv).x, &(*puv).y); +} + +inline int GetFace(const PJ_XYZ& p) { + int face = LargestAbsComponent(p); + double pFace; + switch (face) { + case 0: pFace = p.x; break; + case 1: pFace = p.y; break; + default: pFace = p.z; break; + } + if (pFace < 0) face += 3; + return face; +} + +inline int XYZtoFaceUV(const PJ_XYZ& p, double* pu, double* pv) { + int face = GetFace(p); + ValidFaceXYZtoUV(face, p, pu, pv); + return face; +} + +inline int XYZtoFaceUV(const PJ_XYZ& p, PJ_XY* puv) { + return XYZtoFaceUV(p, &(*puv).x, &(*puv).y); +} + +inline bool FaceXYZtoUV(int face, const PJ_XYZ& p, + double* pu, double* pv) { + double pFace; + switch(face) { + case 0: pFace = p.x; break; + case 1: pFace = p.y; break; + case 2: pFace = p.z; break; + case 3: pFace = p.x; break; + case 4: pFace = p.y; break; + default: pFace = p.z; break; + } + if (face < 3) { + if (pFace <= 0) return false; + } else { + if (pFace >= 0) return false; + } + ValidFaceXYZtoUV(face, p, pu, pv); + return true; +} + +inline bool FaceXYZtoUV(int face, const PJ_XYZ& p, PJ_XY* puv) { + return FaceXYZtoUV(face, p, &(*puv).x, &(*puv).y); +} + +// This function inverts ValidFaceXYZtoUV() +inline bool UVtoSphereXYZ(int face, double u, double v, PJ_XYZ* xyz) { + double major_coord = 1 / sqrt(1 + u*u + v*v); + double minor_coord_1 = u*major_coord; + double minor_coord_2 = v*major_coord; + + switch(face) { + case 0: xyz->x = major_coord; + xyz->y = minor_coord_1; + xyz->z = minor_coord_2; break; + case 1: xyz->x = -minor_coord_1; + xyz->y = major_coord; + xyz->z = minor_coord_2; break; + case 2: xyz->x = -minor_coord_1; + xyz->y = -minor_coord_2; + xyz->z = major_coord; break; + case 3: xyz->x = -major_coord; + xyz->y = -minor_coord_2; + xyz->z = -minor_coord_1; break; + case 4: xyz->x = minor_coord_2; + xyz->y = -major_coord; + xyz->z = -minor_coord_1; break; + default:xyz->x = minor_coord_2; + xyz->y = minor_coord_1; + xyz->z = -major_coord; break; + } + + return true; +} + +// ============================================ +// +// The Forward and Inverse Functions +// +// ============================================ +static PJ_XY s2_forward (PJ_LP lp, PJ *P) { + struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque); + double lat, lon; + + /* Convert the geodetic latitude to a geocentric latitude. + * This corresponds to the shift from the ellipsoid to the sphere + * described in [LK12]. */ + if (P->es != 0.0) { + lat = atan(Q->one_minus_f_squared * tan(lp.phi)); + } else { + lat = lp.phi; + } + lon = lp.lam; + + // Convert the lat/lon to x,y,z on the unit sphere + double x, y, z; + double sinlat, coslat; + double sinlon, coslon; + + sinlat = sin(lat); + coslat = cos(lat); + sinlon = sin(lon); + coslon = cos(lon); + x = coslat * coslon; + y = coslat * sinlon; + z = sinlat; + + PJ_XYZ spherePoint {x, y, z}; + PJ_XY uvCoords; + + ValidFaceXYZtoUV(Q->face, spherePoint, &uvCoords.x, &uvCoords.y); + double s = UVtoST(uvCoords.x, Q->UVtoST); + double t = UVtoST(uvCoords.y, Q->UVtoST); + return {s, t}; +} + +static PJ_LP s2_inverse (PJ_XY xy, PJ *P) { + PJ_LP lp = {0.0,0.0}; + struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque); + + // Do the S2 projections to get from s,t to u,v to x,y,z + double u = STtoUV(xy.x, Q->UVtoST); + double v = STtoUV(xy.y, Q->UVtoST); + + PJ_XYZ sphereCoords; + UVtoSphereXYZ(Q->face, u, v, &sphereCoords); + double q = sphereCoords.x; + double r = sphereCoords.y; + double s = sphereCoords.z; + + // Get the spherical angles from the x y z + lp.phi = acos(-s) - M_HALFPI; + lp.lam = atan2(r, q); + + /* Apply the shift from the sphere to the ellipsoid as described + * in [LK12]. */ + if (P->es != 0.0) { + int invert_sign; + volatile double tanphi, xa; + invert_sign = (lp.phi < 0.0 ? 1 : 0); + tanphi = tan(lp.phi); + xa = P->b / sqrt(tanphi * tanphi + Q->one_minus_f_squared); + lp.phi = atan(sqrt(Q->a_squared - xa * xa) / (Q->one_minus_f * xa)); + if (invert_sign) { + lp.phi = -lp.phi; + } + } + + return lp; +} + +PJ *PROJECTION(s2) { + struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); + if (nullptr==Q) + return pj_default_destructor (P, PROJ_ERR_OTHER /*ENOMEM*/); + P->opaque = Q; + + /* Determine which UVtoST function is to be used */ + PROJVALUE maybeUVtoST = pj_param(P->ctx, P->params, "sUVtoST"); + if (nullptr != maybeUVtoST.s) { + try { + Q->UVtoST = stringToS2ProjectionType.at(maybeUVtoST.s); + } catch (const std::out_of_range&) { + proj_log_error(P, _("Invalid value for s2 parameter: should be linear, quadratic, tangent, or none.")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + } else { + Q->UVtoST = Quadratic; + } + + P->left = PJ_IO_UNITS_RADIANS; + P->right = PJ_IO_UNITS_PROJECTED; + P->from_greenwich = -P->lam0; + + P->inv = s2_inverse; + P->fwd = s2_forward; + + /* Determine the cube face from the center of projection. */ + if (P->phi0 >= M_HALFPI - M_FORTPI / 2.0) { + Q->face = FACE_TOP; + } else if (P->phi0 <= -(M_HALFPI - M_FORTPI / 2.0)) { + Q->face = FACE_BOTTOM; + } else if (fabs(P->lam0) <= M_FORTPI) { + Q->face = FACE_FRONT; + } else if (fabs(P->lam0) <= M_HALFPI + M_FORTPI) { + Q->face = (P->lam0 > 0.0 ? FACE_RIGHT : FACE_LEFT); + } else { + Q->face = FACE_BACK; + } + /* Fill in useful values for the ellipsoid <-> sphere shift + * described in [LK12]. */ + if (P->es != 0.0) { + Q->a_squared = P->a * P->a; + Q->one_minus_f = 1.0 - (P->a - P->b) / P->a; + Q->one_minus_f_squared = Q->one_minus_f * Q->one_minus_f; + } + + return P; +} diff --git a/src/release.cpp b/src/release.cpp index f5130f19..8a5eb224 100644 --- a/src/release.cpp +++ b/src/release.cpp @@ -11,7 +11,7 @@ char const pj_release[] = STR(PROJ_VERSION_MAJOR)"." STR(PROJ_VERSION_MINOR)"." STR(PROJ_VERSION_PATCH)", " - "July 1st, 2021"; + "November 1st, 2021"; const char *pj_get_release() { return pj_release; diff --git a/src/transformations/molodensky.cpp b/src/transformations/molodensky.cpp index 70cf987b..29c51b55 100644 --- a/src/transformations/molodensky.cpp +++ b/src/transformations/molodensky.cpp @@ -15,7 +15,7 @@ The code in this file is mostly based on The Standard and Abridged Molodensky Coordinate Transformation - Formulae, 2004, R.E. Deaking, + Formulae, 2004, R.E. Deakin, http://www.mygeodesy.id.au/documents/Molodensky%20V2.pdf diff --git a/test/cli/testprojinfo b/test/cli/testprojinfo index a9bbfa37..3081966b 100755 --- a/test/cli/testprojinfo +++ b/test/cli/testprojinfo @@ -78,6 +78,10 @@ echo "Testing projinfo -s EPSG:4230 -t EPSG:4258 --bbox 8,54.51,15.24,57.8 --sum $EXE -s EPSG:4230 -t EPSG:4258 --bbox 8,54.51,15.24,57.8 --summary >>${OUT} echo "" >>${OUT} +echo "Testing projinfo -s EPSG:23031 -t EPSG:4326 --bbox -13.87,34.91,-7.24,41.88 --crs-extent-use none --summary" >> ${OUT} +$EXE -s EPSG:23031 -t EPSG:4326 --bbox -13.87,34.91,-7.24,41.88 --crs-extent-use none --summary >>${OUT} +echo "" >>${OUT} + echo "Testing projinfo -s EPSG:4230 -t EPSG:4258 --area EPSG:3237 --summary" >> ${OUT} $EXE -s EPSG:4230 -t EPSG:4258 --area EPSG:3237 --summary >>${OUT} echo "" >>${OUT} diff --git a/test/cli/testprojinfo_out.dist b/test/cli/testprojinfo_out.dist index 9f2fb22b..6c3a37c4 100644 --- a/test/cli/testprojinfo_out.dist +++ b/test/cli/testprojinfo_out.dist @@ -904,6 +904,11 @@ Candidate operations found: 1 Note: using '--spatial-test intersects' would bring more results (2) EPSG:1626, ED50 to ETRS89 (4), 1.0 m, Denmark - onshore. +Testing projinfo -s EPSG:23031 -t EPSG:4326 --bbox -13.87,34.91,-7.24,41.88 --crs-extent-use none --summary +Candidate operations found: 1 +Note: using '--spatial-test intersects' would bring more results (9) +unknown id, Inverse of UTM zone 31N + ED50 to WGS 84 (42), 5 m, Portugal - mainland - offshore. + Testing projinfo -s EPSG:4230 -t EPSG:4258 --area EPSG:3237 --summary Candidate operations found: 1 Note: using '--spatial-test intersects' would bring more results (2) diff --git a/test/cli/testvarious b/test/cli/testvarious index e88cf68b..6e9cd43c 100755 --- a/test/cli/testvarious +++ b/test/cli/testvarious @@ -1047,6 +1047,12 @@ $EXE -E EPSG:2636 "WGS 84" >> ${OUT} <<EOF 5540944.47 500000.001 EOF +echo "##############################################################" >> ${OUT} +echo "Check that we select the operation that has the smallest area of use, when 2 have the same accuracy" >> ${OUT} +$EXE -E EPSG:4326 "NAD83(HARN)" >> ${OUT} <<EOF +34 -120 +EOF + # Done! # do 'diff' with distribution results diff --git a/test/cli/tv_out.dist b/test/cli/tv_out.dist index 44926677..9bb85933 100644 --- a/test/cli/tv_out.dist +++ b/test/cli/tv_out.dist @@ -504,3 +504,6 @@ Check that we can use a transformation spanning the antimeridian (should use Pul Check that we can use a transformation spanning the antimeridian (should use Pulkovo 1942 to WGS 84 (20)) 5540944.47 499999.999 49d59'59.36"N 179d59'52.133"W 0.000 5540944.47 500000.001 49d59'59.36"N 179d59'52.133"W 0.000 +############################################################## +Check that we select the operation that has the smallest area of use, when 2 have the same accuracy +34 -120 33d59'59.983"N 119d59'59.955"W 0.000 diff --git a/test/gie/builtins.gie b/test/gie/builtins.gie index 1f3824c8..9e1d3339 100644 --- a/test/gie/builtins.gie +++ b/test/gie/builtins.gie @@ -2582,6 +2582,9 @@ expect -0.001796631 0.000904369 accept -200 -100 expect -0.001796631 -0.000904369 +accept 13000000 0 +expect failure errno coord_transfm_outside_projection_domain + ------------------------------------------------------------------------------- operation +proj=laea +R=6400000 ------------------------------------------------------------------------------- @@ -5273,6 +5276,173 @@ expect -223368.098302014 111769.110486991 accept -2 -1 expect -223368.098302014 -111769.110486991 +=============================================================================== +# S2 +# Input lats are converted from nice spherical values to +# messy ellipsoidal lats e.g. 45 vs 45.1924232.... +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=s2 +ellps=WGS84 +lat_0=0 +lon_0=0 +UVtoST=linear +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 0 +expect 0.5 0.5 +accept 0 45.19242321598196 +expect 0.5 1 +accept 0 -45.19242321598196 +expect 0.5 0 +accept -45 0 +expect 0 0.5 +accept 45 0 +expect 1 0.5 +accept -45 -35.446011426401625 +expect 0 0 +accept 45 -35.446011426401625 +expect 1 0 +accept 45 35.446011426401625 +expect 1 1 +accept -45 35.446011426401625 +expect 0 1 +accept 20 20.124006563576454 +expect 0.6819851171331012 0.6936645165744716 +accept 20 -20.124006563576454 +expect 0.6819851171331012 0.3063354834255284 +accept -20 -20.124006563576454 +expect 0.31801488286689883 0.3063354834255284 +accept -20 20.124006563576454 +expect 0.31801488286689883 0.6936645165744716 + +direction inverse +accept 0.5 0.5 +expect 0 0 +accept 0.5 1 +expect 0 45.19242321598196 +accept 0.5 0 +expect 0 -45.19242321598196 +accept 0 0.5 +expect -45 0 +accept 1 0.5 +expect 45 0 +accept 0 0 +expect -45 -35.446011426401625 +accept 1 0 +expect 45 -35.446011426401625 +accept 1 1 +expect 45 35.446011426401625 +accept 0 1 +expect -45 35.446011426401625 +accept 0.6819851171331012 0.6936645165744716 +expect 20 20.124006563576454 +accept 0.6819851171331012 0.3063354834255284 +expect 20 -20.124006563576454 +accept 0.31801488286689883 0.3063354834255284 +expect -20 -20.124006563576454 +accept 0.31801488286689883 0.6936645165744716 +expect -20 20.124006563576454 + +------------------------------------------------------------------------------- +operation +proj=s2 +ellps=WGS84 +lat_0=0 +lon_0=90 +UVtoST=quadratic +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 90 0 +expect 0.5 0.5 +accept 70 20.124006563576454 +expect 0.27682804555233764 0.7351848576118168 +accept 110 20.124006563576454 +expect 0.7231719544476624 0.7351848576118168 + +direction inverse +accept 0.5 0.5 +expect 90 0 +accept 0.27682804555233764 0.7351848576118168 +expect 70 20.124006563576454 +accept 0.7231719544476624 0.7351848576118168 +expect 110 20.124006563576454 + +------------------------------------------------------------------------------- +operation +proj=s2 +ellps=WGS84 +lat_0=90 +UVtoST=tangent +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 90 +expect 0.5 0.5 +accept 20 70.12337013762532 +expect 0.29020309743436806 0.4211558922141421 +accept -20 70.12337013762532 +expect 0.29020309743436806 0.5788441077858579 + +direction inverse +accept 0.5 0.5 +expect 0 90 +accept 0.29020309743436806 0.4211558922141421 +expect 20 70.12337013762532 +accept 0.29020309743436806 0.5788441077858579 +expect -20 70.12337013762532 + +------------------------------------------------------------------------------- +operation +proj=s2 +ellps=WGS84 +lat_0=0 +lon_0=180 +UVtoST=none +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 180 0 +expect 0 0 +accept 160 20.124006563576454 +expect -0.3873290331489431 -0.3639702342662023 +accept -160 20.124006563576454 +expect -0.3873290331489431 0.3639702342662023 + +direction inverse +accept 0 0 +expect 180 0 +accept -0.3873290331489431 -0.3639702342662023 +expect 160 20.124006563576454 +accept -0.3873290331489431 0.3639702342662023 +expect -160 20.124006563576454 + +------------------------------------------------------------------------------- +operation +proj=s2 +ellps=WGS84 +lat_0=0 +lon_0=-90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept -90 0 +expect 0.5 0.5 +accept -70 20.124006563576454 +expect 0.26481514238818316 0.7231719544476624 +accept -110 20.124006563576454 +expect 0.26481514238818316 0.27682804555233764 + +direction inverse +accept 0.5 0.5 +expect -90 0 +accept 0.26481514238818316 0.7231719544476624 +expect -70 20.124006563576454 +accept 0.26481514238818316 0.27682804555233764 +expect -110 20.124006563576454 + +------------------------------------------------------------------------------- +operation +proj=s2 +ellps=WGS84 +lat_0=-90 +UVtoST=linear +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 -90 +expect 0.5 0.5 +accept 20 -70.12337013762533 +expect 0.5622425758450019 0.6710100716628344 +accept -20 -70.12337013762533 +expect 0.4377574241549981 0.6710100716628344 + +direction inverse +accept 0.5 0.5 +expect 0 -90 +accept 0.5622425758450019 0.6710100716628344 +expect 20 -70.12337013762533 +accept 0.4377574241549981 0.6710100716628344 +expect -20 -70.12337013762533 + +------------------------------------------------------------------------------- +operation +proj=s2 +ellps=WGS84 +lat_0=0 +lon_0=0 +UVtoST=invalid +------------------------------------------------------------------------------- +tolerance 0.1 mm + +accept 0 0 +expect failure errno invalid_op_illegal_arg_value =============================================================================== # Sinusoidal (Sanson-Flamsteed) @@ -5445,6 +5615,7 @@ accept 20 70 expect 748315.3282 -2055979.4669 roundtrip 1 +# Polar Stereographic Variant B, ellipsoidal ------------------------------------------------------------------------------- operation +proj=stere +ellps=GRS80 +lat_0=-90 +lat_ts=-70 ------------------------------------------------------------------------------- @@ -5458,6 +5629,50 @@ accept 20 -70 expect 748315.3282 2055979.4669 roundtrip 1 +# Polar Stereographic Variant A, ellipsoidal +------------------------------------------------------------------------------- +operation +proj=stere +ellps=GRS80 +lat_0=-90 +k_0=0.97 +------------------------------------------------------------------------------- +tolerance 1e-15m +accept 0 -90 +expect 0 0 +roundtrip 1 + +tolerance 0.1 mm +accept 20 -70 +expect 748424.7446 2056280.0858 +roundtrip 1 + +# Polar Stereographic Variant B, spherical +------------------------------------------------------------------------------- +operation +proj=stere +R=6378137 +lat_0=-90 +lat_ts=-70 +------------------------------------------------------------------------------- +tolerance 1e-15m +accept 0 -90 +expect 0 0 +roundtrip 1 + +tolerance 0.1 mm +accept 20 -70 +expect 746100.2968 2049893.7182 +roundtrip 1 + + +# Polar Stereographic Variant A, spherical +# k_0 = (1 + math.sin(abs(lat_ts=-70) / 180. * math.pi)) / 2.0 +------------------------------------------------------------------------------- +operation +proj=stere +R=6378137 +lat_0=-90 +k_0=0.9698463103929542 +------------------------------------------------------------------------------- +tolerance 1e-15m +accept 0 -90 +expect 0 0 +roundtrip 1 + +tolerance 0.1 mm +accept 20 -70 +expect 746100.2968 2049893.7182 +roundtrip 1 + =============================================================================== # Oblique Stereographic Alternative # Azimuthal, Sph&Ell diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 53a14ced..1a080ac5 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -166,10 +166,6 @@ add_executable(test_defmodel target_link_libraries(test_defmodel PRIVATE GTest::gtest PRIVATE ${PROJ_LIBRARIES}) -if(NLOHMANN_JSON STREQUAL "external") - target_compile_definitions(test_defmodel PRIVATE EXTERNAL_NLOHMANN_JSON) - target_link_libraries(test_defmodel PRIVATE nlohmann_json::nlohmann_json) -endif() add_test(NAME test_defmodel COMMAND test_defmodel) set_property(TEST test_defmodel PROPERTY ENVIRONMENT ${PROJ_TEST_ENVIRONMENT}) @@ -180,10 +176,6 @@ add_executable(test_tinshift target_link_libraries(test_tinshift PRIVATE GTest::gtest PRIVATE ${PROJ_LIBRARIES}) -if(NLOHMANN_JSON STREQUAL "external") - target_compile_definitions(test_tinshift PRIVATE EXTERNAL_NLOHMANN_JSON) - target_link_libraries(test_tinshift PRIVATE nlohmann_json::nlohmann_json) -endif() add_test(NAME test_tinshift COMMAND test_tinshift) set_property(TEST test_tinshift PROPERTY ENVIRONMENT ${PROJ_TEST_ENVIRONMENT}) diff --git a/test/unit/gie_self_tests.cpp b/test/unit/gie_self_tests.cpp index c7c1ddf5..5fc8f0f1 100644 --- a/test/unit/gie_self_tests.cpp +++ b/test/unit/gie_self_tests.cpp @@ -442,6 +442,17 @@ TEST(gie, info_functions) { /* we can't expect perfect numerical accuracy so testing with a tolerance */ ASSERT_NEAR(-2.0, proj_dmstor(&buf[0], NULL), 1e-7); + /* test UTF-8 degree sign on DMS input */ + ASSERT_NEAR(0.34512432, proj_dmstor("19°46'27\"E", NULL), 1e-7); + + /* test ISO 8859-1, cp1252, et al. degree sign on DMS input */ + ASSERT_NEAR(0.34512432, + proj_dmstor("19" + "\260" + "46'27\"E", + NULL), + 1e-7); + /* test proj_derivatives_retrieve() and proj_factors_retrieve() */ P = proj_create(PJ_DEFAULT_CTX, "+proj=merc +ellps=WGS84"); a = proj_coord(0, 0, 0, 0); diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp index 99d91e3b..2a82af64 100644 --- a/test/unit/test_c_api.cpp +++ b/test/unit/test_c_api.cpp @@ -47,6 +47,10 @@ #include <sqlite3.h> +#ifndef __MINGW32__ +#include <thread> +#endif + using namespace osgeo::proj::common; using namespace osgeo::proj::crs; using namespace osgeo::proj::cs; @@ -2369,10 +2373,17 @@ TEST_F(CApi, check_coord_op_obj_can_be_used_with_proj_trans) { // --------------------------------------------------------------------------- TEST_F(CApi, proj_create_projections) { + { + constexpr int invalid_zone_number = 0; + auto projCRS = + proj_create_conversion_utm(m_ctxt, invalid_zone_number, 0); + ObjectKeeper keeper_projCRS(projCRS); + ASSERT_EQ(projCRS, nullptr); + } /* BEGIN: Generated by scripts/create_c_api_projections.py*/ { - auto projCRS = proj_create_conversion_utm(m_ctxt, 0, 0); + auto projCRS = proj_create_conversion_utm(m_ctxt, 1, 0); ObjectKeeper keeper_projCRS(projCRS); ASSERT_NE(projCRS, nullptr); } @@ -4287,106 +4298,6 @@ TEST_F(CApi, proj_as_projjson) { // --------------------------------------------------------------------------- -struct Fixture_proj_context_set_autoclose_database : public CApi { - void test(bool autoclose) { - proj_context_set_autoclose_database(m_ctxt, autoclose); - - auto c_path = proj_context_get_database_path(m_ctxt); - ASSERT_TRUE(c_path != nullptr); - std::string path(c_path); - - FILE *f = fopen(path.c_str(), "rb"); - ASSERT_NE(f, nullptr); - fseek(f, 0, SEEK_END); - auto length = ftell(f); - std::string content; - content.resize(static_cast<size_t>(length)); - fseek(f, 0, SEEK_SET); - auto read_bytes = fread(&content[0], 1, content.size(), f); - ASSERT_EQ(read_bytes, content.size()); - fclose(f); - const char *tempdir = getenv("TEMP"); - if (!tempdir) { - tempdir = getenv("TMP"); - } - if (!tempdir) { - tempdir = "/tmp"; - } - std::string tmp_filename( - std::string(tempdir) + - "/test_proj_context_set_autoclose_database.db"); - f = fopen(tmp_filename.c_str(), "wb"); - if (!f) { - std::cerr << "Cannot create " << tmp_filename << std::endl; - return; - } - fwrite(content.data(), 1, content.size(), f); - fclose(f); - - { - sqlite3 *db = nullptr; - sqlite3_open_v2(tmp_filename.c_str(), &db, SQLITE_OPEN_READWRITE, - nullptr); - ASSERT_NE(db, nullptr); - ASSERT_TRUE(sqlite3_exec(db, - "UPDATE geodetic_crs SET name = 'foo' " - "WHERE auth_name = 'EPSG' and code = " - "'4326'", - nullptr, nullptr, nullptr) == SQLITE_OK); - sqlite3_close(db); - } - - EXPECT_TRUE(proj_context_set_database_path(m_ctxt, tmp_filename.c_str(), - nullptr, nullptr)); - { - auto crs = proj_create_from_database( - m_ctxt, "EPSG", "4326", PJ_CATEGORY_CRS, false, nullptr); - ObjectKeeper keeper(crs); - ASSERT_NE(crs, nullptr); - EXPECT_EQ(proj_get_name(crs), std::string("foo")); - } - - { - sqlite3 *db = nullptr; - sqlite3_open_v2(tmp_filename.c_str(), &db, SQLITE_OPEN_READWRITE, - nullptr); - ASSERT_NE(db, nullptr); - ASSERT_TRUE(sqlite3_exec(db, - "UPDATE geodetic_crs SET name = 'bar' " - "WHERE auth_name = 'EPSG' and code = " - "'4326'", - nullptr, nullptr, nullptr) == SQLITE_OK); - sqlite3_close(db); - } - { - auto crs = proj_create_from_database( - m_ctxt, "EPSG", "4326", PJ_CATEGORY_CRS, false, nullptr); - ObjectKeeper keeper(crs); - ASSERT_NE(crs, nullptr); - EXPECT_EQ(proj_get_name(crs), - std::string(autoclose ? "bar" : "foo")); - } - - if (!autoclose) { - proj_context_destroy(m_ctxt); - m_ctxt = nullptr; - } - std::remove(tmp_filename.c_str()); - } -}; - -TEST_F(Fixture_proj_context_set_autoclose_database, - proj_context_set_autoclose_database_true) { - test(true); -} - -TEST_F(Fixture_proj_context_set_autoclose_database, - proj_context_set_autoclose_database_false) { - test(false); -} - -// --------------------------------------------------------------------------- - TEST_F(CApi, proj_context_copy_from_default) { auto c_path = proj_context_get_database_path(m_ctxt); ASSERT_TRUE(c_path != nullptr); @@ -5178,7 +5089,20 @@ TEST_F(CApi, proj_create_vertical_crs_ex_implied_accuracy) { ObjectKeeper keeper_transform(transform); // This is the accuracy of operations EPSG:5656 / 5657 - ASSERT_EQ(proj_coordoperation_get_accuracy(m_ctxt, transform), 0.15); + const double acc = proj_coordoperation_get_accuracy(m_ctxt, transform); + EXPECT_NEAR(acc, 0.15, 1e-10); + + // Check there's an asssociated area of use + double west_lon_degree = 0; + double south_lat_degree = 0; + double east_lon_degree = 0; + double north_lat_degree = 0; + ASSERT_EQ(proj_get_area_of_use(m_ctxt, transform, &west_lon_degree, + &south_lat_degree, &east_lon_degree, + &north_lat_degree, nullptr), + true); + EXPECT_LE(north_lat_degree, -10); + EXPECT_GE(west_lon_degree, 110); } // --------------------------------------------------------------------------- @@ -5644,4 +5568,72 @@ TEST_F(CApi, proj_get_geoid_models_from_database) { EXPECT_FALSE(findInList(list, "OSGM15")); } +// --------------------------------------------------------------------------- + +#if !defined(_WIN32) +TEST_F(CApi, open_plenty_of_contexts) { + // Test that we only consume 1 file handle for the connection to the + // database + std::vector<FILE *> dummyFilePointers; + std::vector<PJ_CONTEXT *> ctxts; + // 1024 is the number of file descriptors that can be opened simultaneously + // by a Linux process (by default) + for (int i = 0; i < 1024 - 50; i++) { + FILE *f = fopen("/dev/null", "rb"); + ASSERT_TRUE(f != nullptr); + dummyFilePointers.push_back(f); + } + for (int i = 0; i < 100; i++) { + PJ_CONTEXT *ctxt = proj_context_create(); + ASSERT_TRUE(ctxt != nullptr); + auto obj = proj_create(ctxt, "EPSG:4326"); + ObjectKeeper keeper(obj); + EXPECT_NE(obj, nullptr); + ctxts.push_back(ctxt); + } + for (PJ_CONTEXT *ctxt : ctxts) { + proj_context_destroy(ctxt); + } + for (FILE *f : dummyFilePointers) { + fclose(f); + } + proj_cleanup(); +} +#endif // !defined(_WIN32) + +// --------------------------------------------------------------------------- + +#ifndef __MINGW32__ +// We need std::thread support + +TEST_F(CApi, concurrent_context) { + // Test that concurrent access to the database is thread safe. + std::vector<std::thread> threads; + for (int i = 0; i < 4; i++) { + threads.emplace_back(std::thread([] { + for (int j = 0; j < 60; j++) { + PJ_CONTEXT *ctxt = proj_context_create(); + { + auto obj = proj_create(ctxt, "EPSG:4326"); + ObjectKeeper keeper(obj); + EXPECT_NE(obj, nullptr); + } + { + auto obj = proj_create( + ctxt, ("EPSG:" + std::to_string(32600 + j)).c_str()); + ObjectKeeper keeper(obj); + EXPECT_NE(obj, nullptr); + } + proj_context_destroy(ctxt); + } + })); + } + for (auto &t : threads) { + t.join(); + } + proj_cleanup(); +} + +#endif // __MINGW32__ + } // namespace diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp index 614580f2..2ac26d3a 100644 --- a/test/unit/test_crs.cpp +++ b/test/unit/test_crs.cpp @@ -3014,6 +3014,38 @@ TEST(crs, projectedCRS_identify_db) { EXPECT_EQ(res.front().first->getEPSGCode(), 32631); EXPECT_GE(res.front().second, 70.0); } + { + // Identify a ESRI WKT where the datum name doesn't start with D_ + auto wkt = "PROJCS[\"S-JTSK_[JTSK03]_Krovak_East_North\"," + "GEOGCS[\"S-JTSK_[JTSK03]\"," + " DATUM[\"S-JTSK_[JTSK03]\"," + " SPHEROID[\"Bessel_1841\",6377397.155,299.1528128]]," + " PRIMEM[\"Greenwich\",0.0]," + " UNIT[\"Degree\",0.0174532925199433]]," + "PROJECTION[\"Krovak\"]," + "PARAMETER[\"False_Easting\",0.0]," + "PARAMETER[\"False_Northing\",0.0]," + "PARAMETER[\"Pseudo_Standard_Parallel_1\",78.5]," + "PARAMETER[\"Scale_Factor\",0.9999]," + "PARAMETER[\"Azimuth\",30.2881397527778]," + "PARAMETER[\"Longitude_Of_Center\",24.8333333333333]," + "PARAMETER[\"Latitude_Of_Center\",49.5]," + "PARAMETER[\"X_Scale\",-1.0]," + "PARAMETER[\"Y_Scale\",1.0]," + "PARAMETER[\"XY_Plane_Rotation\",90.0]," + "UNIT[\"Meter\",1.0]]"; + EXPECT_EQ(WKTParser().guessDialect(wkt), + WKTParser::WKTGuessedDialect::WKT1_ESRI); + auto obj = + WKTParser().attachDatabaseContext(dbContext).createFromWKT(wkt); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + auto factoryAll = AuthorityFactory::create(dbContext, std::string()); + auto res = crs->identify(factoryAll); + ASSERT_EQ(res.size(), 1U); + EXPECT_EQ(res.front().first->getEPSGCode(), 8353); + EXPECT_EQ(res.front().second, 100); + } } // --------------------------------------------------------------------------- @@ -4411,6 +4443,93 @@ TEST(crs, boundCRS_to_WKT2) { // --------------------------------------------------------------------------- +TEST(crs, boundCRS_with_usage) { + + auto wkt = + "BOUNDCRS[\n" + " SOURCECRS[\n" + " PROJCRS[\"Monte Mario / Italy zone 2\",\n" + " BASEGEOGCRS[\"Monte Mario\",\n" + " DATUM[\"Monte Mario\",\n" + " ELLIPSOID[\"International 1924\",6378388,297,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " ID[\"EPSG\",4265]],\n" + " CONVERSION[\"unnamed\",\n" + " METHOD[\"Transverse Mercator\",\n" + " ID[\"EPSG\",9807]],\n" + " PARAMETER[\"Latitude of natural origin\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8801]],\n" + " PARAMETER[\"Longitude of natural origin\",15,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8802]],\n" + " PARAMETER[\"Scale factor at natural origin\",0.9996,\n" + " SCALEUNIT[\"unity\",1],\n" + " ID[\"EPSG\",8805]],\n" + " PARAMETER[\"False easting\",2520000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8806]],\n" + " PARAMETER[\"False northing\",0,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8807]]],\n" + " CS[Cartesian,2],\n" + " AXIS[\"x\",east,\n" + " ORDER[1],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " AXIS[\"y\",north,\n" + " ORDER[2],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",3004]]],\n" + " TARGETCRS[\n" + " GEOGCRS[\"WGS 84\",\n" + " DATUM[\"World Geodetic System 1984\",\n" + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " CS[ellipsoidal,2],\n" + " AXIS[\"geodetic latitude (Lat)\",north,\n" + " ORDER[1],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " AXIS[\"geodetic longitude (Lon)\",east,\n" + " ORDER[2],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " ID[\"EPSG\",4326]]],\n" + " ABRIDGEDTRANSFORMATION[\"Transformation from Monte Mario to " + "WGS84\",\n" + " METHOD[\"Position Vector transformation (geog2D domain)\",\n" + " ID[\"EPSG\",9606]],\n" + " PARAMETER[\"X-axis translation\",-50.2,\n" + " ID[\"EPSG\",8605]],\n" + " PARAMETER[\"Y-axis translation\",-50.4,\n" + " ID[\"EPSG\",8606]],\n" + " PARAMETER[\"Z-axis translation\",84.8,\n" + " ID[\"EPSG\",8607]],\n" + " PARAMETER[\"X-axis rotation\",-0.69,\n" + " ID[\"EPSG\",8608]],\n" + " PARAMETER[\"Y-axis rotation\",-2.012,\n" + " ID[\"EPSG\",8609]],\n" + " PARAMETER[\"Z-axis rotation\",0.459,\n" + " ID[\"EPSG\",8610]],\n" + " PARAMETER[\"Scale difference\",0.99997192,\n" + " ID[\"EPSG\",8611]]],\n" + " USAGE[\n" + " SCOPE[\"unknown\"],\n" + " AREA[\"Italy - Sicily onshore\"],\n" + " BBOX[36.59,12.36,38.35,15.71]]]"; + auto crs = + nn_dynamic_pointer_cast<BoundCRS>(WKTParser().createFromWKT(wkt)); + ASSERT_TRUE(crs != nullptr); + + auto got_wkt = crs->exportToWKT( + WKTFormatter::create(WKTFormatter::Convention::WKT2_2019).get()); + EXPECT_EQ(got_wkt, wkt); +} + +// --------------------------------------------------------------------------- + TEST(crs, boundCRS_crs_link) { { @@ -4646,9 +4765,10 @@ TEST(crs, boundCRS_identify_db) { auto res = crs->identify(factoryEPSG); ASSERT_EQ(res.size(), 1U); EXPECT_EQ(res.front().second, 25); - auto wkt = crs->exportToWKT( - WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get()); - EXPECT_TRUE(wkt.find("32122") != std::string::npos) << wkt; + auto boundCRS = dynamic_cast<const BoundCRS *>(res.front().first.get()); + ASSERT_TRUE(boundCRS != nullptr); + EXPECT_EQ(boundCRS->baseCRS()->getEPSGCode(), 32122); + EXPECT_EQ(boundCRS->transformation()->method()->getEPSGCode(), 9603); } { @@ -4665,6 +4785,25 @@ TEST(crs, boundCRS_identify_db) { EXPECT_EQ(boundCRS->baseCRS()->getEPSGCode(), 3148); EXPECT_EQ(res.front().second, 70); } + + { + // Identify a WKT with datum WGS84 and TOWGS84 + auto obj = WKTParser().attachDatabaseContext(dbContext).createFromWKT( + "GEOGCS[\"WGS84 Coordinate System\",DATUM[\"WGS 1984\"," + "SPHEROID[\"WGS 1984\",6378137,298.257223563]," + "TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]]," + "PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]," + "AUTHORITY[\"EPSG\",\"4326\"]]"); + auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj); + ASSERT_TRUE(crs != nullptr); + auto res = crs->identify(factoryEPSG); + ASSERT_EQ(res.size(), 1U); + EXPECT_EQ(res.front().second, 100); + auto boundCRS = dynamic_cast<const BoundCRS *>(res.front().first.get()); + ASSERT_TRUE(boundCRS != nullptr); + EXPECT_EQ(boundCRS->baseCRS()->getEPSGCode(), 4326); + EXPECT_EQ(boundCRS->transformation()->method()->getEPSGCode(), 9606); + } } // --------------------------------------------------------------------------- @@ -6383,6 +6522,32 @@ TEST(crs, promoteTo3D_and_demoteTo2D) { EXPECT_TRUE(dynamic_cast<const ProjectedCRS *>(demoted.get()) != nullptr); } + + { + auto crs = createDerivedGeographicCRS(); + auto crs3D = crs->promoteTo3D(std::string(), dbContext); + auto crs3DAsDerivedGeog = + nn_dynamic_pointer_cast<DerivedGeographicCRS>(crs3D); + ASSERT_TRUE(crs3DAsDerivedGeog != nullptr); + EXPECT_EQ(crs3DAsDerivedGeog->baseCRS() + ->coordinateSystem() + ->axisList() + .size(), + 3U); + EXPECT_EQ(crs3DAsDerivedGeog->coordinateSystem()->axisList().size(), + 3U); + EXPECT_TRUE(crs3DAsDerivedGeog->promoteTo3D(std::string(), nullptr) + ->isEquivalentTo(crs3DAsDerivedGeog.get())); + + auto demoted = crs3DAsDerivedGeog->demoteTo2D(std::string(), dbContext); + EXPECT_EQ(demoted->baseCRS()->coordinateSystem()->axisList().size(), + 2U); + EXPECT_EQ(demoted->coordinateSystem()->axisList().size(), 2U); + EXPECT_TRUE(demoted->isEquivalentTo( + crs.get(), IComparable::Criterion::EQUIVALENT)); + EXPECT_TRUE(demoted->demoteTo2D(std::string(), nullptr) + ->isEquivalentTo(demoted.get())); + } } // --------------------------------------------------------------------------- diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index 6c8340aa..e99072a8 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -39,6 +39,8 @@ #include "proj/metadata.hpp" #include "proj/util.hpp" +#include <algorithm> + #include <sqlite3.h> #ifdef _MSC_VER @@ -2912,7 +2914,7 @@ TEST(factory, attachExtraDatabases_none) { TEST(factory, attachExtraDatabases_auxiliary) { const std::string auxDbName( - "file:proj_test_aux.db?mode=memory&cache=shared"); + "file:attachExtraDatabases_auxiliary.db?mode=memory&cache=shared"); sqlite3 *dbAux = nullptr; sqlite3_open_v2( @@ -3115,6 +3117,115 @@ TEST_F(FactoryWithTmpDatabase, // --------------------------------------------------------------------------- +TEST_F(FactoryWithTmpDatabase, + check_fixup_direction_concatenated_inverse_map_projection) { + + // This tests https://github.com/OSGeo/PROJ/issues/2817 + + createStructure(); + populateWithFakeEPSG(); + + ASSERT_TRUE(execute( + "INSERT INTO other_transformation " + "VALUES('EPSG','NOOP_TRANSFORMATION_32631','name',NULL," + "'PROJ','PROJString','+proj=noop'," + "'EPSG','32631','EPSG','32631',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);")) + << last_error(); + + ASSERT_TRUE( + execute("INSERT INTO usage VALUES('EPSG'," + "'other_transformation_NOOP_TRANSFORMATION_32631_usage'," + "'other_transformation'," + "'EPSG','NOOP_TRANSFORMATION_32631'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); + + ASSERT_TRUE(execute( + "INSERT INTO other_transformation " + "VALUES('EPSG','NOOP_TRANSFORMATION_4326','name',NULL," + "'PROJ','PROJString','+proj=noop'," + "'EPSG','4326','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);")) + << last_error(); + + ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," + "'other_transformation_NOOP_TRANSFORMATION_4326_usage'," + "'other_transformation'," + "'EPSG','NOOP_TRANSFORMATION_4326'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); + + ASSERT_TRUE(execute("INSERT INTO concatenated_operation " + "VALUES('EPSG','TEST_CONCATENATED','name',NULL," + "'EPSG','4326','EPSG'" + ",'4326',NULL,NULL,0);")) + << last_error(); + ASSERT_TRUE(execute("INSERT INTO usage VALUES('EPSG'," + "'concatenated_operation_TEST_CONCATENATED_usage'," + "'concatenated_operation'," + "'EPSG','TEST_CONCATENATED'," + "'EPSG','1262','EPSG','1024');")) + << last_error(); + + // Forward map projection + ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step " + "VALUES('EPSG','TEST_CONCATENATED',1," + "'EPSG','16031');")) + << last_error(); + + // Noop projected + ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step " + "VALUES('EPSG','TEST_CONCATENATED',2," + "'EPSG','NOOP_TRANSFORMATION_32631');")) + << last_error(); + + // Inverse map projection + ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step " + "VALUES('EPSG','TEST_CONCATENATED',3," + "'EPSG','16031');")) + << last_error(); + + // Noop geographic + ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step " + "VALUES('EPSG','TEST_CONCATENATED',4," + "'EPSG','NOOP_TRANSFORMATION_4326');")) + << last_error(); + + // Forward map projection + ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step " + "VALUES('EPSG','TEST_CONCATENATED',5," + "'EPSG','16031');")) + << last_error(); + + // Noop projected + ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step " + "VALUES('EPSG','TEST_CONCATENATED',6," + "'EPSG','NOOP_TRANSFORMATION_32631');")) + << last_error(); + + // Inverse map projection + ASSERT_TRUE(execute("INSERT INTO concatenated_operation_step " + "VALUES('EPSG','TEST_CONCATENATED',7," + "'EPSG','16031');")) + << last_error(); + + auto dbContext = DatabaseContext::create(m_ctxt); + auto authFactory = AuthorityFactory::create(dbContext, std::string("EPSG")); + const auto op = + authFactory->createCoordinateOperation("TEST_CONCATENATED", false); + auto wkt = op->exportToPROJString(PROJStringFormatter::create().get()); + EXPECT_EQ(wkt, "+proj=noop"); +} + +// --------------------------------------------------------------------------- + TEST(factory, createObjectsFromName) { auto ctxt = DatabaseContext::create(); auto factory = AuthorityFactory::create(ctxt, std::string()); diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index 95b9a4c3..72ac1868 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -5722,6 +5722,18 @@ static const struct { {{"False_Easting", 1}, {"False_Northing", 2}, {"Central_Meridian", 3}, + {"Option", 0.0}}, + "Goode Homolosine", + { + {"Longitude of natural origin", 3}, + {"False easting", 1}, + {"False northing", 2}, + }}, + + {"Goode_Homolosine", + {{"False_Easting", 1}, + {"False_Northing", 2}, + {"Central_Meridian", 3}, {"Option", 1.0}}, "Interrupted Goode Homolosine", { @@ -5929,8 +5941,8 @@ static const struct { TEST(wkt_parse, esri_projcs) { for (const auto &projDef : esriProjDefs) { - std::string wkt("PROJCS[\"unnamed\",GEOGCS[\"GCS_WGS_1984\"," - "DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\"," + std::string wkt("PROJCS[\"unnamed\",GEOGCS[\"unnamed\"," + "DATUM[\"unnamed\",SPHEROID[\"unnamed\"," "6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0]," "UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\""); wkt += projDef.esriProjectionName; @@ -6290,6 +6302,31 @@ TEST(wkt_parse, wkt1_esri_gauss_kruger) { // --------------------------------------------------------------------------- +TEST(wkt_parse, wkt1_esri_goode_homolosine_without_option_0) { + // Not sure if it is really valid to not have PARAMETER["Option",0.0] + // but it seems reasonable to check that we understand that as + // Goode Homolosine and not Interrupted Goode Homolosine (option 1) + auto wkt = "PROJCS[\"unknown\",GEOGCS[\"GCS_unknown\",DATUM[\"D_WGS_1984\"," + "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + "PROJECTION[\"Goode_Homolosine\"]," + "PARAMETER[\"False_Easting\",0.0]," + "PARAMETER[\"False_Northing\",0.0]," + "PARAMETER[\"Central_Meridian\",0.0]," + "UNIT[\"Meter\",1.0]]"; + + auto obj = WKTParser() + .attachDatabaseContext(DatabaseContext::create()) + .createFromWKT(wkt); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + + EXPECT_EQ(crs->derivingConversion()->method()->nameStr(), + "Goode Homolosine"); +} + +// --------------------------------------------------------------------------- + TEST(wkt_parse, wkt1_oracle) { // WKT from mdsys.cs_srs Oracle table auto wkt = "PROJCS[\"RGF93 / Lambert-93\", GEOGCS [ \"RGF93\", " @@ -11891,9 +11928,12 @@ TEST(json_import, compound_crs) { // --------------------------------------------------------------------------- TEST(json_import, bound_crs) { + // Explicitly check that the version is v0.2 in that circumstance. Might + // require adjustments in the future. auto json = "{\n" - " \"$schema\": \"foo\",\n" + " \"$schema\": " + "\"https://proj.org/schemas/v0.2/projjson.schema.json\",\n" " \"type\": \"BoundCRS\",\n" " \"source_crs\": {\n" " \"type\": \"GeographicCRS\",\n" @@ -11987,9 +12027,125 @@ TEST(json_import, bound_crs) { auto obj = createFromUserInput(json, nullptr); auto boundCRS = nn_dynamic_pointer_cast<BoundCRS>(obj); ASSERT_TRUE(boundCRS != nullptr); - EXPECT_EQ( - boundCRS->exportToJSON(&(JSONFormatter::create()->setSchema("foo"))), - json); + EXPECT_EQ(boundCRS->exportToJSON(JSONFormatter::create().get()), json); +} + +// --------------------------------------------------------------------------- + +TEST(json_import, bound_crs_with_name_and_usage) { + // Explicitly check that the version is v0.3 in that circumstance. Might + // require adjustments in the future. + auto json = + "{\n" + " \"$schema\": " + "\"https://proj.org/schemas/v0.3/projjson.schema.json\",\n" + " \"type\": \"BoundCRS\",\n" + " \"name\": \"my bound crs\",\n" + " \"source_crs\": {\n" + " \"type\": \"GeographicCRS\",\n" + " \"name\": \"unknown\",\n" + " \"datum\": {\n" + " \"type\": \"GeodeticReferenceFrame\",\n" + " \"name\": \"Unknown based on GRS80 ellipsoid\",\n" + " \"ellipsoid\": {\n" + " \"name\": \"GRS 1980\",\n" + " \"semi_major_axis\": 6378137,\n" + " \"inverse_flattening\": 298.257222101,\n" + " \"id\": {\n" + " \"authority\": \"EPSG\",\n" + " \"code\": 7019\n" + " }\n" + " }\n" + " },\n" + " \"coordinate_system\": {\n" + " \"subtype\": \"ellipsoidal\",\n" + " \"axis\": [\n" + " {\n" + " \"name\": \"Longitude\",\n" + " \"abbreviation\": \"lon\",\n" + " \"direction\": \"east\",\n" + " \"unit\": \"degree\"\n" + " },\n" + " {\n" + " \"name\": \"Latitude\",\n" + " \"abbreviation\": \"lat\",\n" + " \"direction\": \"north\",\n" + " \"unit\": \"degree\"\n" + " }\n" + " ]\n" + " }\n" + " },\n" + " \"target_crs\": {\n" + " \"type\": \"GeographicCRS\",\n" + " \"name\": \"WGS 84\",\n" + " \"datum\": {\n" + " \"type\": \"GeodeticReferenceFrame\",\n" + " \"name\": \"World Geodetic System 1984\",\n" + " \"ellipsoid\": {\n" + " \"name\": \"WGS 84\",\n" + " \"semi_major_axis\": 6378137,\n" + " \"inverse_flattening\": 298.257223563\n" + " }\n" + " },\n" + " \"coordinate_system\": {\n" + " \"subtype\": \"ellipsoidal\",\n" + " \"axis\": [\n" + " {\n" + " \"name\": \"Latitude\",\n" + " \"abbreviation\": \"lat\",\n" + " \"direction\": \"north\",\n" + " \"unit\": \"degree\"\n" + " },\n" + " {\n" + " \"name\": \"Longitude\",\n" + " \"abbreviation\": \"lon\",\n" + " \"direction\": \"east\",\n" + " \"unit\": \"degree\"\n" + " }\n" + " ]\n" + " },\n" + " \"id\": {\n" + " \"authority\": \"EPSG\",\n" + " \"code\": 4326\n" + " }\n" + " },\n" + " \"transformation\": {\n" + " \"name\": \"unknown to WGS84\",\n" + " \"method\": {\n" + " \"name\": \"NTv2\",\n" + " \"id\": {\n" + " \"authority\": \"EPSG\",\n" + " \"code\": 9615\n" + " }\n" + " },\n" + " \"parameters\": [\n" + " {\n" + " \"name\": \"Latitude and longitude difference file\",\n" + " \"value\": \"@foo\",\n" + " \"id\": {\n" + " \"authority\": \"EPSG\",\n" + " \"code\": 8656\n" + " }\n" + " }\n" + " ]\n" + " },\n" + " \"scope\": \"Example only (fictitious).\",\n" + " \"area\": \"Description of the extent of the CRS.\",\n" + " \"bbox\": {\n" + " \"south_latitude\": -90,\n" + " \"west_longitude\": -180,\n" + " \"north_latitude\": 90,\n" + " \"east_longitude\": 180\n" + " },\n" + " \"id\": {\n" + " \"authority\": \"foo\",\n" + " \"code\": 1234\n" + " }\n" + "}"; + auto obj = createFromUserInput(json, nullptr); + auto boundCRS = nn_dynamic_pointer_cast<BoundCRS>(obj); + ASSERT_TRUE(boundCRS != nullptr); + EXPECT_EQ(boundCRS->exportToJSON(JSONFormatter::create().get()), json); } // --------------------------------------------------------------------------- @@ -13717,3 +13873,74 @@ TEST(json_export, coordinate_system_id) { EXPECT_EQ(cs->exportToJSON(&(JSONFormatter::create()->setSchema("foo"))), json); } + +// --------------------------------------------------------------------------- + +TEST(io, EXTENSION_PROJ4) { + // Check that the PROJ string is preserved in the remarks + auto obj = PROJStringParser().createFromPROJString( + "+proj=utm +datum=NAD27 +zone=11 +over +type=crs"); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->remarks(), + "PROJ CRS string: +proj=utm +datum=NAD27 +zone=11 +over"); + + // Chat that the PROJ string is detected when ingesting a WKT2 with + // a REMARKS node that contains it + auto wkt2 = crs->exportToWKT(WKTFormatter::create().get()); + auto obj2 = WKTParser().createFromWKT(wkt2); + auto crs2 = nn_dynamic_pointer_cast<ProjectedCRS>(obj2); + ASSERT_TRUE(crs2 != nullptr); + EXPECT_EQ(crs2->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=utm +datum=NAD27 +zone=11 +over +type=crs"); + + // Chat that the PROJ string is detected when ingesting a WKT2 with + // a REMARKS node that contains it (in the middle of the remarks) + auto wkt3 = + "PROJCRS[\"unknown\",\n" + " BASEGEOGCRS[\"unknown\",\n" + " DATUM[\"North American Datum 1927\",\n" + " ELLIPSOID[\"Clarke 1866\",6378206.4,294.978698213898,\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",6267]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8901]]],\n" + " CONVERSION[\"UTM zone 11N\",\n" + " METHOD[\"Transverse Mercator\",\n" + " ID[\"EPSG\",9807]],\n" + " PARAMETER[\"Latitude of natural origin\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8801]],\n" + " PARAMETER[\"Longitude of natural origin\",-117,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8802]],\n" + " PARAMETER[\"Scale factor at natural origin\",0.9996,\n" + " SCALEUNIT[\"unity\",1],\n" + " ID[\"EPSG\",8805]],\n" + " PARAMETER[\"False easting\",500000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8806]],\n" + " PARAMETER[\"False northing\",0,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8807]],\n" + " ID[\"EPSG\",16011]],\n" + " CS[Cartesian,2],\n" + " AXIS[\"(E)\",east,\n" + " ORDER[1],\n" + " LENGTHUNIT[\"metre\",1,\n" + " ID[\"EPSG\",9001]]],\n" + " AXIS[\"(N)\",north,\n" + " ORDER[2],\n" + " LENGTHUNIT[\"metre\",1,\n" + " ID[\"EPSG\",9001]]],\n" + " REMARK[\"Prefix. PROJ CRS string: +proj=utm +datum=NAD27 +zone=11 " + "+over. Suffix\"]]"; + auto obj3 = WKTParser().createFromWKT(wkt3); + auto crs3 = nn_dynamic_pointer_cast<ProjectedCRS>(obj3); + ASSERT_TRUE(crs3 != nullptr); + EXPECT_EQ(crs3->remarks(), "Prefix. PROJ CRS string: +proj=utm " + "+datum=NAD27 +zone=11 +over. Suffix"); + EXPECT_EQ(crs3->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=utm +datum=NAD27 +zone=11 +over +type=crs"); +} diff --git a/test/unit/test_operationfactory.cpp b/test/unit/test_operationfactory.cpp index 18a19d14..56d9f743 100644 --- a/test/unit/test_operationfactory.cpp +++ b/test/unit/test_operationfactory.cpp @@ -2123,6 +2123,47 @@ TEST( // --------------------------------------------------------------------------- +TEST(operation, projCRS_to_geogCRS_crs_extent_use_none) { + auto authFactory = + AuthorityFactory::create(DatabaseContext::create(), "EPSG"); + { + auto ctxt = + CoordinateOperationContext::create(authFactory, nullptr, 0.0); + auto list = CoordinateOperationFactory::create()->createOperations( + authFactory->createCoordinateReferenceSystem("23031"), // ED50 UTM31 + authFactory->createCoordinateReferenceSystem("4326"), ctxt); + bool found_EPSG_15964 = false; + for (const auto &op : list) { + if (op->nameStr().find("ED50 to WGS 84 (42)") != + std::string::npos) { + found_EPSG_15964 = true; + } + } + // not expected since doesn't intersect EPSG:23031 area of use + EXPECT_FALSE(found_EPSG_15964); + } + { + auto ctxt = + CoordinateOperationContext::create(authFactory, nullptr, 0.0); + // Ignore source and target CRS extent + ctxt->setSourceAndTargetCRSExtentUse( + CoordinateOperationContext::SourceTargetCRSExtentUse::NONE); + auto list = CoordinateOperationFactory::create()->createOperations( + authFactory->createCoordinateReferenceSystem("23031"), // ED50 UTM31 + authFactory->createCoordinateReferenceSystem("4326"), ctxt); + bool found_EPSG_15964 = false; + for (const auto &op : list) { + if (op->nameStr().find("ED50 to WGS 84 (42)") != + std::string::npos) { + found_EPSG_15964 = true; + } + } + EXPECT_TRUE(found_EPSG_15964); + } +} + +// --------------------------------------------------------------------------- + TEST(operation, projCRS_to_projCRS_north_pole_inverted_axis) { auto authFactory = @@ -2181,7 +2222,7 @@ TEST(operation, projCRS_to_projCRS_through_geog3D) { "+step +proj=cart +ellps=WGS84 " "+step +proj=helmert +x=-0.16959 +y=0.35312 +z=0.51846 " "+rx=-0.03385 +ry=0.16325 +rz=-0.03446 +s=0.03693 " - "+convention=position_vector " + "+convention=coordinate_frame " "+step +inv +proj=cart +ellps=GRS80 " "+step +proj=pop +v_3 " "+step +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=500000 " @@ -6067,6 +6108,30 @@ TEST(operation, createOperation_fallback_to_proj4_strings) { // --------------------------------------------------------------------------- +TEST(operation, createOperation_fallback_to_proj4_strings_bound_of_geog) { + auto objSrc = PROJStringParser().createFromPROJString( + "+proj=longlat +geoc +ellps=GRS80 +towgs84=0,0,0 +type=crs"); + auto src = nn_dynamic_pointer_cast<BoundCRS>(objSrc); + ASSERT_TRUE(src != nullptr); + + auto objDest = PROJStringParser().createFromPROJString( + "+proj=longlat +geoc +ellps=clrk66 +towgs84=0,0,0 +type=crs"); + auto dest = nn_dynamic_pointer_cast<BoundCRS>(objDest); + ASSERT_TRUE(dest != nullptr); + + auto op = CoordinateOperationFactory::create()->createOperation( + NN_CHECK_ASSERT(src), NN_CHECK_ASSERT(dest)); + ASSERT_TRUE(op != nullptr); + EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +inv +proj=longlat +geoc +ellps=GRS80 +towgs84=0,0,0 " + "+step +proj=longlat +geoc +ellps=clrk66 +towgs84=0,0,0 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg"); +} + +// --------------------------------------------------------------------------- + TEST( operation, createOperation_fallback_to_proj4_strings_regular_with_datum_to_projliteral) { |
