地图瓦片PNG8格式理解

地图切片后的格式是单波段的png格式。

利用gdal读取该文件,看下文件结构:

band = gdal.Open(filepath).GetRasterBand(1)

band.ReadAsArray()

array([[217, 217, 217, ..., 217, 217, 217], [217, 217, 217, ..., 217, 217, 217], [217, 217, 217, ..., 217, 217, 217], ..., [243, 146, 78, ..., 217, 217, 217], [238, 86, 32, ..., 217, 217, 217], [166, 78, 0, ..., 217, 217, 217]], dtype=uint8)

len(band.ReadAsArray())
Out[161]: 256

  说明该图片是一个256*256大小的图片。最大值是243.

import numpy as np

np.max(band.ReadAsArray())
Out[163]: 243

  这个数组看上去像是灰度图片,实际是只是颜色表的索引值。

颜色表是什么呢:

[band.GetColorTable().GetColorEntry(i) for i in range(244)]
Out[158]: 
[(171, 198, 239, 255),
 (177, 199, 234, 255),
 (177, 200, 237, 255),
 (180, 203, 239, 255),
 (181, 205, 241, 255),
 (182, 201, 229, 255),
 (182, 203, 235, 255),
 (186, 205, 237, 255),
 (187, 202, 224, 255),
 (187, 205, 234, 255),
 (187, 207, 239, 255),
 (189, 208, 239, 255),
 (190, 210, 241, 255),

  颜色表,存储的就是颜色值了,上面例子以RGB格式存储,

(171, 198, 239, 255) R=171 G=198 B=239 最后一个255没用到
所以,上表有244个颜色值,序号为[0,243]
这里的243和上面的栅格数组最大值243刚好对应。

下面补全一张颜色表,第一列是索引值。


至此,想明白了这个PNG的数据结构:索引表+颜色表。
索引表就是ReadAsArray()方法返回的数组,索引表的值就是来自颜色表的第一列。
array([[217, 217, 217, ..., 217, 217, 217],
       [217, 217, 217, ..., 217, 217, 217],
       [217, 217, 217, ..., 217, 217, 217],
       ...,
       [243, 146,  78, ..., 217, 217, 217],
       [238,  86,  32, ..., 217, 217, 217],
       [166,  78,   0, ..., 217, 217, 217]], dtype=uint8)
例如,数组中的 217 就是颜色表中的第217个值。


posted @ 2020-03-13 18:15  xiaomozi  阅读(818)  评论(0编辑  收藏  举报