如何用Python绘制天气图
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要讲解了"如何用Python绘制天气图",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何用Python绘制天气图"吧!#!/bin/env
千家信息网最后更新 2025年02月01日如何用Python绘制天气图
这篇文章主要讲解了"如何用Python绘制天气图",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何用Python绘制天气图"吧!
#!/bin/env python
#coding=utf-8
import codecs
import numpy as np
import datetime
import re
import pandas as pd
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from metpy.calc import wind_components
from metpy.plots import add_metpy_logo, current_weather, sky_cover, StationPlot, wx_code_map
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from metpy.units import units
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import cartopy.io.shapereader as shpreader
def func_return_self(x):
return x
def split(str_in, sep=None, convert_func=None):
ss = str_in.split(sep)
nn = len(ss)
rst = [None]*nn
if convert_func is None:
cf = [func_return_self] * nn
else:
cf = [_ for _ in convert_func]
# print(nn, len(cf))
for i in range(nn):
xcf = func_return_self if cf[i] is None else cf[i]
rst[i] = xcf(ss[i])
return rst
def d1_parse(filename,encoding="gb2312"):
"""
读micaps第1类数据文件到内存
:return:
"""
with codecs.open(filename, mode='r', encoding=encoding) as fid:
contents = fid.readlines()
dataflag, style, title = split(contents[0],None,None)
nn = len(contents)
nx = int((nn-2)/2)
data = {
"stid":[None]*nx,
"lon":[None]*nx,
"lat":[None]*nx,
"height":[None]*nx,
"stlevel":[None]*nx,
"cloud":[None]*nx,
"wd":[None]*nx,
"ws":[None]*nx,
"psfc":[None]*nx,
"pd3":[None]*nx,
"pw1":[None]*nx,
"pw2":[None]*nx,
"prc6":[None]*nx,
"lc1":[None]*nx,
"lc2":[None]*nx,
"lc3":[None]*nx,
"dp":[None]*nx,
"njd":[None]*nx,
"cw":[None]*nx,
"tc":[None]*nx,
"mc":[None]*nx,
"hc":[None]*nx,
"flag1":[None]*nx,
"flag2":[None]*nx,
"dtc24":[None]*nx,
"dp24":[None]*nx
}
data = pd.DataFrame(data)
j=0
for i in range(2,nn,2):
iline1 = contents[i]
iline2 = contents[i+1]
iline = " ".join([iline1,iline2])
#for iline in contents[2:]:
data.stid[j], data.lon[j], data.lat[j], data.height[j], data.stlevel[j],data.cloud[j],data.wd[j],data.ws[j],data.psfc[j],data.pd3[j], data.pw1[j], data.pw2[j], \
data.prc6[j], data.lc1[j],data.lc2[j],data.lc3[j], data.dp[j], data.njd[j], data.cw[j], data.tc[j], data.mc[j], data.hc[j], data.flag1[j], data.flag2[j], data.dtc24[j],data.dp24[j] \
=split(iline,None,
[int, float,float,float,int,float,float,float,float,float,int,int,\
float,float,float,float,float,float,int, float,float, float,int, int,float,float]
)
j+=1
#data.append([stid, lon, lat, height, stlevel,cloud,wd,ws,psfc,pd3, pw1, pw2,\
#prc6, lc1,lc2,lc3, dp, njd, cw, tc, mc, hc, flag1, flag2, dtc24,dp24])
#print(data)
return dataflag, style, title,data
def d4_parse(filename,encoding="gb2312"):
"""
读micaps第4类数据文件到内存
:return:
"""
try:
file_object = codecs.open(filename, mode='r', encoding=encoding)
all_the_text = file_object.read().strip()
file_object.close()
contents = re.split('[\s]+', all_the_text)
if len(contents) < 23:
return
dataflag = contents[0].strip()
style = contents[1].strip()
title = contents[2].strip()
yy = int(contents[3].strip())
mm = int(contents[4].strip())
dd = int(contents[5].strip())
hh = int(contents[6].strip())
forehh = int(contents[7].strip())
level = contents[8].strip()
deltalon = float(contents[9].strip())
deltalat = float(contents[10].strip())
beginlon = float(contents[11].strip())
endlon = float(contents[12].strip())
beginlat = float(contents[13].strip())
endlat = float(contents[14].strip())
sumlon = int(contents[15].strip())
sumlat = int(contents[16].strip())
distance = float(contents[17].strip())
min = float(contents[18].strip())
max = float(contents[19].strip())
def1 = contents[20].strip()
def2 = contents[21].strip()
x = np.arange(beginlon, endlon + 0.9*deltalon, deltalon)
y = np.arange(beginlat, endlat + 0.9*deltalat, deltalat)
X, Y = np.meshgrid(x, y)
if dataflag == 'diamond' and style == '4':
begin = 22
Z = np.zeros((sumlat, sumlon))
for i in range(sumlon):
for j in range(sumlat):
Z[j, i] = float(contents[begin + j * sumlon + i])
return dataflag, style,title,yy,mm,dd,hh,forehh,level,X,Y,Z,distance,min,max,def1,def2
except Exception as err:
print(u'【{0}】{1}-{2}'.format(filename, err, datetime.datetime.now()))
if __name__ == "__main__":
dataflag, style, title, yy, mm, dd, hh, forehh, level, X, Y, p0_data, distance, dmin, dmax, def1, def2 = d4_parse("/home/hliang/share/share/plotest/20190126/p0/19012602.000")
station_dataflag, staiton_style, station_title, station_data = d1_parse("/home/hliang/share/share/plotest/20190126/plot/19012108.000")
station_data = station_data.replace(9999,np.nan)
station_data = station_data[station_data.stlevel==2]#.dropna()
lat_max=50
lat_min=15
lon_max=130
lon_min=100
proj = ccrs.LambertCylindrical(central_longitude=(lon_max+lon_min)/2.0)#ccrs.LambertConformal(central_longitude=(lon_max+lon_min)/2.0, central_latitude=(lat_max+lat_min)/2.0,standard_parallels=[(lat_max+lat_min)/2.0])
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1, 1, 1, projection=proj)
ax.set_extent([lon_min,lon_max,lat_min,lat_max],proj)
ax.set_xticks(range(lon_min,lon_max+2,10), crs=proj)
ax.set_yticks(range(lat_min,lat_max+2,10), crs=proj)
shp = shpreader.Reader('/home/hliang/share/share/plotest/shp_resources/CHN_adm/CHN_adm1.shp')
ax.add_geometries(shp.geometries(), crs=proj, facecolor="none", edgecolor="grey", lw=0.8)
contours = ax.contour(X, Y, p0_data,levels=np.arange(dmin,dmax+0.9*distance,distance), colors="black",transform=proj,linewidths=0.5)
plt.clabel(contours, fontsize=8,fmt='%.1f')
stationplot = StationPlot(ax, station_data['lon'].values, station_data['lat'].values, clip_on=True,
transform=proj, fontsize=6)
u,v = wind_components(station_data['ws'].values * units('m/s'),station_data['wd'].values * units.degree)
stationplot.plot_parameter('NW', station_data['tc'], color='red')
stationplot.plot_barb(u, v,sizes=dict(emptybarb=0.15))
cw = station_data.cw.replace(np.nan,0).astype(np.int)
pw1 = station_data.pw1.replace(np.nan,0).astype(np.int)
stationplot.plot_symbol('W', cw, current_weather,color='fuchsia')
stationplot.plot_symbol('SE', pw1, current_weather,color='y')
'''
for record,state in zip(shp.records(), shp.geometries()):
name = record.attributes["NAME_1"]
if name=="Jiangsu":
ax.add_geometries(state,crs=proj,facecolor="none",edgecolor="grey",lw=0.5)
'''
plt.savefig('./fig1.png',dpi=300)
#plt.show()
感谢各位的阅读,以上就是"如何用Python绘制天气图"的内容了,经过本文的学习后,相信大家对如何用Python绘制天气图这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
天气
天气图
学习
内存
内容
数据
文件
就是
思路
情况
文章
更多
知识
知识点
篇文章
跟着
问题
实践
推送
研究
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
家政服务app软件开发装
陕西中公软件开发就业怎么样
郑州爱普网络技术有限公司
云计算是全新的网络技术吗
网络安全use
不限流量美国服务器
国庆节政府网络安全提示
南京公安局网络安全
甘肃戴尔服务器虚拟化系统服务器
没有法外之地网络安全吗
头条项目需要几台服务器
数据库三大经典数据模型
软件开发案例详细设计说明书
小学网络安全讲座稿
冯春培谈网络安全
军人网络安全宣传图片
戴尔r740服务器
显示数据库列表信息失败
邮件服务器如何防护
网络安全 cto
帆软数据库条件查询
英伟达做软件开发
大型数据库技术大题
戴尔r320服务器密码重置盘
工业软件开发的难点在哪里
网络安全专业哪个学校有
软件开发的制作过程
上网卡网络安全吗
oracle 数据库参数
成都服务器好不好干