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 文件描述
OGC 发布的 GeoTIFF 标准,版本1.1
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.java
和GeoTIFFOperator.java
,前者是读取 TIFF 文件内容的公共类,后者是 GeoTIFF 格式文件的操作类。它们的主要函数说明如下:
- TIFFContentReader.java
- readContentAsByteArray:读取 TIFF 文件内容,返回结果是二进制数组
- convert2HexAsStr:读取二进制数组指定位置的数据,并将其转为十六进制字符串
- GeoTIFFOperator.java
- readAndPrintGeoTiffContent:主函数,读取并打印 GeoTIFF 文件的内容,这里的内容都是十六进制字符串
- printIfhContent:打印 IFH 的内容
- printIfdContent:打印 IFD 的内容
- printDeContent:打印 DE 的内容
- printGeoKeyDirectoryTagInfo:打印 GeoKeyDirectoryTag 的内容
- printGeoAsciiParamsTagInfo:打印 GeoAsciiParamsTag 的内容
3.2 IFH 解析结果分析
IFH 内容的打印结果如下:
IFH中的字节顺序:4949
IFH中的标识符:2A00
IFH中第一个IFD的偏移量(十六进制,大端字节序):08000000
根据第2.1内容分析:
- 十六进制的
4949
转为 Word 类型(字符串类型)为II
,即表示小端字节序,也就说后,后续所有的读取顺序与打印的顺序是相反的; - 标识符值为
2A00
,读取结果为002A
,对应的十进制值为42
- 第一个 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
- TAG 的读取结果为
0100
,该 TAG 表示 ImageWidth,图像中的列数,即每行的像素数; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000001
,表示共1条数据; - 数据值的偏移量读取结果为
000003E9
,十进制值为1001,即该文件每行有1001个像素。
3.3.2.2 第1个DE
diff
-第1个DE的内容:
--DE中的TAG标识:0101
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:E9030000
- TAG 的读取结果为
0100
,该 TAG 表示 ImageLength,图像中像素的行数; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000001
,表示共1条数据; - 数据值的偏移量读取结果为
000003E9
,十进制值为1001,即该文件有1001行。
3.3.2.3 第2个DE
diff
-第2个DE的内容:
--DE中的TAG标识:0201
--DE中的数据类型:0300
--DE中的数据数量:03000000
--DE中的ValueOffset:CE000000
- TAG 的读取结果为
0102
,该 TAG 表示 BitsPerSample,每个分量的Bit数; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000003
,表示共3条数据; - 数据值的偏移量读取结果为
000000CE
,十进制值为206。因为该 DE 中共有3条 SHORT 类型的数据,共占用了6个字节,大于4个字节,因此该部分表示的数据值的偏移量,偏移量为206。
SHORT 类型占用2个字节,所以代码中获取了206-212的内容,打印结果如下:
第3个DE中BitsPerSample的值:100010001000
打印结果解析:
- 每个通道的像素深度为
0010
(十六进制,十进制为16),也就说,每个通道的像素为16位深度,即取值为0~65535。
3.3.2.4 第3个DE
diff
-第3个DE的内容:
--DE中的TAG标识:0301
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:01000000
- TAG 的读取结果为
0103
,表示 Compression,压缩属性; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000001
,表示共1条数据; - 数据值的偏移量读取结果为
00000001
,十进制值为1,表示没有压缩。
3.3.2.5 第4个DE
diff
-第4个DE的内容:
--DE中的TAG标识:0601
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:01000000
- TAG 的读取结果为
0106
,表示 PhotometricInterpretation,颜色空间; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000001
,表示共1条数据; - 数据值的偏移量读取结果为
00000001
,十进制值为1,表示当前颜色空间为 BlacklsZero,即:0表示黑色。
3.3.2.6 第5个DE
diff
-第5个DE的内容:
--DE中的TAG标识:1101
--DE中的数据类型:0400
--DE中的数据数量:E9030000
--DE中的ValueOffset:A6080000
- TAG 的读取结果为
0111
,表示 StripOffsets,对于每个条带,该条带的字节偏移量; - 数据类型的读取结果为
0004
,对应的数据类型为 LONG; - 数据数量的读取结果为
000003E9
,表示共1001条数据; - 数据值的偏移量读取结果为
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
- TAG 的读取结果为
0115
,表示 SamplesPerPixel,每个像素的通道数; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000001
,表示共1条数据; - 数据值的偏移量读取结果为
00000003
,十进制为3,表示每个像素有3个通道。
3.3.2.8 第7个DE
diff
-第7个DE的内容:
--DE中的TAG标识:1601
--DE中的数据类型:0300
--DE中的数据数量:01000000
--DE中的ValueOffset:01000000
- TAG 的读取结果为
0116
,表示 RowsPerStrip,每个条带有多少行; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000001
,表示共1条数据; - 数据值的偏移量读取结果为
00000001
,十进制为1,表示每个条带有1行。
3.3.2.9 第8个DE
diff
-第8个DE的内容:
--DE中的TAG标识:1701
--DE中的数据类型:0300
--DE中的数据数量:E9030000
--DE中的ValueOffset:D4000000
- TAG 的读取结果为
0117
,表示 StripByteCounts,每个条带的长度; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
000003E9
,表示共1001条数据; - 数据值的偏移量读取结果为
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
- TAG 的读取结果为
011C
,表示 PlanarConfiguration,如何存储每个像素的分量; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000001
,表示共1条数据; - 数据值的偏移量读取结果为
00000001
,十进制为1,表示 Chunky 格式,即:每个像素的分量值是连续存储的。 例如,对于RGB数据,数据存储为RGBRGBRGB。
3.3.2.11 第10个DE
diff
-第10个DE的内容:
--DE中的TAG标识:5201
--DE中的数据类型:0300
--DE中的数据数量:02000000
--DE中的ValueOffset:00000000
- TAG 的读取结果为
0152
,表示 ExtraSamples,表示额外的描述; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000002
,表示共2条数据; - 数据值的偏移量读取结果为
00000000
,十进制为0,表示未指定数据。
3.3.2.12 第11个DE
diff
-第11个DE的内容:
--DE中的TAG标识:5301
--DE中的数据类型:0300
--DE中的数据数量:03000000
--DE中的ValueOffset:4A180000
- TAG 的读取结果为
0153
,表示 SampleFormat,指定如何解释像素中的每个数据样本; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000003
,表示共3条数据; - 数据值的偏移量读取结果为
0000184A
,十进制为6218,很显然该值表示一个偏移量。
SHORT 类型占用2个字节,所以代码中获取了6218-6224的内容,打印结果如下:
第11个DE中SampleFormat的值:010001000100
打印结果解析:
- 每个通道的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
- TAG 的读取结果为
830E
,表示 ModelPixelScaleTag,用于定义栅格和模型空间之间的精确仿射变换,主要用于 GeoTIFF 文件; - 数据类型的读取结果为
000C
,十进制为12,对应的数据类型为 DOUBLE; - 数据数量的读取结果为
00000003
,表示共3条数据; - 数据值的偏移量读取结果为
00001850
,十进制为6224,很显然该值表示一个偏移量。
DOUBLE 类型占用8个字节,所以代码中获取了6224-6248的内容,打印结果如下:
第12个DE中ModelPixelScaleTag的值:000000000000244000000000000024400000000000000000
打印结果解析:
- 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
- TAG 的读取结果为
8482
,表示 ModelTiepointTag,该标签也称为 GeoreferenceTag,按顺序存储栅格->模型连接点对,模型连接点标签 =(...,I,J,K, X,Y,Z...)
,其中(I,J,K)
是栅格空间中位置(I,J)
处像素值为K
的点,(X,Y,Z)
是模型空间中的向量。 大多数情况下模型空间只是二维的,在这种情况下 K 和 Z 都应该设置为零; 提供第三个维度是为了将来支持 3D 数字高程模型和垂直坐标系; - 数据类型的读取结果为
000C
,十进制为12,对应的数据类型为 DOUBLE; - 数据数量的读取结果为
00000006
,表示共6条数据; - 数据值的偏移量读取结果为
00001868
,十进制为6248,很显然该值表示一个偏移量,具体解析详见4.4小节。
3.3.2.15 第14个DE
diff
-第14个DE的内容:
--DE中的TAG标识:AF87
--DE中的数据类型:0300
--DE中的数据数量:20000000
--DE中的ValueOffset:98180000
- TAG 的读取结果为
87AF
,表示 GeoKeyDirectoryTag,该标签也称为 ProjectionInfoTag 或者 CoordSystemInfoTag,用于存储 GeoKey 目录,该目录定义并引用"GeoKey"; - 数据类型的读取结果为
0003
,对应的数据类型为 SHORT; - 数据数量的读取结果为
00000020
,表示共32条数据; - 数据值的偏移量读取结果为
00001898
,十进制为6296,很显然该值表示一个偏移量,具体解析详见4.5小节。
3.3.2.16 第15个DE
diff
-第15个DE的内容:
--DE中的TAG标识:B187
--DE中的数据类型:0200
--DE中的数据数量:1E000000
--DE中的ValueOffset:D8180000
- TAG 的读取结果为
87B1
,表示 GeoAsciiParamsTag,用于存储由 GeoKeyDirectoryTag 引用的所有 ASCII 值 GeoKey。 由于键使用标签的偏移量,因此任何特殊注释都可以放置在该标签的开头。 在大多数情况下,唯一具有 ASCII 值的键是"引文"键,为晦涩的投影、数据等提供文档和参考; - 数据类型的读取结果为
0002
,对应的数据类型为 ASCII; - 数据数量的读取结果为
0000001E
,表示共30条数据; - 数据值的偏移量读取结果为
000018D8
,十进制为6360,很显然该值表示一个偏移量。
3.3.3 GeoKeyDirectoryTag 信息分析
该信息在第14个 DE 中
首先来看该信息的打印结果。因为有32条数据,每条数据都是 SHORT 类型(2字节),因此共占用了32 * 2=64个字节,所以该信息的偏移量为6296~(6296 + 64),具体打印结果为:
0100010000000700000400000100010001040000010001000204B187160000000108B187070016000608000001008E23000C00000100777F040C000001002923
- GeoKeyDirectory 标头分析
根据3.1节内容,标头共有4个值,每个值都是 SHORT 类型,共占8个字节,因此其内容为0100,0100,0000,0700
(其中,
只是为了更好区分),其中:
- 第1个值为版本号,读取的值为
0001
,十进制为1; - 第2个值为键集修订版本号,读取的值为
0001
; - 第3个值为键码修订版本号,读取的值为
0000
; - 第4个值为键的数目,读取值为
0007
,十进制为7,表示共有7组键的记录集。
- 第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 中确认一下。
- 第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的描述,该值表示光栅像素是区域(不太明白)。
- 第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位。
- 第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位。
- 第5组键的记录集
第5组键的记录集为0608,0000,0100,8E23
,其中:
- 第1个值为_键 ID_,读取的值为
0806
,十进制为2054,具体描述参照3.1.1.2小节; - 第2个值为_标记位置_,读取的值为
0000
,十进制为0,即指为_偏移_; - 第3个值为_计数_,读取的值为
0001
,十进制为1; - 第4个值为_偏移_,读取的值为
238E
,十进制为9102。
- 第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
投影坐标系。
- 第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
- GeoKeyDirectory 第3组键的值
在4.4节中,第3组键的值为GeoAsciiParamsTag
标记值的第0-21位,打印的值如下,对应的字符串为WGS 84 / UTM zone 31N|
。
GeoKeyDirectoryTag第3组键的值:574753203834202F2055544D207A6F6E652033314E7C
- GeoKeyDirectory 第4组键的记录集
在4.4节中,第4组键的值为GeoAsciiParamsTag
标记值的第22-29位,打印的值如下,对应的字符串为WGS 84|
。
GeoKeyDirectoryTag第4组键的值:5747532038347C