Skip to content

Commit

Permalink
GTiff: ensure GDAL PROJ context is used for all libgeotiff functions …
Browse files Browse the repository at this point in the history
…(requires internal libgeotiff / libgeotiff 1.6)
  • Loading branch information
rouault committed Jul 17, 2019
1 parent 043b7d5 commit ffb0ad0
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 26 deletions.
69 changes: 60 additions & 9 deletions gdal/frmts/gtiff/gt_wkt_srs.cpp
Expand Up @@ -54,6 +54,7 @@
#include "ogr_core.h"
#include "ogr_spatialref.h"
#include "ogr_srs_api.h"
#include "ogr_proj_p.h"
#include "tiff.h"
#include "tiffio.h"
#include "tifvsi.h"
Expand Down Expand Up @@ -314,6 +315,10 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn )

LibgeotiffOneTimeInit();

#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
void* projContext = GTIFGetPROJContext(hGTIF, FALSE, nullptr);
#endif

/* -------------------------------------------------------------------- */
/* Handle non-standard coordinate systems where GTModelTypeGeoKey */
/* is not defined, but ProjectedCSTypeGeoKey is defined (ticket #3019) */
Expand Down Expand Up @@ -379,7 +384,12 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn )
oSRS.SetLocalCS( szPCSName );

