作者:朱金灿

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

geotif格式的波段描述信息探究的更多相关文章

  1. 文件系统的描述信息-/etc/fstab

    /etc/fstab文件包含众多文件系统的描述信息.文件中每一行为一个文件系统的描述,每行的选项之间通过tab分隔,#开头的行会被转换为注释,空白行会被忽略./etc/fstab文件中的设备顺序很重要 ...

  2. MVC中得到成员元数据的Description特性描述信息公用方法

    #region 从类型成员获取指定的Attribute T特性集合 /// <summary> /// 从类型成员获取指定的Attribute T特性集合 /// </summary ...

  3. 简析Geoserver中获取图层列表以及各图层描述信息的三种方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 实际项目中需要获取到Geoserver中的图层组织以及各图层 ...

  4. .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法

    一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显 ...

  5. 利用DescriptionAttribute定义枚举值的描述信息 z

    System.ComponentModel命名空间下有个名为DescriptionAttribute的类用于指定属性或事件的说明,我所调用的枚举值描述信息就是DescriptionAttribute类 ...

  6. C# 读取枚举描述信息实例

    using System;using System.Collections;using System.Collections.Generic;using System.Linq;using Syste ...

  7. dedecms 获取描述信息限制字数

    对于我刚刚刚开始对于获取到了描述的信息,但是有些字数简直是太多了,显示的样式不好看,所以我就希望限制字数,所以我来告诉你们获取描述信息限制字数的语法吧[field:description functi ...

  8. SqlServer创建数据表描述及列描述信息

    SqlServer创建数据表描述及列描述信息 Intro Q: 为什么要创建描述信息? A: 鼠标悬停在对应表和列上时,会出现描述信息,可以提高工作的效率,借助工具我们根据数据表可以生成Model,可 ...

  9. delphi XE Datasnap SERVER 在windows 7 下为服务添加描述信息

    网上对服务添加描述信息的,多数是用注册表的方式,而注册表的方式,我在win7 下测试,不知为什么,总是不行,把执行的CMD以管理员模式开启,还是没加进去. 于是在网上查到下面的代码,保存供叁考,原文博 ...

随机推荐

  1. Ubuntu14.04下tensorflow安装

    自己电脑没装双系统,于是决定在虚拟机里装个tensorflow,以下是安装过程: 1.安装anaconda2 for Linux 官网下的话很慢,去清华的镜像网站下吧,我上一篇文章有网址 安装:bas ...

  2. mcustomscrollbar滚动条美化插件

    mCustomScrollbar 是个基于 jQuery UI 的自定义滚动条插件,它可以让你灵活的通过 CSS 定义网页的滚动条,并且垂直和水平两个方向的滚动条都可以定义,它通过 Brandon A ...

  3. mysql优化篇之表分区

             当表的数据量达到一定数量时(如单个.myd文件都达到10G,myd 是mysql的数据文件),这时候读取起来必然效率很低.          1.从业务角度可以解决(分表)      ...

  4. appium 模拟实现物理按键点击

    appium自动化测试中,当确认,搜索,返回等按键通过定位点击不好实现的时候,可以借助物理按键来实现.appium支持以下物理按键模拟: 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ ...

  5. 理解JavaScript Call()函数原理。

    最近在做面试题的过程中偶然碰到关于call函数的问题.然后再百度上查了查.偶然看到一篇文章:JavaScript中的call.apply.bind深入理解 抛开其对call函数基本概念的介绍还有其他原 ...

  6. Centos7不修改默认交换分区下添加交换分区

    交换分区介绍 Linux系统中的交换分区是当物理内存(RAM)被充满时,作为物理内存的缓存来使用. 当系统需要更多的内存资源而物理内存已经充满,内存中不活跃的页就会被移动到交换分区上. 交换分区位于硬 ...

  7. 【UVa 12563】Jin Ge Jin Qu hao

    [Link]: [Description] KTV给你T秒的唱歌时间; 你有n首一定要唱的歌; 然后有一首很变态的歌有678s,你想在T秒结束之前唱一下这首歌; 因为这样的话,你能尽量晚地走出KTV( ...

  8. mysql(for update)悲观锁总结与实践

    悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制( ...

  9. ArcGIS api for javascript——以地理处理结果为条件查询地图

    这里发生什么任务呢?当第一次单击地图,单击的坐标被发送到一个Geoprocessor任务.该任务访问服务器上的通过ArcGIS Server 地理处理服务提供的可用的GIS模型.本例中模型计算驱动时间 ...

  10. URAL 1823. Ideal Gas(数学啊 )

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1823 1823. Ideal Gas Time limit: 0.5 second Me ...