遥感影像免切片3:GeoTIFF 文件结构

1. 概述

数字化地图、卫星影像和航空影像等图像文件可以采用不同的格式,为了在 GIS 软件中能够使用此类图像,就必须包含地理配准信息。对于许多图像类型(例如:TIFF 和 JPEG),地理配准信息包含在额外的文件中,例如:.tfw 文件或者 .jfw 文件。 GeoTIFF,英文全称是 Geographic Tagged Image File Format,是开放地理空间联盟(Open Geospatial Consortium, OGC)实施标准,是 TIFF 的一种扩展,用作地理参考栅格图像的交换格式,航空图像、卫星图像、数字高程模型等都是 GeoTIFF 文件的一些示例。GeoTIFF 在 TIFF 的基础上定义了一些 GeoTag(地理标签),从而实现对各种坐标系统、椭球基准、投影信息等进行定义和存储,使得图像数据和地理数据存储在同一图像文件中。 GeoTIFF 文件可能附带其他文件:

  • *.tfw 文件:提供地理位置,但绝大多数情况下不再需要该文件
  • *.xml 文件:GeoTIFF 文件的元数据,大多出现在原始影像中
  • *.aux 文件:存储投影和其他信息的辅助文件
  • *.ovr:金字塔文件,可以提供影像文件的显示速度

TIFF 文件描述

遥感影像免切片1:TIFF 文件结构

OGC 发布的 GeoTIFF 标准,版本1.1

OGC GeoTIFF Standard.pdf

2. TIFF 和 JPEG 图像文件存储地理配准信息的方式

以 JPEG 图像文件为例

在光学原始卫星影像中,一般都会提供*.jpw文件,以 GF1B_PMS 原始影像为例,它除了提供<文件名>_MUX.tiff文件以外,也提供了<文件名_MUX.jpg><文件名_MUX.jpw>文件。如果在 ArcMap 中依次打开 TIFF 文件和 JPG 文件,你会发现,它们基本可以重合在一起;如果删除<文件名>_MUX.jpw文件,则会发现 JPG 文件不能正确的定位。 打开 JPW 文件,其内容如下:

diff 复制代码
0.000299184071201538
-0.0000585703287133816
-0.0000639702633068812
-0.000272718634182381
105.020989957873
24.9829246988689

其中:

  • 第1行表示 X 方向的像素大小
  • 第2行、第3行是旋转分量,以左上像素为旋转点,负值代表顺时针旋
  • 第4行表示 Y 方向像素分辨率(几乎总是负值)
  • 第5行、第6行时图像左上像素的坐标

GeoTFF 文件结构

GeoTIFF 文件结构与 TIFF 文件结构是一致的,相对于 TIFF 文件,GeoTIFF 文件主要增加了 Geo 开头几个 TAG。实际过程中,为了节省 TIFF 预留的标签资源,GeoTIFF 使用了 GeoKeys 来组织众多空间参数,所有的 GeoKeys 由 GeoKeyDirectoryTag 来索引。下面就来介绍几个重要的 GeoTIFF 文件新增的 TAG。

2.1 GeoKeyDirectoryTag

GeoKeyDirectoryTag 又可成为 ProjectionTag、CoorSystemInfoTag,从别名上仿佛能够更清晰理解该 TAG 的作用。该标签主要用来存储 GeoKey 目录,该目录定义并引用了 GeoKeys。和该 TAG 相关联的 TAG 为 GeoDoubleParamsTag 和 GeoAsciiParamsTag。 GeoKeyDirectoryTag 的值最少为4个,其中:

  • 第1个值表示版本号,始终为1;
  • 第2个值表示键集修订版本号;
  • 第3个值表示键码修订版本号;
  • 第4个值表示键的数目;
  • 后续的值4个为一组,为键的记录集,依次为_键ID_、标记位置计数偏移

2.1.1 键ID

