Mercator_[12]SP are both the same projection in GeoTIFF. Lacking a definition in the official specification, the intention appears to be that for Mercator_2SP the latitude of true scale (lat_ts) should be specified in ProjStdParallel1GeoKey and for Mercator_1SP the scale at origin (k) should be specified in ProjScaleAtNatOriginGeoKey. As proposed here, http://permalink.gmane.org/gmane.comp.gis.geotiff/387
Current behavior when creating a GTiff with 2SP is to drop lat_ts and create a default k value of 1.0, which will product an incorrect projection. When reading, 1SP is always used and lat_ts is ignored. It is expected that libgeotiff will provide a default k of 1.0 if none was specified in the file. This patches changes the behavior when writing to supply ProjScaleAtNatOriginGeoKey for Mercator_1SP or ProjStdParallel1GeoKey for Mercator_2SP. When reading, 2SP is used if ProjStdParallel1GeoKey is present and 1SP is used otherwise. A warning is issued if both keys are present (and scale is ignored). It is expected that libgeotiff's normalization will continue to provide a default scale of 1.0 if neither parameter is present. --- v2 Split out libgeotiff part. This patch does not need the libgeotiff patch to be applied. Will write correctly without libgeotiff patch. Reading will be unchanged unless libgeotiff is also patched. gdal/frmts/gtiff/gt_wkt_srs.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/gdal/frmts/gtiff/gt_wkt_srs.cpp b/gdal/frmts/gtiff/gt_wkt_srs.cpp index 5934df5..0afb101 100644 --- a/gdal/frmts/gtiff/gt_wkt_srs.cpp +++ b/gdal/frmts/gtiff/gt_wkt_srs.cpp @@ -737,9 +737,21 @@ char *GTIFGetOGISDefn( GTIF *hGTIF, GTIFDefn * psDefn ) break; case CT_Mercator: - oSRS.SetMercator( adfParm[0], adfParm[1], - adfParm[4], - adfParm[5], adfParm[6] ); + /* If a lat_ts was specified use 2SP, otherwise use 1SP */ + if (psDefn->ProjParmId[2] == ProjStdParallel1GeoKey) + { + if (psDefn->ProjParmId[4] == ProjScaleAtNatOriginGeoKey) + CPLError( CE_Warning, CPLE_AppDefined, + "Mercator projection should not define both StdParallel1 and ScaleAtNatOrigin.\n" + "Using StdParallel1 and ignoring ScaleAtNatOrigin.\n" ); + oSRS.SetMercator2SP( adfParm[2], + adfParm[0], adfParm[1], + adfParm[5], adfParm[6]); + } + else + oSRS.SetMercator( adfParm[0], adfParm[1], + adfParm[4], + adfParm[5], adfParm[6] ); if (psDefn->Projection == 1024 || psDefn->Projection == 9841) // override hack for google mercator. { @@ -1510,14 +1522,18 @@ int GTIFSetFromOGISDefn( GTIF * psGTIF, const char *pszOGCWKT ) GTIFKeySet(psGTIF, ProjNatOriginLongGeoKey, TYPE_DOUBLE, 1, poSRS->GetNormProjParm( SRS_PP_CENTRAL_MERIDIAN, 0.0 ) ); - GTIFKeySet(psGTIF, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE, 1, - poSRS->GetNormProjParm( SRS_PP_SCALE_FACTOR, 1.0 ) ); - GTIFKeySet(psGTIF, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1, poSRS->GetProjParm( SRS_PP_FALSE_EASTING, 0.0 ) ); GTIFKeySet(psGTIF, ProjFalseNorthingGeoKey, TYPE_DOUBLE, 1, poSRS->GetProjParm( SRS_PP_FALSE_NORTHING, 0.0 ) ); + + if( EQUAL(pszProjection,SRS_PT_MERCATOR_2SP) ) + GTIFKeySet(psGTIF, ProjStdParallel1GeoKey, TYPE_DOUBLE, 1, + poSRS->GetNormProjParm( SRS_PP_STANDARD_PARALLEL_1, 0.0 ) ); + else + GTIFKeySet(psGTIF, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE, 1, + poSRS->GetNormProjParm( SRS_PP_SCALE_FACTOR, 1.0 ) ); } else if( EQUAL(pszProjection,SRS_PT_OBLIQUE_STEREOGRAPHIC) ) -- 1.7.10.4 _______________________________________________ gdal-dev mailing list gdal-dev@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/gdal-dev