FY4B卫星L2级产品掌握和python处理

废话不多说,展示二级产品CTT为例:
在这里插入图片描述
抱歉没空了解FY4B产品情况了,直接看代码

# CTT色标配置
bounds_CTT = [180, 200, 220, 240, 260, 280, 300, 320]  # 根据你的数据设定
colors_CTT = [
        (0, 0, 139/255),
        (10/255, 0, 245/255),
        (0, 164/255, 235/255),
        (0, 246/255, 192/255),
        (89/255, 255/255, 5/255),
        (255/255, 122/255, 0),
        (255/255, 68/255, 0),
        (155/255, 14/255, 0)
    ]
def get_fy4b_l2_png(filePaths, pngPath):
        try:
            file_type = filePaths.split(".")[-1]
            dataset = nc.Dataset(filePaths, 'r')
            time = dataset.date_created
            fyTime = datetime.strptime(time, '%Y-%m-%dT%H:%M:%SZ').strftime('%Y-%m-%d %H:%M:%S')
            timeStr = fyTime.replace(' ', '_').replace(':', '')
            file_name = os.path.basename(filePaths)
            type = file_name.split('-')[4].replace('_', '')
            if type == 'QPE':
                data = dataset.variables['Precipitation'][:]
            else:
                data = dataset.variables[type][:]
            # 经纬度32°N-42°N,104°E-125°E
            # 设置经纬度网格,并通过坐标转换转为CTT数据中的行列号来读取数据
            lat = np.arange(3, 55, 0.1)
            lon = np.arange(60, 137, 0.1)
            # 将经纬度转为格点,变为[lon lat]形式,转换为[l c],目标输出每个经纬度格点(行列号)的CTT数据,维度CTT(lat,lon)=(90,120)
            lon, lat = np.meshgrid(lon, lat)
            line, column = latlontolinecolumn(lat, lon, "4000M")

            l = line[:, :, np.newaxis]
            c = column[:, :, np.newaxis]
            lc = np.concatenate((l, c), axis=2)  # (90*120*2)
            sichun = [[] for i in range(520)]

            i = 0
            for point_l in lc:
                # for point_c in point_l:
                #     CTT_sichun[i].append(CTT[round(point_c[0])][round(point_c[1])])
                # i+=1
                for point_c in point_l:
                    # 添加有效性检查,确保行列号在合理范围内
                    if 0 <= point_c[0] < data.shape[0] - 1 and 0 <= point_c[1] < data.shape[1] - 1:
                        sichun[i].append(data[round(point_c[0])][round(point_c[1])])
                    else:
                        # 如果行列号越界,可以添加一些处理逻辑,比如跳过该点或者使用默认值
                        sichun[i].append(0)  # 这里使用了默认值,你可以根据需要进行调整
                i += 1
            if type == 'CLM':
                bounds = bounds_CLM
                colors = colors_CLM
            elif type == 'CTT':
                bounds = bounds_CTT
                colors = colors_CTT
            else:
                logger.error('数据错误或格式错误')
            # 创建自定义颜色映射
            custom_cmap = ListedColormap(colors)
            norm = BoundaryNorm(bounds, custom_cmap.N, clip=False)
            # # 绘制数据
            fig, ax = plt.subplots(subplot_kw={'projection': ccrs.PlateCarree()})
            # 添加省界
            china = cfeature.ShapelyFeature(Reader(shp_path).geometries(), ccrs.PlateCarree(),
                                            linewidth=0.5, facecolor='none', edgecolor='yellow', alpha=0.7)
            ax.add_feature(china)
            # 绘制数据,使用 'viridis' 颜色映射
            b = ax.contourf(lon, lat, sichun, cmap=custom_cmap, transform=ccrs.PlateCarree())
            # # 添加网格线
            # ax.gridlines(draw_labels=True, linestyle='--', color='gray', alpha=0.5)
            dir_png = pngPath + '/' + type
            if not os.path.exists(dir_png):  # 如果路径不存在
                os.makedirs(dir_png)  # 则创建该目录
            else:
                print("路径已经存在")
            out_path = dir_png + '/' + type + '_' + timeStr + '.png'
            # img = ax.imshow(CTT_sichun, cmap=custom_cmap, norm=norm, transform=ccrs.Mercator())
            plt.savefig(out_path, transparent=True, dpi=600, bbox_inches='tight', pad_inches=0)
            dataset.close()
            logger.debug(out_path + 'Product production successful')
            path = get_path(out_path, pngPath)
            add_fy4b_record(fyTime, type, path)
        except Exception as e:
            # 记录异常信息
            logger.error('绘制FY4B' + type + '时发生错误: ' + str(e))
            # 根据需要抛出 HTTP 异常或其他类型的异常
            # raise HTTPException(status_code=500, detail="处理" + type + "时发生错误")


