博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
geotif格式的波段描述信息探究
阅读量:2429 次
发布时间:2019-05-10

本文共 2497 字,大约阅读时间需要 8 分钟。

作者:朱金灿

来源:

 

         有时打开一些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文件本身没有保存波段描述信息的位置。

转载地址:http://buimb.baihongyu.com/

你可能感兴趣的文章
与吴恩达并肩战斗,她是 AI 界的女超人!|人物志
查看>>
微信手机 WeOS 的可行性到底有多大?
查看>>
阿里面试,我挂在了第四轮……
查看>>
C++ 程序员到高级架构师,必须经历的三个阶段
查看>>
和 Java、C# 等语言对比后,Python 简直酷上天了!
查看>>
程序媛到最后,拼的到底是什么?
查看>>
笑死!996 程序员竟然做了这个梦!| 每日趣闻
查看>>
“再见,微软!”
查看>>
ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!
查看>>
技术引路:机器学习仍大有可为,但方向在哪里?
查看>>
漫画:如何给女朋友解释什么是编译与反编译
查看>>
刷屏了!这篇 Python 学习贴,90% 的程序员都用的上!
查看>>
漫画:如何给女朋友解释什么是适配器模式?
查看>>
程序员又迎来一个好消息! | 每日趣闻
查看>>
Mac 被曝存在恶意漏洞:黑客可随意调动摄像头,波及四百万用户!
查看>>
拒绝与其他码农一致!CSDN定制T让你成为最靓的仔
查看>>
程序员情商低?看完这 4 类程序员我懂了!
查看>>
《长安十二时辰》里你不能不知道的 IT 技术 | 每日趣闻
查看>>
程序员爬取 3 万条评论,《长安十二时辰》槽点大揭秘!
查看>>
一年参加一次就够,全新升级的 AI 开发者大会议程出炉!
查看>>