遥感影像免切片10:COG文件结构解析

584 阅读23分钟

1. 概述

我们在之前的三篇文章中了解了什么是 COG 影像以及它所依赖的2项核心技术,那么在这篇文章中在之前读取 GeoTIFF 文件结构的代码上简单调整一下,来看一下 COG 示例影像的结构具体是怎样的吧。
前面的三篇文章分别是:
遥感影像免切片7:Cloud Optimized GeoTIFF 简介
遥感影像免切片9:范围请求(Range Request)
0401 | 范围请求(Range Request)

2. COG 文件结构

2.1 示例数据

示例数据为示例代码的/resources/files文件夹下的 COG.tif 文件,大小为 13721580 字节,具体位置如下:
image.png

2.2 第1个 IFD

第1个 IFD 起始偏移量8,DE 个数占用字节2,DE 内容占用字节12 * 20(当前 IFD 的 DE 的个数) = 240,下一个DE的偏移量占用字节4,因此,在当前 IFD 中的 TAG 的值的第一个偏移量应该为8+2+240+4=254

序号TAG数据类型数据值个数数据值偏移量
1IMAGE_WIDTHSHORT1-
2IMAGE_LENGTHSHORT1-
3BITS_PER_SAMPLESHORT3254
4COMPRESSIONSHORT1-
5PHOTO_INTERPRETATIONSHORT1-
6SAMPLES_PER_PIXELSHORT1-
7PLANAR_CONFIGURATIONSHORT1-
8TILE_WIDTHSHORT1-
9TILE_LENGTHSHORT1-
10TILE_COUNTSLONG390260
(254 + 2*3)
11TILE_OFFSETSLONG3901820
(260 + 4*390)
12SAMPLE_FORMATSHORT33380
(1820 + 4*390)
13REFERENCE_BLACK_WHITERATIONAL63386
(3380 + 2*3)
14JPEG_TABLESUNDEFINED1423434
(3386 + 8*6)
15GDAL_METADATAASCII11713576
(3434 + 1*142)
16MODEL_PIXEL_SCALEDOUBLE34748
(3576 + 1*1171)
17MODEL_TIEPOINTDOUBLE64772
(4748 + 8*3)
18GEO_KEY_DIRECTORYSHORT324820
(4772 + 8*6)
19GEO_ASCII_PARAMSASCII304884
(4820 + 2*32)
20YCBCR_SUB_SAMPLINGSHORT2131074

TILE_COUNTS 内容

