基于高德 API 的自动获取气候数据的 Python 脚本

news2024/10/5 16:22:03

文章目录

  • 高德申请 Key
  • 脚本介绍
  • 运行结果示例

源代码: https://github.com/ma0513207162/PyPrecip。pyprecip\reading\read_api.py 路径下。

项目介绍:PyPrecip 是一个专注于气候数据处理的 Python 库,旨在为用户提供方便、高效的气候数据处理和分析工具。该库致力于处理各种气候数据,并特别关注于降水数据的处理和分析。

高德申请 Key

地址: https://lbs.amap.com/api/webservice/guide/api/weatherinfo在这里插入图片描述
个人申请 Key 很简单, 按照官方教程即可。

脚本介绍

导入相关的库和模块,用于支持程序的正常运行。包含自定义的异常抛出、警告、request请求、参数检查等。

import json
from requests.exceptions import RequestException 
from ..utits.http_ import send_request 
from ..utits.sundries import check_param_type
from ..utits.except_ import RaiseException as exc 
from ..utits.warn_ import RaiseWarn as warn

WEATHER_KEY = ""

__check_weather_key 装饰器:检查全局变量 WEATHER_KEY 是否存在,如果不存在,打印相关提示。

# private decorator 
def __check_weather_key(func):
    def wrapper(*args, **kwargs):
        """
        Check whether the global variable WEATHER_KEY is empty, and if it is, 
        prompt the user to register a Web service API and assign a value.
        """
        if not WEATHER_KEY:
            print("\033[93m- PyPrecip Warning: \033[0mWEATHER_KEY is not set.")
            print("\033[0m- Please register for a Web Service API at\033[94m https://console.amap.com/dev/key/app.")
            print("\033[0m- After registering, set the value of the global variable 'read_api.WEATHER_KEY' like this:")
            print("\033[92m- read_api.WEATHER_KEY = 'your_api_key_here' \033[0m")
            return; 
        return func(*args, **kwargs)
    return wrapper

get_address_info 函数:在区域名正确的前提下,用于获取输入区域名来获取该区域的相关信息。

@__check_weather_key
def get_address_info(address: str = "", city: str = None) -> dict:
    """
    The Amap geocoding service API is encapsulated to obtain the region code based on the provided address information.

    Parameters
    ------------------------------
    - address (str): The address information to obtain the corresponding region code
    - city (str): The city name, used to assist in obtaining the region code based on the address

    
    Returns
    -------------------------------
    - dict: A dictionary containing the region code information based on the provided address
    - If the address parameter is empty or invalid, a ValueError exception is raised
    - If an error occurs during the request, a RequestException is raised
    """

    check_param_type(address, str, "address"); 
    check_param_type(city, str, "city")
                
    if address != "":
        with open("./pyprecip/_constant.json", "r", encoding="utf-8") as file:
            READ_API_DATA: dict = json.load(file)["READ_API"]    
        
        GEOCODING_URL: str = READ_API_DATA["GEOCODING_URL"]
        PARAMS: dict = { 
            "key": WEATHER_KEY, 
            "address": address,  "city": city
        }

        # 发送 request 请求 
        response = send_request(GEOCODING_URL, PARAMS)   
        address_info: dict = response.json()

        if address_info["status"] == "1" and address_info["infocode"] == "10000":
            if int(address_info["count"]) > 1:
                warn.raise_warning(f"The place name has multiple regional codes: {address}, the first one is selected by default.")
            return address_info
        else:
            except_address_info: str = address_info["info"]; 
            exc.raise_exception(f"An unknown error occurred in the address request. {except_address_info} \
                             Please try again later", RequestException)
    else:
        exc.raise_exception("address parameter cannot be null or invalid.", ValueError) 

get_weather_data 函数: 输入区域编码或区域名,来获取实时的气候数据。如果指定了 forecasts = True,则获取未来的气候数据。

