• geotif格式的波段描述信息探究


    作者:朱金灿

    来源: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文件本身没有保存波段描述信息的位置。

  • 相关阅读:
    PhoenixFD插件流体模拟——UI布局【Dynamics】详解
    Altera三速以太网IP核使用(下篇)之千兆网接口设计与使用
    FPGA之千兆网接口设计与使用(不调用IP核,适用于Alter与Xilinx,简单粗暴实现udp协议封装)
    基于Matlab Hdl Coder实现FPGA程序开发(卡尔曼滤波算法实现)
    FPGA之SSI接口协议实现
    FPGA之BISS接口协议实现
    Xilinx DDR2 IP核使用
    FFT IP核调用与仿真之SCALE压缩因子设置
    Quartus/Modelsim调试仿真技巧
    FPGA之CORDIC算法实现_代码实现(下)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470169.html
Copyright © 2020-2023  润新知