[1664, 18011, 19736, 20084, 18160, 16315, 14802, 15338, 7884, 1664, 1664, 1664, 1664, 1664, 1664, 3796, 25357, 30039, 29771, 29516, 26963, 27515, 27553, 29293, 27948, 24865, 27595, 24788, 19151, 1784, 21465, 35071, 36784, 35905, 29409, 26092, 25310, 25570, 29591, 29798, 26678, 30232, 17758, 30753, 3253, 29824, 31449, 33862, 37231, 25270, 28068, 24150, 20873, 25702, 27592, 28410, 29030, 32333, 25546, 2695, 29284, 27380, 37443, 22499, 23070, 19308, 21335, 20891, 22809, 27406, 28456, 30163, 31623, 26718, 1815, 32664, 26022, 34104, 24140, 26484, 18747, 22111, 23524, 25148, 21299, 26694, 32015, 27367, 23247, 1664, 32087, 29260, 28991, 30033, 19006, 15665, 15792, 20022, 22375, 19433, 26629, 30336, 27991, 21359, 1664, 21807, 29793, 30719, 27159, 23143, 15757, 17652, 23588, 25161, 23164, 26847, 29768, 28002, 20635, 1664, 19006, 29965, 36378, 25986, 25024, 22434, 19270, 20828, 21790, 25659, 26923, 29929, 28760, 27109, 1664, 18438, 30049, 31208, 25404, 23522, 34085, 29460, 33942, 32426, 20878, 26376, 30309, 25612, 17685, 1664, 13960, 25495, 37225, 28939, 20666, 28918, 21275, 33839, 40666, 18696, 25892, 28316, 28059, 17142, 1664, 11852, 25538, 36138, 27482, 17678, 29564, 22471, 39036, 40461, 18541, 23799, 27814, 30628, 21456, 1664, 9991, 29068, 33854, 23561, 11840, 30138, 23502, 31691, 28759, 19805, 27036, 32153, 29942, 18509, 1664, 9221, 28921, 35397, 31393, 18412, 30219, 20669, 39190, 42037, 21446, 26303, 31971, 33823, 11978, 1664, 9898, 28243, 38364, 33920, 20606, 28600, 24977, 27653, 39699, 25379, 30981, 34028, 34568, 13903, 1664, 8654, 29929, 33980, 30337, 25571, 29900, 33994, 32917, 34460, 29897, 29412, 36617, 35534, 13214, 1664, 5645, 29698, 35181, 37092, 25024, 25945, 27446, 26182, 30032, 28645, 30604, 34152, 36924, 14381, 1664, 9917, 35900, 29844, 36829, 26731, 25017, 21308, 23646, 24916, 21921, 27964, 32708, 31911, 23005, 1664, 10098, 35916, 28305, 38411, 28383, 23324, 20002, 24710, 27523, 22494, 29000, 38626, 37903, 13318, 1664, 5991, 28669, 28532, 39737, 26102, 29371, 23206, 23209, 28260, 20832, 26700, 32186, 35066, 15235, 1664, 6029, 26792, 32055, 43080, 24770, 26683, 21696, 20812, 27825, 25845, 28244, 34427, 36796, 13797, 1664, 4719, 27043, 30529, 35274, 31857, 30139, 28025, 27535, 29260, 27378, 32046, 38354, 38459, 17022, 1664, 4820, 24255, 32582, 30750, 29084, 25939, 27766, 29610, 28676, 32950, 33803, 26977, 36473, 12147, 1664, 2833, 26846, 25955, 24824, 23116, 21565, 21864, 27836, 28644, 28596, 30277, 18590, 21557, 1664, 1664, 1700, 25510, 25143, 22862, 20644, 13155, 13136, 17942, 20319, 23466, 22383, 24785, 8533, 1664, 1664, 1664, 1664, 2782, 2278, 2808, 1664, 1664, 6585, 4653, 1664, 1664, 1664, 1664, 1664, 1664]

TILE_OFFSETS 内容

