作者:朱金灿
来源:http://blog.csdn.net/clever101
有时打开一些geotif文件,可以看到它的波段描述,但是它究竟存储在文件的什么位置呢?今天研究了一下,大致搞清了这个问题。
我首先搜索了一下geotif的格式说明,没有找到它的存储波段描述的tag,稍微和它接近的tag是TIFFTAG_IMAGEDESCRIPTION,但这个是存放整幅图像的描述信息的。
既然在它的格式说明中没有找到,我就研究下gdal是怎么解决这个问题的。找到相关的一段代码:
if( TIFFGetField( hTIFF, TIFFTAG_GDAL_METADATA, &pszText ) ) { CPLXMLNode *psRoot = CPLParseXMLString( pszText ); CPLXMLNode *psItem = NULL; if( psRoot != NULL && psRoot->eType == CXT_Element && EQUAL(psRoot->pszValue,"GDALMetadata") ) psItem = psRoot->psChild; for( ; psItem != NULL; psItem = psItem->psNext ) { const char *pszKey, *pszValue, *pszRole, *pszDomain; char *pszUnescapedValue; int nBand, bIsXML = FALSE; if( psItem->eType != CXT_Element || !EQUAL(psItem->pszValue,"Item") ) continue; pszKey = CPLGetXMLValue( psItem, "name", NULL ); pszValue = CPLGetXMLValue( psItem, NULL, NULL ); nBand = atoi(CPLGetXMLValue( psItem, "sample", "-1" )) + 1; pszRole = CPLGetXMLValue( psItem, "role", "" ); pszDomain = CPLGetXMLValue( psItem, "domain", "" ); if( pszKey == NULL || pszValue == NULL ) continue; if( EQUALN(pszDomain,"xml:",4) ) bIsXML = TRUE; pszUnescapedValue = CPLUnescapeString( pszValue, NULL, CPLES_XML ); if( nBand == 0 ) { if( bIsXML ) { char *apszMD[2] = { pszUnescapedValue, NULL }; SetMetadata( apszMD, pszDomain ); } else SetMetadataItem( pszKey, pszUnescapedValue, pszDomain ); } else { GDALRasterBand *poBand = GetRasterBand(nBand); if( poBand != NULL ) { if( EQUAL(pszRole,"scale") ) poBand->SetScale( CPLAtofM(pszUnescapedValue) ); else if( EQUAL(pszRole,"offset") ) poBand->SetOffset( CPLAtofM(pszUnescapedValue) ); else if( EQUAL(pszRole,"unittype") ) poBand->SetUnitType( pszUnescapedValue ); else if( EQUAL(pszRole,"description") ) poBand->SetDescription( pszUnescapedValue );
从上面一段代码可以看出,gdal库读取geotif文件的波段描述是从它的元数据文件中读取的,也就是说geotif文件本身没有保存波段描述信息的位置。