1. 概述
我们在之前的三篇文章中了解了什么是 COG 影像以及它所依赖的2项核心技术,那么在这篇文章中在之前读取 GeoTIFF 文件结构的代码上简单调整一下,来看一下 COG 示例影像的结构具体是怎样的吧。
前面的三篇文章分别是:
遥感影像免切片7:Cloud Optimized GeoTIFF 简介
遥感影像免切片9:范围请求(Range Request)
0401 | 范围请求(Range Request)
2. COG 文件结构
2.1 示例数据
示例数据为示例代码的/resources/files文件夹下的 COG.tif 文件,大小为 13721580 字节,具体位置如下:
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 | 数据类型 | 数据值个数 | 数据值偏移量 |
|---|---|---|---|---|
| 1 | IMAGE_WIDTH | SHORT | 1 | - |
| 2 | IMAGE_LENGTH | SHORT | 1 | - |
| 3 | BITS_PER_SAMPLE | SHORT | 3 | 254 |
| 4 | COMPRESSION | SHORT | 1 | - |
| 5 | PHOTO_INTERPRETATION | SHORT | 1 | - |
| 6 | SAMPLES_PER_PIXEL | SHORT | 1 | - |
| 7 | PLANAR_CONFIGURATION | SHORT | 1 | - |
| 8 | TILE_WIDTH | SHORT | 1 | - |
| 9 | TILE_LENGTH | SHORT | 1 | - |
| 10 | TILE_COUNTS | LONG | 390 | 260 (254 + 2*3) |
| 11 | TILE_OFFSETS | LONG | 390 | 1820 (260 + 4*390) |
| 12 | SAMPLE_FORMAT | SHORT | 3 | 3380 (1820 + 4*390) |
| 13 | REFERENCE_BLACK_WHITE | RATIONAL | 6 | 3386 (3380 + 2*3) |
| 14 | JPEG_TABLES | UNDEFINED | 142 | 3434 (3386 + 8*6) |
| 15 | GDAL_METADATA | ASCII | 1171 | 3576 (3434 + 1*142) |
| 16 | MODEL_PIXEL_SCALE | DOUBLE | 3 | 4748 (3576 + 1*1171) |
| 17 | MODEL_TIEPOINT | DOUBLE | 6 | 4772 (4748 + 8*3) |
| 18 | GEO_KEY_DIRECTORY | SHORT | 32 | 4820 (4772 + 8*6) |
| 19 | GEO_ASCII_PARAMS | ASCII | 30 | 4884 (4820 + 2*32) |
| 20 | YCBCR_SUB_SAMPLING | SHORT | 2 | 131074 |
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 | 数据类型 | 数据值个数 | 数据值偏移量 |
|---|---|---|---|---|
| 1 | NEW_SUBFILE_TYPE | LONG | 1 | - |
| 2 | IMAGE_WIDTH | SHORT | 1 | - |
| 3 | IMAGE_LENGTH | SHORT | 1 | - |
| 4 | BITS_PER_SAMPLE | SHORT | 1 | - |
| 5 | COMPRESSION | SHORT | 1 | - |
| 6 | PHOTO_INTERPRETATION | SHORT | 1 | - |
| 7 | SAMPLES_PER_PIXEL | SHORT | 1 | - |
| 8 | PLANAR_CONFIGURATION | SHORT | 1 | - |
| 9 | TIFF_PREDICTOR | SHORT | 1 | - |
| 10 | TILE_WIDTH | SHORT | 1 | - |
| 11 | TILE_LENGTH | SHORT | 1 | - |
| 12 | TILE_COUNTS | LONG | 390 | 5088 |
| 13 | TILE_OFFSETS | LONG | 390 | 6648 (5088 + 4*390) |
| 14 | SAMPLE_FORMAT | SHORT | 1 | - |
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 | 数据类型 | 数据值个数 | 数据值偏移量 |
|---|---|---|---|---|
| 1 | NEW_SUBFILE_TYPE | LONG | 1 | - |
| 2 | IMAGE_WIDTH | SHORT | 1 | - |
| 3 | IMAGE_LENGTH | SHORT | 1 | - |
| 4 | BITS_PER_SAMPLE | SHORT | 3 | 8406 |
| 5 | COMPRESSION | SHORT | 1 | - |
| 6 | PHOTO_INTERPRETATION | SHORT | 1 | - |
| 7 | SAMPLES_PER_PIXEL | SHORT | 1 | - |
| 8 | PLANAR_CONFIGURATION | SHORT | 1 | - |
| 9 | TILE_WIDTH | SHORT | 1 | - |
| 10 | TILE_LENGTH | SHORT | 1 | - |
| 11 | TILE_COUNTS | LONG | 104 | 8412 (8406 + 2*3) |
| 12 | TILE_OFFSETS | LONG | 104 | 8828 (8412 + 4*104) |
| 13 | SAMPLE_FORMAT | SHORT | 3 | 9244 (8828 + 4*104) |
| 14 | REFERENCE_BLACK_WHITE | RATIONAL | 6 | 9250 (9244 + 2*3) |
| 15 | JPEG_TABLES | UNDEFINED | 142 | 9298 (9250 + 8*6) |
| 16 | YCBCR_SUB_SAMPLING | SHORT | 2 | 131074 |
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 | 数据类型 | 数据值个数 | 数据值偏移量 |
|---|---|---|---|---|
| 1 | NEW_SUBFILE_TYPE | LONG | 1 | - |
| 2 | IMAGE_WIDTH | SHORT | 1 | - |
| 3 | IMAGE_LENGTH | SHORT | 1 | - |
| 4 | BITS_PER_SAMPLE | SHORT | 3 | 9638 |
| 5 | COMPRESSION | SHORT | 1 | - |
| 6 | PHOTO_INTERPRETATION | SHORT | 1 | - |
| 7 | SAMPLES_PER_PIXEL | SHORT | 1 | - |
| 8 | PLANAR_CONFIGURATION | SHORT | 1 | - |
| 9 | TILE_WIDTH | SHORT | 1 | - |
| 10 | TILE_LENGTH | SHORT | 1 | - |
| 11 | TILE_COUNTS | LONG | 28 | 9644 (9638 + 2*3) |
| 12 | TILE_OFFSETS | LONG | 28 | 9756 (9644 + 4*28) |
| 13 | SAMPLE_FORMAT | SHORT | 3 | 9868 (9756 + 4*28) |
| 14 | REFERENCE_BLACK_WHITE | RATIONAL | 6 | 9874 (9868 + 2*3) |
| 15 | JPEG_TABLES | UNDEFINED | 142 | 9922 (9874 + 8*6) |
| 16 | YCBCR_SUB_SAMPLING | SHORT | 2 | 131074 |
2.6 其他 IFD 内容
其他 IFD 的解析结构与第3个、第4个 IFD 结构内容类似,本篇文章中不在过多赘述了,感兴趣的朋友可以运行示例代码自行查验。
3. 各IFD瓦片个数以及对应的起始偏移量汇总
| 序号 | IFD序号 | 图像宽度 | 图像高度 | 瓦片大小 (正方形) | 瓦片个数 (水平) | 瓦片个数 (垂直) | 瓦片 个数 | 起始瓦片偏移量 | 瓦片总字节数 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 7 | 225 | 403 | 512 | 1 | 1 | 1 | 13350 | 29565 |
| 2 | 12 | 225 | 403 | 512 | 1 | 1 | 1 | 42915 | 1682 |
| 3 | 6 | 449 | 806 | 512 | 1 | 2 | 2 | 44597 | 87354 |
| 4 | 11 | 449 | 806 | 512 | 1 | 2 | 2 | 131951 | 3981 |
| 5 | 5 | 898 | 1611 | 512 | 2 | 4 | 8 | 135932 | 299342 |
| 6 | 10 | 898 | 1611 | 512 | 2 | 4 | 8 | 435274 | 10331 |
| 7 | 4 | 1795 | 3221 | 512 | 4 | 7 | 28 | 445605 | 981234 |
| 8 | 9 | 1795 | 3221 | 512 | 4 | 7 | 28 | 1426839 | 23246 |
| 9 | 3 | 3590 | 6441 | 512 | 8 | 13 | 104 | 1450085 | 3117077 |
| 10 | 8 | 3590 | 6441 | 512 | 8 | 13 | 104 | 4567162 | 52404 |
| 11 | 1 | 7180 | 12882 | 512 | 15 | 26 | 390 | 4619566 | 8982056 |
| 12 | 2 | 7180 | 12882 | 512 | 15 | 26 | 390 | 13601622 | 119958 |
4. 总结
根据第2章节、第3章节的内容,我们不难得出如下结论:
- COG 影像将所有的属性信息放在数据前面,并且数据从低缩放等级的缩略图开始,原始数据位于文件末尾
- 最后一个 IFD 的偏移量为13176,总共有14个 DE,并且每个 DE 的值均在其内部表示,因此,最后一个 IFD 的占用字节总数为:2 + 12*14 * 4 = 174,而13176 + 174 = 13350,正好是第1个 IFD 中第1个瓦片的偏移量
- 根据第3章的表格可以看出,按照序号递增的顺序,每一个 IFD 的瓦片起始偏移量均是上一个 IFD 的瓦片起始偏移量 + 瓦片总字节数。最后一个 IFD 的起始偏移量和其瓦片字节总数之和正好是示例文件的字节大小(13601622 + 119958 = 13721580)。
- COG 影像在组织数据时,先组织缩略图(Overviews),最后组织原始数据。在组织缩略图时,从原始数据开始,每创建一层缩略图,其大小都是在上一层数据的基础上上除以2,一直到缩略图图像的宽度和高度均小于瓦片的宽度和高度时停止。