1 #define PJ_LIB__
2 #include <projects.h>
3
4 PROJ_HEAD(eck3, "Eckert III") "\n\tPCyl, Sph.";
5 PROJ_HEAD(putp1, "Putnins P1") "\n\tPCyl, Sph.";
6 PROJ_HEAD(wag6, "Wagner VI") "\n\tPCyl, Sph.";
7 PROJ_HEAD(kav7, "Kavraisky VII") "\n\tPCyl, Sph.";
8
9 struct pj_opaque {
10 double C_x, C_y, A, B;
11 };
12
13
s_forward(LP lp,PJ * P)14 static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
15 XY xy = {0.0,0.0};
16 struct pj_opaque *Q = P->opaque;
17
18 xy.y = Q->C_y * lp.phi;
19 xy.x = Q->C_x * lp.lam * (Q->A + asqrt(1. - Q->B * lp.phi * lp.phi));
20 return xy;
21 }
22
23
s_inverse(XY xy,PJ * P)24 static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */
25 LP lp = {0.0,0.0};
26 struct pj_opaque *Q = P->opaque;
27
28 lp.phi = xy.y / Q->C_y;
29 lp.lam = xy.x / (Q->C_x * (Q->A + asqrt(1. - Q->B * lp.phi * lp.phi)));
30 return lp;
31 }
32
33
freeup_new(PJ * P)34 static void *freeup_new (PJ *P) { /* Destructor */
35 if (0==P)
36 return 0;
37 if (0==P->opaque)
38 return pj_dealloc (P);
39 pj_dealloc (P->opaque);
40 return pj_dealloc(P);
41 }
42
43
freeup(PJ * P)44 static void freeup (PJ *P) {
45 freeup_new (P);
46 return;
47 }
48
49
setup(PJ * P)50 static PJ *setup(PJ *P) {
51 P->es = 0.;
52 P->inv = s_inverse;
53 P->fwd = s_forward;
54 return P;
55 }
56
57
PROJECTION(eck3)58 PJ *PROJECTION(eck3) {
59 struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
60 if (0==Q)
61 return freeup_new (P);
62 P->opaque = Q;
63
64 Q->C_x = 0.42223820031577120149;
65 Q->C_y = 0.84447640063154240298;
66 Q->A = 1.0;
67 Q->B = 0.4052847345693510857755;
68
69 return setup(P);
70 }
71
72
PROJECTION(kav7)73 PJ *PROJECTION(kav7) {
74 struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
75 if (0==Q)
76 return freeup_new (P);
77 P->opaque = Q;
78
79 /* Defined twice in original code - Using 0.866...,
80 * but leaving the other one here as a safety measure.
81 * Q->C_x = 0.2632401569273184856851; */
82 Q->C_x = 0.8660254037844;
83 Q->C_y = 1.;
84 Q->A = 0.;
85 Q->B = 0.30396355092701331433;
86
87 return setup(P);
88 }
89
90
PROJECTION(wag6)91 PJ *PROJECTION(wag6) {
92 struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
93 if (0==Q)
94 return freeup_new (P);
95 P->opaque = Q;
96
97 Q->C_x = Q->C_y = 0.94745;
98 Q->A = 0.0;
99 Q->B = 0.30396355092701331433;
100
101 return setup(P);
102 }
103
104
PROJECTION(putp1)105 PJ *PROJECTION(putp1) {
106 struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
107 if (0==Q)
108 return freeup_new (P);
109 P->opaque = Q;
110
111 Q->C_x = 1.89490;
112 Q->C_y = 0.94745;
113 Q->A = -0.5;
114 Q->B = 0.30396355092701331433;
115
116 return setup(P);
117 }
118
119
120 #ifndef PJ_SELFTEST
pj_eck3_selftest(void)121 int pj_eck3_selftest (void) {return 0;}
122 #else
123
pj_eck3_selftest(void)124 int pj_eck3_selftest (void) {
125 double tolerance_lp = 1e-10;
126 double tolerance_xy = 1e-7;
127
128 char s_args[] = {"+proj=eck3 +a=6400000 +lat_1=0.5 +lat_2=2"};
129
130 LP fwd_in[] = {
131 { 2, 1},
132 { 2,-1},
133 {-2, 1},
134 {-2,-1}
135 };
136
137 XY s_fwd_expect[] = {
138 { 188652.01572153764, 94328.919337031271},
139 { 188652.01572153764, -94328.919337031271},
140 {-188652.01572153764, 94328.919337031271},
141 {-188652.01572153764, -94328.919337031271},
142 };
143
144 XY inv_in[] = {
145 { 200, 100},
146 { 200,-100},
147 {-200, 100},
148 {-200,-100}
149 };
150
151 LP s_inv_expect[] = {
152 { 0.0021202405520236059, 0.0010601202759750307},
153 { 0.0021202405520236059, -0.0010601202759750307},
154 {-0.0021202405520236059, 0.0010601202759750307},
155 {-0.0021202405520236059, -0.0010601202759750307},
156 };
157
158 return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
159 }
160
161
162 #endif
163
164 #ifndef PJ_SELFTEST
pj_kav7_selftest(void)165 int pj_kav7_selftest (void) {return 0;}
166 #else
167
pj_kav7_selftest(void)168 int pj_kav7_selftest (void) {
169 double tolerance_lp = 1e-10;
170 double tolerance_xy = 1e-7;
171
172 char s_args[] = {"+proj=kav7 +a=6400000 +lat_1=0.5 +lat_2=2"};
173
174 LP fwd_in[] = {
175 { 2, 1},
176 { 2,-1},
177 {-2, 1},
178 {-2,-1}
179 };
180
181 XY s_fwd_expect[] = {
182 { 193462.9749437288, 111701.07212763709},
183 { 193462.9749437288, -111701.07212763709},
184 {-193462.9749437288, 111701.07212763709},
185 {-193462.9749437288, -111701.07212763709}
186 };
187
188 XY inv_in[] = {
189 { 200, 100},
190 { 200,-100},
191 {-200, 100},
192 {-200,-100}
193 };
194
195 LP s_inv_expect[] = {
196 { 0.0020674833579085268, 0.00089524655489191132},
197 { 0.0020674833579085268, -0.00089524655489191132},
198 {-0.0020674833579085268, 0.00089524655489191132},
199 {-0.0020674833579085268, -0.00089524655489191132}
200 };
201
202 return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
203 }
204
205
206 #endif
207
208 #ifndef PJ_SELFTEST
pj_wag6_selftest(void)209 int pj_wag6_selftest (void) {return 0;}
210 #else
211
pj_wag6_selftest(void)212 int pj_wag6_selftest (void) {
213 double tolerance_lp = 1e-10;
214 double tolerance_xy = 1e-7;
215
216 char s_args[] = {"+proj=wag6 +a=6400000 +lat_1=0.5 +lat_2=2"};
217
218 LP fwd_in[] = {
219 { 2, 1},
220 { 2,-1},
221 {-2, 1},
222 {-2,-1}
223 };
224
225 XY s_fwd_expect[] = {
226 { 211652.56216440981, 105831.18078732977},
227 { 211652.56216440981, -105831.18078732977},
228 {-211652.56216440981, 105831.18078732977},
229 {-211652.56216440981, -105831.18078732977}
230 };
231
232 XY inv_in[] = {
233 { 200, 100},
234 { 200,-100},
235 {-200, 100},
236 {-200,-100}
237 };
238
239 LP s_inv_expect[] = {
240 { 0.0018898022163257513, 0.000944901108123818},
241 { 0.0018898022163257513, -0.000944901108123818},
242 {-0.0018898022163257513, 0.000944901108123818},
243 {-0.0018898022163257513, -0.000944901108123818}
244 };
245
246 return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
247 }
248
249
250 #endif
251
252
253 #ifndef PJ_SELFTEST
pj_putp1_selftest(void)254 int pj_putp1_selftest (void) {return 0;}
255 #else
256
pj_putp1_selftest(void)257 int pj_putp1_selftest (void) {
258 double tolerance_lp = 1e-10;
259 double tolerance_xy = 1e-7;
260
261 char s_args[] = {"+proj=putp1 +a=6400000 +lat_1=0.5 +lat_2=2"};
262
263 LP fwd_in[] = {
264 { 2, 1},
265 { 2,-1},
266 {-2, 1},
267 {-2,-1}
268 };
269
270 XY s_fwd_expect[] = {
271 { 211642.76275416015, 105831.18078732977},
272 { 211642.76275416015, -105831.18078732977},
273 {-211642.76275416015, 105831.18078732977},
274 {-211642.76275416015, -105831.18078732977}
275 };
276
277 XY inv_in[] = {
278 { 200, 100},
279 { 200,-100},
280 {-200, 100},
281 {-200,-100}
282 };
283
284 LP s_inv_expect[] = {
285 { 0.0018898022164038663, 0.000944901108123818},
286 { 0.0018898022164038663, -0.000944901108123818},
287 {-0.0018898022164038663, 0.000944901108123818},
288 {-0.0018898022164038663, -0.000944901108123818}
289 };
290
291 return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
292 }
293
294
295 #endif
296