我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python实现葵花8号卫星数据自动下载实例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python实现葵花8号卫星数据自动下载实例

一:数据源介绍

本篇文章介绍的是使用python实现对葵花8号卫星数据进行自动下载。

葵花8号卫星是日本的一颗静止轨道气象卫星,覆盖范围为60S-60N, 80E-160W,除了提供十分钟一幅的原始卫星影像外,还提供了如气溶胶光学厚度(AOT,也叫AOD)、叶绿素A、海表温度、云层厚度以及火点等多种产品,这些数据都可以进行下载。

二:FTP服务器描述

首先需要在葵花8官网申请帐号。

可以通过FTP(ftp.ptree.jaxa.jp)使用申请的帐号密码访问文件服务器,可以看到jma文件夹、pub文件夹和两个文本文件,其中,jma文件夹和pub文件夹中存放的都是葵花系列卫星的影像产品,文本文件的内容是每种影像产品的存放位置和数据介绍。

三: 程序描述

  • 本代码下载Ftp服务器如下地址下的文件,如需使用可根据自己的需要进行修改,也可以参考官方txt数据介绍文档寻找自己需要的数据的存储路径。
  • 使用/031目录是因为数据最全。
  /pub/himawari/L3/ARP/031/
  • 本程序有两个全局调试变量。
全局变量TrueFalse配置变量
debugLocalDownload下载到本地目录下载到服务器指定目录self._save_path
debugDownloadDaily下载当前日期前1天的文件下载指定时间段的文件-

本程序有两个版本在debugDownloadDaily=False时略有区别

  • HimawariDownloadBulitIn的时间变量写在程序内部,运行前需手动修改,适用于超算节点。
  • HimawariDownloadCmdLine的时间变量通过命令行输入,适用于登陆节点。

四:注意事项

  • 代码无法直接运行 需要将以下行中的帐号和密码替换成你申请的账号密码

五:代码

# -*- codeing = utf-8 -*-
# 可以部署在日本的服务器上,下载速度很快
import ftplib
import json
import os
import time
import numpy as np
debugLocalDownload = True
debugDownloadDaily = False
globPersonalTime = [2022, 9, 7]
class NumpyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (np.int_, np.intc, np.intp, np.int8,
                            np.int16, np.int32, np.int64, np.uint8,
                            np.uint16, np.uint32, np.uint64)):
            return int(obj)
        elif isinstance(obj, (np.float_, np.float16, np.float32, np.float64)):
            return float(obj)
        elif isinstance(obj, (np.ndarray,)):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)
