地图瓦片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个值。