利用python将多个jp2格式转为tif格式(GF等影像)
**注意:**由于jp2无坐标参考系,因此结果无空间参考,需要进行jp2附带的rpb做校正即可得到有参考系的tif结果。
具体代码如下(亲测可用):
不会代码的可以下载下面链接的exe,双击即可得到处理结果。
jp2格式转为tif格式只需一秒(sentinel、GF等影像)
```python
# -*- coding: utf-8 -*-
from osgeo import gdal, osr, ogr
import glob
#利用GDAL读取jp2并转换为tif
def S2tif(filename):
# 打开栅格数据集
print(filename)
root_ds = gdal.Open(filename)
print(root_ds)
print(type(root_ds))
# 返回结果是一个list,list中的每个元素是一个tuple,每个tuple中包含了对数据集的路径,元数据等的描述信息
# tuple中的第一个元素描述的是数据子集的全路径
# ds_list = root_ds.GetSubDatasets() # 获取子数据集。该数据以数据集形式存储且以子数据集形式组织
# visual_ds = gdal.Open(ds_list) # 打开第1个数据子集的路径。ds_list有4个子集,内部前段是路径,后段是数据信息
visual_arr = root_ds.ReadAsArray() # 将数据集中的数据读取为ndarray
print('array')
print(visual_arr)
print(visual_arr.shape)
# 创建.tif文件
band_count = root_ds.RasterCount # 波段数
print(band_count)
xsize = root_ds.RasterXSize
ysize = root_ds.RasterYSize
print(xsize)
print(ysize)
print(root_ds.GetGeoTransform())
out_tif_name = filename[:-4] + ".tif"
driver = gdal.GetDriverByName("GTiff")
out_tif = driver.Create(out_tif_name, xsize, ysize, band_count, gdal.GDT_Int16)
out_tif.SetProjection(root_ds.GetProjection()) # 设置投影坐标
# data_set.SetGeoTransform(GeoTransform)
# out_tif.GetGeoTransform(root_ds.GetGeoTransform())
if band_count>1:
for i in range(band_count):
# 数据写出
out_tif.GetRasterBand(i + 1).WriteArray(visual_arr[i]) # 将每个波段的数据写入内存,此时没有写入硬盘
else:
out_tif.GetRasterBand(1).WriteArray(visual_arr)
out_tif.FlushCache() # 最终将数据写入硬盘
out_tif = None # 注意必须关闭tif文件
if __name__ == "__main__":
#只需修改下方jp2路径,自动识别jp2文件
SAFE_Path = (r'D:\中科星图\地面站数据\GF1D_2mTDICCD2_MYC_202103231227_202103231236_90')
data_list = glob.glob(SAFE_Path + "\\*.JP2")
#filename = ('E:\\RSDATA\\Sentinel2\\L2A\\S2A_MSIL2A_20210220T024731_N9999_R132_T51STA_20210306T024402.SAFE\\MTD_MSIL2A.xml')
for i in range(len(data_list)):
data_path = data_list[i]
file_name=data_path
print(file_name)
xml_name = data_path[:-4] + ".xml"
# get_geo(xml_name)
S2tif(file_name)
print(data_path + "-----转tif成功")
print("----转换结束----")