diff options
| author | Bojan Savric <bsavric@esri.com> | 2016-04-04 10:19:28 -0700 |
|---|---|---|
| committer | Bojan Savric <bsavric@esri.com> | 2016-04-04 10:19:28 -0700 |
| commit | 311cf99cf9836f9d4bf989b5a32768b27841af70 (patch) | |
| tree | 9043e230757cd55f6635062d3d40fa26a9903738 | |
| parent | a648ae934034924f15e1468b04bd986e007fd381 (diff) | |
| download | PROJ-311cf99cf9836f9d4bf989b5a32768b27841af70.tar.gz PROJ-311cf99cf9836f9d4bf989b5a32768b27841af70.zip | |
Adding Natural Earth II and Compact Miller
| -rwxr-xr-x | nad/testvarious | 31 | ||||
| -rw-r--r-- | nad/tv_out.dist | 27 | ||||
| -rw-r--r-- | src/Makefile.am | 4 | ||||
| -rw-r--r-- | src/PJ_comill.c | 59 | ||||
| -rw-r--r-- | src/PJ_natearth2.c | 75 | ||||
| -rw-r--r-- | src/lib_proj.cmake | 2 | ||||
| -rw-r--r-- | src/makefile.vc | 4 | ||||
| -rw-r--r-- | src/pj_list.h | 2 |
8 files changed, 200 insertions, 4 deletions
diff --git a/nad/testvarious b/nad/testvarious index a3604ec1..e769411b 100755 --- a/nad/testvarious +++ b/nad/testvarious @@ -539,6 +539,37 @@ $EXE +proj=latlong +a=1 +lon_0=0 \ 180.0 90.0 0 9591912.979377454 9062062.394736718 EOF echo "##############################################################" >> ${OUT} +echo "Test the Compact Miller projection" >> ${OUT} +$EXE +proj=latlong +a=1 +lon_0=0 \ + +to +proj=comill +a=6371008.7714 +b=6371008.7714 -f '%.'7'f' \ + -E >>${OUT} <<EOF +0 0.0 0 0.0 0.0 +0 22.5 0 0.0 2537439.6610749415 +0 45.0 0 0.0 5391682.432264133 +0 67.5 0 0.0 8661480.510260897 +0 90.0 0 0.0 12009484.264916677 +45 0.0 0 5003778.588046594 0.0 +45 22.5 0 5003778.588046594 2537439.6610749415 +45 45.0 0 5003778.588046594 5391682.432264133 +45 67.5 0 5003778.588046594 8661480.510260897 +45 90.0 0 5003778.588046594 12009484.264916677 +90 0.0 0 10007557.176093187 0.0 +90 22.5 0 10007557.176093187 2537439.6610749415 +90 45.0 0 10007557.176093187 5391682.432264133 +90 67.5 0 10007557.176093187 8661480.510260897 +90 90.0 0 10007557.176093187 12009484.264916677 +135 0.0 0 15011335.76413978 0.0 +135 22.5 0 15011335.76413978 2537439.6610749415 +135 45.0 0 15011335.76413978 5391682.432264133 +135 67.5 0 15011335.76413978 8661480.510260897 +135 90.0 0 15011335.76413978 12009484.264916677 +180 0.0 0 20015114.352186374 0.0 +180 22.5 0 20015114.352186374 2537439.6610749415 +180 45.0 0 20015114.352186374 5391682.432264133 +180 67.5 0 20015114.352186374 8661480.510260897 +180 90.0 0 20015114.352186374 12009484.264916677 +EOF +echo "##############################################################" >> ${OUT} echo "Test pconic (#148)" >> ${OUT} # $EXE +proj=latlong +datum=WGS84 \ diff --git a/nad/tv_out.dist b/nad/tv_out.dist index f61df2f6..87690279 100644 --- a/nad/tv_out.dist +++ b/nad/tv_out.dist @@ -379,3 +379,30 @@ Test patterson inverse projection 10007557.176093187 -5366413.421153781 90.000 -45.000 0.000 15011335.76413978 -8729502.054111844 135.000 -67.500 0.000 20015114.352186374 -11409566.822831295 180.000 -90.000 0.000 +############################################################## +Test Compact Miller projection +0 0.0 0 0.0 0.0 0.00000000 +0 22.5 0 0.0 2537439.6610749415 0.00000000 +0 45.0 0 0.0 5391682.432264133 0.00000000 +0 67.5 0 0.0 8661480.510260897 0.00000000 +0 90.0 0 0.0 1.2009484264916677E7 0.00000000 +45 0.0 0 5003778.588046594 0.0 0.00000000 +45 22.5 0 5003778.588046594 2537439.6610749415 0.00000000 +45 45.0 0 5003778.588046594 5391682.432264133 0.00000000 +45 67.5 0 5003778.588046594 8661480.510260897 0.00000000 +45 90.0 0 5003778.588046594 1.2009484264916677E7 0.00000000 +90 0.0 0 1.0007557176093187E7 0.0 0.00000000 +90 22.5 0 1.0007557176093187E7 2537439.6610749415 0.00000000 +90 45.0 0 1.0007557176093187E7 5391682.432264133 0.00000000 +90 67.5 0 1.0007557176093187E7 8661480.510260897 0.00000000 +90 90.0 0 1.0007557176093187E7 1.2009484264916677E7 0.00000000 +135 0.0 0 1.501133576413978E7 0.0 0.00000000 +135 22.5 0 1.501133576413978E7 2537439.6610749415 0.00000000 +135 45.0 0 1.501133576413978E7 5391682.432264133 0.00000000 +135 67.5 0 1.501133576413978E7 8661480.510260897 0.00000000 +135 90.0 0 1.501133576413978E7 1.2009484264916677E7 0.00000000 +180 0.0 0 2.0015114352186374E7 0.0 0.00000000 +180 22.5 0 2.0015114352186374E7 2537439.6610749415 0.00000000 +180 45.0 0 2.0015114352186374E7 5391682.432264133 0.00000000 +180 67.5 0 2.0015114352186374E7 8661480.510260897 0.00000000 +180 90.0 0 2.0015114352186374E7 1.2009484264916677E7 0.00000000 diff --git a/src/Makefile.am b/src/Makefile.am index 6fd97475..d59e3fde 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -47,7 +47,7 @@ libproj_la_SOURCES = \ PJ_lask.c PJ_nocol.c PJ_ob_tran.c PJ_oea.c \ PJ_tpeqd.c PJ_vandg.c PJ_vandg2.c PJ_vandg4.c \ PJ_wag7.c PJ_lcca.c PJ_geos.c proj_etmerc.c \ - PJ_boggs.c PJ_collg.c PJ_crast.c PJ_denoy.c \ + PJ_boggs.c PJ_collg.c PJ_comill.c PJ_crast.c PJ_denoy.c \ PJ_eck1.c PJ_eck2.c PJ_eck3.c PJ_eck4.c \ PJ_eck5.c PJ_fahey.c PJ_fouc_s.c PJ_gins8.c PJ_gstmerc.c \ PJ_gn_sinu.c PJ_goode.c PJ_igh.c PJ_hatano.c PJ_loxim.c \ @@ -64,7 +64,7 @@ libproj_la_SOURCES = \ pj_open_lib.c pj_param.c pj_phi2.c pj_pr_list.c \ pj_qsfn.c pj_strerrno.c pj_tsfn.c pj_units.c pj_ctx.c pj_log.c \ pj_zpoly1.c rtodms.c vector1.c pj_release.c pj_gauss.c \ - PJ_healpix.c PJ_natearth.c PJ_calcofi.c pj_fileapi.c \ + PJ_healpix.c PJ_natearth.c PJ_natearth2.c PJ_calcofi.c pj_fileapi.c \ \ pj_gc_reader.c pj_gridcatalog.c \ nad_cvt.c nad_init.c nad_intr.c emess.c emess.h \ diff --git a/src/PJ_comill.c b/src/PJ_comill.c new file mode 100644 index 00000000..ad9914d4 --- /dev/null +++ b/src/PJ_comill.c @@ -0,0 +1,59 @@ +/* +The Compact Miller projection was designed by Tom Patterson, US National +Park Service, in 2014. The polynomial equation was developed by Bojan +Savric and Bernhard Jenny, College of Earth, Ocean, and Atmospheric +Sciences, Oregon State University. +Port to PROJ.4 by Bojan Savric, 4 April 2016 +*/ + +#define PJ_LIB__ +#include <projects.h> +PROJ_HEAD(comill, "Compact Miller") "\n\tCyl., Sph."; + +#define K1 0.9902 +#define K2 0.1604 +#define K3 -0.03054 +#define C1 K1 +#define C2 (3 * K2) +#define C3 (5 * K3) +#define EPS 1e-11 +#define MAX_Y (0.6000207669862655 * PI) + +FORWARD(s_forward); /* spheroid */ + double lat_sq; + + lat_sq = lp.phi * lp.phi; + xy.x = lp.lam; + xy.y = lp.phi * (K1 + lat_sq * (K2 + K3 * lat_sq)); + return (xy); +} +INVERSE(s_inverse); /* spheroid */ + double yc, tol, y2, y4, f, fder; + + /* make sure y is inside valid range */ + if (xy.y > MAX_Y) { + xy.y = MAX_Y; + } else if (xy.y < -MAX_Y) { + xy.y = -MAX_Y; + } + + /* latitude */ + yc = xy.y; + for (;;) { /* Newton-Raphson */ + y2 = yc * yc; + f = (yc * (K1 + y2 * (K2 + K3 * y2))) - xy.y; + fder = C1 + y2 * (C2 + C3 * y2); + yc -= tol = f / fder; + if (fabs(tol) < EPS) { + break; + } + } + lp.phi = yc; + + /* longitude */ + lp.lam = xy.x; + + return (lp); +} +FREEUP; if (P) pj_dalloc(P); } +ENTRY0(comill) P->es = 0; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) diff --git a/src/PJ_natearth2.c b/src/PJ_natearth2.c new file mode 100644 index 00000000..c3776a8b --- /dev/null +++ b/src/PJ_natearth2.c @@ -0,0 +1,75 @@ +/* +The Natural Earth II projection was designed by Tom Patterson, US National +Park Service, in 2012, using Flex Projector. The polynomial equation was +developed by Bojan Savric and Bernhard Jenny, College of Earth, Ocean, +and Atmospheric Sciences, Oregon State University. +Port to PROJ.4 by Bojan Savric, 4 April 2016 +*/ + +#define PJ_LIB__ +#include <projects.h> +PROJ_HEAD(natearth2, "Natural Earth 2") "\n\tPCyl., Sph."; + +#define A0 0.84719 +#define A1 -0.13063 +#define A2 -0.04515 +#define A3 0.05494 +#define A4 -0.02326 +#define A5 0.00331 +#define B0 1.01183 +#define B1 -0.02625 +#define B2 0.01926 +#define B3 -0.00396 +#define C0 B0 +#define C1 (9 * B1) +#define C2 (11 * B2) +#define C3 (13 * B3) +#define EPS 1e-11 +#define MAX_Y (0.84719 * 0.535117535153096 * PI) + +FORWARD(s_forward); /* spheroid */ + double phi2, phi4, phi6; + + phi2 = lp.phi * lp.phi; + phi4 = phi2 * phi2; + phi6 = phi2 * phi4; + + xy.x = lp.lam * (A0 + A1 * phi2 + phi6 * phi6 * (A2 + A3 * phi2 + A4 * phi4 + A5 * phi6)); + xy.y = lp.phi * (B0 + phi4 * phi4 * (B1 + B2 * phi2 + B3 * phi4)); + return (xy); +} +INVERSE(s_inverse); /* spheroid */ + double yc, tol, y2, y4, y6, f, fder; + + /* make sure y is inside valid range */ + if (xy.y > MAX_Y) { + xy.y = MAX_Y; + } else if (xy.y < -MAX_Y) { + xy.y = -MAX_Y; + } + + /* latitude */ + yc = xy.y; + for (;;) { /* Newton-Raphson */ + y2 = yc * yc; + y4 = y2 * y2; + f = (yc * (B0 + y4 * y4 * (B1 + B2 * y2 + B3 * y4))) - xy.y; + fder = C0 + y4 * y4 * (C1 + C2 * y2 + C3 * y4); + yc -= tol = f / fder; + if (fabs(tol) < EPS) { + break; + } + } + lp.phi = yc; + + /* longitude */ + y2 = yc * yc; + y4 = y2 * y2; + y6 = y2 * y4; + + lp.lam = xy.x / (A0 + A1 * y2 + y6 * y6 * (A2 + A3 * y2 + A4 * y4 + A5 * y6)); + + return (lp); +} +FREEUP; if (P) pj_dalloc(P); } +ENTRY0(natearth2) P->es = 0; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) diff --git a/src/lib_proj.cmake b/src/lib_proj.cmake index a8797a74..ed14e99e 100644 --- a/src/lib_proj.cmake +++ b/src/lib_proj.cmake @@ -55,6 +55,7 @@ SET(SRC_LIBPROJ_PJ PJ_cea.c PJ_chamb.c PJ_collg.c + PJ_comill.c PJ_crast.c PJ_denoy.c PJ_eck1.c @@ -97,6 +98,7 @@ SET(SRC_LIBPROJ_PJ PJ_mod_ster.c PJ_moll.c PJ_natearth.c + PJ_natearth2.c PJ_nell.c PJ_nell_h.c PJ_nocol.c diff --git a/src/makefile.vc b/src/makefile.vc index 435f9943..6989519d 100644 --- a/src/makefile.vc +++ b/src/makefile.vc @@ -14,7 +14,7 @@ conic = \ PJ_rpoly.obj PJ_sconics.obj PJ_lcca.obj cylinder = \ - PJ_cass.obj PJ_cc.obj PJ_cea.obj PJ_eqc.obj \ + PJ_cass.obj PJ_cc.obj PJ_cea.obj PJ_comill.obj PJ_eqc.obj \ PJ_gall.obj PJ_labrd.obj PJ_lsat.obj PJ_misrsom.obj PJ_merc.obj \ PJ_mill.obj PJ_ocea.obj PJ_omerc.obj PJ_patterson.obj PJ_somerc.obj \ PJ_tcc.obj PJ_tcea.obj PJ_tmerc.obj PJ_geos.obj \ @@ -26,7 +26,7 @@ misc = \ PJ_lask.obj PJ_nocol.obj PJ_ob_tran.obj PJ_oea.obj \ PJ_sch.obj PJ_tpeqd.obj PJ_vandg.obj PJ_vandg2.obj \ PJ_vandg4.obj PJ_wag7.obj pj_latlong.obj PJ_krovak.obj \ - pj_geocent.obj PJ_healpix.obj PJ_natearth.obj PJ_qsc.obj + pj_geocent.obj PJ_healpix.obj PJ_natearth.obj PJ_natearth2.obj PJ_qsc.obj pseudo = \ PJ_boggs.obj PJ_collg.obj PJ_crast.obj PJ_denoy.obj \ diff --git a/src/pj_list.h b/src/pj_list.h index 47362d87..baacacc3 100644 --- a/src/pj_list.h +++ b/src/pj_list.h @@ -22,6 +22,7 @@ PROJ_HEAD(cc, "Central Cylindrical") PROJ_HEAD(cea, "Equal Area Cylindrical") PROJ_HEAD(chamb, "Chamberlin Trimetric") PROJ_HEAD(collg, "Collignon") +PROJ_HEAD(comill, "Compact Miller") PROJ_HEAD(crast, "Craster Parabolic (Putnins P4)") PROJ_HEAD(denoy, "Denoyer Semi-Elliptical") PROJ_HEAD(eck1, "Eckert I") @@ -85,6 +86,7 @@ PROJ_HEAD(murd1, "Murdoch I") PROJ_HEAD(murd2, "Murdoch II") PROJ_HEAD(murd3, "Murdoch III") PROJ_HEAD(natearth, "Natural Earth") +PROJ_HEAD(natearth2, "Natural Earth II") PROJ_HEAD(nell, "Nell") PROJ_HEAD(nell_h, "Nell-Hammer") PROJ_HEAD(nicol, "Nicolosi Globular") |