def get_path(path, path1):
    # 找到path1在path中的结束位置
    end_index = path.find(path1) + len(path1)
    # 截取从path1之后的部分
    sub_path = path[end_index:]
    return sub_path


def latlontolinecolumn(lat, lon, resolution):
    """
    (lat, lon) → (line, column)
    resolution:文件名中的分辨率{'0500M', '1000M', '2000M', '4000M'}
    line, column不是整数
    """
    # 坐标转换函数,author: modabao
    ea = 6378.137  # 地球的半长轴[km]
    eb = 6356.7523  # 地球的短半轴[km]
    h = 42164  # 地心到卫星质心的距离[km]
    λD = np.deg2rad(105.0)  # 卫星星下点所在经度
    # 列偏移
    COFF = {"0500M": 10991.5,
            "1000M": 5495.5,
            "2000M": 2747.5,
            "4000M": 1373.5}
    # 列比例因子2,033,406.58
    CFAC = {"0500M": 81865099,
            "1000M": 40932549,
            "2000M": 20466274,
            "4000M": 10233137}
    LOFF = {"0500M": 10991.5,
            "1000M": 5495.5,
            "2000M": 2747.5,
            "4000M": 1373.5}  # 行偏移
    # LOFF = COFF
    LFAC = {"0500M": 81865099,
            "1000M": 40932549,
            "2000M": 20466274,
            "4000M": 10233137}  # 行比例因子
    # LFAC = CFAC
    in_ = 0.5  # 归一化后的像点亮度,范围为 [0, 1]
    # Step1.检查地理经纬度
    # Step2.将地理经纬度的角度表示转化为弧度表示
    lat = np.deg2rad(lat)
    lon = np.deg2rad(lon)
    # Step3.将地理经纬度转化成地心经纬度
    eb2_ea2 = eb ** 2 / ea ** 2
    λe = lon
    φe = np.arctan(eb2_ea2 * np.tan(lat))
    # Step4.求Re
    cosφe = np.cos(φe)
    re = eb / np.sqrt(1 - (1 - eb2_ea2) * cosφe ** 2)
    # Step5.求r1,r2,r3
    λe_λD = λe - λD
    r1 = h - re * cosφe * np.cos(λe_λD)
    r2 = -re * cosφe * np.sin(λe_λD)
    r3 = re * np.sin(φe)
    # Step6.求rn,x,y
    rn = np.sqrt(r1 ** 2 + r2 ** 2 + r3 ** 2)
    x = np.rad2deg(np.arctan(-r2 / r1))
    y = np.rad2deg(np.arcsin(-r3 / rn))
    # Step7.求c,l
    column = COFF[resolution] + x * 2 ** -16 * CFAC[resolution]
    line = LOFF[resolution] + y * 2 ** -16 * LFAC[resolution]
    return line, column

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/802982.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言——详解二维数组中元素的地址

在C语言中&#xff0c;二维数组元素的地址认知是一个相对复杂但重要的概念。以下是对二维数组中元素地址认知的详细叙述&#xff1a; 一、二维数组的基本构成 二维数组可以被看作是由多个一维数组组成的数组。例如&#xff0c;定义了一个3行4列的二维数组&#xff0c; int a…

实战分享:利用百数实现通讯录与表单无缝对接,提升管理效率

百数的通讯录实时同步到表单功能&#xff0c;实现了员工信息的即时更新与自动整合&#xff0c;不仅极大地提升了信息管理的效率与准确性&#xff0c;还为企业提供了便捷的数据分析基础&#xff0c;助力企业更高效地运营与决策。 设置方式 在企业管理中&#xff0c;开启通讯录…

深度学习入门——神经网络

前言 神经网络可以帮助自动化设定权重 具体地讲&#xff0c;神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数 从感知机到神经网络 神经网络的例子 中间层aka隐藏层 复习感知机 偏置b 并没有被画出来。如果要明确地表示出b&#xff0c;可以像图3-3那样做…

redis基本类型和订阅

redis-cli -h <host> -p <port> -a <password> 其中&#xff0c;< host>是Redis服务器的主机名或IP地址&#xff0c;< port>是Redis服务器的端口号&#xff0c;< password>是Redis服务器的密码&#xff08;如果有的话&#xff09;。 set …

多模态大模型--音频文本

音频信息 声学 音频编解码技术的目标是&#xff0c;通过减少音频文件的大小来节省存储空间或减轻网络传输的负担。理想的情况下&#xff0c;即使音频被压缩&#xff0c;我们听到的声音与原版也应该没有任何区别。 Opus是一个多才多艺的音频编解码器&#xff0c;它适用于各种应…

Linux系统之快速部署小游戏合集网站(二)

