Sentinel-2A/B数据预处理之观测角度数据导出

本文介绍了如何使用Python和GDAL库解析哨兵二号S2B_MSIL1C数据中的角度信息,包括天顶角、方位角和观测角,并将这些数据转换为tif影像格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近分析了下哨兵二号数据,其角度数据让我烦不胜烦,写一个小程序将角度数据导出来为tif影像。
一、角度数据来源
 在类似下面S2B_MSIL1C_20180112T025049_N0206_R132_T50RPV_20180112T062213.SAFE\GRANULE\L1C_T50RPV_A004448_20180112T025254\MTD_TL.xml地址的文件中保存有哨兵数据的观测角度信息,但打开来是这样的:

在这里插入图片描述看的人头皮发麻
二、tif角度数据生成
我用的是python程序
导入库:

from osgeo import gdal
import numpy as np
import xmltodict

提取经纬度坐标信息,使用任何一个样例文件位置:

path=r'S2B_MSIL1C_20180112T025049_N0206_R132_T50RPV_20180112T062213.SAFE\GRANULE\L1C_T50RPV_A004448_20180112T025254\IMG_DATA\T50RPV_20180112T025049_B02.jp2'#影像位置
root = gdal.Open(path)
Proj = root.GetProjection()
geotrans = root.GetGeoTransform()
im_geotrns = (geotrans[0],5000.0,geotrans[2],geotrans[3],geotrans[4],-5000.0)#调整分辨率为5000m
#坐标投影信息获取完毕

#导出数据为字典
xml_file=r'S2B_MSIL1C_20180112T025049_N0206_R132_T50RPV_20180112T062213.SAFE\GRANULE\L1C_T50RPV_A004448_20180112T025254\MTD_TL.xml'
    with open(xml_file, encoding="UTF-8") as xml_file1:
            parsed_data = xmltodict.parse(xml_file1.read())
            xml_file1.close()
vzn_m=int(float(parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Mean_Viewing_Incidence_Angle_List"]["Mean_Viewing_Incidence_Angle"][1]["ZENITH_ANGLE"]["#text"]))
vaz_m=int(float(parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Mean_Viewing_Incidence_Angle_List"]["Mean_Viewing_Incidence_Angle"][1]["AZIMUTH_ANGLE"]["#text"]))
szn_m=int(float(parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Mean_Sun_Angle"]["ZENITH_ANGLE"]["#text"]))
saz_m=int(float(parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Mean_Sun_Angle"]["AZIMUTH_ANGLE"]["#text"]))
#导出4个角度数据的均值(其路径位置都一样)
#导出4个单独角数据
"""
注意
除太阳天顶角与方位角,其他各波段观测角都是分别保存且分为7个部分
"""
    szn1=parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Sun_Angles_Grid"]["Zenith"]["Values_List"]["VALUES"]
    saz1=parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Sun_Angles_Grid"]["Azimuth"]["Values_List"]["VALUES"]
    height=len(szn1)
    width=len(szn1[0].split(" "))
    szn=np.zeros((height,width),dtype=np.uint8)
    saz=np.zeros((height,width),dtype=np.uint8)
    
    for i in range(height):
        for j in range(width):
            szn[i][j]=int(float(szn1[i].split(" ")[j]))
            saz[i][j]=int(float(saz1[i].split(" ")[j]))#太阳角提取完毕
    vzn1=parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Viewing_Incidence_Angles_Grids"][28]["Zenith"]["Values_List"]["VALUES"]
    vaz1=parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Viewing_Incidence_Angles_Grids"][28]["Azimuth"]["Values_List"]["VALUES"]

    vzn=np.zeros((height,width),dtype=np.uint8)
    vaz=np.zeros((height,width),dtype=np.int16)
    
    for d in range(28,35):
        vzn1=parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Viewing_Incidence_Angles_Grids"][d]["Zenith"]["Values_List"]["VALUES"]
        vaz1=parsed_data["n1:Level-1C_Tile_ID"]["n1:Geometric_Info"]["Tile_Angles"]["Viewing_Incidence_Angles_Grids"][d]["Azimuth"]["Values_List"]["VALUES"]
        for i in range(height):
            for j in range(width):
                if vzn[i][j]==0 or vaz[i][j]==0:#注意7个部分直接相加存在部分区域重复相加的问题
                    vzn[i][j]=vzn[i][j]+int(float(vzn1[i].replace("NaN","0").split(" ")[j]))
                    vaz[i][j]=vaz[i][j]+int(float(vaz1[i].replace("NaN","0").split(" ")[j]))#观测角提取完毕
                    #zn天顶角 az方位角
    write_img(angle_name, Proj, im_geotrans, szn, saz, vzn,vaz)#保存文件到tif
def write_img(filename, proj, im_geotrans, da1, da2, da3,da4):
    driver = gdal.GetDriverByName("GTiff")  # 数据类型必须有,因为要计算需要多大内存空间
    dataset = driver.Create(filename, im_width, im_height, 4, gdal.GDT_Byte)
    dataset.SetGeoTransform(im_geotrans)  # 写入仿射变换参数
    dataset.SetProjection(im_proj)  # 写入投影
    dataset.GetRasterBand(1).WriteArray(da1)  # szn
    dataset.GetRasterBand(2).WriteArray(da2)  # saz
    dataset.GetRasterBand(3).WriteArray(da3)  # vzn
	dataset.GetRasterBand(4).WriteArray(da4)  # vaz
    del dataset,driver
Whisper是一款可以实现语音识别转文字的应用软件。它可以通过下载安装在手机或电脑上,实现将语音转化为文字的功能。 使用Whisper进行语音识别转文字非常简便。首先,用户需要下载并安装Whisper应用,可以在各大应用商店或官方网站上获取。安装完成后,用户可以打开应用,并按照界面上的提示进行设置和授权。接下来,用户可以开始使用Whisper进行语音转文字的操作。 在使用Whisper进行语音识别转文字时,用户可以选择两种方式。一种是通过录制语音进行识别,用户只需按下录制按钮,开始说话,Whisper会自动将语音转化为文字。另一种方式是通过实时语音输入进行识别,用户可以直接讲话到麦克风,Whisper会实时将语音转为文字显示在屏幕上。 Whisper的语音识别转文字功能非常准确和快速。它采用了先进的语音识别技术,能够准确地识别各种语音,并将其转化为文字。同时,Whisper还支持多国语言的识别,可以满足不同用户的需求。 通过Whisper进行语音识别转文字,用户可以享受到很多便利。无论是需要记录会议内容、学习笔记,还是进行语音交流的转化,Whisper都能够帮助用户快速准确地将语音转化为文字,并保存在手机或电脑上。这样,用户可以方便地进行查看、编辑和分享。 总之,Whisper是一个功能强大、操作简便的语音识别转文字应用软件,通过下载安装,用户可以随时随地将语音转化为文字,提高工作和学习的效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值