@__check_weather_key
def get_weather_data(area_code: int = -1, address: str = "", 
                     city: str = "", forecasts: bool = False) -> dict:
    """
    The Amap Open Platform weather data API is encapsulated to obtain real-time weather or future weather forecast data for a specified area.
    
    Parameters
    -------------------------------
    - area_code (int): indicates the region code. If provided, the region code is used to obtain weather data
    - address (str): indicates the address information. If the region code is provided but not provided, the region code is obtained based on the address
    - city (str): city name, used to assist in obtaining the area code based on the address
    forecasts (bool): Specifies whether to obtain real-time weather data (False) or future weather forecast data (True)
    
    Returns
    -------------------------------
    - dict: A dictionary containing weather information for the requested area.
    """

    check_param_type(area_code, int, "area_code"); 
    check_param_type(address, str, "address")
    check_param_type(city, str, "city")
    check_param_type(forecasts, bool, "forecasts")

    request_result: dict = {}
    with open("./pyprecip/_constant.json", "r", encoding="utf-8") as file:
        READ_API_DATA: dict = json.load(file)["READ_API"]    

    # 自动获取当前位置、根据地名获取区域编码 
    if area_code == -1 and address == "":
        # 自动获取当前的位置 
        URL: str = READ_API_DATA["LOCATION_URL"]
        PARAMS: dict = { "key": WEATHER_KEY }

        # 发送 request 请求 
        response = send_request(URL, PARAMS)            
        location_data: dict = response.json()

        if location_data["status"] == '1' and location_data["infocode"] == "10000":
            area_code = location_data["adcode"]
            request_result["area_code"] = location_data["adcode"]
        else:
            exc.raise_exception("An unknown error occurred with the ip location request. Please try again later", RequestException)
    elif area_code == -1 and address != "": 
        address_info = get_address_info(address=address, city=city)
        area_code = address_info["geocodes"][0]["adcode"]
        request_result["area_code"] = area_code
    else:
        if address != "": 
            warn.raise_warning("The area_code parameter overrides the effect of the address parameter.")
        request_result["area_code"] = area_code

    # 请求实时/未来的气候数据 
    WEATHER_URL = READ_API_DATA["WEATHER_URL"]
    ext_type = "base" if forecasts == False else "all" 
    WEA_PARAMS = {"city": area_code,  "key": WEATHER_KEY, "extensions": ext_type}

    # 发送 http 请求
    response = send_request(WEATHER_URL, WEA_PARAMS)            
    weather_data = response.json()

    if weather_data["status"] == '1' and weather_data["infocode"] == '10000':
        if forecasts: 
            forecasts_or_lives = weather_data["forecasts"][0]
        else:
            forecasts_or_lives = weather_data["lives"][0]
            forecasts_or_lives_copy = forecasts_or_lives.copy()
            for key_ in ["province", "city", "reporttime", "adcode"]:
                del forecasts_or_lives_copy[key_]
            forecasts_or_lives["casts"] = [forecasts_or_lives_copy]

        request_result["province"] = forecasts_or_lives["province"]
        request_result["city"] = forecasts_or_lives["city"]
        request_result["update_time"] = forecasts_or_lives["reporttime"] 
        request_result["casts"] = forecasts_or_lives["casts"]
        
        return request_result                    
    else:
        exc.raise_exception("An unknown error occurred in the climate data request. Please try again later", RequestException)

运行结果示例

切换到 pyprecip 项目路径下,运行下面的命令。

python -m pyprecip.reading.read_api

指定区域编码:
在这里插入图片描述
指定区域名:
在这里插入图片描述

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

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

相关文章

鸿蒙DevEco Studio 4.1 Release-模拟器启动方式错误

软件版本:DevEco Studio 4.1 Release 报错提示: 没有权限查看处理指导 Size on Disk 显示1.0MB 尝试方案(统统无效): 1、“windows虚拟机监控程序平台”、"虚拟机平台"已开启 启用CPU虚拟化 2、C…

康谋分享 | aiSim5仿真场景重建感知置信度评估(三)

aiSim5重建高精度的真实交通场景,用于测试和训练ADAS/AD系统。内置场景包括赛道、车库、高速公路和城市环境。通过全局行动日志,aiSim能将驾驶数据转化为场景重建。车道线检测算法在仿真与现实世界的相关性测试中误差相近,召回率均接近98.5%。…

Camtasia Studio 的功能介绍及常规操作教程

随着数字媒体时代的快速发展,视频已经成为人们获取信息、娱乐和沟通的主要方式之一。在这样的背景下,一款强大且易于使用的视频编辑和制作工具显得尤为重要。Camtasia Studio就是这样一款能够满足各种视频制作需求的优秀软件。 一、Camtasia Studio的特…

Python生成文学编程风格文档库之pycco使用详解

概要 Pycco是一个Python库,用于生成文学编程风格的文档。它受到了Docco(一个快速生成源代码文档的工具)的启发,并通过解析源代码旁边的注释来创建一个美观的文档页面,使代码的解释与代码本身并排显示。 安装 安装Pycco非常简单,可以通过Python的包管理器pip进行安装: …

论文阅读_RAG融合现有知识树_T-RAG

英文名称: T-RAG: LESSONS FROM THE LLM TRENCHES 中文名称: T-RAG:来自LLM战壕的经验教训 链接: https://arxiv.org/abs/2402.07483 作者: Masoomali Fatehkia, Ji Kim Lucas, Sanjay Chawla 机构: 卡塔尔计算研究所, 哈马德本哈利法大学 日期: 2024-02-12 引用次数…

《米小圈上学记》|快乐读书,从身边的人身边的事开始!

时间,抓住了就是黄金,虚度了就是流水;书,看了就是学问,没看就是废纸:抱负,努力了才叫幻想,放弃了那只是妄想。读书,不一定能转变命运,但肯定能让我们安静,安静本身就是一…