class himawari:
    ftp = ftplib.FTP()
    def __init__(self):
        self._url = '/pub/himawari/L3/ARP/031/'
        self._save_path = './Your_save_path'
        if debugLocalDownload:
            self._save_path = './Download/'
        self.ftp.connect('ftp.ptree.jaxa.jp', 21)
        self.ftp.login('YourFTPAccount', 'YourFTPPassWord')
        self._yearNum, self._monNum, self._dayNum = self.dayInit()
        self._nginx_path = ''
        print(self.ftp.welcome)  # 显示登录信息
    def run(self):
        self._nginx_path = ''
        try:
            if debugDownloadDaily:
                self._yearNum, self._monNum, self._dayNum = self.getYesterday(self._yearNum, self._monNum, self._dayNum)
            else:
                self._yearNum = globPersonalTime[0]
                self._monNum = globPersonalTime[1]
                self._dayNum = globPersonalTime[2]
            self._yearStr, self._monStr, self._dayStr = self.getDateStr(self._yearNum, self._monNum, self._dayNum)
            ftp_filePath = self._url + self._yearStr + self._monStr + "/" + self._dayStr + "/"
            # 从目标路径ftp_filePath将文件下载至本地路径dst_filePath
            dst_filePath = self._nginx_path + self._save_path + self._yearStr + "/" + self._monStr + "/" + self._dayStr + "/" + "hour" + "/"
            self.deleteFile(dst_filePath)  # 先删除未下载完成的临时文件
            print("Local:" + dst_filePath)
            print("Remote:" + ftp_filePath)
            self.DownLoadFileTree(dst_filePath, ftp_filePath)
            if debugDownloadDaily:
                self.ftp.quit()
        except Exception as err:
            print(err)
    def getYesterday(self, yy, mm, dd):
        dt = (yy, mm, dd, 9, 0, 0, 0, 0, 0)
        dt = time.mktime(dt) - 86400
        yesterdayList = time.strftime("%Y-%m-%d", time.localtime(dt)).split('-')
        return int(yesterdayList[0]), int(yesterdayList[1]), int(yesterdayList[2])
    def dayInit(self, ):
        yesterdayList = time.strftime("%Y-%m-%d", time.localtime(time.time())).split('-')
        return int(yesterdayList[0]), int(yesterdayList[1]), int(yesterdayList[2])
    def getDateStr(self, yy, mm, dd):
        syy = str(yy)
        smm = str(mm)
        sdd = str(dd)
        if mm < 10:
            smm = '0' + smm
        if dd < 10:
            sdd = '0' + sdd
        return syy, smm, sdd
    # 删除目录下扩展名为.temp的文件
    def deleteFile(self, fileDir):
        if os.path.isdir(fileDir):
            targetDir = fileDir
            for file in os.listdir(targetDir):
                targetFile = os.path.join(targetDir, file)
                if targetFile.endswith('.temp'):
                    os.remove(targetFile)
    # 下载单个文件,LocalFile表示本地存储路径和文件名,RemoteFile是FTP路径和文件名
    def DownLoadFile(self, LocalFile, RemoteFile):
        bufSize = 102400
        file_handler = open(LocalFile, 'wb')
        print(file_handler)
        # 接收服务器上文件并写入本地文件
        self.ftp.retrbinary('RETR ' + RemoteFile, file_handler.write, bufSize)
        self.ftp.set_debuglevel(0)
        file_handler.close()
        return True
    # 下载整个目录下的文件,LocalDir表示本地存储路径, emoteDir表示FTP路径
    def DownLoadFileTree(self, LocalDir, RemoteDir):
        # 如果本地不存在该路径,则创建
        if not os.path.exists(LocalDir):
            os.makedirs(LocalDir)
            # 获取FTP路径下的全部文件名,以列表存储
        self.ftp.cwd(RemoteDir)
        RemoteNames = self.ftp.nlst()
        RemoteNames.reverse()
        # print("RemoteNames:", RemoteNames)
        for file in RemoteNames:
            # 先下载为临时文件Local,下载完成后再改名为nc4格式的文件
            # 这是为了防止上一次下载中断后,最后一个下载的文件未下载完整,而再开始下载时,程序会识别为已经下载完成
            Local = os.path.join(LocalDir, file[0:-3] + ".temp")
            files = file[0:-3] + ".nc"
            LocalNew = os.path.join(LocalDir, files)
            '''
            下载小时文件,只下载UTC时间0时至24时(北京时间0时至24时)的文件
            下载的文件必须是nc格式
            若已经存在,则跳过下载
            '''
            # 小时数据命名格式示例:H08_20200819_0700_1HARP030_FLDK.02401_02401.nc
            if int(file[13:15]) >= 0 and int(file[13:15]) <= 24:
                if not os.path.exists(LocalNew):
                    #print("Downloading the file of %s" % file)
                    self.DownLoadFile(Local, file)
                    os.rename(Local, LocalNew)
                    print("The download of the file of %s has finished\n" % file)
                    #print("png of the file of %s has finished\n" % png_name)
                elif os.path.exists(LocalNew):
                    print("The file of %s has already existed!\n" % file)
        self.ftp.cwd("..")
        return
# 主程序
myftp = himawari()
if debugDownloadDaily:
    myftp.run()
else:
    yyStart, mmStart, ddStart = input("Start(yy mm dd):").split()
    yyStart, mmStart, ddStart = int(yyStart), int(mmStart), int(ddStart)
    yyEnd, mmEnd, ddEnd = input("End(yy mm dd):").split()
    yyEnd, mmEnd, ddEnd = int(yyEnd), int(mmEnd), int(ddEnd)
    dtStart = (yyStart, mmStart, ddStart, 9, 0, 0, 0, 0, 0)
    dtEnd = (yyEnd, mmEnd, ddEnd, 10, 0, 0, 0, 0, 0)
    timeIndex = time.mktime(dtStart)
    timeIndexEnd = time.mktime(dtEnd)
    while timeIndex < timeIndexEnd:
        indexDayList = time.strftime("%Y-%m-%d", time.localtime(timeIndex)).split('-')
        globPersonalTime[0] = int(indexDayList[0])
        globPersonalTime[1] = int(indexDayList[1])
        globPersonalTime[2] = int(indexDayList[2])
        print(globPersonalTime)
        myftp.run()
        timeIndex = int(timeIndex) + 3600 * 24

以上就是Python实现葵花8号卫星数据自动下载实例的详细内容,更多关于Python数据自动下载的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python实现葵花8号卫星数据自动下载实例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录