爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索

[经验总结] Python完美白化

  [复制链接]

新浪微博达人勋

发表于 2020-10-17 16:01:50 | 显示全部楼层
想请问一下作者为什么我region只填一个省的时候可以成功mask,但是填一个数组的时候他就显示‘local variable 'clip' referenced before assignment’
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-10-17 16:03:31 | 显示全部楼层
qq492947833 发表于 2020-10-17 16:01
想请问一下作者为什么我region只填一个省的时候可以成功mask,但是填一个数组的时候他就显示‘local variab ...

这里的数组是包含好几个省份的,['江苏省','安徽省',]
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-10-18 09:44:04 | 显示全部楼层
qq492947833 发表于 2020-10-17 16:03
这里的数组是包含好几个省份的,['江苏省','安徽省',]

clip没有被赋值,请参见我帖子内容的结尾部分
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-10-19 12:37:58 | 显示全部楼层
平流层的萝卜 发表于 2020-10-18 09:44
clip没有被赋值,请参见我帖子内容的结尾部分

我已经找到原因了楼主,在您最初的maskout里面用的命令是“if shape_rec.record[7] == region:”,这样就只能mask一个省,如果把命令改成“if shape_rec.record[7] in region:”就可以使用list,mask多个省了
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-10-19 13:37:06 | 显示全部楼层
qq492947833 发表于 2020-10-19 12:37
我已经找到原因了楼主,在您最初的maskout里面用的命令是“if shape_rec.record[7] == region:”,这样就 ...

very good!!!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-10-21 11:14:47 | 显示全部楼层
  1. import maskout
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. from scipy.interpolate import Rbf
  6. from mpl_toolkits.basemap import Basemap



  7. plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文
  8. plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


  9. data = pd.read_excel('D:\climate.xlsx', header=0,
  10.     names=['lon','lat','data'] )
  11. # 插值
  12. lon = data['lon']
  13. lat = data['lat']
  14. rain_data = data['data']
  15. olon = np.linspace(97,118,30)
  16. olat = np.linspace(17,30,30)
  17. olon,olat = np.meshgrid(olon,olat)
  18. # 插值处理
  19. func = Rbf(lon, lat, rain_data,function='linear')
  20. rain_data_new = func(olon, olat)

  21. # 画图
  22. fig = plt.figure(figsize=(16,9))
  23. plt.rc('font',size=15,weight='bold')
  24. ax = fig.add_subplot(111)
  25. m = Basemap(projection='cyl',llcrnrlat=17,llcrnrlon=97,urcrnrlat=30,urcrnrlon=118)

  26. m.readshapefile('D:/shp_file/four_province','whatevername',color='black')

  27. x,y = m(olon,olat)  
  28. xx,yy = m(lon,lat)
  29. levels = np.linspace(0,np.max(rain_data_new),100)
  30. cf = m.contourf(x,y,rain_data_new, levels=levels)
  31. cbar = m.colorbar(cf,location='right',format='%d',size=0.3,ticks=np.linspace(0,np.max(rain_data_new),6))


  32. lon_num = np.arange(97,120,3)
  33. lon_label = ['97°','99°','102°','105°','108°','111°','114°','117°E']
  34. lat_num =  np.arange(17,32,3)
  35. lat_label = ['17°','20°','23°','26°','29°N']
  36. plt.yticks(lat_num,lat_label)
  37. plt.xticks(lon_num,lon_label)
  38. plt.title('测试图')
  39. # 白化
  40. clip = maskout.shp2clip(cf,ax,'D:/shp_file/four_province',[440000,450000,460000,530000])

  41. plt.savefig('test.png', bbox_inches='tight',dpi=300)

  42. plt.show()
复制代码


楼主 请教一下 我这个代码 把特征值从0-9都试了一遍 还是报错local variable 'clip' referenced before assignment 我实在不知道为什么了

