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 /src | |
| parent | a648ae934034924f15e1468b04bd986e007fd381 (diff) | |
| download | PROJ-311cf99cf9836f9d4bf989b5a32768b27841af70.tar.gz PROJ-311cf99cf9836f9d4bf989b5a32768b27841af70.zip | |
Adding Natural Earth II and Compact Miller
Diffstat (limited to 'src')
| -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 |
6 files changed, 142 insertions, 4 deletions
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") |