企业计算机服务器中了faust勒索病毒如何处理,faust勒索病毒解密恢复

随着网络技术的不断发展与应用,越来越多的企业利用网络走向了数字化办公模式,网络也极大地方便了企业生产运营,大大提高了企业生产效率,但对于众多企业来说,企业的数据安全一直是大家关心的主要话题,保护好…

LLM Agent 全网最全简介

什么是LLM Agent 导语 GPT(尤其是GPT-4)等大语言模型(LLM)的推出,让人类认识到了大语言模型强大的文本生成能力。 只是用来做文本生成工具的话,LLM的能力就被严重低估了。Agents的想法的出现,…

粘土制作的梵高世界;实时自由地转换您的声音Supertone;几秒钟内设计出令人惊叹的LOGO

✨ 1: 梵高的世界 你探索 runwayml #Gen2 过 的风格功能吗?看看这个用粘土制作的梵高作品的视频——就像走进了梵高的双手雕刻的世界。 🎨 🖌️ 关注更多将经典艺术与现代技术融合的创新方式! ✨ 2: Supertone Shift 实时自由…

数字工厂管理系统如何实现生产过程透明化

随着科技的飞速发展,数字化转型已成为制造业不可逆转的趋势。数字工厂管理系统作为实现生产自动化、智能化的重要工具,其在提升生产效率、降低运营成本、优化资源配置等方面的作用日益凸显。其中,实现生产过程的透明化是数字工厂管理系统的重…

Vinted店铺总被封号?如何有效养号?

Vinted是一家欧洲知名的二手时尚交易平台,致力于连接买家和卖家,让他们能够在平台上买卖二手时尚商品。用户可以在Vinted上销售和购买服装、鞋子、配饰等各种时尚物品,无论是品牌商品还是非品牌商品,都可以在平台上找到。Vinted的…

什么是驱动数字签名?如何获取驱动数字签名?

Windows 驱动程序承载着计算机实现的各种内核和用户模式功能。如果驱动程序被黑客攻击,可能会产生很多问题。Windows通过数字签名来验证驱动程序包的完整性及发布者的身份。2020年10月的安全更新中,微软加强了对驱动软件的验证,如果Windows无…

OFDM802.11a的FPGA实现(十)导频插入(含verilog和matlab代码)

原文链接(相关文章合集):OFDM 802.11a的xilinx FPGA实现 目录 1.前言2.插入导频原理3.硬件实现4.Matlab仿真5.ModelSim仿真6.结果对比验证7.verilog代码 1.前言 前面一篇文章完成了星座图的映射,今天继续设计后面的模块。在接收机…

Linux 操作系统网络编程1

目录 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型 1.1.2 网络数据传输过程 2 传输层通信协议 2.1 TCP 2.1.1 TCP的3次握手过程 2.1.2 TCP四次挥手过程 2.2 UDP 3 网络编程的IP地址 4 端口 5 套接字 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型…

GitHub介绍,GitHub如何订阅充值?

一、GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名Github。 GitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的Web管理界面以外,还提供了订阅、讨论组、…

WSL介绍(Windows10内置的Linux子系统)

最近发现在Windows10下不用安装虚拟机也可以使用Linux,然后发现原来2016年就已经有这个功能了,下面来介绍下如何使用。 首先我的win10版本信息如下,以免部分版本不支持,可以做个参考。 需要进到控制面板里将Linux子系统功能打开&a…

使用Vue连接Mqtt实现主题的订阅及消息发布

效果如下&#xff1a; 直接贴代码&#xff0c;本地创建一个html文件将以下内容贴入即可 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, …

基于Linux中的 进程相关知识 综合讲解

目录 一、进程的基本概念 二、pid&#xff0c;ppid&#xff0c;fork函数 三、进程的状态讲解 四、进程的优先级 五、完结撒❀ 一、进程的基本概念 概念&#xff1a; ● 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 ● 内核观点&#xff1a;担当…

SSM【Spring SpringMVC Mybatis】——Mybatis

目录 1、初识Mybatis 1.1Mybatis简介 1.2 官网地址 2、搭建Mybatis框架 2.1 准备 2.2 搭建Mybatis框架步骤 1. 导入jar包 2. 编写核心配置文件【mybatis-config.xml】 3. 书写相关接口及映射文件 4. 测试【SqlSession】 2.3 添加Log4j日志框架 导入jar包 编写配置文…

CTF关于反序列化练习随笔记录

反序列化 php魔术方法 1、get、set 这两个方法是为在类和他们的父类中没有声明的属性而设计的 get&#xff08; $property &#xff09; 当调用一个未定义的属性时访问此方法 set&#xff08; $property&#xff0c; $value &#xff09; 给一个未定义的属性赋值时调用 这里的…