CPLErr VRTSourcedRasterBand::XMLInit( CPLXMLNode * psTree, const char *pszVRTPath ) { CPLErr eErr; eErr = VRTRasterBand::XMLInit( psTree, pszVRTPath ); if( eErr != CE_None ) return eErr; /* -------------------------------------------------------------------- */ /* Validate a bit. */ /* -------------------------------------------------------------------- */ if( psTree == NULL || psTree->eType != CXT_Element || (!EQUAL(psTree->pszValue,"VRTSourcedRasterBand") && !EQUAL(psTree->pszValue,"VRTRasterBand") && !EQUAL(psTree->pszValue,"VRTDerivedRasterBand")) ) { CPLError( CE_Failure, CPLE_AppDefined, "Invalid node passed to VRTSourcedRasterBand::XMLInit()." ); return CE_Failure; } /* -------------------------------------------------------------------- */ /* Process sources. */ /* -------------------------------------------------------------------- */ CPLXMLNode *psChild; VRTDriver *poDriver = (VRTDriver *) GDALGetDriverByName( "VRT" ); for( psChild = psTree->psChild; psChild != NULL && poDriver != NULL; psChild = psChild->psNext) { VRTSource *poSource; if( psChild->eType != CXT_Element ) continue; CPLErrorReset(); poSource = poDriver->ParseSource( psChild, pszVRTPath ); if( poSource != NULL ) AddSource( poSource ); else if( CPLGetLastErrorType() != CE_None ) return CE_Failure; } /* -------------------------------------------------------------------- */ /* Done. */ /* -------------------------------------------------------------------- */ if( nSources == 0 ) CPLDebug( "VRT", "No valid sources found for band in VRT file:\n%s", pszVRTPath ); return CE_None; }
CPLErr VRTSourcedRasterBand::SetMetadata( char **papszNewMD, const char *pszDomain ) { if( pszDomain != NULL && (EQUAL(pszDomain,"new_vrt_sources") || EQUAL(pszDomain,"vrt_sources")) ) { VRTDriver *poDriver = (VRTDriver *) GDALGetDriverByName( "VRT" ); CPLErr eErr; int i; if( EQUAL(pszDomain,"vrt_sources") ) { for( int i = 0; i < nSources; i++ ) delete papoSources[i]; CPLFree( papoSources ); papoSources = NULL; nSources = 0; } for( i = 0; i < CSLCount(papszNewMD); i++ ) { const char *pszXML = CPLParseNameValue( papszNewMD[i], NULL ); CPLXMLNode *psTree = CPLParseXMLString( pszXML ); VRTSource *poSource; if( psTree == NULL ) return CE_Failure; poSource = poDriver->ParseSource( psTree, NULL ); CPLDestroyXMLNode( psTree ); if( poSource != NULL ) { eErr = AddSource( poSource ); if( eErr != CE_None ) return eErr; } else return CE_Failure; } return CE_None; } else return VRTRasterBand::SetMetadata( papszNewMD, pszDomain ); }
CPLErr VRTSourcedRasterBand::SetMetadataItem( const char *pszName, const char *pszValue, const char *pszDomain ) { CPLDebug( "VRT", "VRTSourcedRasterBand::SetMetadataItem(%s,%s,%s)\n", pszName, pszValue, pszDomain ); if( pszDomain != NULL && EQUAL(pszDomain,"new_vrt_sources") ) { VRTDriver *poDriver = (VRTDriver *) GDALGetDriverByName( "VRT" ); CPLXMLNode *psTree = CPLParseXMLString( pszValue ); VRTSource *poSource; if( psTree == NULL ) return CE_Failure; poSource = poDriver->ParseSource( psTree, NULL ); CPLDestroyXMLNode( psTree ); if( poSource != NULL ) return AddSource( poSource ); else return CE_Failure; } else if( pszDomain != NULL && EQUAL(pszDomain,"vrt_sources") ) { int iSource; if (sscanf(pszName, "source_%d", &iSource) != 1 || iSource < 0 || iSource >= nSources) { CPLError(CE_Failure, CPLE_AppDefined, "%s metadata item name is not recognized. " "Should be between source_0 and source_%d", pszName, nSources - 1); return CE_Failure; } VRTDriver *poDriver = (VRTDriver *) GDALGetDriverByName( "VRT" ); CPLXMLNode *psTree = CPLParseXMLString( pszValue ); VRTSource *poSource; if( psTree == NULL ) return CE_Failure; poSource = poDriver->ParseSource( psTree, NULL ); CPLDestroyXMLNode( psTree ); if( poSource != NULL ) { delete papoSources[iSource]; papoSources[iSource] = poSource; ((VRTDataset *)poDS)->SetNeedsFlush(); return CE_None; } else return CE_Failure; } else return VRTRasterBand::SetMetadataItem( pszName, pszValue, pszDomain ); }
void GDALRegister_VRT() { if( GDALGetDriverByName( "VRT" ) != NULL ) return; VRTDriver *poDriver = new VRTDriver(); poDriver->SetDescription( "VRT" ); poDriver->SetMetadataItem( GDAL_DCAP_RASTER, "YES" ); poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, "Virtual Raster" ); poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "vrt" ); poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, "gdal_vrttut.html" ); poDriver->SetMetadataItem( GDAL_DMD_CREATIONDATATYPES, "Byte Int16 UInt16 Int32 UInt32 Float32 Float64 " "CInt16 CInt32 CFloat32 CFloat64" ); poDriver->pfnOpen = VRTDataset::Open; poDriver->pfnCreateCopy = VRTCreateCopy; poDriver->pfnCreate = VRTDataset::Create; poDriver->pfnIdentify = VRTDataset::Identify; poDriver->pfnDelete = VRTDataset::Delete; poDriver->SetMetadataItem( GDAL_DMD_OPENOPTIONLIST, "<OptionList>" " <on name='ROOT_PATH' type='string' description='Root path to evaluate " "relative paths inside the VRT. Mainly useful for inlined VRT, or in-memory " "VRT, where their own directory does not make sense'/>" "</OptionList>" ); poDriver->SetMetadataItem( GDAL_DCAP_VIRTUALIO, "YES" ); poDriver->AddSourceParser( "SimpleSource", VRTParseCoreSources ); poDriver->AddSourceParser( "ComplexSource", VRTParseCoreSources ); poDriver->AddSourceParser( "AveragedSource", VRTParseCoreSources ); poDriver->AddSourceParser( "KernelFilteredSource", VRTParseFilterSources ); GetGDALDriverManager()->RegisterDriver( poDriver ); }
void GDALRegister_VRT() { VRTDriver *poDriver; if( GDALGetDriverByName( "VRT" ) == NULL ) { poDriver = new VRTDriver(); poDriver->SetDescription( "VRT" ); poDriver->SetMetadataItem( GDAL_DCAP_RASTER, "YES" ); poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, "Virtual Raster" ); poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "vrt" ); poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, "gdal_vrttut.html" ); poDriver->SetMetadataItem( GDAL_DMD_CREATIONDATATYPES, "Byte Int16 UInt16 Int32 UInt32 Float32 Float64 CInt16 CInt32 CFloat32 CFloat64" ); poDriver->pfnOpen = VRTDataset::Open; poDriver->pfnCreateCopy = VRTCreateCopy; poDriver->pfnCreate = VRTDataset::Create; poDriver->pfnIdentify = VRTDataset::Identify; poDriver->pfnDelete = VRTDataset::Delete; poDriver->SetMetadataItem( GDAL_DCAP_VIRTUALIO, "YES" ); poDriver->AddSourceParser( "SimpleSource", VRTParseCoreSources ); poDriver->AddSourceParser( "ComplexSource", VRTParseCoreSources ); poDriver->AddSourceParser( "AveragedSource", VRTParseCoreSources ); poDriver->AddSourceParser( "KernelFilteredSource", VRTParseFilterSources ); GetGDALDriverManager()->RegisterDriver( poDriver ); } }