[4619566, 4621230, 4639241, 4658977, 4679061, 4697221, 4713536, 4728338, 4743676, 4751560, 4753224, 4754888, 4756552, 4758216, 4759880, 4761544, 4765340, 4790697, 4820736, 4850507, 4880023, 4906986, 4934501, 4962054, 4991347, 5019295, 5044160, 5071755, 5096543, 5115694, 5117478, 5138943, 5174014, 5210798, 5246703, 5276112, 5302204, 5327514, 5353084, 5382675, 5412473, 5439151, 5469383, 5487141, 5517894, 5521147, 5550971, 5582420, 5616282, 5653513, 5678783, 5706851, 5731001, 5751874, 5777576, 5805168, 5833578, 5862608, 5894941, 5920487, 5923182, 5952466, 5979846, 6017289, 6039788, 6062858, 6082166, 6103501, 6124392, 6147201, 6174607, 6203063, 6233226, 6264849, 6291567, 6293382, 6326046, 6352068, 6386172, 6410312, 6436796, 6455543, 6477654, 6501178, 6526326, 6547625, 6574319, 6606334, 6633701, 6656948, 6658612, 6690699, 6719959, 6748950, 6778983, 6797989, 6813654, 6829446, 6849468, 6871843, 6891276, 6917905, 6948241, 6976232, 6997591, 6999255, 7021062, 7050855, 7081574, 7108733, 7131876, 7147633, 7165285, 7188873, 7214034, 7237198, 7264045, 7293813, 7321815, 7342450, 7344114, 7363120, 7393085, 7429463, 7455449, 7480473, 7502907, 7522177, 7543005, 7564795, 7590454, 7617377, 7647306, 7676066, 7703175, 7704839, 7723277, 7753326, 7784534, 7809938, 7833460, 7867545, 7897005, 7930947, 7963373, 7984251, 8010627, 8040936, 8066548, 8084233, 8085897, 8099857, 8125352, 8162577, 8191516, 8212182, 8241100, 8262375, 8296214, 8336880, 8355576, 8381468, 8409784, 8437843, 8454985, 8456649, 8468501, 8494039, 8530177, 8557659, 8575337, 8604901, 8627372, 8666408, 8706869, 8725410, 8749209, 8777023, 8807651, 8829107, 8830771, 8840762, 8869830, 8903684, 8927245, 8939085, 8969223, 8992725, 9024416, 9053175, 9072980, 9100016, 9132169, 9162111, 9180620, 9182284, 9191505, 9220426, 9255823, 9287216, 9305628, 9335847, 9356516, 9395706, 9437743, 9459189, 9485492, 9517463, 9551286, 9563264, 9564928, 9574826, 9603069, 9641433, 9675353, 9695959, 9724559, 9749536, 9777189, 9816888, 9842267, 9873248, 9907276, 9941844, 9955747, 9957411, 9966065, 9995994, 10029974, 10060311, 10085882, 10115782, 10149776, 10182693, 10217153, 10247050, 10276462, 10313079, 10348613, 10361827, 10363491, 10369136, 10398834, 10434015, 10471107, 10496131, 10522076, 10549522, 10575704, 10605736, 10634381, 10664985, 10699137, 10736061, 10750442, 10752106, 10762023, 10797923, 10827767, 10864596, 10891327, 10916344, 10937652, 10961298, 10986214, 11008135, 11036099, 11068807, 11100718, 11123723, 11125387, 11135485, 11171401, 11199706, 11238117, 11266500, 11289824, 11309826, 11334536, 11362059, 11384553, 11413553, 11452179, 11490082, 11503400, 11505064, 11511055, 11539724, 11568256, 11607993, 11634095, 11663466, 11686672, 11709881, 11738141, 11758973, 11785673, 11817859, 11852925, 11868160, 11869824, 11875853, 11902645, 11934700, 11977780, 12002550, 12029233, 12050929, 12071741, 12099566, 12125411, 12153655, 12188082, 12224878, 12238675, 12240339, 12245058, 12272101, 12302630, 12337904, 12369761, 12399900, 12427925, 12455460, 12484720, 12512098, 12544144, 12582498, 12620957, 12637979, 12639643, 12644463, 12668718, 12701300, 12732050, 12761134, 12787073, 12814839, 12844449, 12873125, 12906075, 12939878, 12966855, 13003328, 13015475, 13017139, 13019972, 13046818, 13072773, 13097597, 13120713, 13142278, 13164142, 13191978, 13220622, 13249218, 13279495, 13298085, 13319642, 13321306, 13322970, 13324670, 13350180, 13375323, 13398185, 13418829, 13431984, 13445120, 13463062, 13483381, 13506847, 13529230, 13554015, 13562548, 13564212, 13565876, 13567540, 13569204, 13571986, 13574264, 13577072, 13578736, 13580400, 13586985, 13591638, 13593302, 13594966, 13596630, 13598294, 13599958]

GDAL_METADATA 内容

