CPLErr ERSDataset::SetGeoTransform( double *padfTransform ) { if( memcmp( padfTransform, adfGeoTransform, sizeof(double)*6 ) == 0 ) return CE_None; if( adfGeoTransform[2] != 0 || adfGeoTransform[4] != 0 ) { CPLError( CE_Failure, CPLE_AppDefined, "Rotated and skewed geotransforms not currently supported for ERS driver." ); return CE_Failure; } bGotTransform = TRUE; memcpy( adfGeoTransform, padfTransform, sizeof(double) * 6 ); bHDRDirty = TRUE; poHeader->Set( "RasterInfo.CellInfo.Xdimension", CPLString().Printf( "%.15g", fabs(adfGeoTransform[1]) ) ); poHeader->Set( "RasterInfo.CellInfo.Ydimension", CPLString().Printf( "%.15g", fabs(adfGeoTransform[5]) ) ); poHeader->Set( "RasterInfo.RegistrationCoord.Eastings", CPLString().Printf( "%.15g", adfGeoTransform[0] ) ); poHeader->Set( "RasterInfo.RegistrationCoord.Northings", CPLString().Printf( "%.15g", adfGeoTransform[3] ) ); return CE_None; }
void ERSHdrNode::Set( const char *pszPath, const char *pszValue ) { CPLString osPath = pszPath; int iDot; iDot = osPath.find_first_of('.'); /* -------------------------------------------------------------------- */ /* We have an intermediate node, find or create it and */ /* recurse. */ /* -------------------------------------------------------------------- */ if( iDot != -1 ) { CPLString osPathFirst = osPath.substr(0,iDot); CPLString osPathRest = osPath.substr(iDot+1); ERSHdrNode *poFirst = FindNode( osPathFirst ); if( poFirst == NULL ) { poFirst = new ERSHdrNode(); MakeSpace(); papszItemName[nItemCount] = CPLStrdup(osPathFirst); papszItemValue[nItemCount] = NULL; papoItemChild[nItemCount] = poFirst; nItemCount++; } poFirst->Set( osPathRest, pszValue ); return; } /* -------------------------------------------------------------------- */ /* This is the final item name. Find or create it. */ /* -------------------------------------------------------------------- */ int i; for( i = 0; i < nItemCount; i++ ) { if( EQUAL(osPath,papszItemName[i]) && papszItemValue[i] != NULL ) { CPLFree( papszItemValue[i] ); papszItemValue[i] = CPLStrdup( pszValue ); return; } } MakeSpace(); papszItemName[nItemCount] = CPLStrdup(osPath); papszItemValue[nItemCount] = CPLStrdup(pszValue); papoItemChild[nItemCount] = NULL; nItemCount++; }
CPLErr ERSDataset::SetProjection( const char *pszSRS ) { if( pszProjection && EQUAL(pszSRS,pszProjection) ) return CE_None; if( pszSRS == NULL ) pszSRS = ""; CPLFree( pszProjection ); pszProjection = CPLStrdup(pszSRS); OGRSpatialReference oSRS( pszSRS ); char szERSProj[32], szERSDatum[32], szERSUnits[32]; oSRS.exportToERM( szERSProj, szERSDatum, szERSUnits ); bHDRDirty = TRUE; poHeader->Set( "CoordinateSpace.Datum", CPLString().Printf( "\"%s\"", szERSDatum ) ); poHeader->Set( "CoordinateSpace.Projection", CPLString().Printf( "\"%s\"", szERSProj ) ); poHeader->Set( "CoordinateSpace.CoordinateType", CPLString().Printf( "EN" ) ); poHeader->Set( "CoordinateSpace.Units", CPLString().Printf( "\"%s\"", szERSUnits ) ); poHeader->Set( "CoordinateSpace.Rotation", "0:0:0.0" ); /* -------------------------------------------------------------------- */ /* It seems that CoordinateSpace needs to come before */ /* RasterInfo. Try moving it up manually. */ /* -------------------------------------------------------------------- */ int iRasterInfo = -1; int iCoordSpace = -1; int i; for( i = 0; i < poHeader->nItemCount; i++ ) { if( EQUAL(poHeader->papszItemName[i],"RasterInfo") ) iRasterInfo = i; if( EQUAL(poHeader->papszItemName[i],"CoordinateSpace") ) { iCoordSpace = i; break; } } if( iCoordSpace > iRasterInfo && iRasterInfo != -1 ) { for( i = iCoordSpace; i > 0 && i != iRasterInfo; i-- ) { char *pszTemp; ERSHdrNode *poTemp = poHeader->papoItemChild[i]; poHeader->papoItemChild[i] = poHeader->papoItemChild[i-1]; poHeader->papoItemChild[i-1] = poTemp; pszTemp = poHeader->papszItemName[i]; poHeader->papszItemName[i] = poHeader->papszItemName[i-1]; poHeader->papszItemName[i-1] = pszTemp; pszTemp = poHeader->papszItemValue[i]; poHeader->papszItemValue[i] = poHeader->papszItemValue[i-1]; poHeader->papszItemValue[i-1] = pszTemp; } } return CE_None; }
CPLErr ERSDataset::SetGCPs( int nGCPCountIn, const GDAL_GCP *pasGCPListIn, const char *pszGCPProjectionIn ) { /* -------------------------------------------------------------------- */ /* Clean old gcps. */ /* -------------------------------------------------------------------- */ CPLFree( pszGCPProjection ); pszGCPProjection = NULL; if( nGCPCount > 0 ) { GDALDeinitGCPs( nGCPCount, pasGCPList ); CPLFree( pasGCPList ); pasGCPList = NULL; nGCPCount = 0; } /* -------------------------------------------------------------------- */ /* Copy new ones. */ /* -------------------------------------------------------------------- */ nGCPCount = nGCPCountIn; pasGCPList = GDALDuplicateGCPs( nGCPCount, pasGCPListIn ); pszGCPProjection = CPLStrdup( pszGCPProjectionIn ); /* -------------------------------------------------------------------- */ /* Setup the header contents corresponding to these GCPs. */ /* -------------------------------------------------------------------- */ bHDRDirty = TRUE; poHeader->Set( "RasterInfo.WarpControl.WarpType", "Polynomial" ); if( nGCPCount > 6 ) poHeader->Set( "RasterInfo.WarpControl.WarpOrder", "2" ); else poHeader->Set( "RasterInfo.WarpControl.WarpOrder", "1" ); poHeader->Set( "RasterInfo.WarpControl.WarpSampling", "Nearest" ); /* -------------------------------------------------------------------- */ /* Translate the projection. */ /* -------------------------------------------------------------------- */ OGRSpatialReference oSRS( pszGCPProjection ); char szERSProj[32], szERSDatum[32], szERSUnits[32]; oSRS.exportToERM( szERSProj, szERSDatum, szERSUnits ); poHeader->Set( "RasterInfo.WarpControl.CoordinateSpace.Datum", CPLString().Printf( "\"%s\"", szERSDatum ) ); poHeader->Set( "RasterInfo.WarpControl.CoordinateSpace.Projection", CPLString().Printf( "\"%s\"", szERSProj ) ); poHeader->Set( "RasterInfo.WarpControl.CoordinateSpace.CoordinateType", CPLString().Printf( "EN" ) ); poHeader->Set( "RasterInfo.WarpControl.CoordinateSpace.Units", CPLString().Printf( "\"%s\"", szERSUnits ) ); poHeader->Set( "RasterInfo.WarpControl.CoordinateSpace.Rotation", "0:0:0.0" ); /* -------------------------------------------------------------------- */ /* Translate the GCPs. */ /* -------------------------------------------------------------------- */ CPLString osControlPoints = "{\n"; int iGCP; for( iGCP = 0; iGCP < nGCPCount; iGCP++ ) { CPLString osLine; CPLString osId = pasGCPList[iGCP].pszId; if( strlen(osId) == 0 ) osId.Printf( "%d", iGCP + 1 ); osLine.Printf( "\t\t\t\t\"%s\"\tYes\tYes\t%.6f\t%.6f\t%.15g\t%.15g\t%.15g\n", osId.c_str(), pasGCPList[iGCP].dfGCPPixel, pasGCPList[iGCP].dfGCPLine, pasGCPList[iGCP].dfGCPX, pasGCPList[iGCP].dfGCPY, pasGCPList[iGCP].dfGCPZ ); osControlPoints += osLine; } osControlPoints += "\t\t}"; poHeader->Set( "RasterInfo.WarpControl.ControlPoints", osControlPoints ); return CE_None; }