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