<GDALMetadata>
  <Item name="STATISTICS_MAXIMUM" sample="0">255</Item>
  <Item name="STATISTICS_MEAN" sample="0">75.541972798736</Item>
  <Item name="STATISTICS_MINIMUM" sample="0">0</Item>
  <Item name="STATISTICS_STDDEV" sample="0">53.011680475165</Item>
  <Item name="DESCRIPTION" sample="0" role="description">red</Item>
  <Item name="COLORINTERP" sample="0" role="colorinterp">Red</Item>
  <Item name="STATISTICS_MAXIMUM" sample="1">255</Item>
  <Item name="STATISTICS_MEAN" sample="1">82.628006678577</Item>
  <Item name="STATISTICS_MINIMUM" sample="1">0</Item>
  <Item name="STATISTICS_STDDEV" sample="1">51.846054023259</Item>
  <Item name="DESCRIPTION" sample="1" role="description">green</Item>
  <Item name="COLORINTERP" sample="1" role="colorinterp">Green</Item>
  <Item name="STATISTICS_MAXIMUM" sample="2">255</Item>
  <Item name="STATISTICS_MEAN" sample="2">74.704202123496</Item>
  <Item name="STATISTICS_MINIMUM" sample="2">0</Item>
  <Item name="STATISTICS_STDDEV" sample="2">58.60685884744</Item>
  <Item name="DESCRIPTION" sample="2" role="description">blue</Item>
  <Item name="COLORINTERP" sample="2" role="colorinterp">Blue</Item>
</GDALMetadata>

GEO_KEY_DIRECTORY 内容

-- GEO_KEY_DIRECTORY属性信息:
---- KeyDirectoryVersion:1
---- Revision:1.0
---- NumberOfKeys:7
---- 第1个GeoKey的KeyID:1024(GT_MODEL_TYPE_GEO_KEY),数据值:1(表示投影坐标系)
---- 第2个GeoKey的KeyID:1025(GT_RASTER_TYPE_GEO_KEY),数据值:1(表示RasterPixellsArea)
---- 第3个GeoKey的KeyID:1026(GT_CITATION_GEO_KEY),数据值:WGS 84 / UTM zone 50N
---- 第4个GeoKey的KeyID:2049(GEO_CITATION_GEO_KEY),数据值:WGS 84|
---- 第5个GeoKey的KeyID:2054(GEO_ANGULAR_UNITS_GEO_KEY),数据值:1
---- 第6个GeoKey的KeyID:3072(PROJECTED_CS_TYPE_GEO_KEY),数据值:1
---- 第7个GeoKey的KeyID:3076(PROJ_LINEAR_UNITS_GEO_KEY),数据值:1

2.3 第2个IFD

第2个 IFD 的偏移量为4914(4884 + 1*30),DE 个数占用字节2,DE 内容占用字节12 * 14(当前 IFD 的 DE 的个数) = 168,下一个DE的偏移量占用字节4,因此,在当前 IFD 中的 TAG 的值的第一个偏移量应该为4914+2+168+4=5088

序号TAG数据类型数据值个数数据值偏移量
1NEW_SUBFILE_TYPELONG1-
2IMAGE_WIDTHSHORT1-
3IMAGE_LENGTHSHORT1-
4BITS_PER_SAMPLESHORT1-
5COMPRESSIONSHORT1-
6PHOTO_INTERPRETATIONSHORT1-
7SAMPLES_PER_PIXELSHORT1-
8PLANAR_CONFIGURATIONSHORT1-
9TIFF_PREDICTORSHORT1-
10TILE_WIDTHSHORT1-
11TILE_LENGTHSHORT1-
12TILE_COUNTSLONG3905088
13TILE_OFFSETSLONG3906648
(5088 + 4*390)
14SAMPLE_FORMATSHORT1-

2.4 第3个IFD

第3个 IFD 的偏移量为8208(6648 + 4*390),DE 个数占用字节2,DE 内容占用字节12 * 16(当前 IFD 的 DE 的个数) = 192,下一个DE的偏移量占用字节4,因此,在当前 IFD 中的 TAG 的值的第一个偏移量应该为8208+2+192+4=8406

