今天常识读写sentinel-2的数据。
先写上gdal支持的数据类型
GDT_Unknown : 未知数据类型
GDT_Byte : 8bit正整型 (C++中对应unsigned char)
GDT_UInt16 : 16bit正整型 (C++中对应 unsigned short)
GDT_Int16 : 16bit整型 (C++中对应 short 或 short int)
GDT_UInt32 : 32bit 正整型 (C++中对应unsigned long)
GDT_Int32 : 32bit整型 (C++中对应int 或 long 或 long int)
GDT_Float32 : 32bit 浮点型 (C++中对应float)
GDT_Float64 : 64bit 浮点型 (C++中对应double)
GDT_CInt16 : 16bit复整型 (?)
GDT_CInt32 : 32bit复整型 (?)
GDT_CFloat32 : 32bit复浮点型 (?)
GDT_CFloat64 : 64bit复浮点型 (?)
先献上代码,我读取的是sentinel2的数据,目前网上还没有找到有效的代码,不过有一个老哥的很好我在他的框架上改动了一些,就可以用了。神奇的是,我一直以为sentienl的数据是把地理信息等等和图像分开存储的,因为我用envi也好,snap也好都不能直接打开图片同时获得地理信息,打开的jp2文件只是仅仅的图片文件而已,metedata啥都没有。但是这里通过gdal打开却能
产生这种效果,明显是把地理信息都读取出来了。所以在此把代码献上。
在代码中,大部分地方都没改,只是原来读取xml只能得到部分坐标信息,后面死马当活马,想试试打开jp2偶然成功了。
from osgeo import gdal
import os
class GRID:
#读图像文件
def read_img(self,filename):
dataset=gdal.Open(filename) #打开文件
im_width = dataset.RasterXSize #栅格矩阵的列数
im_height = dataset.RasterYSize #栅格矩阵的行数
im_geotrans = dataset.GetGeoTransform() #仿射矩阵
im_proj = dataset.GetProjection() #地图投影信息
im_data = dataset.ReadAsArray(0,0,im_width,im_height)
#将数据写成数组,对应栅格矩阵
del dataset
return im_proj,im_geotrans,im_data
#写文件,以写成tif为例
def write_img(self,filename,im_proj,im_geotrans,im_data):
#gdal数据类型包括
#gdal.GDT_Byte,
#gdal .GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,
#gdal.GDT_Float32, gdal.GDT_Float64
#判断栅格数据的数据类型
if 'int8' in im_data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
#判读数组维数
if len(im_data.shape) == 3:
im_bands, im_height, im_width = im_data.shape
else:
im_bands, (im_height, im_width) = 1,im_data.shape
#创建文件
driver = gdal.GetDriverByName("GTiff")
#数据类型必须有,因为要计算需要多大内存空间
dataset = driver.Create(filename, im_width, im_height,''
''im_bands, datatype)
dataset.SetGeoTransform(im_geotrans) #写入仿射变换参数
dataset.SetProjection(im_proj) #写入投影
if im_bands == 1:
dataset.GetRasterBand(1).WriteArray(im_data) #写入数组数据
else:
for i in range(im_bands):
dataset.GetRasterBand(i+1).WriteArray(im_data[i])
del dataset
if __name__ == "__main__":
os.chdir(r'E:/yi_data/shanghai/S2A_MSIL1C_20181018T022701_N0206_R0'
'46_T51RUQ_20181018T053000.SAFE/GRANULE/L1C_'
'T51RUQ_A017346_20181018T023228/IMG_DATA')
#切换路径到待处理图像所在文件夹
run = GRID()
proj,geotrans,data = run.read_img('T51RUQ_'
'20181018T022701_B01.jp2') #读数据
print (proj)
print (geotrans)
print (data)
print (data.shape)
run.write_img('gouride.tif',proj,geotrans,data) #写数据
好了,最后顺便感谢chrome,Microsoft Edge真的是垃圾中的垃圾,粘贴个代码能崩好几次,今天开始绝对不用了
https://blog.csdn.net/vonuo/article/details/74783291
这是代码的引用来源