Linux系统之快速部署小游戏合集网站(二) 一、项目介绍1.1 项目简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看apach…

FPGA-Verilog

这里写目录标题 累加累乘器 累加累乘器 timescale 1ns/10psmodule inout_test(); parameter ratio 2; reg [15:0]num ; reg [31:0]save_add_v; reg [31:0]save_multi_v;initialbeginsave_add_v 100;save_multi_v 100;forever beginsave_add_v save_add_v ratio;save_mul…

基于视觉工具箱和背景差法的行人检测,行走轨迹跟踪,人员行走习惯统计matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 在三维图中&#xff0c;幅度越大&#xff0c;则表示人员更习惯的行走路线。 2.算法运行软件版本 matlab2022a 3.部分核…

[笔记]Fluke3563 振动分析仪

参考文档&#xff1a;Fluke 3563 Analysis Vibration Sensor system | Fluke 1.四大机械故障损伤原因 2.振动特征 福禄克做的示意图很棒&#xff1a; 不平衡对应转动轴的一倍频&#xff0c;不对中是2倍频&#xff0c;然后3~6倍频会有未紧固故障&#xff0c;更高频的位置是齿轮…

新版网页无插件H.265播放器EasyPlayer.js如何测试demo视频?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff1b;支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#xff0…

解决 Vscode不支持c++11的语法

问题&#xff1a; 解决方案&#xff1a; 1、按 CtrlShiftP 调出命令面板&#xff0c;输入 C/C: Edit Configurations (UI) 并选择它。这将打开 C/C 配置界面 2、打开 c_cpp_properties.json 文件 3、编辑 c_cpp_properties.json 4、保存 c_cpp_properties.json 文件。 关闭并…

ollama + fastgpt 搭建免费本地知识库

目录 1、ollama ollama的一些操作命令: 使用的方式: 2、fastgpt 快速部署: 修改配置: config.json: docker-compose.yml: 运行fastgpt: 访问OneApi: 添加令牌和渠道: 登陆fastgpt,创建知识库和应用 3、总结: 附录: 1. 11434是ollama的端口: 2. m3e 测…

设计模式-概述*

1.代码的质量的评判 可维护性&#xff1a;不破坏原有代码设计以及不引入新的bug的前提下&#xff0c;能够快速修改或新增代码&#xff1b;可读性&#xff1a;人类能理解的代码&#xff08;编程规范-命名、函数是否冗长、类是否过大等&#xff09;&#xff1b;可扩展性&#xff…

【Java】:浅克隆和深克隆

克隆 克隆和赋值 克隆的结果是有多个相同的实体&#xff0c;各个对象指向不同的实体而多个不同对象指向一个相同的实体不是克隆&#xff0c;而是赋值 克隆的过程 首先实例化一个 student1 对象 在堆里开辟了一块内存用来存储 age 10 这个数据 调用 clone 方法 在堆中又开辟了一…

数字化转型“破局”:低代码开发平台如何缩短开发交付周期,提升效率

日新月异的数字时代&#xff0c;各行业正经历着前所未有的变革与转型。随着大数据、云计算、人工智能等技术的不断成熟与融合&#xff0c;数字化转型的步伐愈发坚定而迅速&#xff0c;成为企业转型升级、实现可持续发展的必由之路。然而&#xff0c;传统的软件开发模式受限于高…

Hadoop3:HDFS-存储优化之纠删码

一、集群环境 集群一共5个节点&#xff0c;102/103/104/105/106 二、纠删码原理 1、简介 HDFS默认情况下&#xff0c;一个文件有3个副本&#xff0c;这样提高了数据的可靠性&#xff0c;但也带来了2倍的冗余开销。Hadoop3.x引入了纠删码&#xff0c;采用计算的方式&#x…

【学习】美国虚拟信用卡申请流程

WildCard 官方网址&#xff1a;https://bewildcard.com/i/PEACEFUL &#xff08;使用邀请码“PEACEFUL”可以享受开卡88 折优惠&#xff0c;注册时提示填写邀请码就可以填写&#xff09;

Window中 Redis下载安装

Redis7.2.3连接&#xff1a; 我用夸克网盘分享了「redis-windows-7.2.3.zip」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/4dfb0497707a 在安…

驱动框架——CMSIS第一部分 RTE驱动框架介绍

一、介绍CMISIS 什么是CMSIS&#xff08;cortex microcontrol software interface standard一种软件标准接口&#xff09;&#xff0c;官网地址&#xff1a;https://arm-software.github.io/CMSIS_6/latest/General/index.html 包含的core、driver、RTOS、dsp、nn等部分&…

蓝桥 双周赛算法赛【小白场】

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 蓝桥第14场小白入门赛T1/T2/T3 题目&#xff1a; T1照常还是送分题无需多…