Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: libgeotiff
4 : * Purpose: Code to normalize a few common PCS values
5 : * Author: Frank Warmerdam, warmerda@home.com
6 : *
7 : ******************************************************************************
8 : * Copyright (c) 1999, Frank Warmerdam
9 : *
10 : * SPDX-License-Identifier: MIT
11 : *****************************************************************************/
12 :
13 : #include <stddef.h>
14 :
15 : #include "geo_normalize.h"
16 : #include "geovalues.h"
17 :
18 : static const int StatePlaneTable[] =
19 : {
20 : PCS_NAD83_Alabama_East, Proj_Alabama_CS83_East,
21 : PCS_NAD83_Alabama_West, Proj_Alabama_CS83_West,
22 :
23 : PCS_NAD83_Alaska_zone_1, Proj_Alaska_CS83_1,
24 : PCS_NAD83_Alaska_zone_2, Proj_Alaska_CS83_2,
25 : PCS_NAD83_Alaska_zone_3, Proj_Alaska_CS83_3,
26 : PCS_NAD83_Alaska_zone_4, Proj_Alaska_CS83_4,
27 : PCS_NAD83_Alaska_zone_5, Proj_Alaska_CS83_5,
28 : PCS_NAD83_Alaska_zone_6, Proj_Alaska_CS83_6,
29 : PCS_NAD83_Alaska_zone_7, Proj_Alaska_CS83_7,
30 : PCS_NAD83_Alaska_zone_8, Proj_Alaska_CS83_8,
31 : PCS_NAD83_Alaska_zone_9, Proj_Alaska_CS83_9,
32 : PCS_NAD83_Alaska_zone_10, Proj_Alaska_CS83_10,
33 :
34 : PCS_NAD83_California_1, Proj_California_CS83_1,
35 : PCS_NAD83_California_2, Proj_California_CS83_2,
36 : PCS_NAD83_California_3, Proj_California_CS83_3,
37 : PCS_NAD83_California_4, Proj_California_CS83_4,
38 : PCS_NAD83_California_5, Proj_California_CS83_5,
39 : PCS_NAD83_California_6, Proj_California_CS83_6,
40 :
41 : PCS_NAD83_Arizona_East, Proj_Arizona_CS83_east,
42 : PCS_NAD83_Arizona_Central, Proj_Arizona_CS83_Central,
43 : PCS_NAD83_Arizona_West, Proj_Arizona_CS83_west,
44 :
45 : PCS_NAD83_Arkansas_North, Proj_Arkansas_CS83_North,
46 : PCS_NAD83_Arkansas_South, Proj_Arkansas_CS83_South,
47 :
48 : PCS_NAD83_Colorado_North, Proj_Colorado_CS83_North,
49 : PCS_NAD83_Colorado_Central, Proj_Colorado_CS83_Central,
50 : PCS_NAD83_Colorado_South, Proj_Colorado_CS83_South,
51 :
52 : PCS_NAD83_Connecticut, Proj_Connecticut_CS83,
53 :
54 : PCS_NAD83_Delaware, Proj_Delaware_CS83,
55 :
56 : PCS_NAD83_Florida_East, Proj_Florida_CS83_East,
57 : PCS_NAD83_Florida_North, Proj_Florida_CS83_North,
58 : PCS_NAD83_Florida_West, Proj_Florida_CS83_West,
59 :
60 : PCS_NAD83_Hawaii_zone_1, Proj_Hawaii_CS83_1,
61 : PCS_NAD83_Hawaii_zone_2, Proj_Hawaii_CS83_2,
62 : PCS_NAD83_Hawaii_zone_3, Proj_Hawaii_CS83_3,
63 : PCS_NAD83_Hawaii_zone_4, Proj_Hawaii_CS83_4,
64 : PCS_NAD83_Hawaii_zone_5, Proj_Hawaii_CS83_5,
65 :
66 : PCS_NAD83_Georgia_East, Proj_Georgia_CS83_East,
67 : PCS_NAD83_Georgia_West, Proj_Georgia_CS83_West,
68 :
69 : PCS_NAD83_Idaho_East, Proj_Idaho_CS83_East,
70 : PCS_NAD83_Idaho_Central, Proj_Idaho_CS83_Central,
71 : PCS_NAD83_Idaho_West, Proj_Idaho_CS83_West,
72 :
73 : PCS_NAD83_Illinois_East, Proj_Illinois_CS83_East,
74 : PCS_NAD83_Illinois_West, Proj_Illinois_CS83_West,
75 :
76 : PCS_NAD83_Indiana_East, Proj_Indiana_CS83_East,
77 : PCS_NAD83_Indiana_West, Proj_Indiana_CS83_West,
78 :
79 : PCS_NAD83_Iowa_North, Proj_Iowa_CS83_North,
80 : PCS_NAD83_Iowa_South, Proj_Iowa_CS83_South,
81 :
82 : PCS_NAD83_Kansas_North, Proj_Kansas_CS83_North,
83 : PCS_NAD83_Kansas_South, Proj_Kansas_CS83_South,
84 :
85 : PCS_NAD83_Kentucky_North, Proj_Kentucky_CS83_North,
86 : PCS_NAD83_Kentucky_South, Proj_Kentucky_CS83_South,
87 :
88 : PCS_NAD83_Louisiana_North, Proj_Louisiana_CS83_North,
89 : PCS_NAD83_Louisiana_South, Proj_Louisiana_CS83_South,
90 :
91 : PCS_NAD83_Maine_East, Proj_Maine_CS83_East,
92 : PCS_NAD83_Maine_West, Proj_Maine_CS83_West,
93 :
94 : PCS_NAD83_Maryland, Proj_Maryland_CS83,
95 :
96 : PCS_NAD83_Massachusetts, Proj_Massachusetts_CS83_Mainland,
97 : PCS_NAD83_Massachusetts_Is, Proj_Massachusetts_CS83_Island,
98 :
99 : PCS_NAD83_Michigan_North, Proj_Michigan_CS83_North,
100 : PCS_NAD83_Michigan_Central, Proj_Michigan_CS83_Central,
101 : PCS_NAD83_Michigan_South, Proj_Michigan_CS83_South,
102 :
103 : PCS_NAD83_Minnesota_North, Proj_Minnesota_CS83_North,
104 : PCS_NAD83_Minnesota_Cent, Proj_Minnesota_CS83_Central,
105 : PCS_NAD83_Minnesota_South, Proj_Minnesota_CS83_South,
106 :
107 : PCS_NAD83_Mississippi_East, Proj_Mississippi_CS83_East,
108 : PCS_NAD83_Mississippi_West, Proj_Mississippi_CS83_West,
109 :
110 : PCS_NAD83_Missouri_East, Proj_Missouri_CS83_East,
111 : PCS_NAD83_Missouri_Central, Proj_Missouri_CS83_Central,
112 : PCS_NAD83_Missouri_West, Proj_Missouri_CS83_West,
113 :
114 : PCS_NAD83_Montana, Proj_Montana_CS83,
115 :
116 : PCS_NAD83_Nebraska, Proj_Nebraska_CS83,
117 :
118 : PCS_NAD83_Nevada_East, Proj_Nevada_CS83_East,
119 : PCS_NAD83_Nevada_Central, Proj_Nevada_CS83_Central,
120 : PCS_NAD83_Nevada_West, Proj_Nevada_CS83_West,
121 :
122 : PCS_NAD83_New_Hampshire, Proj_New_Hampshire_CS83,
123 :
124 : PCS_NAD83_New_Jersey, Proj_New_Jersey_CS83,
125 :
126 : PCS_NAD83_New_Mexico_East, Proj_New_Mexico_CS83_East,
127 : PCS_NAD83_New_Mexico_Cent, Proj_New_Mexico_CS83_Central,
128 : PCS_NAD83_New_Mexico_West, Proj_New_Mexico_CS83_West,
129 :
130 : PCS_NAD83_New_York_East, Proj_New_York_CS83_East,
131 : PCS_NAD83_New_York_Central, Proj_New_York_CS83_Central,
132 : PCS_NAD83_New_York_West, Proj_New_York_CS83_West,
133 : PCS_NAD83_New_York_Long_Is, Proj_New_York_CS83_Long_Island,
134 :
135 : PCS_NAD83_North_Carolina, Proj_North_Carolina_CS83,
136 :
137 : PCS_NAD83_North_Dakota_N, Proj_North_Dakota_CS83_North,
138 : PCS_NAD83_North_Dakota_S, Proj_North_Dakota_CS83_South,
139 :
140 : PCS_NAD83_Ohio_North, Proj_Ohio_CS83_North,
141 : PCS_NAD83_Ohio_South, Proj_Ohio_CS83_South,
142 :
143 : PCS_NAD83_Oklahoma_North, Proj_Oklahoma_CS83_North,
144 : PCS_NAD83_Oklahoma_South, Proj_Oklahoma_CS83_South,
145 :
146 : PCS_NAD83_Oregon_North, Proj_Oregon_CS83_North,
147 : PCS_NAD83_Oregon_South, Proj_Oregon_CS83_South,
148 :
149 : PCS_NAD83_Pennsylvania_N, Proj_Pennsylvania_CS83_North,
150 : PCS_NAD83_Pennsylvania_S, Proj_Pennsylvania_CS83_South,
151 :
152 : PCS_NAD83_Rhode_Island, Proj_Rhode_Island_CS83,
153 :
154 : PCS_NAD83_South_Carolina, Proj_South_Carolina_CS83,
155 :
156 : PCS_NAD83_South_Dakota_N, Proj_South_Dakota_CS83_North,
157 : PCS_NAD83_South_Dakota_S, Proj_South_Dakota_CS83_South,
158 :
159 : PCS_NAD83_Tennessee, Proj_Tennessee_CS83,
160 :
161 : PCS_NAD83_Texas_North, Proj_Texas_CS83_North,
162 : PCS_NAD83_Texas_North_Cen, Proj_Texas_CS83_North_Central,
163 : PCS_NAD83_Texas_Central, Proj_Texas_CS83_Central,
164 : PCS_NAD83_Texas_South_Cen, Proj_Texas_CS83_South_Central,
165 : PCS_NAD83_Texas_South, Proj_Texas_CS83_South,
166 :
167 : PCS_NAD83_Utah_North, Proj_Utah_CS83_North,
168 : PCS_NAD83_Utah_Central, Proj_Utah_CS83_Central,
169 : PCS_NAD83_Utah_South, Proj_Utah_CS83_South,
170 :
171 : PCS_NAD83_Vermont, Proj_Vermont_CS83,
172 :
173 : PCS_NAD83_Virginia_North, Proj_Virginia_CS83_North,
174 : PCS_NAD83_Virginia_South, Proj_Virginia_CS83_South,
175 :
176 : PCS_NAD83_Washington_North, Proj_Washington_CS83_North,
177 : PCS_NAD83_Washington_South, Proj_Washington_CS83_South,
178 :
179 : PCS_NAD83_West_Virginia_N, Proj_West_Virginia_CS83_North,
180 : PCS_NAD83_West_Virginia_S, Proj_West_Virginia_CS83_South,
181 :
182 : PCS_NAD83_Wisconsin_North, Proj_Wisconsin_CS83_North,
183 : PCS_NAD83_Wisconsin_Cen, Proj_Wisconsin_CS83_Central,
184 : PCS_NAD83_Wisconsin_South, Proj_Wisconsin_CS83_South,
185 :
186 : PCS_NAD83_Wyoming_East, Proj_Wyoming_CS83_East,
187 : PCS_NAD83_Wyoming_E_Cen, Proj_Wyoming_CS83_East_Central,
188 : PCS_NAD83_Wyoming_W_Cen, Proj_Wyoming_CS83_West_Central,
189 : PCS_NAD83_Wyoming_West, Proj_Wyoming_CS83_West,
190 :
191 : PCS_NAD83_Puerto_Rico_Virgin_Is, Proj_Puerto_Rico_Virgin_Is,
192 :
193 : PCS_NAD27_Alabama_East, Proj_Alabama_CS27_East,
194 : PCS_NAD27_Alabama_West, Proj_Alabama_CS27_West,
195 :
196 : PCS_NAD27_Alaska_zone_1, Proj_Alaska_CS27_1,
197 : PCS_NAD27_Alaska_zone_2, Proj_Alaska_CS27_2,
198 : PCS_NAD27_Alaska_zone_3, Proj_Alaska_CS27_3,
199 : PCS_NAD27_Alaska_zone_4, Proj_Alaska_CS27_4,
200 : PCS_NAD27_Alaska_zone_5, Proj_Alaska_CS27_5,
201 : PCS_NAD27_Alaska_zone_6, Proj_Alaska_CS27_6,
202 : PCS_NAD27_Alaska_zone_7, Proj_Alaska_CS27_7,
203 : PCS_NAD27_Alaska_zone_8, Proj_Alaska_CS27_8,
204 : PCS_NAD27_Alaska_zone_9, Proj_Alaska_CS27_9,
205 : PCS_NAD27_Alaska_zone_10, Proj_Alaska_CS27_10,
206 :
207 : PCS_NAD27_California_I, Proj_California_CS27_I,
208 : PCS_NAD27_California_II, Proj_California_CS27_II,
209 : PCS_NAD27_California_III, Proj_California_CS27_III,
210 : PCS_NAD27_California_IV, Proj_California_CS27_IV,
211 : PCS_NAD27_California_V, Proj_California_CS27_V,
212 : PCS_NAD27_California_VI, Proj_California_CS27_VI,
213 : PCS_NAD27_California_VII, Proj_California_CS27_VII,
214 :
215 : PCS_NAD27_Arizona_East, Proj_Arizona_Coordinate_System_east,
216 : PCS_NAD27_Arizona_Central, Proj_Arizona_Coordinate_System_Central,
217 : PCS_NAD27_Arizona_West, Proj_Arizona_Coordinate_System_west,
218 :
219 : PCS_NAD27_Arkansas_North, Proj_Arkansas_CS27_North,
220 : PCS_NAD27_Arkansas_South, Proj_Arkansas_CS27_South,
221 :
222 : PCS_NAD27_Colorado_North, Proj_Colorado_CS27_North,
223 : PCS_NAD27_Colorado_Central, Proj_Colorado_CS27_Central,
224 : PCS_NAD27_Colorado_South, Proj_Colorado_CS27_South,
225 :
226 : PCS_NAD27_Connecticut, Proj_Connecticut_CS27,
227 :
228 : PCS_NAD27_Delaware, Proj_Delaware_CS27,
229 :
230 : PCS_NAD27_Florida_East, Proj_Florida_CS27_East,
231 : PCS_NAD27_Florida_North, Proj_Florida_CS27_North,
232 : PCS_NAD27_Florida_West, Proj_Florida_CS27_West,
233 :
234 : PCS_NAD27_Hawaii_zone_1, Proj_Hawaii_CS27_1,
235 : PCS_NAD27_Hawaii_zone_2, Proj_Hawaii_CS27_2,
236 : PCS_NAD27_Hawaii_zone_3, Proj_Hawaii_CS27_3,
237 : PCS_NAD27_Hawaii_zone_4, Proj_Hawaii_CS27_4,
238 : PCS_NAD27_Hawaii_zone_5, Proj_Hawaii_CS27_5,
239 :
240 : PCS_NAD27_Georgia_East, Proj_Georgia_CS27_East,
241 : PCS_NAD27_Georgia_West, Proj_Georgia_CS27_West,
242 :
243 : PCS_NAD27_Idaho_East, Proj_Idaho_CS27_East,
244 : PCS_NAD27_Idaho_Central, Proj_Idaho_CS27_Central,
245 : PCS_NAD27_Idaho_West, Proj_Idaho_CS27_West,
246 :
247 : PCS_NAD27_Illinois_East, Proj_Illinois_CS27_East,
248 : PCS_NAD27_Illinois_West, Proj_Illinois_CS27_West,
249 :
250 : PCS_NAD27_Indiana_East, Proj_Indiana_CS27_East,
251 : PCS_NAD27_Indiana_West, Proj_Indiana_CS27_West,
252 :
253 : PCS_NAD27_Iowa_North, Proj_Iowa_CS27_North,
254 : PCS_NAD27_Iowa_South, Proj_Iowa_CS27_South,
255 :
256 : PCS_NAD27_Kansas_North, Proj_Kansas_CS27_North,
257 : PCS_NAD27_Kansas_South, Proj_Kansas_CS27_South,
258 :
259 : PCS_NAD27_Kentucky_North, Proj_Kentucky_CS27_North,
260 : PCS_NAD27_Kentucky_South, Proj_Kentucky_CS27_South,
261 :
262 : PCS_NAD27_Louisiana_North, Proj_Louisiana_CS27_North,
263 : PCS_NAD27_Louisiana_South, Proj_Louisiana_CS27_South,
264 :
265 : PCS_NAD27_Maine_East, Proj_Maine_CS27_East,
266 : PCS_NAD27_Maine_West, Proj_Maine_CS27_West,
267 :
268 : PCS_NAD27_Maryland, Proj_Maryland_CS27,
269 :
270 : PCS_NAD27_Massachusetts, Proj_Massachusetts_CS27_Mainland,
271 : PCS_NAD27_Massachusetts_Is, Proj_Massachusetts_CS27_Island,
272 :
273 : PCS_NAD27_Michigan_North, Proj_Michigan_CS27_North,
274 : PCS_NAD27_Michigan_Central, Proj_Michigan_CS27_Central,
275 : PCS_NAD27_Michigan_South, Proj_Michigan_CS27_South,
276 :
277 : PCS_NAD27_Minnesota_North, Proj_Minnesota_CS27_North,
278 : PCS_NAD27_Minnesota_Cent, Proj_Minnesota_CS27_Central,
279 : PCS_NAD27_Minnesota_South, Proj_Minnesota_CS27_South,
280 :
281 : PCS_NAD27_Mississippi_East, Proj_Mississippi_CS27_East,
282 : PCS_NAD27_Mississippi_West, Proj_Mississippi_CS27_West,
283 :
284 : PCS_NAD27_Missouri_East, Proj_Missouri_CS27_East,
285 : PCS_NAD27_Missouri_Central, Proj_Missouri_CS27_Central,
286 : PCS_NAD27_Missouri_West, Proj_Missouri_CS27_West,
287 :
288 : PCS_NAD27_Montana_North, Proj_Montana_CS27_North,
289 : PCS_NAD27_Montana_Central, Proj_Montana_CS27_Central,
290 : PCS_NAD27_Montana_South, Proj_Montana_CS27_South,
291 :
292 : PCS_NAD27_Nebraska_North, Proj_Nebraska_CS27_North,
293 : PCS_NAD27_Nebraska_South, Proj_Nebraska_CS27_South,
294 :
295 : PCS_NAD27_Nevada_East, Proj_Nevada_CS27_East,
296 : PCS_NAD27_Nevada_Central, Proj_Nevada_CS27_Central,
297 : PCS_NAD27_Nevada_West, Proj_Nevada_CS27_West,
298 :
299 : PCS_NAD27_New_Hampshire, Proj_New_Hampshire_CS27,
300 :
301 : PCS_NAD27_New_Jersey, Proj_New_Jersey_CS27,
302 :
303 : PCS_NAD27_New_Mexico_East, Proj_New_Mexico_CS27_East,
304 : PCS_NAD27_New_Mexico_Cent, Proj_New_Mexico_CS27_Central,
305 : PCS_NAD27_New_Mexico_West, Proj_New_Mexico_CS27_West,
306 :
307 : PCS_NAD27_New_York_East, Proj_New_York_CS27_East,
308 : PCS_NAD27_New_York_Central, Proj_New_York_CS27_Central,
309 : PCS_NAD27_New_York_West, Proj_New_York_CS27_West,
310 : PCS_NAD27_New_York_Long_Is, Proj_New_York_CS27_Long_Island,
311 :
312 : PCS_NAD27_North_Carolina, Proj_North_Carolina_CS27,
313 :
314 : PCS_NAD27_North_Dakota_N, Proj_North_Dakota_CS27_North,
315 : PCS_NAD27_North_Dakota_S, Proj_North_Dakota_CS27_South,
316 :
317 : PCS_NAD27_Ohio_North, Proj_Ohio_CS27_North,
318 : PCS_NAD27_Ohio_South, Proj_Ohio_CS27_South,
319 :
320 : PCS_NAD27_Oklahoma_North, Proj_Oklahoma_CS27_North,
321 : PCS_NAD27_Oklahoma_South, Proj_Oklahoma_CS27_South,
322 :
323 : PCS_NAD27_Oregon_North, Proj_Oregon_CS27_North,
324 : PCS_NAD27_Oregon_South, Proj_Oregon_CS27_South,
325 :
326 : PCS_NAD27_Pennsylvania_N, Proj_Pennsylvania_CS27_North,
327 : PCS_NAD27_Pennsylvania_S, Proj_Pennsylvania_CS27_South,
328 :
329 : PCS_NAD27_Rhode_Island, Proj_Rhode_Island_CS27,
330 :
331 : PCS_NAD27_South_Carolina_N, Proj_South_Carolina_CS27_North,
332 : PCS_NAD27_South_Carolina_S, Proj_South_Carolina_CS27_South,
333 :
334 : PCS_NAD27_South_Dakota_N, Proj_South_Dakota_CS27_North,
335 : PCS_NAD27_South_Dakota_S, Proj_South_Dakota_CS27_South,
336 :
337 : PCS_NAD27_Tennessee, Proj_Tennessee_CS27,
338 :
339 : PCS_NAD27_Texas_North, Proj_Texas_CS27_North,
340 : PCS_NAD27_Texas_North_Cen, Proj_Texas_CS27_North_Central,
341 : PCS_NAD27_Texas_Central, Proj_Texas_CS27_Central,
342 : PCS_NAD27_Texas_South_Cen, Proj_Texas_CS27_South_Central,
343 : PCS_NAD27_Texas_South, Proj_Texas_CS27_South,
344 :
345 : PCS_NAD27_Utah_North, Proj_Utah_CS27_North,
346 : PCS_NAD27_Utah_Central, Proj_Utah_CS27_Central,
347 : PCS_NAD27_Utah_South, Proj_Utah_CS27_South,
348 :
349 : PCS_NAD27_Vermont, Proj_Vermont_CS27,
350 :
351 : PCS_NAD27_Virginia_North, Proj_Virginia_CS27_North,
352 : PCS_NAD27_Virginia_South, Proj_Virginia_CS27_South,
353 :
354 : PCS_NAD27_Washington_North, Proj_Washington_CS27_North,
355 : PCS_NAD27_Washington_South, Proj_Washington_CS27_South,
356 :
357 : PCS_NAD27_West_Virginia_N, Proj_West_Virginia_CS27_North,
358 : PCS_NAD27_West_Virginia_S, Proj_West_Virginia_CS27_South,
359 :
360 : PCS_NAD27_Wisconsin_North, Proj_Wisconsin_CS27_North,
361 : PCS_NAD27_Wisconsin_Cen, Proj_Wisconsin_CS27_Central,
362 : PCS_NAD27_Wisconsin_South, Proj_Wisconsin_CS27_South,
363 :
364 : PCS_NAD27_Wyoming_East, Proj_Wyoming_CS27_East,
365 : PCS_NAD27_Wyoming_E_Cen, Proj_Wyoming_CS27_East_Central,
366 : PCS_NAD27_Wyoming_W_Cen, Proj_Wyoming_CS27_West_Central,
367 : PCS_NAD27_Wyoming_West, Proj_Wyoming_CS27_West,
368 :
369 : PCS_NAD27_Puerto_Rico, Proj_Puerto_Rico_CS27,
370 :
371 : KvUserDefined
372 : };
373 :
374 : /************************************************************************/
375 : /* GTIFMapSysToPCS() */
376 : /* */
377 : /* Given a Datum, MapSys and zone value generate the best PCS */
378 : /* code possible. */
379 : /************************************************************************/
380 :
381 0 : int GTIFMapSysToPCS( int MapSys, int Datum, int nZone )
382 :
383 : {
384 0 : int PCSCode = KvUserDefined;
385 :
386 0 : if( MapSys == MapSys_UTM_North )
387 : {
388 0 : if( Datum == GCS_NAD27 )
389 0 : PCSCode = PCS_NAD27_UTM_zone_3N + nZone - 3;
390 0 : else if( Datum == GCS_NAD83 )
391 0 : PCSCode = PCS_NAD83_UTM_zone_3N + nZone - 3;
392 0 : else if( Datum == GCS_WGS_72 )
393 0 : PCSCode = PCS_WGS72_UTM_zone_1N + nZone - 1;
394 0 : else if( Datum == GCS_WGS_72BE )
395 0 : PCSCode = PCS_WGS72BE_UTM_zone_1N + nZone - 1;
396 0 : else if( Datum == GCS_WGS_84 )
397 0 : PCSCode = PCS_WGS84_UTM_zone_1N + nZone - 1;
398 : }
399 0 : else if( MapSys == MapSys_UTM_South )
400 : {
401 0 : if( Datum == GCS_WGS_72 )
402 0 : PCSCode = PCS_WGS72_UTM_zone_1S + nZone - 1;
403 0 : else if( Datum == GCS_WGS_72BE )
404 0 : PCSCode = PCS_WGS72BE_UTM_zone_1S + nZone - 1;
405 0 : else if( Datum == GCS_WGS_84 )
406 0 : PCSCode = PCS_WGS84_UTM_zone_1S + nZone - 1;
407 : }
408 0 : else if( MapSys == MapSys_State_Plane_27 )
409 : {
410 0 : PCSCode = 10000 + nZone;
411 0 : for( int i = 0; StatePlaneTable[i] != KvUserDefined; i += 2 )
412 : {
413 0 : if( StatePlaneTable[i+1] == PCSCode )
414 0 : PCSCode = StatePlaneTable[i];
415 : }
416 :
417 : /* Old EPSG code was in error for Tennesse CS27, override */
418 0 : if( nZone == 4100 )
419 0 : PCSCode = 2204;
420 : }
421 0 : else if( MapSys == MapSys_State_Plane_83 )
422 : {
423 0 : PCSCode = 10000 + nZone + 30;
424 :
425 0 : for( int i = 0; StatePlaneTable[i] != KvUserDefined; i += 2 )
426 : {
427 0 : if( StatePlaneTable[i+1] == PCSCode )
428 0 : PCSCode = StatePlaneTable[i];
429 : }
430 :
431 : /* Old EPSG code was in error for Kentucky North CS83, override */
432 0 : if( nZone == 1601 )
433 0 : PCSCode = 2205;
434 : }
435 :
436 0 : return PCSCode;
437 : }
438 :
439 : /************************************************************************/
440 : /* GTIFMapSysToProj() */
441 : /* */
442 : /* Given a MapSys and zone value generate the best Proj_ */
443 : /* code possible. */
444 : /************************************************************************/
445 :
446 0 : int GTIFMapSysToProj( int MapSys, int nZone )
447 :
448 : {
449 0 : int ProjCode = KvUserDefined;
450 :
451 0 : if( MapSys == MapSys_UTM_North )
452 : {
453 0 : ProjCode = Proj_UTM_zone_1N + nZone - 1;
454 : }
455 0 : else if( MapSys == MapSys_UTM_South )
456 : {
457 0 : ProjCode = Proj_UTM_zone_1S + nZone - 1;
458 : }
459 0 : else if( MapSys == MapSys_State_Plane_27 )
460 : {
461 0 : ProjCode = 10000 + nZone;
462 :
463 : /* Tennesse override */
464 0 : if( nZone == 4100 )
465 0 : ProjCode = 15302;
466 : }
467 0 : else if( MapSys == MapSys_State_Plane_83 )
468 : {
469 0 : ProjCode = 10000 + nZone + 30;
470 :
471 : /* Kentucky North override */
472 0 : if( nZone == 1601 )
473 0 : ProjCode = 15303;
474 : }
475 :
476 0 : return ProjCode;
477 : }
478 :
479 : /************************************************************************/
480 : /* GTIFPCSToMapSys() */
481 : /************************************************************************/
482 :
483 : /**
484 : * Translate a PCS_ code into a UTM or State Plane map system, a datum,
485 : * and a zone if possible.
486 : *
487 : * @param PCSCode The projection code (PCS_*) as would be stored in the
488 : * ProjectedCSTypeGeoKey of a GeoTIFF file.
489 : *
490 : * @param pDatum Pointer to an integer into which the datum code (GCS_*)
491 : * is put if the function succeeds.
492 : *
493 : * @param pZone Pointer to an integer into which the zone will be placed
494 : * if the function is successful.
495 : *
496 : * @return Returns either MapSys_UTM_North, MapSys_UTM_South,
497 : * MapSys_State_Plane_83, MapSys_State_Plane_27 or KvUserDefined.
498 : * KvUserDefined indicates that the
499 : * function failed to recognise the projection as UTM or State Plane.
500 : *
501 : * The zone value is only set if the return code is other than KvUserDefined.
502 : * For utm map system the returned zone will be between 1 and 60. For
503 : * State Plane, the USGS state plane zone number is returned. For instance,
504 : * Alabama East is zone 101.
505 : *
506 : * The datum (really this is the GCS) is set to a GCS_ value such as GCS_NAD27.
507 : *
508 : * This function is useful to recognise (most) UTM and State Plane coordinate
509 : * systems.
510 : * It is used as a fallback mechanism by GTIFGetDefn() for normalization when
511 : * PROJ database is not found.
512 : */
513 :
514 6410 : int GTIFPCSToMapSys( int PCSCode, int * pDatum, int * pZone )
515 :
516 : {
517 6410 : int Datum = KvUserDefined, Proj = KvUserDefined;
518 6410 : int nZone = KvUserDefined;
519 :
520 : /* -------------------------------------------------------------------- */
521 : /* UTM with various datums. Note there are lots of PCS UTM */
522 : /* codes not done yet which use strange datums. */
523 : /* -------------------------------------------------------------------- */
524 6410 : if( PCSCode >= PCS_NAD27_UTM_zone_3N && PCSCode <= PCS_NAD27_UTM_zone_22N )
525 : {
526 5726 : Datum = GCS_NAD27;
527 5726 : Proj = MapSys_UTM_North;
528 5726 : nZone = PCSCode - PCS_NAD27_UTM_zone_3N + 3;
529 : }
530 684 : else if( PCSCode >= PCS_NAD83_UTM_zone_3N
531 400 : && PCSCode <= PCS_NAD83_UTM_zone_23N )
532 : {
533 12 : Datum = GCS_NAD83;
534 12 : Proj = MapSys_UTM_North;
535 12 : nZone = PCSCode - PCS_NAD83_UTM_zone_3N + 3;
536 : }
537 :
538 672 : else if( PCSCode >= PCS_WGS72_UTM_zone_1N
539 340 : && PCSCode <= PCS_WGS72_UTM_zone_60N )
540 : {
541 0 : Datum = GCS_WGS_72;
542 0 : Proj = MapSys_UTM_North;
543 0 : nZone = PCSCode - PCS_WGS72_UTM_zone_1N + 1;
544 : }
545 672 : else if( PCSCode >= PCS_WGS72_UTM_zone_1S
546 340 : && PCSCode <= PCS_WGS72_UTM_zone_60S )
547 : {
548 0 : Datum = GCS_WGS_72;
549 0 : Proj = MapSys_UTM_South;
550 0 : nZone = PCSCode - PCS_WGS72_UTM_zone_1S + 1;
551 : }
552 :
553 672 : else if( PCSCode >= PCS_WGS72BE_UTM_zone_1N
554 340 : && PCSCode <= PCS_WGS72BE_UTM_zone_60N )
555 : {
556 0 : Datum = GCS_WGS_72BE;
557 0 : Proj = MapSys_UTM_North;
558 0 : nZone = PCSCode - PCS_WGS72BE_UTM_zone_1N + 1;
559 : }
560 672 : else if( PCSCode >= PCS_WGS72BE_UTM_zone_1S
561 340 : && PCSCode <= PCS_WGS72BE_UTM_zone_60S )
562 : {
563 0 : Datum = GCS_WGS_72BE;
564 0 : Proj = MapSys_UTM_South;
565 0 : nZone = PCSCode - PCS_WGS72BE_UTM_zone_1S + 1;
566 : }
567 :
568 672 : else if( PCSCode >= PCS_WGS84_UTM_zone_1N
569 340 : && PCSCode <= PCS_WGS84_UTM_zone_60N )
570 : {
571 334 : Datum = GCS_WGS_84;
572 334 : Proj = MapSys_UTM_North;
573 334 : nZone = PCSCode - PCS_WGS84_UTM_zone_1N + 1;
574 : }
575 338 : else if( PCSCode >= PCS_WGS84_UTM_zone_1S
576 4 : && PCSCode <= PCS_WGS84_UTM_zone_60S )
577 : {
578 4 : Datum = GCS_WGS_84;
579 4 : Proj = MapSys_UTM_South;
580 4 : nZone = PCSCode - PCS_WGS84_UTM_zone_1S + 1;
581 : }
582 334 : else if( PCSCode >= PCS_SAD69_UTM_zone_18N
583 24 : && PCSCode <= PCS_SAD69_UTM_zone_22N )
584 : {
585 0 : Datum = KvUserDefined;
586 0 : Proj = MapSys_UTM_North;
587 0 : nZone = PCSCode - PCS_SAD69_UTM_zone_18N + 18;
588 : }
589 334 : else if( PCSCode >= PCS_SAD69_UTM_zone_17S
590 24 : && PCSCode <= PCS_SAD69_UTM_zone_25S )
591 : {
592 0 : Datum = KvUserDefined;
593 0 : Proj = MapSys_UTM_South;
594 0 : nZone = PCSCode - PCS_SAD69_UTM_zone_17S + 17;
595 : }
596 :
597 : /* -------------------------------------------------------------------- */
598 : /* State Plane zones, first we translate any PCS_ codes to */
599 : /* a Proj_ code that we can get a handle on. */
600 : /* -------------------------------------------------------------------- */
601 1602500 : for( int i = 0; StatePlaneTable[i] != KvUserDefined; i += 2 )
602 : {
603 1596090 : if( StatePlaneTable[i] == PCSCode )
604 12 : PCSCode = StatePlaneTable[i+1];
605 : }
606 :
607 6410 : if( PCSCode <= 15900 && PCSCode >= 10000 )
608 : {
609 12 : if( (PCSCode % 100) >= 30 )
610 : {
611 8 : Proj = MapSys_State_Plane_83;
612 8 : Datum = GCS_NAD83;
613 : }
614 : else
615 : {
616 4 : Proj = MapSys_State_Plane_27;
617 4 : Datum = GCS_NAD27;
618 : }
619 :
620 12 : nZone = PCSCode - 10000;
621 12 : if( Datum == GCS_NAD83 )
622 8 : nZone -= 30;
623 : }
624 :
625 6410 : if( pDatum != NULL )
626 6410 : *pDatum = Datum;
627 :
628 6410 : if( pZone != NULL )
629 6410 : *pZone = nZone;
630 :
631 6410 : return Proj;
632 : }
633 :
634 : /************************************************************************/
635 : /* GTIFProjToMapSys() */
636 : /************************************************************************/
637 :
638 : /**
639 : * Translate a Proj_ code into a UTM or State Plane map system, and a zone
640 : * if possible.
641 : *
642 : * @param ProjCode The projection code (Proj_*) as would be stored in the
643 : * ProjectionGeoKey of a GeoTIFF file.
644 : * @param pZone Pointer to an integer into which the zone will be placed
645 : * if the function is successful.
646 : *
647 : * @return Returns either MapSys_UTM_North, MapSys_UTM_South,
648 : * MapSys_State_Plane_27, MapSys_State_Plane_83 or KvUserDefined.
649 : * KvUserDefined indicates that the
650 : * function failed to recognise the projection as UTM or State Plane.
651 : *
652 : * The zone value is only set if the return code is other than KvUserDefined.
653 : * For utm map system the returned zone will be between 1 and 60. For
654 : * State Plane, the USGS state plane zone number is returned. For instance,
655 : * Alabama East is zone 101.
656 : *
657 : * This function is useful to recognise UTM and State Plane coordinate
658 : * systems, and to extract zone numbers so the projections can be
659 : * represented as UTM rather than as the underlying projection method such
660 : * Transverse Mercator for instance.
661 : */
662 :
663 7594 : int GTIFProjToMapSys( int ProjCode, int * pZone )
664 :
665 : {
666 7594 : int nZone = KvUserDefined;
667 7594 : int MapSys = KvUserDefined;
668 :
669 : /* -------------------------------------------------------------------- */
670 : /* Handle UTM. */
671 : /* -------------------------------------------------------------------- */
672 7594 : if( ProjCode >= Proj_UTM_zone_1N && ProjCode <= Proj_UTM_zone_60N )
673 : {
674 3060 : MapSys = MapSys_UTM_North;
675 3060 : nZone = ProjCode - Proj_UTM_zone_1N + 1;
676 : }
677 4534 : else if( ProjCode >= Proj_UTM_zone_1S && ProjCode <= Proj_UTM_zone_60S )
678 : {
679 3 : MapSys = MapSys_UTM_South;
680 3 : nZone = ProjCode - Proj_UTM_zone_1S + 1;
681 : }
682 :
683 : /* -------------------------------------------------------------------- */
684 : /* Handle State Plane. I think there are some anomalies in */
685 : /* here, so this is a bit risky. */
686 : /* -------------------------------------------------------------------- */
687 4531 : else if( ProjCode >= 10101 && ProjCode <= 15299 )
688 : {
689 10 : if( ProjCode % 100 >= 30 )
690 : {
691 7 : MapSys = MapSys_State_Plane_83;
692 7 : nZone = ProjCode - 10000 - 30;
693 : }
694 : else
695 : {
696 3 : MapSys = MapSys_State_Plane_27;
697 3 : nZone = ProjCode - 10000;
698 : }
699 : }
700 :
701 7594 : if( pZone != NULL )
702 7594 : *pZone = nZone;
703 :
704 7594 : return MapSys;
705 : }
|