1 /******************************************************************************
2  * $Id: geo_normalize.h 6240bef04d4ee087587e50fb0ff83a04e4f09c1e 2021-03-06 17:04:20 +0100 Even Rouault $
3  *
4  * Project:  libgeotiff
5  * Purpose:  Include file related to geo_normalize.c containing Code to
6  *           normalize PCS and other composite codes in a GeoTIFF file.
7  * Author:   Frank Warmerdam, warmerda@home.com
8  *
9  ******************************************************************************
10  * Copyright (c) 1999, Frank Warmerdam
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a
13  * copy of this software and associated documentation files (the "Software"),
14  * to deal in the Software without restriction, including without limitation
15  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16  * and/or sell copies of the Software, and to permit persons to whom the
17  * Software is furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice shall be included
20  * in all copies or substantial portions of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28  * DEALINGS IN THE SOFTWARE.
29  *****************************************************************************/
30 
31 #ifndef GEO_NORMALIZE_H_INCLUDED
32 #define GEO_NORMALIZE_H_INCLUDED
33 
34 #include <stdio.h>
35 #include "geotiff.h"
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 /**
42  * \file geo_normalize.h
43  *
44  * Include file for extended projection definition normalization api.
45  */
46 
47 #define MAX_GTIF_PROJPARMS 	10
48 
49 /**
50  * Holds a definition of a coordinate system in normalized form.
51  */
52 
53 typedef struct {
54     /** From GTModelTypeGeoKey tag.  Can have the values ModelTypeGeographic
55         or ModelTypeProjected. */
56     short	Model;
57 
58     /** From ProjectedCSTypeGeoKey tag.  For example PCS_NAD27_UTM_zone_3N.*/
59     short	PCS;
60 
61     /** From GeographicTypeGeoKey tag.  For example GCS_WGS_84 or
62         GCS_Voirol_1875_Paris.  Includes datum and prime meridian value. */
63     short	GCS;
64 
65     /** From ProjLinearUnitsGeoKey if found, or from GeogLinearUnitsGeoKey otherwise.  For example Linear_Meter. */
66     short	UOMLength;
67 
68     /** One UOMLength = UOMLengthInMeters meters. */
69     double	UOMLengthInMeters;
70 
71     /** The angular units of the GCS. */
72     short       UOMAngle;
73 
74     /** One UOMAngle = UOMLengthInDegrees degrees. */
75     double      UOMAngleInDegrees;
76 
77     /** Datum from GeogGeodeticDatumGeoKey tag. For example Datum_WGS84 */
78     short	Datum;
79 
80     /** Prime meridian from GeogPrimeMeridianGeoKey.  For example PM_Greenwich
81         or PM_Paris. */
82     short	PM;
83 
84     /** Decimal degrees of longitude between this prime meridian and
85         Greenwich.  Prime meridians to the west of Greenwich are negative. */
86     double	PMLongToGreenwich;
87 
88     /** Ellipsoid identifier from GeogELlipsoidGeoKey.  For example
89         Ellipse_Clarke_1866. */
90     short	Ellipsoid;
91 
92     /** The length of the semi major ellipse axis in meters. */
93     double	SemiMajor;
94 
95     /** The length of the semi minor ellipse axis in meters. */
96     double	SemiMinor;
97 
98   /* This #if is primary intended to maintain binary compatibility with older
99      versions of libgeotiff for MrSID binaries (for example). */
100 #if !defined(GEO_NORMALIZE_DISABLE_TOWGS84)
101     /** TOWGS84 transformation values (0/3/7) */
102     short       TOWGS84Count;
103 
104     /** TOWGS84 transformation values */
CPL_IGNORE_RET_VAL_INT(CPL_UNUSED int unused)105     double      TOWGS84[7];
106 #endif /* !defined(GEO_NORMALIZE_DISABLE_TOWGS84) */
107 
108     /** Projection id from ProjectionGeoKey.  For example Proj_UTM_11S. */
109     short	ProjCode;
110 
111     /** EPSG identifier for underlying projection method.  From the EPSG
112         TRF_METHOD table.  */
GTIFKeyGetSSHORT(GTIF * gtif,geokey_t key,short * pnVal)113     short	Projection;
114 
115     /** GeoTIFF identifier for underlying projection method.  While some of
116       these values have corresponding values in EPSG (Projection field),
117       others do not.  For example CT_TransverseMercator. */
118     short	CTProjection;
119 
120     /** Number of projection parameters in ProjParm and ProjParmId. */
121     int		nParms;
122 
123     /** Projection parameter value.  The identify of this parameter
124         is established from the corresponding entry in ProjParmId.  The
125         value will be measured in meters, or decimal degrees if it is a
126         linear or angular measure. */
127     double	ProjParm[MAX_GTIF_PROJPARMS];
GTIFGetPCSInfoEx(void * ctxIn,int nPCSCode,char ** ppszEPSGName,short * pnProjOp,short * pnUOMLengthCode,short * pnGeogCS)128 
129     /** Projection parameter identifier.  For example ProjFalseEastingGeoKey.
130         The value will be 0 for unused table entries. */
131     int		ProjParmId[MAX_GTIF_PROJPARMS]; /* geokey identifier,
132                                                    eg. ProjFalseEastingGeoKey*/
133 
134     /** Special zone map system code (MapSys_UTM_South, MapSys_UTM_North,
135         MapSys_State_Plane or KvUserDefined if none apply. */
136     int		MapSys;
137 
138     /** UTM, or State Plane Zone number, zero if not known. */
139     int		Zone;
140 
141     /** Do we have any definition at all?  0 if no geokeys found */
142     int         DefnSet;
143 
144 } GTIFDefn;
145 
146 int GTIF_DLL GTIFGetPCSInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
147                       int nPCSCode, char **ppszEPSGName,
148                       short *pnProjOp, short *pnUOMLengthCode,
149                       short *pnGeogCS );
150 int GTIF_DLL GTIFGetPCSInfo( int nPCSCode, char **ppszEPSGName,
151                             short *pnProjOp,
152                             short *pnUOMLengthCode, short *pnGeogCS );
153 
154 int GTIF_DLL GTIFGetProjTRFInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
155                           int nProjTRFCode,
156                           char **ppszProjTRFName,
157                           short * pnProjMethod,
158                           double * padfProjParams );
159 int GTIF_DLL GTIFGetProjTRFInfo( int nProjTRFCode,
160                                 char ** ppszProjTRFName,
161                                 short * pnProjMethod,
162                                 double * padfProjParams );
163 
164 int GTIF_DLL GTIFGetGCSInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
165                       int nGCSCode, char ** ppszName,
166                       short * pnDatum, short * pnPM, short *pnUOMAngle );
167 int GTIF_DLL GTIFGetGCSInfo( int nGCSCode, char **ppszName,
168                             short *pnDatum, short *pnPM, short *pnUOMAngle );
169 
170 int GTIF_DLL GTIFGetDatumInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
171                         int nDatumCode, char ** ppszName, short * pnEllipsoid );
172 int GTIF_DLL GTIFGetDatumInfo( int nDatumCode, char **ppszName,
173                               short * pnEllipsoid );
174 
175 int GTIF_DLL GTIFGetEllipsoidInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
176                             int nEllipseCode, char ** ppszName,
177                             double * pdfSemiMajor, double * pdfSemiMinor );
178 int GTIF_DLL GTIFGetEllipsoidInfo( int nEllipsoid, char ** ppszName,
179                                   double * pdfSemiMajor,
180                                   double * pdfSemiMinor );
181 
182 int GTIF_DLL GTIFGetPMInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
183                      int nPMCode, char ** ppszName, double *pdfOffset );
184 int GTIF_DLL GTIFGetPMInfo( int nPM, char **ppszName,
185                            double * pdfLongToGreenwich );
186 
187 double GTIF_DLL GTIFAngleStringToDD( const char *pszAngle, int nUOMAngle );
188 
189 int GTIF_DLL GTIFGetUOMLengthInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
190                             int nUOMLengthCode,
191                             char **ppszUOMName,
192                             double * pdfInMeters );
193 int GTIF_DLL GTIFGetUOMLengthInfo( int nUOMLengthCode,
194                                   char **ppszUOMName,
195                                   double * pdfInMeters );
196 
197 int GTIF_DLL GTIFGetUOMAngleInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
198                            int nUOMAngleCode,
199                            char **ppszUOMName,
200                            double * pdfInDegrees );
201 int GTIF_DLL GTIFGetUOMAngleInfo( int nUOMAngleCode,
202                                  char **ppszUOMName,
203                                  double * pdfInDegrees );
204 double GTIF_DLL GTIFAngleToDD( double dfAngle, int nUOMAngle );
205 
206 
207 /* this should be used to free strings returned by GTIFGet... funcs */
208 void GTIF_DLL GTIFFreeMemory( char * );
209 
210 /* The void* should be a PJ_CONTEXT* */
211 void GTIF_DLL GTIFAttachPROJContext( GTIF *psGTIF, void* pjContext );
212 void GTIF_DLL *GTIFGetPROJContext( GTIF *psGTIF, int instantiateIfNeeded,
213                                    int* out_gtif_own_pj_context );
214 
215 int GTIF_DLL GTIFGetDefn( GTIF *psGTIF, GTIFDefn * psDefn );
216 void GTIF_DLL GTIFPrintDefn( GTIFDefn *, FILE * );
217 void GTIF_DLL GTIFPrintDefnEx( GTIF *psGTIF, GTIFDefn *, FILE * );
218 GTIFDefn GTIF_DLL *GTIFAllocDefn( void );
219 void GTIF_DLL GTIFFreeDefn( GTIFDefn * );
220 
221 const char GTIF_DLL *GTIFDecToDMS( double, const char *, int );
222 
223 /*
224  * These are useful for recognising UTM and State Plane.
225  */
226 
227 #define MapSys_UTM_North	-9001
228 #define MapSys_UTM_South	-9002
229 #define MapSys_State_Plane_27	-9003
230 #define MapSys_State_Plane_83	-9004
231 
232 int GTIF_DLL   GTIFMapSysToPCS( int MapSys, int Datum, int nZone );
233 int GTIF_DLL   GTIFMapSysToProj( int MapSys, int nZone );
234 int GTIF_DLL   GTIFPCSToMapSys( int PCSCode, int * pDatum, int * pZone );
235 int GTIF_DLL   GTIFProjToMapSys( int ProjCode, int * pZone );
236 
237 /*
238  * These are only useful if using libgeotiff with libproj (PROJ.4+).
239  */
240 char GTIF_DLL *GTIFGetProj4Defn( GTIFDefn * );
241 
242 int  GTIF_DLL  GTIFProj4ToLatLong( GTIFDefn *, int, double *, double * );
243 int  GTIF_DLL  GTIFProj4FromLatLong( GTIFDefn *, int, double *, double * );
244 
245 int  GTIF_DLL  GTIFSetFromProj4( GTIF *gtif, const char *proj4 );
246 
247 
248 /*
249  * The following functions were used up to libgeotiff 1.4.X series, but
250  * are now no-operation, since there is no longer any CSV use in libgeotiff.
251  */
252 void GTIF_DLL GTIFDeaccessCSV( void );
253 
254 
255 #ifdef __cplusplus
256 }
257 #endif
258 
259 #endif /* ndef GEO_NORMALIZE_H_INCLUDED */
260