@@ -147,6 +147,7 @@ int msSaveImageGDAL( mapObj *map, imageObj *image, const char *filenameIn )
147147 int bUseXmp = MS_FALSE ;
148148 const char * filename = NULL ;
149149 char * filenameToFree = NULL ;
150+ const char * gdal_driver_shortname = format -> driver + 5 ;
150151
151152 msGDALInitialize ();
152153 memset (& rb ,0 ,sizeof (rasterBufferObj ));
@@ -162,11 +163,11 @@ int msSaveImageGDAL( mapObj *map, imageObj *image, const char *filenameIn )
162163 /* Identify the proposed output driver. */
163164 /* -------------------------------------------------------------------- */
164165 msAcquireLock ( TLOCK_GDAL );
165- hOutputDriver = GDALGetDriverByName ( format -> driver + 5 );
166+ hOutputDriver = GDALGetDriverByName ( gdal_driver_shortname );
166167 if ( hOutputDriver == NULL ) {
167168 msReleaseLock ( TLOCK_GDAL );
168169 msSetError ( MS_MISCERR , "Failed to find %s driver." ,
169- "msSaveImageGDAL()" , format -> driver + 5 );
170+ "msSaveImageGDAL()" , gdal_driver_shortname );
170171 return MS_FAILURE ;
171172 }
172173
@@ -182,8 +183,12 @@ int msSaveImageGDAL( mapObj *map, imageObj *image, const char *filenameIn )
182183 if ( pszExtension == NULL )
183184 pszExtension = "img.tmp" ;
184185
185- if ( bUseXmp == MS_FALSE && GDALGetMetadataItem ( hOutputDriver , GDAL_DCAP_VIRTUALIO , NULL )
186- != NULL ) {
186+ if ( bUseXmp == MS_FALSE &&
187+ GDALGetMetadataItem ( hOutputDriver , GDAL_DCAP_VIRTUALIO , NULL ) != NULL &&
188+ /* We need special testing here for the netCDF driver, since recent */
189+ /* GDAL versions advertize VirtualIO support, but this is only for the */
190+ /* read-side of the driver, not the write-side. */
191+ !EQUAL (gdal_driver_shortname , "netCDF" ) ) {
187192 msCleanVSIDir ( "/vsimem/msout" );
188193 filenameToFree = msTmpFile (map , NULL , "/vsimem/msout/" , pszExtension );
189194 }
0 commit comments