Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用Python实现可视化天气预报

用Python实现可视化天气预报

原创
作者头像
mariolu
发布于 2024-03-14 18:56:45
发布于 2024-03-14 18:56:45
30900
代码可运行
举报
运行总次数:0
代码可运行

我们用Python来做一个天气时钟。也就是既能显示时间,也能显示未来12小时天气。我们的产品设计效果如下图:

一、时钟部分

这个天气时钟首先我们先做时钟部分。

时钟有时针、分针和秒针。这里用来绘制用到了Python Trutle库。以小时针为例。我们先

  • 拿起画笔pen.penup()
  • 笔移动到表盘中心点pen.goto(global_x_shift, global_y_shift)
  • 带上笔的颜色, pen.color(hour_color)
  • 设置笔的初始方向 pen.setheading(90)
  • 设置笔的顺时针选择角度angle,对于时针来说就是angele=(hour /12)*360+(minute/60)*30
  • 然后向右旋转角度pen.rt(angle)
  • pen.pendown()放下笔开始绘画
  • pen.fd(hour_hand) 向前绘制长度hour_hand。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# draw a clock using the pen i created
def draw_clock(hour, minute, second, pen):
    pen.hideturtle()

    # Draw the hour han
    # 有关Python Turtle常用的操作见http://www.cse.msu.edu/~ldillon/cse-ctl/Spring2015/Meeting07/turtleCheatSheet.pdf 
    pen.penup()  # 暂停绘画,和底下的pendown是一对
    pen.goto(global_x_shift, global_y_shift)
    pen.color(hour_color)
    pen.pensize(6)  # 小时针的宽度
    pen.setheading(90)  # 设置角度,0(east), 90(north), 180(west), 270(south)
    angle = (hour / 12) * 360 + (minute/60) * 30  # 根据当前时间,小时针应该便宜的角度
    pen.rt(angle)  # 向右/顺时针旋转角度,turtle.rt和turtle.right一样
    pen.pendown()  # 开始绘画,和上面的penup是一对
    pen.fd(hour_hand)  # 小时针的长度,向前绘制,turtle.fd同turtle.forward

    # Draw the minute hand
    pen.penup()
    pen.goto(global_x_shift, global_y_shift)
    pen.color(minute_color)
    pen.setheading(90)
    angle = (minute / 60.0) * 360  # optional + (s/60) * 6
    pen.rt(angle)
    pen.pendown()
    pen.fd(minute_hand)

    # Draw the second hand
    pen.penup()
    pen.goto(global_x_shift, global_y_shift)
    pen.color(second_color)
    pen.setheading(90)
    angle = (second / 60) * 360
    pen.rt(angle)
    pen.pendown()
    pen.fd(second_hand)

二、未来12小时天气

获取未来12小时天气预报这个update_forecast函数,我们通过拉取openweathermap的接口,得到了温度,体感温度,风速和天气类型图标。

这些天气数值和图标准备好之后。会放在数组待用。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def update_forecast():

    global hour_cursor

    # weather ID breakdown https://openweathermap.org/weather-conditions
    # use https://ezgif.com/maker for gif conversion

    logging.debug("---- update_forecast() ----")

    hour_cursor = int(time.strftime("%I"))  # %I表示12小时制
    meridiem = time.strftime('%p')  # %p表示上午AM或者下午PM

    logging.debug("hour_cursor: " + str(hour_cursor))

    for num in range(12):
        # current hour
        logging.debug("current hour: " + str(hour_cursor) + " " + meridiem)
        # forecast hour
        logging.debug("forecast hour: " + str(int(hour_cursor)+num))
        logging.debug("temperature: " + str(data["hourly"][num]["temp"]))
        logging.debug("feels like: " + str(data["hourly"][num]["feels_like"]))
        logging.debug("wind speed: " + str(data["hourly"][num]["wind_speed"]))
        logging.debug(data["hourly"][num]["weather"][0]["description"])
        logging.debug("weather ID: " + str(data["hourly"][num]["weather"][0]["id"]))
        logging.debug("POP: " + str(data["hourly"][num]["pop"]))

        if 'rain' not in data["hourly"][num]:
            logging.debug("no rain data")
        else:
            logging.debug("rain: " + str(data["hourly"][num]["rain"]))

        temp_array[num] = data["hourly"][num]["temp"]  # 温度
        temp_feel_array[num] = data["hourly"][num]["feels_like"]  # 体感温度
        wind_array[num] = data["hourly"][num]["wind_speed"]  # 风速
        id_array[num] = data["hourly"][num]["weather"][0]["id"]  # 天气icon id,见https://openweathermap.org/weather-conditions

        path_theme = os.path.join(path, theme)

        if 232 >= id_array[num] >= 200:
            idImage_array[num] = os.path.join(path_theme, "11d@2x.gif")
        elif 321 >= id_array[num] >= 300:
            idImage_array[num] = os.path.join(path_theme, "09d@2x.gif")
        elif 504 >= id_array[num] >= 500:
            idImage_array[num] = os.path.join(path_theme, "10d@2x.gif")
        elif id_array[num] == 511:
            idImage_array[num] = os.path.join(path_theme, "13d@2x.gif")
        elif 531 >= id_array[num] >= 520:
            idImage_array[num] = os.path.join(path_theme, "09d@2x.gif")
        elif 622 >= id_array[num] >= 600:
            idImage_array[num] = os.path.join(path_theme, "13d@2x.gif")
        elif 781 >= id_array[num] >= 701:
            idImage_array[num] = os.path.join(path_theme, "50d@2x.gif")
        elif id_array[num] == 800:
            idImage_array[num] = os.path.join(path_theme, "01d@2x.gif")
        elif id_array[num] == 801:
            idImage_array[num] = os.path.join(path_theme, "02d@2x.gif")
        elif id_array[num] == 802:
            idImage_array[num] = os.path.join(path_theme, "03d@2x.gif")
        elif id_array[num] == 803 or id_array[num] == 804:
            idImage_array[num] = os.path.join(path_theme, "04d@2x.gif")
        else:
            logging.error("Invalid weather ID")

    logging.debug(temp_array)
    logging.debug(id_array)
    logging.debug(idImage_array)

    for image in idImage_array:
        wn.addshape(image)  # 画布上画上天气图标

