LCOV - code coverage report
Current view: top level - frmts/gtiff/libgeotiff - geo_extra.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 69 137 50.4 %
Date: 2025-01-18 12:42:00 Functions: 2 4 50.0 %

          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             : }

Generated by: LCOV version 1.14