遥感影像免切片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
相关推荐
GIS思维17 小时前
ArcGIS定义投影与投影的区别(数据和底图不套合的原因和解决办法)
arcgis·gis·地理信息·arcgis坐标系·动态投影
duansamve1 天前
WebGIS地图框架有哪些?
javascript·gis·openlayers·cesium·mapbox·leaflet·webgis
moonless02222 天前
【GISer精英计划_01】GIS的生态位与基石
gis
WineMonk2 天前
ArcGIS Pro ADGeoProcessing DAML
arcgis·gis·arcgis pro sdk·daml
兔子小姐_3 天前
实验十三 生态安全评价
arcgis·gis
WineMonk7 天前
ArcGIS Pro ADGeoDatabase DAML
arcgis·gis·arcgis pro sdk·arcgis pro·daml
WineMonk7 天前
ArcGIS Pro ADCore DAML
arcgis·gis·arcgis pro sdk·arcgis pro·daml
山海鲸可视化9 天前
GIS融合之路(八)-如何用Cesium直接加载OSGB文件(不用转换成3dtiles)
3d·gis·数字孪生·cesium·倾斜摄影·osgb
枝上棉蛮15 天前
GISBox VS ArcGIS:分别适用于大型和小型项目的两款GIS软件
arcgis·gis·数据可视化·数据处理·地理信息系统·gis工具箱·gisbox
ReBeX17 天前
【GeoJSON在线编辑平台】(1)创建地图+要素绘制+折点编辑+拖拽移动
前端·javascript·gis·openlayers·webgis