天气icon放置的位置就是原本时钟上的小时数位置。也就是x和y坐标通过公式计算:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
hour_x = []
hour_y = []

for i in range(60, -300, -30):
    i_r = math.radians(i)
    hour_x.append((math.cos(i_r)*radius))
    hour_y.append((math.sin(i_r)*radius))

三、总结

完整的程序我放在了这里:weatherClock/weatherClock.py at master · lumanyu/weatherClock (github.com)

本程序通过小时和天气的创新融合,运用程序员的技能做了一个实用工具。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 中 turtle 库的使用
Turtle 库是 Python 内置的图形化模块,属于标准库之一,位于 Python 安装目录的 lib 文件夹下,常用函数有以下几种:
村雨遥
2022/06/15
9880
Python 中 turtle 库的使用
全网最全面的python的讲解,讲的无可挑剔《记得收藏》
5、文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。
苏州程序大白
2021/08/13
1.1K0
全网最全面的python的讲解,讲的无可挑剔《记得收藏》
Python绘图Turtle库详解[通俗易懂]
画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。
全栈程序员站长
2022/06/27
1.7K0
Python绘图Turtle库详解[通俗易懂]
python库之–turtle,matplotlib,numpy,opencv,os,pillow
在学python之前,我总觉得这个东西很玄乎,而且认为网上传的很邪门:几行画出一个函数图,几十行做出一个人物形象,几十行写出一个小游戏。当时只觉得时夸大其词了。后来慢慢学习python,虽然知道了它可以用好多库,但也并没有觉得有什么。直到这次学长给我机会让我做一些东西,我才真正了解到它如何去使用,才真正发现它的乐趣,因此开启了新世界的大门,非常感谢学长!!!
十四君
2019/11/27
2.2K0
Python-turtle库绘图
turtle(海龟)库是turtle绘图体系的Python实现,turtle库是一种标准库,是Python自带的。
wangmcn
2022/07/25
1.8K0
Python-turtle库绘图
Python 海龟绘图:turtle库的使用
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Python 海龟绘图:turtle库的使用 ---- Python 海龟绘图:turtle库的使用 1.turtle简介 2.turtle基础知识 2.1 画布 2.2 画笔 2.2.1 画笔的状态 2.2.2 画笔的属性 2.2.3 绘图命令 2.2.3.1 画笔运动命令 2.2.3.2 画笔控制命令 2.2
小嗷犬
2022/11/15
3K0
Python 海龟绘图:turtle库的使用
用python实现自动发送天气预报
假如我们给多个人发送天气情况,这几个人来自不同的城市,那么我们不可能每次都要输入城市名,然后查找城市码,然后再访问接口,获取天气情况,这样会非常的麻烦,所以我们需要考虑将城市名跟城市码一一对应起来,说到一一对应,首先想到的数据结构便是字典,所以我们可以将这些信息存入一个字典里,然后持久化到一个文件中,这样便方便很多
dogfei
2020/07/31
1K0
Python语言练习
Python程序由指令组成,运行程序时,计算机依据预设好的指令执行程序。 print是最简单,但很常用的指令,它用于将一些信息输出至屏幕上。 下面演示Python中的print指令:
荣仔_最靓的仔
2021/02/02
3.1K0
Python语言练习
Python3的简单语法与常用库(慢慢更新中)
之前学习Python的时候,主要是在网上简单看了些文档,并没有系统的去学习过,前些天抽空在中国大学MOOC上学习了由北京理工大学嵩天老师讲授的免费公开课--Python语言程序设计。这个课程讲的比较基础,但讲的确实不错。
用户7886150
2020/12/31
7590
Python新手教程:Python微信定时自动给【女朋友】发送天气预报
6.函数中请求百度天气接口,得到该好友对应天气数据,解析处理数据,发送天气信息,完成该对象发送。
一墨编程学习
2019/07/26
2.4K2
Python新手教程:Python微信定时自动给【女朋友】发送天气预报
python图形绘制库turtle中文开发文档及示例大全【最详细、连结果图都有,gif格式的!】
由于网上其它文档的形式不符合我个人习惯,在查阅资料时总感觉不是很习惯,就想着顺手写一篇博文作为一个参考示例。
1_bit
2020/10/23
2.8K0
python图形绘制库turtle中文开发文档及示例大全【最详细、连结果图都有,gif格式的!】
用javafx框架tornadofx做了个天气预报的程序
此实例用到了rest api,tableview,listview,linechart、ItemViewModel等知识,演示了动态加载数据的方法.
用户6167008
2019/10/16
2.1K1
用javafx框架tornadofx做了个天气预报的程序
PYTHON初学之API爬取天气预报数据
一直看到python好多人学,终于自己耐不住性子,还是开始学习起来了。 初学python,看到了这个经典的项目,于是就开始进行学习。并进行了相应的改(乱)善(改),将原本项目采用的储存数据库改为mysql,只储存近三天的天气情况,增加定时执行,成功之后邮件提醒等。
布衣者
2021/09/07
8340
爬虫实例八:爬取天气预报数据,并实现数据可视化
在爬取数据时,有些数据,如图片、视频等等,爬到就是赚到;而有时候,我们爬到的可能只是一些数字,表面上,看上去没什么意义,但当我们换一种角度来看待问题的话,可能又是一个崭新的世界。于是,我今天学习了一下数据的可视化。
远方的星
2021/03/02
8.9K1
爬虫实例八:爬取天气预报数据,并实现数据可视化
《颠覆你的 Python 接口自动化测试》05 - Python 操作 HTTP 请求
看了 @倔强的潇洒小姐 的发送http问题汇总的文章,也有类似的报错。 看了下她的解决方法,发现我在mysql.py文件里已经设置过了 cur = conn.cursor(cursorclass=pymysql.cursors.DictCursor),所以只能从其他地方下手查找错误。接着看到了红字下面的数据库的报错才发现代码里把 params_interface 写成了 param_interface 了,修改完成后,就不报错了。
caoqi95
2019/03/27
6460
《颠覆你的 Python 接口自动化测试》05 - Python 操作 HTTP 请求
Python爬取天气数据及可视化分析!
来源丨Python之王 Python爬取天气数据及可视化分析 说在前面 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物、安排出行,每天的气温、风速风向、相对湿度、空气质量等成为关注的焦点。本次使用python中requests和BeautifulSoup库对中国天气网当天和未来14天的数据进行爬取,保存为csv文件,之后用matplotlib、numpy、pandas对数据进行可视化处理和分析,得到温湿度度变化曲线、空气质量图、风向雷达图等结果,为获得未来天气信息提供了有效方法。 1.数据获取
张俊红
2022/04/06
1.6K0
Python爬取天气数据及可视化分析!
Selenium2+python自动化72-logging日志使用
前言 脚本运行的时候,有时候不知道用例的执行情况,这时候可以加入日志,这样出现问题后方便查阅,也容易排查哪些用例执行了,哪些没有执行。 一、封装logging模块 1.关于logging日志的介绍,我这里就不详细讲解了,主要有两大功能,一个是控制台的输出,一个是保存到本地文件 2.先封装logging模块,保存到common文件夹命名为logger.py,以便于调用 # coding:utf-8 import logging,time,os # 这个是日志保存本地的路径 log_path = "D:\\te
上海-悠悠
2018/04/08
1.2K0
Selenium2+python自动化72-logging日志使用
Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)「建议收藏」
我发现网上有很多写得很好的Python表白代码,感觉绘出来的图很漂亮。我整理了一下,挑了一些我觉得不错的代码和部分自认不错的原创分享给大家(这些我都测试过,确实可以生成喔~),选一种喜欢的方式发给你的那个她/他吧。
全栈程序员站长
2022/09/05
30.8K0
Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)「建议收藏」
Google Earth Engine——GFS全球天气预报模型数据集:384小时的预测,预测间隔为3小时,以6小时的时间分辨率进行(每天更新4次)
The Global Forecast System (GFS) is a weather forecast model produced by the National Centers for Environmental Prediction (NCEP). The GFS dataset consists of selected model outputs (described below) as gridded forecast variables. The 384-hour forecasts, with 3-hour forecast interval, are made at 6-hour temporal resolution (i.e. updated four times daily). Use the 'creation_time' and 'forecast_time' properties to select data of interest.
此星光明
2024/02/02
9120
Google Earth Engine——GFS全球天气预报模型数据集:384小时的预测,预测间隔为3小时,以6小时的时间分辨率进行(每天更新4次)
这几个5.20表白代码发给你女神,还没有女朋友直接来找我!
话说眨眼间...18、19、**、21...,哦?中间忘掉了什么?仔细一看,原来是5.20。
灰小猿
2021/05/20
1.3K0
推荐阅读
相关推荐
Python 中 turtle 库的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验