2.1.1.1 GeoTIFF 的配置键

  • 1024:模型类型代码,定义习惯的模型坐标系的一般类型。值为1表示投影坐标系,值为2表示地理经纬系,值为3表示地心(X,Y,Z)坐标系;
  • 1025:光栅类型代码,建立习惯的光栅空间坐标系统。值为1表示光栅像素是区域,值为2表示光散像素是点;
  • 1026:文档,和所有的"引证"键一起,该键只要给出一个ASCII参考到基于这个文件的全部配置的发表文档。

2.1.1.2 地理坐标系参数键

  • 2048:地理类型代码。指出采用哪一个地理坐标系统;
  • 2049:文档,适用于所有的地理坐标系参数的一般的引文和参考;
  • 2050:大地基准点代码;
  • 2051:本初子午线代码;
  • 2052:线性单位代码;
  • 2053:线性单位大小,单位为米;
  • 2054:有角的单位代码,允许定义自定义的GCS和椭圆体的地心坐标系线性单位;
  • 2056:椭圆体代码,这个键可以用来指定地理坐标系的大地基准点里的椭圆体的编码;
  • 2057:提供自定义椭圆体Semi-Major轴(a)的规格;
  • 2058:提供自定义椭圆体Semi-Major轴(b)的规格;
  • 2059:提供自定义的椭圆体的扁率参数(f)的Inverse的规格,值为比率;
  • 2061:本初子午线长。这个键提供自定义的本初子午线的定义,位置由他的相对于格林威治的经度定义。

2.1.1.3 投影坐标系参数键

  • 3072:投影坐标系类型代码;
  • 3073:文档,和所有的"引证"键一起,该键只要给出一个ASCII参考到投影坐标系上的发表文档,特别的如果这是一个自定义的PCS。

2.1.1.4 投影定义的键

  • 2060:方位角单位代码。这个键可以用来指定在地里坐标系里,测量法的有角的单位,用去定义方位;
  • 3074:投影编码;
  • 3075:坐标转换编码;
  • 3076:线性单位编码;
  • 3077:定义自定义线性单位的尺寸,单位为米;
  • 3078:首要标准纬线的维度;
  • 3079:第二标准纬线的维度;
  • 3080:地图投影自然原点的经度;
  • 3081:地图投影自然原点的纬度;
  • 3082:给出地图投影自然原点的东向坐标;
  • 3083:给出地图投影自然原点的北向坐标;
  • 3084:给出伪原点的经度;
  • 3085:给出伪原点的纬度;
  • 3086:给出伪原点的东向坐标;
  • 3087:给出伪原点的北向坐标;
  • 3088:投影的中心的经度;
  • 3089:投影的中心的纬度;
  • 3090:给出中心的东向坐标;
  • 3091:给出中心的北向坐标;
  • 3092:自然原点的比率;
  • 3093:在中心的比率;
  • 3094:经过投影中心的中心线的真北的东方的方位角;
  • 3095:在直线垂直极点的经度。

2.1.1.5 垂直坐标系的键

  • 4096:垂直坐标系类型代码;
  • 4097:文档,该键用于垂直坐标系统和它的参数的文档;
  • 4098:垂直坐标系数据编码;
  • 4099:线性单位编码。

2.1.2 标记位置

  • 如果值为0,则它的值就是_偏移_;
  • 如果值为34736,则表示值的类型为 DOUBLE,具体值为 GeoDoubleParamsTag 标记的第_偏移_值;
  • 如果值为34737,则表示值的类型为字符串,具体值为 GeoAsciiParamsTag 标记的值,从_偏移_开始,长度为_计数_。

2.2 GeoAsciiParamsTag

GeoAsciiParamsTag 标记的值为字符串,样式为xxxx|xxxx|xxxx,GeoKeyDirectorTag 通过_计数_和_偏移量_确定具体的字符串,末尾的|符号转为\0

3. 实例说明

3.1 示例文件及代码说明

3.1.1 示例代码获取

从 Gitee 上克隆示例代码,访问地址:gitee.com/shixxa/tiff...。安装 POM 依赖后,运行 Main.java 文件即可。 示例代码所用的内容及版本如下:

  • JDK 1.8
  • Maven 3.8.5

3.1.2 示例文件说明

示例文件存放在src/main/resource文件中,名称为GeoTIFF.tif,示意图如下:

3.1.3 示例代码简要说明

本文档的相关代码文件主要是TIFFContentReader.javaGeoTIFFOperator.java,前者是读取 TIFF 文件内容的公共类,后者是 GeoTIFF 格式文件的操作类。它们的主要函数说明如下:

  1. TIFFContentReader.java
    1. readContentAsByteArray:读取 TIFF 文件内容,返回结果是二进制数组
    2. convert2HexAsStr:读取二进制数组指定位置的数据,并将其转为十六进制字符串
  2. GeoTIFFOperator.java
    1. readAndPrintGeoTiffContent:主函数,读取并打印 GeoTIFF 文件的内容,这里的内容都是十六进制字符串
    2. printIfhContent:打印 IFH 的内容
    3. printIfdContent:打印 IFD 的内容
    4. printDeContent:打印 DE 的内容
    5. printGeoKeyDirectoryTagInfo:打印 GeoKeyDirectoryTag 的内容
    6. printGeoAsciiParamsTagInfo:打印 GeoAsciiParamsTag 的内容

3.2 IFH 解析结果分析

IFH 内容的打印结果如下:

复制代码
IFH中的字节顺序:4949
IFH中的标识符:2A00
IFH中第一个IFD的偏移量(十六进制,大端字节序):08000000

根据第2.1内容分析:

  1. 十六进制的4949转为 Word 类型(字符串类型)为II,即表示小端字节序,也就说后,后续所有的读取顺序与打印的顺序是相反的;
  2. 标识符值为2A00,读取结果为002A,对应的十进制值为42
  3. 第一个 IFD 的偏移量为08000000,读取结果为000000CA,对应的十进制值为8,表示第一个 IFD 的内容从读取结果的第8位开始。

3.3 IFD及DE解析结果分析

3.3.1 IFD 中 DE 的数量

第一个 IFD 中的 DE 的数量打印结果如下:

复制代码
第一个IFD中的DE的数量(十六进制,大端字节序):1000

打印结果对应的读取顺序为0010,对应的十进制值为16,表示该 IFD 共有16个DE。

3.3.2 IFD 中的 DE 解析结果

从上一步可以得到,第一个 IFD 共有16个 DE,接下来逐个分析其中的内容。

3.3.2.1 第0个DE

diff 复制代码
-第0个DE的内容:
--DE中的TAG标识:0001
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:E9030000
  1. TAG 的读取结果为0100,该 TAG 表示 ImageWidth,图像中的列数,即每行的像素数;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000001,表示共1条数据;
  4. 数据值的偏移量读取结果为000003E9,十进制值为1001,即该文件每行有1001个像素。

3.3.2.2 第1个DE

diff 复制代码
-第1个DE的内容:
--DE中的TAG标识:0101
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:E9030000
  1. TAG 的读取结果为0100,该 TAG 表示 ImageLength,图像中像素的行数;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000001,表示共1条数据;
  4. 数据值的偏移量读取结果为000003E9,十进制值为1001,即该文件有1001行。

3.3.2.3 第2个DE

diff 复制代码
-第2个DE的内容:
--DE中的TAG标识:0201
--DE中的数据类型:0300
--DE中的数据数量:03000000
--DE中的ValueOffset:CE000000
  1. TAG 的读取结果为0102,该 TAG 表示 BitsPerSample,每个分量的Bit数;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000003,表示共3条数据;
  4. 数据值的偏移量读取结果为000000CE,十进制值为206。因为该 DE 中共有3条 SHORT 类型的数据,共占用了6个字节,大于4个字节,因此该部分表示的数据值的偏移量,偏移量为206。

SHORT 类型占用2个字节,所以代码中获取了206-212的内容,打印结果如下:

复制代码
第3个DE中BitsPerSample的值:100010001000

打印结果解析:

  1. 每个通道的像素深度为0010(十六进制,十进制为16),也就说,每个通道的像素为16位深度,即取值为0~65535。

3.3.2.4 第3个DE

