=============================================================================== Various test material, mostly converted from selftest entries in PJ_xxx.c Contrary to the material in builtins.gie, this material is handwritten and intends to exercise corner cases. =============================================================================== <gie> ------------------------------------------------------------------------------- Two ob_tran tests from nad/testvarious ------------------------------------------------------------------------------- operation +proj=ob_tran +o_proj=moll +R=6378137.0 +o_lon_p=0 +o_lat_p=0 +lon_0=180 ------------------------------------------------------------------------------- tolerance 1 mm direction inverse accept 300000 400000 expect -42.7562158333 85.5911341667 direction forward accept 10 20 expect -1384841.18787 7581707.88240 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- Two tests from PJ_molodensky.c ------------------------------------------------------------------------------- operation proj=molodensky a=6378160 rf=298.25 da=-23 df=-8.120449e-8 dx=-134 dy=-48 dz=149 abridged ------------------------------------------------------------------------------- tolerance 2 m accept 144.9667 -37.8 50 0 expect 144.968 -37.79848 46.378 0 roundtrip 100 1 m ------------------------------------------------------------------------------- Same thing once more, but this time unabridged ------------------------------------------------------------------------------- operation proj=molodensky a=6378160 rf=298.25 da=-23 df=-8.120449e-8 dx=-134 dy=-48 dz=149 ------------------------------------------------------------------------------- tolerance 2 m accept 144.9667 -37.8 50 0 expect 144.968 -37.79848 46.378 0 roundtrip 100 1 m ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- Some tests from PJ_pipeline.c ------------------------------------------------------------------------------- Forward-reverse geo->utm->geo (4D functions) ------------------------------------------------------------------------------- operation proj=pipeline zone=32 step proj=utm ellps=GRS80 step proj=utm ellps=GRS80 inv ------------------------------------------------------------------------------- tolerance 0.1 mm accept 12 55 0 0 expect 12 55 0 0 Now the inverse direction (still same result: the pipeline is symmetrical) direction inverse expect 12 55 0 0 ------------------------------------------------------------------------------- And now the back-to-back situation utm->geo->utm (4D functions) ------------------------------------------------------------------------------- operation proj=pipeline zone=32 ellps=GRS80 step proj=utm inv step proj=utm ------------------------------------------------------------------------------- accept 691875.63214 6098907.82501 0 0 expect 691875.63214 6098907.82501 0 0 direction inverse expect 691875.63214 6098907.82501 0 0 ------------------------------------------------------------------------------- Forward-reverse geo->utm->geo (3D functions) ------------------------------------------------------------------------------- operation proj=pipeline zone=32 step proj=utm ellps=GRS80 step proj=utm ellps=GRS80 inv ------------------------------------------------------------------------------- tolerance 0.1 mm accept 12 55 0 expect 12 55 0 Now the inverse direction (still same result: the pipeline is symmetrical) direction inverse expect 12 55 0 ------------------------------------------------------------------------------- And now the back-to-back situation utm->geo->utm (3D functions) ------------------------------------------------------------------------------- operation proj=pipeline zone=32 ellps=GRS80 step proj=utm inv step proj=utm ------------------------------------------------------------------------------- accept 691875.63214 6098907.82501 0 expect 691875.63214 6098907.82501 0 direction inverse expect 691875.63214 6098907.82501 0 ------------------------------------------------------------------------------- Test a corner case: A rather pointless one-step pipeline geo->utm ------------------------------------------------------------------------------- operation proj=pipeline step proj=utm zone=32 ellps=GRS80 ------------------------------------------------------------------------------- accept 12 55 0 0 expect 691875.63214 6098907.82501 0 0 direction inverse accept 691875.63214 6098907.82501 0 0 expect 12 55 0 0 ------------------------------------------------------------------------------- Finally test a pipeline with more than one init step ------------------------------------------------------------------------------- operation proj=pipeline step init=epsg:25832 inv step init=epsg:25833 step init=epsg:25833 inv step init=epsg:25832 ------------------------------------------------------------------------------- accept 691875.63214 6098907.82501 0 0 expect 691875.63214 6098907.82501 0 0 direction inverse accept 12 55 0 0 expect 12 55 0 0 ------------------------------------------------------------------------------- Test a few inversion scenarios (urm5 has no inverse operation) ------------------------------------------------------------------------------- operation proj=pipeline step proj=urm5 n=0.5 inv expect failure pjd_err_malformed_pipeline operation proj=pipeline inv step proj=urm5 n=0.5 expect failure pjd_err_malformed_pipeline operation proj=pipeline inv step proj=urm5 n=0.5 inv accept 12 56 expect 1215663.2814182492 5452209.5424045017 operation proj=pipeline step proj=urm5 n=0.5 accept 12 56 expect 1215663.2814182492 5452209.5424045017 ------------------------------------------------------------------------------- Test various failing scenarios. ------------------------------------------------------------------------------- operation proj=pipeline step proj=pipeline step proj=merc expect failure pjd_err_malformed_pipeline operation step proj=pipeline step proj=merc expect failure pjd_err_malformed_pipeline operation proj=pipeline expect failure pjd_err_malformed_pipeline ------------------------------------------------------------------------------- Some tests from PJ_vgridshift.c ------------------------------------------------------------------------------- operation proj=vgridshift grids=egm96_15.gtx ellps=GRS80 ------------------------------------------------------------------------------- Appears there is a difference between the egm96_15.gtx distributed by OSGeo4W, and the one from http://download.osgeo.org/proj/vdatum/egm96_15/egm96_15.gtx N(12.5, 55.5) = -36.021305084228515625 (download.osgeo.org) N(12.5, 55.5) = -35.880001068115234000 (OSGeo4W) This is annoying, but must be handled elsewhere. We jump through the hoop by setting a very lax tolerance. ------------------------------------------------------------------------------- tolerance 15 cm ignore pjd_err_failed_to_load_grid accept 12.5 55.5 0 0 expect 12.5 55.5 -36.021305084228516 0 roundtrip 100 1 nm ------------------------------------------------------------------------------- Fail on purpose: +grids parameter is mandatory operation proj=vgridshift expect failure errno no_args Fail on purpose: open non-existing grid operation proj=vgridshift grids=nonexistinggrid.gtx expect failure errno failed_to_load_grid ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- operation proj=vgridshift grids=egm96_15.gtx ellps=GRS80 multiplier=0.1 tolerance 15 cm ignore pjd_err_failed_to_load_grid accept 12.5 55.5 0 0 expect 12.5 55.5 3.6021305084228516 0 ------------------------------------------------------------------------------- Some tests from PJ_hgridshift.c ------------------------------------------------------------------------------- operation proj=hgridshift +grids=nzgd2kgrid0005.gsb ellps=GRS80 ------------------------------------------------------------------------------- Note: These data are home grown and suitable for regression testing only We need a set of authoritative test cases to test the nzgd2000 grid. ------------------------------------------------------------------------------- tolerance 1 mm ignore pjd_err_failed_to_load_grid accept 172.999892181021551 -45.001620431954613 expect 173 -45 direction inverse accept 173 -45 expect 172.999892181021551 -45.001620431954613 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- # Fail on purpose: open non-existing grid: operation proj=hgridshift grids=@nonexistinggrid.gsb,anothernonexistinggrid.gsb expect failure errno failed_to_load_grid # Fail on purpose: +grids parameter is mandatory: operation proj=hgridshift expect failure errno no_args ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- A number of tests from PJ_helmert.c ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- This example is from Lotti Jivall: "Simplified transformations from ITRF2008/IGS08 to ETRS89 for maritime applications" ------------------------------------------------------------------------------- operation proj=helmert convention=coordinate_frame x=0.67678 y=0.65495 z=-0.52827 rx=-0.022742 ry=0.012667 rz=0.022704 s=-0.01070 ------------------------------------------------------------------------------- tolerance 1 um accept 3565285.00000000 855949.00000000 5201383.00000000 expect 3565285.41342351 855948.67986759 5201382.72939791 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- This example is a random point, transformed from ED50 to ETRS89 using KMStrans2 ------------------------------------------------------------------------------- operation proj=helmert exact convention=coordinate_frame x=-081.0703 rx=-0.48488 y=-089.3603 ry=-0.02436 z=-115.7526 rz=-0.41321 s=-0.540645 ------------------------------------------------------------------------------- tolerance 1 um accept 3494994.30120000 1056601.97250000 5212382.16660000 expect 3494909.84026368 1056506.78938633 5212265.66699761 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- This example is a coordinate from the geodetic observatory in Onsala, Sweden transformed from ITRF2000 @ 2017.0 to ITRF93 @ 2017.0. The test coordinate was transformed using GNSStrans, using transformation parameters published by ITRF: ftp://itrf.ensg.ign.fr/pub/itrf/ITRF.TP ------------------------------------------------------------------------------- operation proj=helmert convention=position_vector x = 0.0127 dx = -0.0029 rx = -0.00039 drx = -0.00011 y = 0.0065 dy = -0.0002 ry = 0.00080 dry = -0.00019 z = -0.0209 dz = -0.0006 rz = -0.00114 drz = 0.00007 s = 0.00195 ds = 0.00001 t_epoch = 1988.0 ------------------------------------------------------------------------------- tolerance 0.03 mm accept 3370658.37800 711877.31400 5349787.08600 2017.0 # ITRF2000@2017.0 expect 3370658.18890 711877.42370 5349787.12430 2017.0 # ITRF93@2017.0 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- This example is from "A mathematical relationship between NAD27 and NAD83 (91) State Plane coordinates in Southeastern Wisconsin": http://www.sewrpc.org/SEWRPCFiles/Publications/TechRep/tr-034-Mathematical-Relationship-Between-NAD27-and-NAD83-91-State-Plane-Coordinates-Southeastern-Wisconsin.pdf The test data is taken from p. 29. Here we are using point 203 and converting it from NAD27 (ft) -> NAD83 (m). The paper reports a difference of 0.0014 m from measured to computed coordinates, hence the test tolerance is set accordingly. ------------------------------------------------------------------------------- operation proj=helmert convention=coordinate_frame x=-9597.3572 y=.6112 s=0.304794780637 theta=-1.244048 ------------------------------------------------------------------------------- tolerance 1 mm accept 2546506.957 542256.609 0 expect 766563.675 165282.277 0 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- Finally test the 4D-capabilities of the proj.h API, especially that the rotation matrix is updated when necessary. Test coordinates from GNSStrans. ------------------------------------------------------------------------------- operation proj=helmert convention=position_vector x = 0.01270 dx =-0.0029 rx =-0.00039 drx =-0.00011 y = 0.00650 dy =-0.0002 ry = 0.00080 dry =-0.00019 z =-0.0209 dz =-0.0006 rz =-0.00114 drz = 0.00007 s = 0.00195 ds = 0.00001 t_epoch=1988.0 ------------------------------------------------------------------------------- tolerance 0.1 mm accept 3370658.378 711877.314 5349787.086 2017.0 expect 3370658.18890 711877.42370 5349787.12430 2017.0 accept 3370658.378 711877.314 5349787.086 2018.0 expect 3370658.18087 711877.42750 5349787.12648 2018.0 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- Test error cases of helmert ------------------------------------------------------------------------------- # A rotational term implies an explicit convention to be specified operation proj=helmert rx=1 expect failure errno missing_arg operation proj=helmert rx=1 convention=foo expect failure errno invalid_arg operation proj=helmert rx=1 convention=1 expect failure errno invalid_arg # towgs84 in helmert context should alwas be position_vector operation proj=helmert towgs84=1,2,3,4,5,6,7 convention=coordinate_frame expect failure errno invalid_arg # Transpose no longer accepted operation proj=helmert transpose expect failure errno invalid_arg ------------------------------------------------------------------------------- geocentric latitude ------------------------------------------------------------------------------- operation proj=geoc ellps=GRS80 accept 12 55 0 0 expect 12 54.818973308324573 0 0 roundtrip 1000 accept 12 90 0 0 expect 12 90 0 0 accept 12 -90 0 0 expect 12 -90 0 0 accept 12 89.99999999999 0 0 expect 12 89.999999999989996 0 0 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- geocentric latitude using old +geoc flag ------------------------------------------------------------------------------- operation proj=pipeline step proj=longlat ellps=GRS80 geoc inv accept 12 55 0 0 expect 12 54.818973308324573 0 0 roundtrip 1 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- some less used options ------------------------------------------------------------------------------- operation proj=utm ellps=GRS80 zone=32 to_meter=0 expect failure errno unit_factor_less_than_0 operation proj=utm ellps=GRS80 zone=32 to_meter=10 accept 12 55 expect 69187.5632 609890.7825 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- Test that gie can read DMS style coordinates as well as coordinates where _ is used as a thousands separator. ------------------------------------------------------------------------------- operation +step +proj=latlong ------------------------------------------------------------------------------- tolerance 1 m accept -64d43'75.34 17d32'45.6 expect -64.737589 17.546000 accept 164d43'75.34 17d32'45.6 expect 164.737589 17.546000 accept 164d43'75.34 17d32'45.6 expect 164d43'75.34 17d32'45.6 accept 164d43'75.34W 17d32'45.6S expect -164.737589 -17.546000 accept 90d00'00.00 0d00'00.00 expect 90.0 0.0 accept 0d00'00.00 0d00'00.00 expect 0.0 0.0 operation +proj=pipeline +step +proj=latlong +datum=NAD27 +inv +step +units=us-ft +init=nad27:3901 tolerance 1 mm accept -80d32'30.000 34d32'30.000 0.0 expect 2_138_028.224 561_330.721 0.0 accept -81d00'00.000 34d32'30.000 0.0 expect 2_000_000.000 561_019.077 0.0 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- Some tests from PJ_eqearth.c ------------------------------------------------------------------------------- operation +proj=eqearth +ellps=WGS84 ------------------------------------------------------------------------------- direction forward tolerance 1cm accept 0 0 expect 0 0 accept -180 90 expect -10216474.79 8392927.6 accept 0 90 expect 0 8392927.6 accept 180 90 expect 10216474.79 8392927.6 accept 180 45 expect 14792474.75 5466867.76 accept 180 0 expect 17243959.06 0 accept -70 -31.2 expect -6241081.64 -3907019.16 direction inverse accept -6241081.64 -3907019.16 expect -70 -31.2 accept 17243959.06 0 expect 180 0 accept 14792474.75 5466867.76 expect 180 45 accept 0 0 expect 0 0 accept -10216474.79 8392927.6 expect -180 90 accept 0 8392927.6 expect 0 90 accept 10216474.79 8392927.6 expect 180 90 operation +proj=eqearth +R=6378137 direction forward tolerance 1cm accept 0 0 expect 0 0 accept -180 90 expect -10227908.09 8402320.16 accept 0 90 expect 0.00 8402320.16 accept 180 90 expect 10227908.09 8402320.16 accept 180 45 expect 14795421.79 5486671.72 accept 180 0 expect 17263256.84 0.00 accept -70 -31.2 expect -6244707.88 -3924893.29 direction inverse accept -6244707.88 -3924893.29 expect -70 -31.2 accept 17263256.84 0.00 expect 180 0 accept 14795421.79 5486671.72 expect 180 45 accept 0 0 expect 0 0 accept -10227908.09 8402320.16 expect -180 90 accept 0.00 8402320.16 expect 0 90 accept 10227908.09 8402320.16 expect 180 90 operation +proj=eqearth +R=1 direction inverse # coordinate in valid region accept 0 -1.3 expect 0 -82.318 # coordinate on edge accept 0 -1.3173627591574 expect 0 -90 # coordinate outside valid region, should be clamped accept 0 -1.4 expect 0 -90 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- run the few gie-builtin tests, which are currently either awkward or impossible to express in the gie command set ------------------------------------------------------------------------------- builtins ------------------------------------------------------------------------------- </gie>