python 画广东省等压线图
最近开发时要实现一个业务逻辑:
- 调用中国气象数据网API接口获取广东省实时气象数据
- 根据数据,基于广东省地图渲染等压线图
最终效果图是这样的:

- 首先是获取实时气压数据,由于中国气象数据网每次只能获得30个站点的气象数据,而广东省共有86个气象站点,所以分成3批获取,存入数组。
获取到的数据格式是[{Station_Id_C,Year,Mon,Day,Hour,PES}],然后遍历气象站点列表,把对应的经纬度(longitude、latitude)存入数组中,得到了这样的三元组数组(longitude、latitude、value),用pandas处理一下:
x = df['longitude'].values
y = df['latitude'].values
z = df[request.GET.get("c")].values
- 然后通过numpy库中的 meshgrid 函数把x、y两个一维数组矢量化为两个二维数组
X , Y = np.meshgrid(x,y) - 用zip函数取出所有点
points = [[a, b] for a, b in zip(x, y)] - 使用scipy库中的 griddata 函数插值数据集,便于形成N条等压线
Z = griddata(points, z, (X, Y)) - 为了与前端采用的geojson作为地图数据统一,选用Geopands库作为地图渲染库,首先打开广东省的geojson文件
df = gpd.read_file(os.path.dirname(__file__) + '\\gd.json'),然后将地图渲染到matplotlib的画布上ax = df.plot(figsize=(10, 10), alpha=0.2, edgecolor='k') - 利用 contour 函数将等压线渲染到画布上
C = ax.contour(X, Y, Z),再标注等压线的数值plt.clabel(C, inline=True, fontsize=10) - 去除x轴、y轴
plt.xticks(()) plt.yticks(()),调用show函数查看图像 - 实际业务中的代码如下,为了用户下载图片浪费服务器资源,选择将静态图片保存至服务器端:
def get_contour(request):
index_url = "http://api.data.cma.cn:8090/api?"
get_params = {
"dataFormat": "json",
"interfaceId": "getSurfEleByTimeRangeAndStaID",
"dataCode": "SURF_CHN_MUL_HOR",
"timeRange": "[" + datetime.strptime(request.GET.get('f'), "%Y-%m-%dT%H:%M").strftime(
"%Y%m%d%H%M%S") + "," + datetime.strptime(request.GET.get('g'), "%Y-%m-%dT%H:%M").strftime(
"%Y%m%d%H%M%S") + "]",
"staIDs": int(request.GET.get('e')),
"elements": 'Station_Id_C,Year,Mon,Day,Hour,' + request.GET.get("c")
}
session = requests.Session()
f = session.get(index_url + parse.urlencode(get_params))
s = json.loads(f.text)
l = s['DS'][len(s['DS']) - 1]
date = datetime(year=int(l['Year']), month=int(l['Mon']),
day=int(l['Day']), hour=int(l['Hour']))
s = list(DCmaStation.objects.all().values())
d = []
for i in range(int(len(s) / 30) + 1):
n = [j['id'] for j in s[i * 30: (i + 1) * 30]]
get_params = {
"dataFormat": "json",
"interfaceId": "getSurfEleByTimeRangeAndStaID",
"dataCode": "SURF_CHN_MUL_HOR",
"timeRange": "[" + date.strftime("%Y%m%d%H%M%S") + "," + date.strftime("%Y%m%d%H%M%S") + "]",
"staIDs": str(n),
"elements": 'Station_Id_C,Year,Mon,Day,Hour,' + request.GET.get("c")
}
f = session.get(index_url + parse.urlencode(get_params))
d.extend(json.loads(f.text)['DS'])
for i in d:
for j in s:
if int(i['Station_Id_C']) == int(j['id']):
i['longitude'] = j['longitude']
i['latitude'] = j['latitude']
break
df = pd.DataFrame(d)
x = df['longitude'].values
y = df['latitude'].values
z = df[request.GET.get("c")].values
def plot_contour(x, y, z, resolution=50, contour_method='linear'):
resolution = str(resolution) + 'j'
X, Y = np.mgrid[min(x):max(x):complex(resolution), min(y):max(y):complex(resolution)]
points = [[a, b] for a, b in zip(x, y)]
Z = griddata(points, z, (X, Y), method=contour_method)
return X, Y, Z
X, Y, Z = plot_contour(x, y, z, resolution=50, contour_method='linear')
locale.setlocale(locale.LC_CTYPE, 'chinese')
plt.rcParams['font.sans-serif'] = ['SimHei']
df = gpd.read_file(os.path.dirname(__file__) + '\\gd.json')
ax = df.plot(figsize=(10, 10), alpha=0.2, edgecolor='k')
C = ax.contour(X, Y, Z)
plt.clabel(C, inline=True, fontsize=10)
plt.xticks(())
plt.yticks(())
plt.title(
"广东省" + date.strftime("%Y年%m月%d日%H时") + "等" + DCmaDict.objects.filter(key=request.GET.get('c')).first().value+"图")
filename = datetime.now().strftime("%Y%m%d%H%M%S") + ".png"
plt.savefig(os.path.dirname(__file__) + '\\static\\img\\' + filename, bbox_inches='tight')
return HttpResponse(filename)
python 画广东省等压线图的更多相关文章
- 用matalb、python画聚类结果图
用matlab %读入聚类后的数据, 已经分好级别了,例如前4行是亚洲一流, %-13是亚洲二流,-24是亚洲三流 a=xlsread('C:\Users\Liugengxin\Desktop\1.x ...
- python画箱线图
# -*- coding: utf-8 -*- """ Created on Wed Jun 14 13:00:11 2017 @author: Miao "& ...
- Python matplot画散列图
同matlab一样,matplot也可画散列图scatter. import numpy as np import matplotlib.pyplot as plt #fig = plt.figure ...
- 利用Tkinter和matplotlib两种方式画饼状图
当我们学习python的时候,总会用到一些常用的模块,接下来我就详细讲解下利用两种不同的方式画饼状图.首先利用[Tkinter]中的canvas画布来画饼状图: from tkinter import ...
- 沉淀再出发:用python画各种图表
沉淀再出发:用python画各种图表 一.前言 最近需要用python来做一些统计和画图,因此做一些笔记. 二.python画各种图表 2.1.使用turtle来画图 import turtle as ...
- 利用python画出动态高优先权优先调度
之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...
- 用Python画如此漂亮的专业插图 ?简直So easy!
本文整理自知乎问答,仅用于学术分享,著作权归作者所有.如有侵权,请联系我删文处理.多多转发,多多学习! 方法一 强烈推荐 Python 的绘图模块 matplotlib: python plottin ...
- 用python画xy散点图
import matplotlib.pyplot as plt plt.plot([1,2,3],[4,5,6],'ro') plt.show()#这个智障的编辑器 这样的话,就可以画一个散点图,图中 ...
- 四步轻松实现用Visio画UML类图
本节和大家一起学习一下用Visio画UML类图的方法,主要有四个步骤,这里和大家分享一下,相信通过本节的学习,你对Visio画UML类图的步骤一定会有所了解. 用Visio画UML类图 对于画类图的工 ...
随机推荐
- memory error python报错
np.array时报错内存溢出,检查了python安装的是64位版本,通过下面dtype=np.uint8不再报错texts_vec = (np.array(texts_vec,dtype=np.ui ...
- readlink 获取进程的绝对路径
readlink可以获取exe所在的路径(直接和进程关联);无法获得so的路径,so路径可以用dladdr,参考另一篇文章linux系统中有个符号链接:/proc/self/exe 它代表当前程序,所 ...
- Oracle 11g R2 Backup Data Pump(数据泵)之expdp/impdp工具
Oracle Data Pump(以下简称数据泵)是Oracle 10g开始提供的一种数据迁移工具,同时也被广大DBA用来作为数据库的逻辑备份工具和体量较小的数据迁移工具.与传统的数据导出/导入工具, ...
- (转) jmeter 获取cookie
转自 https://blog.csdn.net/five3/article/details/53842283 jmeter是测试过程中会被用到的一个测试工具,我们即可用来进行压力的压测,也可以用 ...
- matlab多个曲面如何画在一个坐标系中的疑问
matlab多个曲面如何画在一个坐标系中的疑问 [复制链接] [X,Y]=meshgrid(-3:0.1:3);Z=X.^2+Y.^2;mesh(X,Y,-Z)hold onmesh(X,Y,Z)
- 关于Linux目录结构的理解
dUI与刚接触Linux的学习者来说,那么多的根下目录足够让我们头疼不已,如下图: 那么对于初学者来说,我们首要了解的是哪些目录呢? 就是这个标黄绿色的tmp目录,此目录是一个存放临时文件夹的目录( ...
- Centos7下使用Ceph-deploy快速部署Ceph分布式存储-操作记录
之前已详细介绍了Ceph分布式存储基础知识,下面简单记录下Centos7使用Ceph-deploy快速部署Ceph环境: 1)基本环境 192.168.10.220 ceph-admin(ceph-d ...
- 微信中H5网页如何唤醒打开外部浏览器打开指定链接
最近遇到一个需求.朋友找我制作一个在微信中的聊天框,或者公众号菜单发布一条链接或者二维码.跳出微信打开一个指定的我们自己的页面, 拿到这个需求后我们团队分开去找资料研究方案,通过微信的开发文档.腾讯的 ...
- CentOS 7 Squid代理服务器正向代理-传统代理
Squid是Linux系统中最常用的一款开源代理服务软件,主要提供缓存加速和应用层过滤控制的功能,可以很好的实现HTTP.FTP.DNS查询以及SSL等应用的缓存代理 传统代理:普通的代理服务,多见于 ...
- spring boot 整合js css 静态文件
一,添加配置 spring: application: name: interview-server resources: static-locations: file:config/statics ...