diff 复制代码
-第3个DE的内容:
--DE中的TAG标识:0301
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:01000000
  1. TAG 的读取结果为0103,表示 Compression,压缩属性;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000001,表示共1条数据;
  4. 数据值的偏移量读取结果为00000001,十进制值为1,表示没有压缩。

3.3.2.5 第4个DE

diff 复制代码
-第4个DE的内容:
--DE中的TAG标识:0601
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:01000000
  1. TAG 的读取结果为0106,表示 PhotometricInterpretation,颜色空间;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000001,表示共1条数据;
  4. 数据值的偏移量读取结果为00000001,十进制值为1,表示当前颜色空间为 BlacklsZero,即:0表示黑色。

3.3.2.6 第5个DE

diff 复制代码
-第5个DE的内容:
--DE中的TAG标识:1101
--DE中的数据类型:0400
--DE中的数据数量:E9030000
--DE中的ValueOffset:A6080000
  1. TAG 的读取结果为0111,表示 StripOffsets,对于每个条带,该条带的字节偏移量;
  2. 数据类型的读取结果为0004,对应的数据类型为 LONG;
  3. 数据数量的读取结果为000003E9,表示共1001条数据;
  4. 数据值的偏移量读取结果为000008A6,十进制为2214,显然这个值表示的是偏移量。考虑到该值内容太长,不在文档中展示了,可以在代码中查看。

**PS: **2214 + 1001*4 = 6218,正好是第11个 DE 值的偏移量。

3.3.2.7 第6个DE

diff 复制代码
-第6个DE的内容:
--DE中的TAG标识:1501
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:03000000
  1. TAG 的读取结果为0115,表示 SamplesPerPixel,每个像素的通道数;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000001,表示共1条数据;
  4. 数据值的偏移量读取结果为00000003,十进制为3,表示每个像素有3个通道。

3.3.2.8 第7个DE

diff 复制代码
-第7个DE的内容:
--DE中的TAG标识:1601
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:01000000
  1. TAG 的读取结果为0116,表示 RowsPerStrip,每个条带有多少行;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000001,表示共1条数据;
  4. 数据值的偏移量读取结果为00000001,十进制为1,表示每个条带有1行。

3.3.2.9 第8个DE

diff 复制代码
-第8个DE的内容:
--DE中的TAG标识:1701
--DE中的数据类型:0300
--DE中的数据数量:E9030000
--DE中的ValueOffset:D4000000
  1. TAG 的读取结果为0117,表示 StripByteCounts,每个条带的长度;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为000003E9,表示共1001条数据;
  4. 数据值的偏移量读取结果为000000D4,十进制为212,该值代表的是一个偏移量。考虑到该值内容太长,不在文档中展示了,可以在代码中查看。

**PS: **212 + 1001*2 = 2214,正好是第5个 DE 值的偏移量。

3.3.2.10 第9个DE

diff 复制代码
-第9个DE的内容:
--DE中的TAG标识:1C01
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:01000000
  1. TAG 的读取结果为011C,表示 PlanarConfiguration,如何存储每个像素的分量;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000001,表示共1条数据;
  4. 数据值的偏移量读取结果为00000001,十进制为1,表示 Chunky 格式,即:每个像素的分量值是连续存储的。 例如,对于RGB数据,数据存储为RGBRGBRGB。

3.3.2.11 第10个DE

diff 复制代码
-第10个DE的内容:
--DE中的TAG标识:5201
--DE中的数据类型:0300
--DE中的数据数量:02000000
--DE中的ValueOffset:00000000
  1. TAG 的读取结果为0152,表示 ExtraSamples,表示额外的描述;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000002,表示共2条数据;
  4. 数据值的偏移量读取结果为00000000,十进制为0,表示未指定数据。

3.3.2.12 第11个DE

diff 复制代码
-第11个DE的内容:
--DE中的TAG标识:5301
--DE中的数据类型:0300
--DE中的数据数量:03000000
--DE中的ValueOffset:4A180000
  1. TAG 的读取结果为0153,表示 SampleFormat,指定如何解释像素中的每个数据样本;
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000003,表示共3条数据;
  4. 数据值的偏移量读取结果为0000184A,十进制为6218,很显然该值表示一个偏移量。