序号TAG数据类型数据值个数数据值偏移量
1NEW_SUBFILE_TYPELONG1-
2IMAGE_WIDTHSHORT1-
3IMAGE_LENGTHSHORT1-
4BITS_PER_SAMPLESHORT38406
5COMPRESSIONSHORT1-
6PHOTO_INTERPRETATIONSHORT1-
7SAMPLES_PER_PIXELSHORT1-
8PLANAR_CONFIGURATIONSHORT1-
9TILE_WIDTHSHORT1-
10TILE_LENGTHSHORT1-
11TILE_COUNTSLONG1048412
(8406 + 2*3)
12TILE_OFFSETSLONG1048828
(8412 + 4*104)
13SAMPLE_FORMATSHORT39244
(8828 + 4*104)
14REFERENCE_BLACK_WHITERATIONAL69250
(9244 + 2*3)
15JPEG_TABLESUNDEFINED1429298
(9250 + 8*6)
16YCBCR_SUB_SAMPLINGSHORT2131074

2.5 第4个IFD

第4个 IFD 的偏移量为9440(9298 + 1*142),DE 个数占用字节2,DE 内容占用字节12 * 16(当前 IFD 的 DE 的个数) = 192,下一个DE的偏移量占用字节4,因此,在当前 IFD 中的 TAG 的值的第一个偏移量应该为9440+2+192+4=9638

序号TAG数据类型数据值个数数据值偏移量
1NEW_SUBFILE_TYPELONG1-
2IMAGE_WIDTHSHORT1-
3IMAGE_LENGTHSHORT1-
4BITS_PER_SAMPLESHORT39638
5COMPRESSIONSHORT1-
6PHOTO_INTERPRETATIONSHORT1-
7SAMPLES_PER_PIXELSHORT1-
8PLANAR_CONFIGURATIONSHORT1-
9TILE_WIDTHSHORT1-
10TILE_LENGTHSHORT1-
11TILE_COUNTSLONG289644
(9638 + 2*3)
12TILE_OFFSETSLONG289756
(9644 + 4*28)
13SAMPLE_FORMATSHORT39868
(9756 + 4*28)
14REFERENCE_BLACK_WHITERATIONAL69874
(9868 + 2*3)
15JPEG_TABLESUNDEFINED1429922
(9874 + 8*6)
16YCBCR_SUB_SAMPLINGSHORT2131074

2.6 其他 IFD 内容

其他 IFD 的解析结构与第3个、第4个 IFD 结构内容类似,本篇文章中不在过多赘述了,感兴趣的朋友可以运行示例代码自行查验。

3. 各IFD瓦片个数以及对应的起始偏移量汇总

序号IFD序号图像宽度图像高度瓦片大小
(正方形)
瓦片个数
(水平)
瓦片个数
(垂直)
瓦片
个数
起始瓦片偏移量瓦片总字节数
172254035121111335029565
212225403512111429151682
364498065121224459787354
4114498065121221319513981
558981611512248135932299342
610898161151224843527410331
74179532215124728445605981234
89179532215124728142683923246
933590644151281310414500853117077
10835906441512813104456716252404
111718012882512152639046195668982056
122718012882512152639013601622119958

4. 总结

根据第2章节、第3章节的内容,我们不难得出如下结论:

  1. COG 影像将所有的属性信息放在数据前面,并且数据从低缩放等级的缩略图开始,原始数据位于文件末尾
    1. 最后一个 IFD 的偏移量为13176,总共有14个 DE,并且每个 DE 的值均在其内部表示,因此,最后一个 IFD 的占用字节总数为:2 + 12*14 * 4 = 174,而13176 + 174 = 13350,正好是第1个 IFD 中第1个瓦片的偏移量
    2. 根据第3章的表格可以看出,按照序号递增的顺序,每一个 IFD 的瓦片起始偏移量均是上一个 IFD 的瓦片起始偏移量 + 瓦片总字节数。最后一个 IFD 的起始偏移量和其瓦片字节总数之和正好是示例文件的字节大小(13601622 + 119958 = 13721580)。
  2. COG 影像在组织数据时,先组织缩略图(Overviews),最后组织原始数据。在组织缩略图时,从原始数据开始,每创建一层缩略图,其大小都是在上一层数据的基础上上除以2,一直到缩略图图像的宽度和高度均小于瓦片的宽度和高度时停止。