爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 25613|回复: 11

[求助] python用RBF方法插值画降水落区,出现不可预知问题,求教

[复制链接]

新浪微博达人勋

发表于 2019-4-12 15:26:15 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 hut171 于 2019-4-12 15:31 编辑

本人试过Python scipy.interpolate中各个插值方法,最后发现RBF方法还算差强人意,但是仍然存在一点问题

首先读取的txt文件格式为每一行“经度,纬度,降水”
当行数在386行(包括386行)以内的时候,可以正常做出落区图
当超过386行后,就成花图了。

请教坛里大神帮忙看下什么原因,怎么能够调好,毕竟区域站超过386个还是很正常的

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.interpolate import Rbf
  4. from mpl_toolkits.basemap import Basemap


  5. def leves_colors():  # 设置色标方法2
  6.     levels = [0, 0.000000001, 1.5, 7, 15, 40, 50]
  7.     colors = ['#FFFFFF', '#A6F28F', '#3DBA3D', '#61B8FF', '#0000E1', '#FA00FA', '#800040']
  8.     return levels, colors


  9. filename = r'E:\qls\2019022604.txt'
  10. file = np.loadtxt(filename, delimiter=',', dtype='str')
  11. # lon = file[:, 0].astype(np.float).reshape(-1, 1)
  12. lon = file[:, 0].astype(np.float)
  13. lat = file[:, 1].astype(np.float)
  14. rain = file[:, 2].astype(np.float)
  15. result = np.ma.masked_greater(rain, 999989)

  16. olon = np.linspace(104, 112, 300)
  17. olat = np.linspace(31, 40, 300)
  18. olon, olat = np.meshgrid(olon, olat)

  19. func = Rbf(lon, lat, result, function='linear')
  20. rain_data_new = func(olon, olat)

  21. fig = plt.figure(figsize=(8, 8))
  22. ax = fig.add_subplot(111)
  23. m = Basemap(llcrnrlon=105, llcrnrlat=31, urcrnrlon=112, urcrnrlat=40, projection='cyl')
  24. m.readshapefile('./Map/Shaanxi/Shaanxi_province', 'Shaanxi', default_encoding='utf-8')
  25. xx, yy = m(olon, olat)

  26. levels, colors = leves_colors()
  27. c = m.contourf(xx, yy, rain_data_new, levels=levels, colors=colors, extend='max')
  28. m.colorbar(c)

  29. plt.show()
  30. plt.close()
复制代码

数据文件示例,调试时可以在后面复制这些数据108.88,34.08,3.9
108.87,34.17,3.5
108.95,34.14,3.2
108.1,34.09,2.1
108.07,34.13,2.1
108.32,34.07,2.1
108.04,34.14,2
108.73,34.17,2
108.19,34.05,1.9
108.02,33.61,1.8
108.41,33.99,1.8
108.17,34.08,1.7
108.89,34.2,1.7

附件传错了,不知道怎么删除,大家千万不要下载,浪费金币
12313.png

2019022604.txt

26.59 KB, 下载次数: 1, 下载积分: 金钱 -5

数据文件

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-4-12 15:35:41 | 显示全部楼层
站点太密了,这个函数针对少量站点比较好。站点密会出现病态矩阵。你可以考虑用LinearNDInterpolator或者natural neighbor。再者就自己写个反距离权重插值,我们学习一下。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-4-12 15:45:28 | 显示全部楼层
LinearNDInterpolator这个我知道,natural neighbor这个方法在哪可以找到呀?

反距离权重插值,我在网上搜了下,挺复杂的,能力有限啊
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-4-12 16:23:29 | 显示全部楼层
hut171 发表于 2019-4-12 15:45
LinearNDInterpolator这个我知道,natural neighbor这个方法在哪可以找到呀?

反距离权重插值,我在网上 ...

你要的natural_neighbor
https://unidata.github.io/MetPy/ ... e.interpolate.html#
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-4-12 18:05:04 | 显示全部楼层
用MI绘制,了解一下:

  1. http://bbs.06climate.com/forum.php?mod=viewthread&tid=53210&extra=page%3D1
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-4-12 18:17:23 | 显示全部楼层
好的,多谢上面各位专家,明天有空学习下
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-4-12 21:20:57 | 显示全部楼层
格点化的话,建议最好可以用cressman插值(对应ncl中的obj_anal_ic_deprecated方法).metpy似乎有相关函数。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-4-13 09:48:27 | 显示全部楼层
astiny 发表于 2019-4-12 21:20
格点化的话,建议最好可以用cressman插值(对应ncl中的obj_anal_ic_deprecated方法).metpy似乎有相关函数。

cressman反距离权重不推荐使用了,ncl官网推荐ESMF。不过python的esmfpy不会。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-4-13 12:57:11 | 显示全部楼层
metpy下载了,准备先试试看cressman效果
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-4-13 14:45:36 | 显示全部楼层
werewolf 发表于 2019-4-13 09:48
cressman反距离权重不推荐使用了,ncl官网推荐ESMF。不过python的esmfpy不会。

您好。请教一下,具体是哪个函数?我只找到了从格点到格点的函数,没找到从站点到格点的函数。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表