SHORT 类型占用2个字节,所以代码中获取了6218-6224的内容,打印结果如下:

复制代码
第11个DE中SampleFormat的值:010001000100

打印结果解析:

  1. 每个通道的SampleFormat的值0001(十六进制,十进制为1),unsigned integer data,即无符号整型数据。

**PS:**6218 + 3*2 = 6224,正好是第12个 DE 的偏移量。

3.3.2.13 第12个DE

diff 复制代码
-第12个DE的内容:
--DE中的TAG标识:0E83
--DE中的数据类型:0C00
--DE中的数据数量:03000000
--DE中的ValueOffset:50180000
  1. TAG 的读取结果为830E,表示 ModelPixelScaleTag,用于定义栅格和模型空间之间的精确仿射变换,主要用于 GeoTIFF 文件;
  2. 数据类型的读取结果为000C,十进制为12,对应的数据类型为 DOUBLE;
  3. 数据数量的读取结果为00000003,表示共3条数据;
  4. 数据值的偏移量读取结果为00001850,十进制为6224,很显然该值表示一个偏移量。

DOUBLE 类型占用8个字节,所以代码中获取了6224-6248的内容,打印结果如下:

复制代码
第12个DE中ModelPixelScaleTag的值:000000000000244000000000000024400000000000000000

打印结果解析:

  1. ScaleX、SacleY 的值均为0000000000002440,读取值为4024000000000000,转为 Double 类型的值为10,在 ArcMap 中验证结果如下;ScaleZ 值为0000000000000000,Double 类型的值为 0。

**PS:**6224 + 8*3 = 6248,正好对应第13个 DE 值的偏移量。

3.3.2.14 第13个DE

diff 复制代码
-第13个DE的内容:
--DE中的TAG标识:8284
--DE中的数据类型:0C00
--DE中的数据数量:06000000
--DE中的ValueOffset:68180000
  1. TAG 的读取结果为8482,表示 ModelTiepointTag,该标签也称为 GeoreferenceTag,按顺序存储栅格->模型连接点对,模型连接点标签 = (...,I,J,K, X,Y,Z...),其中 (I,J,K) 是栅格空间中位置(I,J)处像素值为 K 的点,(X,Y,Z) 是模型空间中的向量。 大多数情况下模型空间只是二维的,在这种情况下 K 和 Z 都应该设置为零; 提供第三个维度是为了将来支持 3D 数字高程模型和垂直坐标系;
  2. 数据类型的读取结果为000C,十进制为12,对应的数据类型为 DOUBLE;
  3. 数据数量的读取结果为00000006,表示共6条数据;
  4. 数据值的偏移量读取结果为00001868,十进制为6248,很显然该值表示一个偏移量,具体解析详见4.4小节。

3.3.2.15 第14个DE

diff 复制代码
-第14个DE的内容:
--DE中的TAG标识:AF87
--DE中的数据类型:0300
--DE中的数据数量:20000000
--DE中的ValueOffset:98180000
  1. TAG 的读取结果为87AF,表示 GeoKeyDirectoryTag,该标签也称为 ProjectionInfoTag 或者 CoordSystemInfoTag,用于存储 GeoKey 目录,该目录定义并引用"GeoKey";
  2. 数据类型的读取结果为0003,对应的数据类型为 SHORT;
  3. 数据数量的读取结果为00000020,表示共32条数据;
  4. 数据值的偏移量读取结果为00001898,十进制为6296,很显然该值表示一个偏移量,具体解析详见4.5小节。

3.3.2.16 第15个DE

diff 复制代码
-第15个DE的内容:
--DE中的TAG标识:B187
--DE中的数据类型:0200
--DE中的数据数量:1E000000
--DE中的ValueOffset:D8180000
  1. TAG 的读取结果为87B1,表示 GeoAsciiParamsTag,用于存储由 GeoKeyDirectoryTag 引用的所有 ASCII 值 GeoKey。 由于键使用标签的偏移量,因此任何特殊注释都可以放置在该标签的开头。 在大多数情况下,唯一具有 ASCII 值的键是"引文"键,为晦涩的投影、数据等提供文档和参考;
  2. 数据类型的读取结果为0002,对应的数据类型为 ASCII;
  3. 数据数量的读取结果为0000001E,表示共30条数据;
  4. 数据值的偏移量读取结果为000018D8,十进制为6360,很显然该值表示一个偏移量。