这个是maskout的
  1. import shapefile
  2. from matplotlib.path import Path
  3. from matplotlib.patches import PathPatch
  4. def shp2clip(originfig,ax,shpfile,region):
  5.     sf = shapefile.Reader(shpfile)
  6.     vertices = []    ######这块是已经修改的地方
  7.     codes = []    ######这块是已经修改的地方
  8.     for shape_rec in sf.shapeRecords():
  9.         # if shape_rec.record[3] == region:  ####这里需要找到和region匹配的唯一标识符,record[]中必有一项是对应的。
  10.         if shape_rec.record[5] in region:   ######这块是已经修改的地方
  11.             pts = shape_rec.shape.points
  12.             prt = list(shape_rec.shape.parts) + [len(pts)]
  13.             for i in range(len(prt) - 1):
  14.                 for j in range(prt[i], prt[i+1]):
  15.                     vertices.append((pts[j][0], pts[j][1]))
  16.                 codes += [Path.MOVETO]
  17.                 codes += [Path.LINETO] * (prt[i+1] - prt[i] -2)
  18.                 codes += [Path.CLOSEPOLY]
  19.             clip = Path(vertices, codes)
  20.             clip = PathPatch(clip, transform=ax.transData)
  21.     for contour in originfig.collections:
  22.         contour.set_clip_path(clip)
  23.     return clip
复制代码


我的shp文件使用QGIS导出的  我是真的不知道原因在哪里 希望能得到解答 谢谢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-10-21 21:25:26 | 显示全部楼层
邓加尔 发表于 2020-10-21 11:14
楼主 请教一下 我这个代码 把特征值从0-9都试了一遍 还是报错local variable 'clip' referenced before ...

你好,你可以先在maskout的文件里,
for shape_rec in sf.shapeRecords():
    print shape_rec.record
来查看shape_rec.record里的信息都是如何排布的,很有可能你这些信息里没有行政编码,而有别的信息,比如省份名称的拼音,相应地,在主程序里就把maskout.shp2clip(***,[])的[]里的元素改为这些拼音。类似这种。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-10-22 10:03:58 | 显示全部楼层
平流层的萝卜 发表于 2020-10-21 21:25
你好,你可以先在maskout的文件里,
for shape_rec in sf.shapeRecords():
    print shape_rec.record ...

Record #-1: [440000, '广东省', '(2:113.280637,23.125178)', '(2:113.429875,23.334651)', 22, 'province', '(1:100000)', '{ "adcode": 100000 }', 'guangdong', 'D:/shp_file/guangdong.json|layername=guangdong']
Record #-1: [450000, '广西壮族自治区', '(2:108.320004,22.82402)', '(2:108.794261,23.833605)', 14, 'province', '(1:100000)', '{ "adcode": 100000 }', 'guangxi', 'D:/shp_file/guangxi.json|layername=guangxi']
Record #-1: [460000, '海南省', '(2:110.33119,20.031971)', '(2:109.754859,19.189767)', 19, 'province', '(1:100000)', '{ "adcode": 100000 }', 'hainan', 'D:/shp_file/hainan.json|layername=hainan']
Record #-1: [530000, '云南省', '(2:102.712251,25.040609)', '(2:101.485108,25.008645)', 16, 'province', '(1:100000)', '{ "adcode": 100000 }', 'yunnan', 'D:/shp_file/yunnan.json|layername=yunnan']
楼主 这是我打印出来的shape_rec.record  我都试过了 还是报错local variable 'clip' referenced before assignment
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-10-22 18:20:21 | 显示全部楼层
邓加尔 发表于 2020-10-22 10:03
Record #-1: [440000, '广东省', '(2:113.280637,23.125178)', '(2:113.429875,23.334651)', 22, 'provin ...

很明显,你的第一列是行政编码,所以maskout里if shape_rec.record[5] in region的5应该改成0
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-10-22 18:58:20 | 显示全部楼层
平流层的萝卜 发表于 2020-10-22 18:20
很明显,你的第一列是行政编码,所以maskout里if shape_rec.record[5] in region的5应该改成0

楼主 我试过改成0 还是报错local variable 'clip' referenced before assignment
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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