最近开发时要实现一个业务逻辑:

  • 调用中国气象数据网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 画广东省等压线图的更多相关文章

  1. 用matalb、python画聚类结果图

    用matlab %读入聚类后的数据, 已经分好级别了,例如前4行是亚洲一流, %-13是亚洲二流,-24是亚洲三流 a=xlsread('C:\Users\Liugengxin\Desktop\1.x ...

  2. python画箱线图

    # -*- coding: utf-8 -*- """ Created on Wed Jun 14 13:00:11 2017 @author: Miao "& ...

  3. Python matplot画散列图

    同matlab一样,matplot也可画散列图scatter. import numpy as np import matplotlib.pyplot as plt #fig = plt.figure ...

  4. 利用Tkinter和matplotlib两种方式画饼状图

    当我们学习python的时候,总会用到一些常用的模块,接下来我就详细讲解下利用两种不同的方式画饼状图.首先利用[Tkinter]中的canvas画布来画饼状图: from tkinter import ...

  5. 沉淀再出发:用python画各种图表

    沉淀再出发:用python画各种图表 一.前言 最近需要用python来做一些统计和画图,因此做一些笔记. 二.python画各种图表 2.1.使用turtle来画图 import turtle as ...

  6. 利用python画出动态高优先权优先调度

    之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...

  7. 用Python画如此漂亮的专业插图 ?简直So easy!

    本文整理自知乎问答,仅用于学术分享,著作权归作者所有.如有侵权,请联系我删文处理.多多转发,多多学习! 方法一 强烈推荐 Python 的绘图模块 matplotlib: python plottin ...

  8. 用python画xy散点图

    import matplotlib.pyplot as plt plt.plot([1,2,3],[4,5,6],'ro') plt.show()#这个智障的编辑器 这样的话,就可以画一个散点图,图中 ...

  9. 四步轻松实现用Visio画UML类图

    本节和大家一起学习一下用Visio画UML类图的方法,主要有四个步骤,这里和大家分享一下,相信通过本节的学习,你对Visio画UML类图的步骤一定会有所了解. 用Visio画UML类图 对于画类图的工 ...

随机推荐

  1. mysql-5.7 通过apt或者yum安装方式

    此文章仅记录使用apt-get安装mysql. 通过以下命令安装MySQL: shell> sudo apt-get install mysql-server 这将安装MySQL服务器的包,以及 ...

  2. python学习笔记3-列表

    # 1.列表长度可变,内容可修改 a = [0,1,2,3] a[0] = 'a0' a # ['a0', 1, 2, 3] # 2.添加元素 # 2.1列表末尾添加元素 a.append(4) a ...

  3. (.NET高级课程笔记)委托、事件总结

      1.委托的声明.实例化和调用 同样的,也可以把事务写成上面的形式 2.泛型委托---Func.Action 3.委托的意义:解耦 4.委托的意义:异步多线程 5.委托的意义:多播委托 6.观察者模 ...

  4. 克隆Rockey6加密狗复制资料

    克隆Rockey6加密狗复制资料下载 描述:Rockey6加密狗复制克隆方法Rockey6加密狗复制案例解析! 一.用OD加载DLL,并分析: 10001320 >/$ B8 4C140000 ...

  5. js列表添加内容清除内容,时钟

    <div id="wai"> <div id="zuo"> <select multiple="multiple&quo ...

  6. 论文阅读(Weilin Huang——【ECCV2016】Detecting Text in Natural Image with Connectionist Text Proposal Network)

    Weilin Huang——[ECCV2016]Detecting Text in Natural Image with Connectionist Text Proposal Network 目录 ...

  7. H3C交换机配置命令(收集)

    1:配置登录用户,口令等 <H3C>                   //用户直行模式提示符,用户视图 <H3C>system-view        //进入配置视图 [ ...

  8. LR12脚本录制流程

    准备工作: 工具:win7系统.loadrunner 12.Firefox浏览器.飞机订票系统. 打开飞机订票系统 开始录制脚本 步骤一:打开loadrunner(Virtual User Gener ...

  9. 2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 20165335

    一.实验目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,get ...

  10. qemu到kvm的处理,再到vm的运行

    1.QEMU创建虚拟机发起:kvm_ioctl(s, KVM_CREATE_VM, type); KVM中kvm_dev_ioctl判断参数->kvm_dev_ioctl_create_vm-& ...