3.3.3 GeoKeyDirectoryTag 信息分析

该信息在第14个 DE 中

首先来看该信息的打印结果。因为有32条数据,每条数据都是 SHORT 类型(2字节),因此共占用了32 * 2=64个字节,所以该信息的偏移量为6296~(6296 + 64),具体打印结果为:

复制代码
0100010000000700000400000100010001040000010001000204B187160000000108B187070016000608000001008E23000C00000100777F040C000001002923
  1. GeoKeyDirectory 标头分析

根据3.1节内容,标头共有4个值,每个值都是 SHORT 类型,共占8个字节,因此其内容为0100,0100,0000,0700(其中,只是为了更好区分),其中:

  • 第1个值为版本号,读取的值为0001,十进制为1;
  • 第2个值为键集修订版本号,读取的值为0001
  • 第3个值为键码修订版本号,读取的值为0000
  • 第4个值为键的数目,读取值为0007,十进制为7,表示共有7组键的记录集。
  1. 第1组键的记录集

根据3.1节内容,每组记录集共有4个值,每个值都是 SHORT 类型,共占8个字节,因此第1组键的记录集为0004,0000,0100,0100,其中:

  • 第1个值为_键 ID_,读取的值为0400,十进制为1024,具体描述参照3.1.1.1小节;
  • 第2个值为_标记位置_,读取的值为00000,十进制为0,也就说,该记录的值就为_偏移_;
  • 第3个值为_计数_,读取的值为0001,十进制为1;
  • 第4个值为_偏移_,读取的值为0001,十进制为1,参照3.1.1.1的描述,该值表述的为投影坐标系,可以在 ArcMap 中确认一下。
  1. 第2组键的记录集

第2组键的记录集为0104,0000,0100,0100,其中:

  • 第1个值为_键 ID_,读取的值为0401,十进制为1025,具体描述参照3.1.1.1小节;
  • 第2个值为_标记位置_,读取的值为00000,十进制为0,也就说,该记录的值就为_偏移_;
  • 第3个值为_计数_,读取的值为0001,十进制为1;
  • 第4个值为_偏移_,读取的值为0001,十进制为1,参照3.1.1.1的描述,该值表示光栅像素是区域(不太明白)。
  1. 第3组键的记录集

第3组键的记录集为0204,B187,1600,0000,其中:

  • 第1个值为_键 ID_,读取的值为0402,十进制为1026,具体描述参照3.1.1.1小节;
  • 第2个值为_标记位置_,读取的值为87B1,十进制为34737,参照3.1.2小节,该值的类型为字符串,也就是对应的GeoAsciiParamsTag;
  • 第3个值为_计数_,读取的值为0016,十进制为22;
  • 第4个值为_偏移_,读取的值为0000,十进制为0,也就是说,该值的内容为GeoAsciiParamsTag标记值的第0-22位。
  1. 第4组键的记录集

第4组键的记录集为0108,B187,0700,1600,其中:

  • 第1个值为_键 ID_,读取的值为0801,十进制为2049,具体描述参照3.1.1.2小节,文档,适用于所有的地理坐标系参数的一般的引文和参考;
  • 第2个值为_标记位置_,读取的值为87B1,十进制为34737,参照3.1.2小节,该值的类型为字符串,也就是对应的GeoAsciiParamsTag;
  • 第3个值为_计数_,读取的值为0007,十进制为7;
  • 第4个值为_偏移_,读取的值为0016,十进制为22,也就是说,该值的内容为GeoAsciiParamsTag标记值的第22-29位。
  1. 第5组键的记录集

