windows Linux :python 脚本 下载日本葵花8号卫星数据L1级产品,自定义分辨率、时间

news2024/10/7 13:24:51

前言介绍

  • 近期需要用到日本葵花8号卫星数据,用于相关研究,而通过官方提供的下载方法,难以针对性的下载所需要的数据类型,因此这里编写了一个针对葵花8号卫星L1级数据产品的脚本下载,主要实现两个功能:
  • 1、自定义时间下载
  • 2、选择任意的分辨率下载
    在这里插入图片描述

完整代码,下载5km分辨率,30min一次的指定时间内的数据

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
# ================================================================================================
# Author: Jianpu | Affiliation: Hohai
# Email : 211311040008@hhu.edu.cn
# Last modified: 2023-04-04 12:28:06
# Filename: download_kuihua8_L1.py
# Description: 1.日本葵花8号卫星,L1级数据产品下载脚本
#              2.需要提前下载好对于葵花8卫星产品下载的安装包: lb_toolkits.tools
#              3.在官网注册获取下载的用户名和密码以及链接网址
#              4. 可以选择两个分辨率进行下载:5km和2km
#			   5. 可以选择下载的频率:10min一次或者30min一次
# =================================================================================================

"""
import os
import sys
import datetime
import time
from lb_toolkits.tools import ftppro


    
class downloadH8(object):

    def __init__(self, username, password):

        self.ftp = ftppro(FTPHOST, username, password)


    def search_ahi8_l1_netcdf(self, starttime, endtime=None, pattern=None, skip=False):
        '''
        下载葵花8号卫星L1 NetCDF数据文件
        Parameters
        ----------
        starttime : datetime
            下载所需数据的起始时间
        endtime : datetime
            下载所需数据的起始时间
        pattern: list, optional
            模糊匹配参数
        Returns
        -------
            list
            下载的文件列表
        '''

        if endtime is None :
            endtime = starttime

        downfilelist = []

        nowdate = starttime
        while nowdate <= endtime :
            # 拼接H8 ftp 目录
            sourceRoot = os.path.join('/jma/netcdf', nowdate.strftime("%Y%m"), nowdate.strftime("%d"))
            sourceRoot = sourceRoot.replace('\\','/')

            # 获取文件列表
            filelist = self.GetFileList(starttime, endtime, sourceRoot, pattern)
            
            # filelist = [f for f in filelist if f.startswith('NC_H08_') and f.endswith('.06001_06001.nc')]
            
            if len(filelist) == 0 :
                nowdate += datetime.timedelta(days=1)
                print('未匹配当前时间【%s】的文件' %(nowdate.strftime('%Y-%m-%d')))
                continue

            nowdate += datetime.timedelta(days=1)
            downfilelist.extend(filelist)

        return downfilelist
    def GetFileList(self, starttime, endtime, srcpath, pattern=None):
        ''' 根据输入时间,匹配获取H8 L1数据文件名  '''
        downfiles = []

        srcpath = srcpath.replace('\\', '/')

        filelist = self.ftp.listdir(srcpath)
        filelist.sort()
        for filename in filelist :
            namelist = filename.split('_')
            nowdate = datetime.datetime.strptime('%s %s' %(namelist[2], namelist[3]), '%Y%m%d %H%M')

            if (nowdate < starttime) | (nowdate > endtime) :
                continue

            downflag = True
            # 根据传入的匹配参数,匹配文件名中是否包含相应的字符串
            if pattern is not None :
                if isinstance(pattern, list) :
                    for item in pattern :
                        if item in filename :
                            downflag = True
                            # break
                        else:
                            downflag = False
                            break
                elif isinstance(pattern, str) :
                    if pattern in filename :
                        downflag = True
                    else:
                        downflag = False

            if downflag :
                srcname = os.path.join(srcpath, filename)
                srcname = srcname.replace('\\','/')

                downfiles.append(srcname)

        return downfiles
    def download(self, outdir, srcfile, blocksize=1*1024, skip=False):
        """通过ftp接口下载H8 L1数据文件"""

        if not os.path.exists(outdir):
            os.makedirs(outdir)
            print('成功创建路径:%s' %(outdir))

        if isinstance(srcfile, list) :
            count = len(srcfile)
            for srcname in srcfile:
                count -= 1
                self._download(outdir, srcname, blocksize=blocksize, skip=skip, count=count+1)

        elif isinstance(srcfile, str) :
            self._download(outdir, srcfile, blocksize=blocksize, skip=skip)

    def _download(self, outdir, srcname, blocksize=1*1024, skip=False, count=1):

        print('='*100)
        basename = os.path.basename(srcname)
        dstname = os.path.join(outdir, basename)

        if skip :
            return srcname

        if os.path.isfile(dstname) :
            print('文件已存在,跳过下载>>【%s】' %(dstname))
            return srcname

        stime = time.time()
        print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
              '开始下载文件【%d】: %s'%(count, srcname))

        if self.ftp.downloadFile(srcname, outdir, blocksize=blocksize):
            print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
                  '成功下载文件【%s】:%s' %(count, dstname))
        else:
            print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
                  '下载文件失败【%s】:%s' %(count, dstname))

        etime = time.time()
        print('下载文件共用%.2f秒' %(etime - stime))

        return srcname
 
    
def check_data_completeness(file_list, start_time, end_time):
    
    expected_num_files = (end_time - start_time).days *48 + 48  # 48 show 30min/time; 144 show 10min/time
    actual_num_files = len(file_list)

    if actual_num_files == expected_num_files:
        print("已经下载了全部数据。")
    else:
        print("有 %d 个数据文件缺失。" % (expected_num_files - actual_num_files))
        expected_file_names = []
        actual_file_names = []

        for i in range(expected_num_files):
            file_time = start_time + datetime.timedelta(minutes=i * 30)
            file_name = "NC_H08_%s_R21_FLDK.06001_06001.nc" % (file_time.strftime("%Y%m%d_%H%M"))
            expected_file_names.append(file_name)

        for file_path in file_list:
            file_name = os.path.basename(file_path)
            actual_file_names.append(file_name)

        missing_file_names = set(expected_file_names) - set(actual_file_names)

        for missing_file_name in missing_file_names:
            print("缺失文件:%s" % missing_file_name)

    
  


FTPHOST='ftp.ptree.jaxa.jp'

# create an instance of the downloadH8 class
h8_downloader = downloadH8('xxx', 'xxx')
#
# search for H8 files for a specific date
start_time = datetime.datetime(2017, 1, 1)
end_time = datetime.datetime(2017, 1,31,23, 59, 59)
file_list = h8_downloader.search_ahi8_l1_netcdf(start_time, end_time,pattern=['R21','02401_02401'])


# 选取每30分钟的数据文件名
selected_files = []
for file in file_list:
    if file.endswith(".nc"):
        if file[40:42] in ["00", "30"]:
            selected_files.append(file)

# 打印选取的文件名
print(selected_files)


check_data_completeness(selected_files,start_time, end_time)

from tqdm import tqdm 

for file in tqdm(selected_files):
    
    
    try:
        h8_downloader.download('/media/DATA/kuihua8_5km/', file)
    except ValueError as e:
        print(str(e))
        os.remove(os.path.join('/media/DATA/kuihua8_5km/', os.path.basename(file)))
        h8_downloader.download('/media/DATA/kuihua8_5km/', file)


脚本主要完成如下功能:

  • 创建一个downloadH8类,用于FTP文件下载相关操作;
  • 定义了search_ahi8_l1_netcdf函数,用于搜索指定时间范围内的葵花8号卫星L1 NetCDF数据文件,返回下载的文件列表;
  • 定义了GetFileList函数,用于获取FTP服务器上指定路径下的文件列表,并根据输入时间和匹配参数筛选符合条件的文件进行返回;

搜寻数据和获取服务器文件的脚本如下:

 def search_ahi8_l1_netcdf(self, starttime, endtime=None, pattern=None, skip=False):
        '''
        下载葵花8号卫星L1 NetCDF数据文件
        Parameters
        ----------
        starttime : datetime
            下载所需数据的起始时间
        endtime : datetime
            下载所需数据的起始时间
        pattern: list, optional
            模糊匹配参数
        Returns
        -------
            list
            下载的文件列表
        '''

        if endtime is None :
            endtime = starttime

        downfilelist = []

        nowdate = starttime
        while nowdate <= endtime :
            # 拼接H8 ftp 目录
            sourceRoot = os.path.join('/jma/netcdf', nowdate.strftime("%Y%m"), nowdate.strftime("%d"))
            sourceRoot = sourceRoot.replace('\\','/')

            # 获取文件列表
            filelist = self.GetFileList(starttime, endtime, sourceRoot, pattern)
            
            # filelist = [f for f in filelist if f.startswith('NC_H08_') and f.endswith('.06001_06001.nc')]
            
            if len(filelist) == 0 :
                nowdate += datetime.timedelta(days=1)
                print('未匹配当前时间【%s】的文件' %(nowdate.strftime('%Y-%m-%d')))
                continue

            nowdate += datetime.timedelta(days=1)
            downfilelist.extend(filelist)

        return downfilelist
    def GetFileList(self, starttime, endtime, srcpath, pattern=None):
        ''' 根据输入时间,匹配获取H8 L1数据文件名  '''
        downfiles = []

        srcpath = srcpath.replace('\\', '/')

        filelist = self.ftp.listdir(srcpath)
        filelist.sort()
        for filename in filelist :
            namelist = filename.split('_')
            nowdate = datetime.datetime.strptime('%s %s' %(namelist[2], namelist[3]), '%Y%m%d %H%M')

            if (nowdate < starttime) | (nowdate > endtime) :
                continue

            downflag = True
            # 根据传入的匹配参数,匹配文件名中是否包含相应的字符串
            if pattern is not None :
                if isinstance(pattern, list) :
                    for item in pattern :
                        if item in filename :
                            downflag = True
                            # break
                        else:
                            downflag = False
                            break
                elif isinstance(pattern, str) :
                    if pattern in filename :
                        downflag = True
                    else:
                        downflag = False

            if downflag :
                srcname = os.path.join(srcpath, filename)
                srcname = srcname.replace('\\','/')

                downfiles.append(srcname)

        return downfiles
  • 定义了download和_download函数,用于将符合条件的文件下载到本地指定目录;
 def download(self, outdir, srcfile, blocksize=1*1024, skip=False):
        """通过ftp接口下载H8 L1数据文件"""

        if not os.path.exists(outdir):
            os.makedirs(outdir)
            print('成功创建路径:%s' %(outdir))

        if isinstance(srcfile, list) :
            count = len(srcfile)
            for srcname in srcfile:
                count -= 1
                self._download(outdir, srcname, blocksize=blocksize, skip=skip, count=count+1)

        elif isinstance(srcfile, str) :
            self._download(outdir, srcfile, blocksize=blocksize, skip=skip)

    def _download(self, outdir, srcname, blocksize=1*1024, skip=False, count=1):

        print('='*100)
        basename = os.path.basename(srcname)
        dstname = os.path.join(outdir, basename)

        if skip :
            return srcname

        if os.path.isfile(dstname) :
            print('文件已存在,跳过下载>>【%s】' %(dstname))
            return srcname

        stime = time.time()
        print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
              '开始下载文件【%d】: %s'%(count, srcname))

        if self.ftp.downloadFile(srcname, outdir, blocksize=blocksize):
            print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
                  '成功下载文件【%s】:%s' %(count, dstname))
        else:
            print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
                  '下载文件失败【%s】:%s' %(count, dstname))

        etime = time.time()
        print('下载文件共用%.2f秒' %(etime - stime))

        return srcname

此外,对于_download函数,还可以进一步修改,判断如果文件没有下载成功,则重新下载,这里也给出我改的一个函数:

    def _download(self, outdir, srcname, blocksize=1*1024, skip=False, count=1):
        print('=' * 100)
        basename = os.path.basename(srcname)
        dstname = os.path.join(outdir, basename)
    
        if skip:
            return srcname
    
        if os.path.isfile(dstname):
            print('文件已存在,跳过下载>>【%s】' % (dstname))
            return srcname
    
        stime = time.time()
        print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
              '开始下载文件【%d】: %s' % (count, srcname))
    
        while True:
            if self.ftp.downloadFile(srcname, outdir, blocksize=blocksize):
                print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
                      '成功下载文件【%s】:%s' % (count, dstname))
                break
            else:
                print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
                      '下载文件失败, 正在重新下载【%s】:%s' % (count, dstname))
        
        etime = time.time()
        print('下载文件共用%.2f秒' % (etime - stime))
    
        return srcname
  • 定义了check_data_completeness函数,用于检查是否存在数据文件缺失;

对于5km分辨率,10min一次的的:

def check_data_completeness(file_list, start_time, end_time):
    expected_num_files = (end_time - start_time).days * 144 + 144
    actual_num_files = len(file_list)

    if actual_num_files == expected_num_files:
        print("已经下载了全部数据。")
    else:
        print("有 %d 个数据文件缺失。" % (expected_num_files - actual_num_files))
        expected_file_names = []
        actual_file_names = []

        for i in range(expected_num_files):
            file_time = start_time + datetime.timedelta(minutes=i * 10)
            file_name = "NC_H08_%s_R21_FLDK.02401_02401.nc" % (file_time.strftime("%Y%m%d_%H%M"))
            expected_file_names.append(file_name)

        for file_path in file_list:
            file_name = os.path.basename(file_path)
            actual_file_names.append(file_name)

        missing_file_names = set(expected_file_names) - set(actual_file_names)

        for missing_file_name in missing_file_names:
            print("缺失文件:%s" % missing_file_name)

对于2km分辨率,30min一次的的:

def check_data_completeness(file_list, start_time, end_time):
    
    expected_num_files = (end_time - start_time).days *48 + 48  # 48 show 30min/time; 144 show 10min/time
    actual_num_files = len(file_list)

    if actual_num_files == expected_num_files:
        print("已经下载了全部数据。")
    else:
        print("有 %d 个数据文件缺失。" % (expected_num_files - actual_num_files))
        expected_file_names = []
        actual_file_names = []

        for i in range(expected_num_files):
            file_time = start_time + datetime.timedelta(minutes=i * 30)
            file_name = "NC_H08_%s_R21_FLDK.06001_06001.nc" % (file_time.strftime("%Y%m%d_%H%M"))
            expected_file_names.append(file_name)

        for file_path in file_list:
            file_name = os.path.basename(file_path)
            actual_file_names.append(file_name)

        missing_file_names = set(expected_file_names) - set(actual_file_names)

        for missing_file_name in missing_file_names:
            print("缺失文件:%s" % missing_file_name)
  • 具体下载方法:
    在主程序中,先调用search_ahi8_l1_netcdf函数搜索符合条件的文件列表,再通过循环调用download函数将文件下载到本地。
    在具体的操作过程中,需要按照实际情况替换FTPHOST、username和password等相关参数,以保证正确的网络连接。同时,还需要根据需求修改脚本中的时间范围等参数,以便精确地搜索和下载文件。

下载示例

下面主要下载了了:2017.01.01-2017.01.31日之间,整个区域上,5km分辨率,30min一次的所有数据,如何看空间分辨率在后面有数据介绍


FTPHOST='ftp.ptree.jaxa.jp'

# create an instance of the downloadH8 class
h8_downloader = downloadH8('xxx', 'xxx')
## 2016 1440\0240   loss
# search for H8 files for a specific date
start_time = datetime.datetime(2017, 1, 1)
end_time = datetime.datetime(2017, 1,31,23, 59, 59)
file_list = h8_downloader.search_ahi8_l1_netcdf(start_time, end_time,pattern=['R21','02401_02401'])


# 选取每30分钟的数据文件名
selected_files = []
for file in file_list:
    if file.endswith(".nc"):
        if file[40:42] in ["00", "30"]:
            selected_files.append(file)

# 打印选取的文件名
print(selected_files)


check_data_completeness(selected_files,start_time, end_time)

from tqdm import tqdm 

for file in tqdm(selected_files):
    
    
    try:
        h8_downloader.download('/media/DATA/kuihua8_5km/', file)
    except ValueError as e:
        print(str(e))
        os.remove(os.path.join('/media/DATA/kuihua8_5km/', os.path.basename(file)))
        h8_downloader.download('/media/DATA/kuihua8_5km/', file)

如果你想要下载5km,10min一次的,只需要把选取每30分钟的数据文件名那段循环删掉,直接从file_list中进行下载即可

def check_data_completeness(file_list, start_time, end_time):
    
    expected_num_files = (end_time - start_time).days *144 + 144 # 48 show 30min/time; 144 show 10min/time
    actual_num_files = len(file_list)

    if actual_num_files == expected_num_files:
        print("已经下载了全部数据。")
    else:
        print("有 %d 个数据文件缺失。" % (expected_num_files - actual_num_files))
        expected_file_names = []
        actual_file_names = []

        for i in range(expected_num_files):
            file_time = start_time + datetime.timedelta(minutes=i * 10)
            file_name = "NC_H08_%s_R21_FLDK.02401_02401.nc" % (file_time.strftime("%Y%m%d_%H%M"))
            expected_file_names.append(file_name)

        for file_path in file_list:
            file_name = os.path.basename(file_path)
            actual_file_names.append(file_name)

        missing_file_names = set(expected_file_names) - set(actual_file_names)

        for missing_file_name in missing_file_names:
            print("缺失文件:%s" % missing_file_name)
FTPHOST='ftp.ptree.jaxa.jp'

# create an instance of the downloadH8 class
h8_downloader = downloadH8('xxx', 'xxx')
## 2016 1440\0240   loss
# search for H8 files for a specific date
start_time = datetime.datetime(2017, 1, 1)
end_time = datetime.datetime(2017, 1,31,23, 59, 59)
file_list = h8_downloader.search_ahi8_l1_netcdf(start_time, end_time,pattern=['R21','02401_02401'])


# 打印选取的文件名
print(file_list)


check_data_completeness(selected_files,start_time, end_time)

from tqdm import tqdm 

for file in tqdm(file_list):
    
    
    try:
        h8_downloader.download('/media/DATA/kuihua8_5km/', file)
    except ValueError as e:
        print(str(e))
        os.remove(os.path.join('/media/DATA/kuihua8_5km/', os.path.basename(file)))
        h8_downloader.download('/media/DATA/kuihua8_5km/', file)


数据介绍

这里,对于数据名称做简单介绍:

NC_H08_20170101_0100_R21_FLDK.06001_06001.nc

NC_H08_20170101_0030_R21_FLDK.02401_02401.n

 NC_Hnn_YYYYMDD_hhmm_Rbb_FLDK.xxxxx_yyyyy.nc

一般下载下来的数据名称如上所示:

NC_H08 : nn=08代表葵花8号,nn=09表示葵花9号

YYYYMDD: 年月日
hhmm: 小时分钟
Rbb:Rbb = R21,表示的是整个区域,波段从 “01” 到 “16”;Rbb=R14,表示的是日本区域,波段为14

xxxxx: (“2401”: 5km resolution,
“6001”: 2km resolution, )
yyyyy: (“2401”: 5km resolution,
“6001”: 2km resolution, )

参考

https://mp.weixin.qq.com/s/b_BlfXYTTY0oAnb7U0tCOQ
https://mp.weixin.qq.com/s/EFT8D7ElvlcTBXQ_LkAbRw

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为docker安装图形界面和配置远程桌面连接

由于远程桌面访问必须要打开端口3389&#xff0c;所以在启动docker中ubuntu系统的时候要首先将linux系统的3389端口映射出来 docker run -tid -p 3389:3389 --name ceshi --privilegedtrue ceshi /bin/bash 接下来进入到ubuntu中 docker exec -it ceshi /bin/bash 首先安装X…

查找 | 顺序查找、分块查找、二分查找、哈希查找 | 牛客刷题笔记

查找 就平均查找速度而言&#xff0c;下列几种查找速度从慢至快的关系是&#xff1a;顺序、分块、折半、哈希。 顺序查找的时间复杂度为o(n) 分块查找的时间复杂度为o(log2n)到o(n)之间 二分查找的时间复杂度为o(log2n) 哈希查找的时间复杂度为o(1) 用概率查找改进查找效率&am…

本周热门chatGPT之AutoGPT-AgentGPT,可以实现完全自主实现任务,附部署使用教程

AutoGPT 是一个实验性的开源应用程序&#xff0c;它由GPT-4驱动&#xff0c;但有别于ChatGPT的是&#xff0c;​ 这与ChatGPT的底层语言模型一致。 ​AutoGPT 的定位是将LLM的"思想"串联起来&#xff0c;自主地实现你设定的任何目标。 简单的说&#xff0c;你只用提出…

界面组件Telerik ASP.NET MVC使用指南 - 如何自定义网格过滤

Telerik UI for ASP. NET MVC拥有使用JavaScript和HTML5构建网站和移动应用所需的70UI部件&#xff0c;来满足开发者的各种需求&#xff0c;提供无语伦比的开发性能和用户体验。它主要是针对专业级的 ASP.NET开发&#xff0c;通过该产品的强大功能&#xff0c;开发者可以开发出…

消息队列面试题-RocketMQ

1.为什么要使用消息队列&#xff1f; 2.消息队列有什么优点和缺点&#xff1f; 3.如何解决重复消费&#xff1f; 幂等性&#xff1a; 概念&#xff1a;一次和多次请求某一个资源对于资源本身应该具有同样的结果&#xff08;网络超时等问题除外&#xff09;。也就是说&#xf…

前端项目-09-购物车-游客列表-变更选中状态-删除

目录 1-加入购物车成功 2-购物车成功页面跳转 3-游客身份获取购物车列表 4-动态渲染购物车列表 5-处理商品数量 6-删除购物车商品 6.1-删除购物车单个商品 6.2-删除全部选中商品 7-修改产品状态 7.1-修改单个产品的状态​编辑 7.2-修改多个产品的状态 1-加入购物车成功…

【2023】分享一份网友的Linux运维面试题

原只有问题&#xff0c;没有答案。答案是我整理的&#xff0c;如发现有什么问题可以在评论区留言告诉我&#xff01;目录1.grep如何查找一个字符串如何忽略大小写2.kill -9和kill -15有什么区别3.简单描述一下TCP的建立和断开4.Linux服务在什么情况下CPU使用率会超过100%5.服务…

【机器学习(四)】基于KNN算法对鸢尾花类别进行分类预测

文章目录专栏导读1、KNN算法原理2、实战案例-对鸢尾花类别分类预测2.1确定特征和类别2.2对特征进行处理2.3对模型调参&#xff0c;选择最优参数2.4使用分类模型进行预测2.5评估模型&#xff0c;检验模型效果3、完整代码及结果专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c…

nginx-代理多个服务

目录 1.主机多Ip 1.1单网卡多ip主机配置 1.2修改default.conf 1.3server1.conf 1.3server2.conf 1.4测试文件 1.4重启测试 2.主机多端口 2.1server1.conf 2.2server2.conf 3.多域名代理 3.1server1.conf 3.2server2.conf 1.主机多Ip 1.1单网卡多ip主机配置 # 查看…

echart图表渲染合并策略

目录 调用方式 notMerge 普通合并 规则 例子 替换合并 规则 例子 echarts渲染函数setOption 调用方式 chart.setOption(option, {notMerge: boolean;replaceMerge?: string | string[];lazyUpdate: boolean; }); notMerge false &#xff08;默认&#xff09; 如果…

【Unity URP】2种描边方案:模板测试和正面剔除

写在前面 风格化不像PBR&#xff0c;好像没有套路可言&#xff0c;&#xff0c;&#xff0c;简直是《怎么好看怎么来》的最大化实践了&#xff01;感觉出的PBRNPR也是为了更好地利用PBR资产才诞生的这样一个渲染方案。&#xff08;当然我的评价非常非常的片面&#xff0c;瞎说…

帆软FineReport学习篇(四)——父子格设置

帆软FineReport学习篇(四)——父子格设置 1.概念 子单元格设置父单元格后,子单元格随父单元格进行扩展 简易的说,子单元格根据父单元格分组显示2 对比示意图 2.1 左父格对比示意图 2.2 上父格对比示意图 3 制作分组报表 3.1 新建普通报表WorkBook2.cpt 3.1.1 点击文件➡点…

OldWang带你了解MySQL(六)

文章目录&#x1f525;SQL函数&#x1f525;单行函数&#x1f525;字符函数&#x1f525;数字函数&#x1f525;日期函数&#x1f525;转换函数&#x1f525;通用函数&#x1f525;SQL函数 函数介绍 函数是 SQL 的一个非常强有力的特性&#xff0c;函数能够用于下面的目的&a…

【 SpringBoot ⽇志⽂件 】

文章目录一、⽇志的作用二、认识⽇志三、⾃定义⽇志打印3.1 在程序中得到⽇志对象3.2 使⽤⽇志对象打印⽇志3.3 ⽇志格式说明四、⽇志级别4.1 ⽇志级别的作用4.2 ⽇志级别的分类与使⽤4.2.1 ⽇志级别的分类4.2.2 ⽇志使⽤4.2.2.1 配置全局日志级别4.2.2.2 配置局部文件夹的日志…

【通过Cpython3.9源码看看python的内存回收机制】

一&#xff1a;建立对象引用计数 1. 相关代码 void _Py_NewReference(PyObject *op) {if (_Py_tracemalloc_config.tracing) {_PyTraceMalloc_NewReference(op);} #ifdef Py_REF_DEBUG_Py_RefTotal; #endifPy_SET_REFCNT(op, 1); #ifdef Py_TRACE_REFS_Py_AddToAllObjects(op…

【算法】AB3DMOT之Sutherland Hodgman多边形裁剪

在AB3MOT模型中有一个步骤为计算IOU时&#xff0c;需要先计算两个立体在地面的投影2D形状&#xff0c;然后计算两个投影的重叠部分&#xff0c;实际上为多边形的裁剪算法。 AB3MOT classmethod def box2corners3d_camcoord(cls, bbox):Takes an objects 3D box with the repr…

懒人式迁移服务器深度学习环境(完全不需要重新下载)

换服务器了&#xff1f;想迁移原来服务器上的深度学习环境&#xff0c;但又觉得麻烦懒得重新安装一遍anaconda、pytorch&#xff1f;有没有办法能不费吹灰之力直接迁移&#xff1f;接下来跟着我一起&#xff0c;懒汉式迁移。   本方法适用于在同一内网下的两台服务器之间互相…

【深度强化学习】(8) iPPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下多智能体深度强化学习算法 ippo&#xff0c;并基于 gym 环境完成一个小案例。完整代码可以从我的 GitHub 中获得&#xff1a;https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model 1. 算法原理 多智能体的情形相比于单智…

SpringCloud GateWay与Nacos使用

网关就相当于一个内网与外网的出入口&#xff0c;起着 安全、验证的功能&#xff0c;如果没有网关&#xff0c;那么如果需要实现验证的功能&#xff0c;除非 SpringCloud GateWay 作为微服务的网关,起着如下作用 ① 作为所有API接口服务请求的接入点 ② 作为所有后端业务服务…

SpringBoot 整合 RabbitMQ (四十一)

二八佳人体似酥&#xff0c;腰间仗剑斩愚夫。虽然不见人头落&#xff0c;暗里教君骨髓枯。 上一章简单介绍了SpringBoot 实现 Web 版本控制 (四十),如果没有看过,请观看上一章 关于消息中间件 RabbitMQ, 可以看老蝴蝶之前的文章: https://blog.csdn.net/yjltx1234csdn/categor…