Index: apps/gdal_translate.cpp =================================================================== --- apps/gdal_translate.cpp (revision 26089) +++ apps/gdal_translate.cpp (working copy) @@ -713,6 +713,31 @@ char** papszDupArgv = CSLDuplicate(argv); int nRet = 0; + const char* pszFormat = NULL; + char *pszDest1 = NULL; + char *pszDest2 = NULL; + char **papszTokens = CSLTokenizeString2(pszDest,".",0); + if ( CSLCount(papszTokens) >= 2 ) + { + pszDest1 = CPLStrdup(papszTokens[0]); + pszDest2 = CPLStrdup(papszTokens[1]); + } + CSLDestroy(papszTokens); + if ( CSLCount(papszSubdatasets)/2 < 10 ) + { + if (pszDest1!=NULL) + pszFormat = "%s_%d.%s"; + else + pszFormat = "%s_%d"; + } + else + { + if (pszDest1!=NULL) + pszFormat = "%s_%002d.%s"; + else + pszFormat = "%s_%002d"; + } + CPLFree(papszDupArgv[iDstFileArg]); papszDupArgv[iDstFileArg] = pszSubDest; bSubCall = TRUE; @@ -720,13 +745,21 @@ { CPLFree(papszDupArgv[iSrcFileArg]); papszDupArgv[iSrcFileArg] = CPLStrdup(strstr(papszSubdatasets[i],"=")+1); - sprintf( pszSubDest, "%s%d", pszDest, i/2 + 1 ); + if (pszDest1!=NULL) + sprintf( pszSubDest, pszFormat, pszDest1, i/2 + 1, pszDest2 ); + else + sprintf( pszSubDest, pszFormat, pszDest, i/2 + 1 ); nRet = ProxyMain( argc, papszDupArgv ); if (nRet != 0) break; } CSLDestroy(papszDupArgv); - + if (pszDest1 != NULL) + { + CPLFree(pszDest1); + CPLFree(pszDest2); + } + bSubCall = bOldSubCall; CSLDestroy(argv);