第5组键的记录集为0608,0000,0100,8E23,其中:

  • 第1个值为_键 ID_,读取的值为0806,十进制为2054,具体描述参照3.1.1.2小节;
  • 第2个值为_标记位置_,读取的值为0000,十进制为0,即指为_偏移_;
  • 第3个值为_计数_,读取的值为0001,十进制为1;
  • 第4个值为_偏移_,读取的值为238E,十进制为9102。
  1. 第6组键的记录集

第6组键的记录集为000C,0000,0100,777F,其中:

  • 第1个值为_键 ID_,读取的值为0C00,十进制为3072,具体描述参照3.1.1.3小节;
  • 第2个值为_标记位置_,读取的值为0000,十进制为0,即指为_偏移_;
  • 第3个值为_计数_,读取的值为0001,十进制为1;
  • 第4个值为_偏移_,读取的值为7F77,十进制为32631,表示WGS 1984 UTM Zone 31N投影坐标系。
  1. 第7组键的记录集

第7组键的记录集为040C,0000,0100,2923,其中:

  • 第1个值为_键 ID_,读取的值为0C04,十进制为3076,具体描述参照3.1.1.3小节;
  • 第2个值为_标记位置_,读取的值为0000,十进制为0,即指为_偏移_;
  • 第3个值为_计数_,读取的值为0001,十进制为1;
  • 第4个值为_偏移_,读取的值为2329,十进制为9001,表示线性单位编码Linear_Meter

3.3.4 GeoAsciiParamsTag 信息分析

该信息在第15个 DE 中,其中,偏移量6360刚好等于6296 + 64

首先来看该信息的打印结果。因为有30条数据,每条数据都是 ASCII 类型(8字节),因此共占用了30 * 8=240个字节,所以该信息的偏移量为6360~(6360 + 240),具体打印结果为:

复制代码
574753203834202F2055544D207A6F6E652033314E7C5747532038347C000000000000001F032B024A011403220242010B031C0244011F031D0242011F031A0243011E031C023701150314023D01130319023D0113031A02380113031E0249010E032002440114031E02420114031D0246011D0315024D011903180241011503220248010C031B023C011A0322023D011B0316024701140318023F012303210230011B031D0237011903190239012603210240012303270243010803240242011F0325024C01190324023A01140321024201140319023D011F031E0234010E0325023101120327023C012B031E023F01
  1. GeoKeyDirectory 第3组键的值

在4.4节中,第3组键的值为GeoAsciiParamsTag标记值的第0-21位,打印的值如下,对应的字符串为WGS 84 / UTM zone 31N|

复制代码
GeoKeyDirectoryTag第3组键的值:574753203834202F2055544D207A6F6E652033314E7C
  1. GeoKeyDirectory 第4组键的记录集

在4.4节中,第4组键的值为GeoAsciiParamsTag标记值的第22-29位,打印的值如下,对应的字符串为WGS 84|

复制代码
GeoKeyDirectoryTag第4组键的值:5747532038347C
相关推荐
ct9782 天前
Cesium高级特效与着色器开发全指南
前端·gis·cesium·着色器
葱明撅腚4 天前
shapely空间数据分析
python·pandas·gis·shapely
极海拾贝5 天前
秒加在线底图!天地图、高德地图、星图地球、吉林一号底图一次配齐,收藏这篇就够了!
arcgis·gis·geoscene
ct9785 天前
Cesium 矩阵系统详解
前端·线性代数·矩阵·gis·webgl
两点王爷5 天前
KML文件格式和支持添加的内容
gis
水静川流6 天前
GIS工具、POI数据、DEM数据、NDVI数据等地学大数据
arcgis·gis·poi·dem·地学大数据
GIS遥遥8 天前
2026年地信测绘遥感(3S)专业升学、就业、考证、竞赛专属日历
gis·gis开发·测绘·地图可视化
酬勤-人间道8 天前
XPlote3DGenie 2.1.1.0:实用 3D 数据处理工具,百度网盘可直接安装
c++·3d·gis·编程·计算机软件·岩土
GISBox8 天前
GIS场景透明度贴图全流程指南:模型导入、透明模式设置与3DTiles服务发布
3d·gis·gisbox·透明度贴图·opaque·alphatest·alphablend