// Handle units
GTIFGetUOMLengthInfo( psDefn->UOMLength, &pszUnitsName, nullptr );
#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
GTIFGetUOMLengthInfoEx( projContext,
#else
GTIFGetUOMLengthInfo(
#endif
psDefn->UOMLength, &pszUnitsName, nullptr );

if( pszUnitsName != nullptr && psDefn->UOMLength != KvUserDefined )
{
Expand Down Expand Up @@ -418,7 +428,12 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn )

char *pszUnitsName = nullptr;

GTIFGetUOMLengthInfo( psDefn->UOMLength, &pszUnitsName, nullptr );
#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
GTIFGetUOMLengthInfoEx( projContext,
#else
GTIFGetUOMLengthInfo(
#endif
psDefn->UOMLength, &pszUnitsName, nullptr );

if( pszUnitsName != nullptr && psDefn->UOMLength != KvUserDefined )
{
Expand Down Expand Up @@ -501,7 +516,12 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn )
{
char *pszPCSName = nullptr;

GTIFGetPCSInfo( psDefn->PCS, &pszPCSName, nullptr, nullptr, nullptr );
#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
GTIFGetPCSInfoEx( projContext,
#else
GTIFGetPCSInfo(
#endif
psDefn->PCS, &pszPCSName, nullptr, nullptr, nullptr );

oSRS.SetProjCS( pszPCSName ? pszPCSName : "unnamed" );
if ( pszPCSName )
Expand Down Expand Up @@ -580,7 +600,13 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn )
char *pszAngularUnits = nullptr;
char szGCSName[512] = { '\0' };

if( !GTIFGetGCSInfo( psDefn->GCS, &pszGeogName, nullptr, nullptr, nullptr )
if( !
#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
GTIFGetGCSInfoEx( projContext,
#else
GTIFGetGCSInfo(
#endif
psDefn->GCS, &pszGeogName, nullptr, nullptr, nullptr )
&& GDALGTIFKeyGetASCII( hGTIF, GeogCitationGeoKey, szGCSName, 0,
sizeof(szGCSName)) )
{
Expand All @@ -597,15 +623,25 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn )

if( !pszDatumName )
{
GTIFGetDatumInfo( psDefn->Datum, &pszDatumName, nullptr );
#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
GTIFGetDatumInfoEx( projContext,
#else
GTIFGetDatumInfo(
#endif
psDefn->Datum, &pszDatumName, nullptr );
GTIFToCPLRecycleString( &pszDatumName );
}

double dfSemiMajor = 0.0;
double dfInvFlattening = 0.0;
if( !pszSpheroidName )
{
GTIFGetEllipsoidInfo( psDefn->Ellipsoid, &pszSpheroidName, nullptr, nullptr );
#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
GTIFGetEllipsoidInfoEx( projContext,
#else
GTIFGetEllipsoidInfo(
#endif
psDefn->Ellipsoid, &pszSpheroidName, nullptr, nullptr );
GTIFToCPLRecycleString( &pszSpheroidName );
}
else
Expand All @@ -617,7 +653,12 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn )
}
if( !pszPMName )
{
GTIFGetPMInfo( psDefn->PM, &pszPMName, nullptr );
#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
GTIFGetPMInfoEx( projContext,
#else
GTIFGetPMInfo(
#endif
psDefn->PM, &pszPMName, nullptr );
GTIFToCPLRecycleString( &pszPMName );
}
else
Expand All @@ -629,7 +670,12 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn )
bool aUnitGot = false;
if( !pszAngularUnits )
{
GTIFGetUOMAngleInfo( psDefn->UOMAngle, &pszAngularUnits, nullptr );
#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
GTIFGetUOMAngleInfoEx( projContext,
#else
GTIFGetUOMAngleInfo(
#endif
psDefn->UOMAngle, &pszAngularUnits, nullptr );
if( pszAngularUnits == nullptr )
pszAngularUnits = CPLStrdup("unknown");
else
Expand Down Expand Up @@ -705,7 +751,12 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn )
{
char *pszUnitsName = nullptr;

GTIFGetUOMLengthInfo( psDefn->UOMLength, &pszUnitsName, nullptr );
#if LIBGEOTIFF_VERSION >= 1600 || defined(INTERNAL_LIBGEOTIFF)
GTIFGetUOMLengthInfoEx( projContext,
#else
GTIFGetUOMLengthInfo(
#endif
psDefn->UOMLength, &pszUnitsName, nullptr );

if( pszUnitsName != nullptr && psDefn->UOMLength != KvUserDefined )
{
Expand Down
34 changes: 18 additions & 16 deletions gdal/frmts/gtiff/libgeotiff/geo_normalize.c
Expand Up @@ -108,13 +108,13 @@ CPL_INLINE static void CPL_IGNORE_RET_VAL_INT(CPL_UNUSED int unused) {}
/* GTIFGetPCSInfo() */
/************************************************************************/

static
int GTIFGetPCSInfoEx( PJ_CONTEXT* ctx,
int GTIFGetPCSInfoEx( void* ctxIn,
int nPCSCode, char **ppszEPSGName,
short *pnProjOp, short *pnUOMLengthCode,
short *pnGeogCS )

{
PJ_CONTEXT* ctx = (PJ_CONTEXT*)ctxIn;
int nDatum;
int nZone;

Expand Down Expand Up @@ -393,12 +393,12 @@ double GTIFAngleStringToDD( const char * pszAngle, int nUOMAngle )
/* GCS. */
/************************************************************************/

static
int GTIFGetGCSInfoEx( PJ_CONTEXT* ctx,
int GTIFGetGCSInfoEx( void* ctxIn,
int nGCSCode, char ** ppszName,
short * pnDatum, short * pnPM, short *pnUOMAngle )

{
PJ_CONTEXT* ctx = (PJ_CONTEXT*)ctxIn;
int nDatum=0, nPM, nUOMAngle;

/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -577,12 +577,12 @@ int GTIFGetGCSInfo( int nGCSCode, char ** ppszName,
/* where that is provided. */
/************************************************************************/

static
int GTIFGetEllipsoidInfoEx( PJ_CONTEXT* ctx,
int GTIFGetEllipsoidInfoEx( void* ctxIn,
int nEllipseCode, char ** ppszName,
double * pdfSemiMajor, double * pdfSemiMinor )

{
PJ_CONTEXT* ctx = (PJ_CONTEXT*)ctxIn;
/* -------------------------------------------------------------------- */
/* Try some well known ellipsoids. */
/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -688,11 +688,12 @@ int GTIFGetEllipsoidInfo( int nEllipseCode, char ** ppszName,
/* in degrees. */
/************************************************************************/

static
int GTIFGetPMInfoEx( PJ_CONTEXT* ctx,
int GTIFGetPMInfoEx( void* ctxIn,
int nPMCode, char ** ppszName, double *pdfOffset )

{
PJ_CONTEXT* ctx = (PJ_CONTEXT*)ctxIn;

/* -------------------------------------------------------------------- */
/* Use a special short cut for Greenwich, since it is so common. */
/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -761,11 +762,11 @@ int GTIFGetPMInfo( int nPMCode, char ** ppszName, double *pdfOffset )
/* Fetch the ellipsoid, and name for a datum. */
/************************************************************************/

static
int GTIFGetDatumInfoEx( PJ_CONTEXT* ctx,
int GTIFGetDatumInfoEx( void* ctxIn,
int nDatumCode, char ** ppszName, short * pnEllipsoid )

{
PJ_CONTEXT* ctx = (PJ_CONTEXT*)ctxIn;
const char* pszName = NULL;
int nEllipsoid = 0;

Expand Down Expand Up @@ -878,13 +879,13 @@ int GTIFGetDatumInfo( int nDatumCode, char ** ppszName, short * pnEllipsoid )
/* lookup length aliases in the UOM_LE_ALIAS table. */
/************************************************************************/

static
int GTIFGetUOMLengthInfoEx( PJ_CONTEXT* ctx,
int GTIFGetUOMLengthInfoEx( void* ctxIn,
int nUOMLengthCode,
char **ppszUOMName,
double * pdfInMeters )

{
PJ_CONTEXT* ctx = (PJ_CONTEXT*)ctxIn;
/* -------------------------------------------------------------------- */
/* We short cut meter to save work and avoid failure for missing */
/* in the most common cases. */
Expand Down Expand Up @@ -957,13 +958,13 @@ int GTIFGetUOMLengthInfo( int nUOMLengthCode,
/* GTIFGetUOMAngleInfo() */
/************************************************************************/

static
int GTIFGetUOMAngleInfoEx( PJ_CONTEXT* ctx,
int GTIFGetUOMAngleInfoEx( void* ctxIn,
int nUOMAngleCode,
char **ppszUOMName,
double * pdfInDegrees )

{
PJ_CONTEXT* ctx = (PJ_CONTEXT*)ctxIn;
const char *pszUOMName = NULL;
double dfInDegrees = 1.0;

Expand Down Expand Up @@ -1377,14 +1378,15 @@ static int SetGTParmIds( int nCTProjection,
/* normalized into degrees and meters. */
/************************************************************************/

static
int GTIFGetProjTRFInfoEx( PJ_CONTEXT* ctx,
int GTIFGetProjTRFInfoEx( void* ctxIn,
int nProjTRFCode,
char **ppszProjTRFName,
short * pnProjMethod,
double * padfProjParms )

{
PJ_CONTEXT* ctx = (PJ_CONTEXT*)ctxIn;

if ((nProjTRFCode >= Proj_UTM_zone_1N && nProjTRFCode <= Proj_UTM_zone_60N) ||
(nProjTRFCode >= Proj_UTM_zone_1S && nProjTRFCode <= Proj_UTM_zone_60S))
{
Expand Down
34 changes: 34 additions & 0 deletions gdal/frmts/gtiff/libgeotiff/geo_normalize.h
Expand Up @@ -143,27 +143,61 @@ typedef struct {

} GTIFDefn;

int GTIF_DLL GTIFGetPCSInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
int nPCSCode, char **ppszEPSGName,
short *pnProjOp, short *pnUOMLengthCode,
short *pnGeogCS );
int GTIF_DLL GTIFGetPCSInfo( int nPCSCode, char **ppszEPSGName,
short *pnProjOp,
short *pnUOMLengthCode, short *pnGeogCS );

int GTIF_DLL GTIFGetProjTRFInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
int nProjTRFCode,
char **ppszProjTRFName,
short * pnProjMethod,
double * padfProjParms );
int GTIF_DLL GTIFGetProjTRFInfo( int nProjTRFCode,
char ** ppszProjTRFName,
short * pnProjMethod,
double * padfProjParms );

int GTIF_DLL GTIFGetGCSInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
int nGCSCode, char ** ppszName,
short * pnDatum, short * pnPM, short *pnUOMAngle );
int GTIF_DLL GTIFGetGCSInfo( int nGCSCode, char **ppszName,
short *pnDatum, short *pnPM, short *pnUOMAngle );

int GTIF_DLL GTIFGetDatumInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
int nDatumCode, char ** ppszName, short * pnEllipsoid );
int GTIF_DLL GTIFGetDatumInfo( int nDatumCode, char **ppszName,
short * pnEllipsoid );

int GTIF_DLL GTIFGetEllipsoidInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
int nEllipseCode, char ** ppszName,
double * pdfSemiMajor, double * pdfSemiMinor );
int GTIF_DLL GTIFGetEllipsoidInfo( int nEllipsoid, char ** ppszName,
double * pdfSemiMajor,
double * pdfSemiMinor );

int GTIF_DLL GTIFGetPMInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
int nPMCode, char ** ppszName, double *pdfOffset );
int GTIF_DLL GTIFGetPMInfo( int nPM, char **ppszName,
double * pdfLongToGreenwich );

double GTIF_DLL GTIFAngleStringToDD( const char *pszAngle, int nUOMAngle );

int GTIF_DLL GTIFGetUOMLengthInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
int nUOMLengthCode,
char **ppszUOMName,
double * pdfInMeters );
int GTIF_DLL GTIFGetUOMLengthInfo( int nUOMLengthCode,
char **ppszUOMName,
double * pdfInMeters );

int GTIF_DLL GTIFGetUOMAngleInfoEx( void* ctx, /* The void* should be a PJ_CONTEXT* */
int nUOMAngleCode,
char **ppszUOMName,
double * pdfInDegrees );
int GTIF_DLL GTIFGetUOMAngleInfo( int nUOMAngleCode,
char **ppszUOMName,
double * pdfInDegrees );
Expand Down
2 changes: 1 addition & 1 deletion gdal/frmts/gtiff/libgeotiff/geotiff.h
Expand Up @@ -30,7 +30,7 @@
*/
#define GvCurrentVersion 1

#define LIBGEOTIFF_VERSION 1430
#define LIBGEOTIFF_VERSION 1500

#include "geo_config.h"
#include "geokeys.h"
Expand Down

0 comments on commit ffb0ad0

Please sign in to comment.