爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 19186|回复: 16

[作图] 从全球数据切中国区域切割不全

[复制链接]

新浪微博达人勋

发表于 2020-11-16 10:19:12 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 星星薇 于 2020-12-27 14:54 编辑

问题已经解决,使用这种内部有填充的shp文件就可以了。附件在脚本后面。
------------------------------------------------------------------------------------------------------------------------------------------
如题,使用官方的示例,从全球数据里往下切中国的nc数据,因为还要做区域平均所以这一步是必须的,脚本运行无误,但是不知道为什么相比用元数据mask的结果,切下来的数据不全,有很多地方缺失了,不知道有没有人遇到和我一样的问题。
  1. ;切割nc数据切成中国区域,参考mask9.ncl,以及气象家园一些帖子。

  2. load "/home/max/data/shp/china/cnmap/cnmap.ncl"

  3. begin
  4. MASK_INSIDE = False    ;  区域内还是区域外
  5. dir = "/home/max/cmip6/fracLUT/hist/"
  6. mpi = addfile(dir+"fracLut_Emon_MPI-ESM1-2-LR_land-hist_r1i1p1f1_gn_201001-201412.nc", "r")    ;NOTE 时间范围
  7. mpi_fracLut = mpi ->fracLut
  8. lat_mpi = mpi ->lat
  9. delete(mpi)

  10. ;--------- 处理missingvalue --------把nan处理掉 -------[year | 1980] x [landuse | 4] x [lat | 192] x [lon | 288]----------
  11. if (any(isnan_ieee(mpi_fracLut))) then
  12.       value = 1.e20
  13.       replace_ieeenan (mpi_fracLut, value, 0)
  14.       mpi_fracLut@_FillValue = value
  15. end if

  16. ;---读取 shp文件
  17.   dirshp     = "/home/max/data/shp/china/cnmap/"
  18.   f       = addfile(dirshp + "cnmap.shp", "r")
  19.   mrb_lon = f->x
  20.   mrb_lat = f->y
  21.   nmrb    = dimsizes(mrb_lon)     ;计算顶点数

  22.   min_mrb_lat = min(mrb_lat)    ;估计轮廓线范围
  23.   max_mrb_lat = max(mrb_lat)
  24.   min_mrb_lon = min(mrb_lon)
  25.   max_mrb_lon = max(mrb_lon)

  26. ;
  27. ;实现mask效果取决于区域内外缺省值的赋值

  28.   if(MASK_INSIDE) then
  29. ;---Start with data filled in.
  30.     mpi_fracLut_mask = mpi_fracLut   ;数据区
  31.   else
  32. ;---Start with data all missing
  33.     mpi_fracLut_mask = new(dimsizes(mpi_fracLut),typeof(mpi_fracLut),mpi_fracLut@_FillValue)
  34.     copy_VarCoords(mpi_fracLut,mpi_fracLut_mask)
  35.   end if

  36. ;让gc_inout更快的小技巧,估算轮廓线的大致范围
  37. ;与元数据的数据范围和分辨率相同最好,速度差不了多少。  
  38.   lat1d = fspan(-88.6, 88.6, 96)
  39.   lon1d = fspan(0, 359, 192)
  40.   lat1d@units = "degrees_north"
  41.   lon1d@units = "degrees_east"

  42.   ilt_mn = ind(min_mrb_lat.gt.lat1d)    ;小于轮廓线最小纬度值的索引,以下类似
  43.   ilt_mx = ind(max_mrb_lat.lt.lat1d)  
  44.   iln_mn = ind(min_mrb_lon.gt.lon1d)
  45.   iln_mx = ind(max_mrb_lon.lt.lon1d)

  46. ;http://bbs.06climate.com/forum.php?mod=viewthread&tid=43465&extra=&page=1
  47. ; 已经找到错误就在下面四句,由于经纬度不同,必要时可以手动赋值。
  48.   ilt1   = ilt_mn(dimsizes(ilt_mn)-1)    ; 纬度值起始判断点
  49.   iln1   = iln_mn(dimsizes(iln_mn)-1)    ; 经度值起始判断点
  50.   ilt2   = ilt_mx(0)                     ; 纬度值结束判断点
  51.   iln2   = iln_mx(0)                     ; 经度值结束判断点

  52. ;print(ilt1) ;3
  53. ;print(ilt2) ;54
  54. ;print(iln1) ;3
  55. ;print(iln2) ;67
  56. ;---蒙版区域缺省值
  57.   if(MASK_INSIDE) then
  58.     do ilt=ilt1,ilt2
  59.       do iln=iln1,iln2
  60.         if(gc_inout(lat1d(ilt),lon1d(iln),mrb_lat,mrb_lon)) then
  61.           mpi_fracLut_mask(:,:,ilt,iln) = mpi_fracLut_mask@_FillValue
  62.         end if
  63.       end do
  64.     end do
  65.   else
  66. ;---非蒙版区域放入数据
  67.     do ilt=ilt1,ilt2
  68.       do iln=iln1,iln2
  69.         if(gc_inout(lat1d(ilt),lon1d(iln),mrb_lat,mrb_lon)) then
  70.           mpi_fracLut_mask(:,:,ilt,iln) = mpi_fracLut(:,:,ilt,iln)
  71.         end if
  72.       end do
  73.     end do
  74.   end if

  75. printVarSummary(mpi_fracLut_mask)
  76. ; print(mpi_fracLut_mask(0,0,48,88))
  77. ;---画图
  78.   wks  = gsn_open_wks("eps","mask_mpi_v17")        ; send graphics to PNG file

  79.   res                     = True
  80.   res@gsnMaximize         = True           ; maximize plot in frame
  81.   res@gsnDraw             = False          ; don't draw plot yet
  82.   res@gsnFrame            = False          ; don't advance frame yet
  83.   res@gsnAddCyclic        = False          ; Don't add a cyclic point.

  84.   res@mpDataBaseVersion   = "MediumRes"    ; slightly better resolution

  85.   res@cnFillOn=True;画填充图
  86.   res@cnLinesOn=False;不画等值线
  87.   res@cnLineLabelsOn=False;不要等值线上的标签

  88.   res@cnFillPalette  = "cmocean_tempo"

  89.   res@mpMinLatF           = 0
  90.   res@mpMaxLatF           = 55
  91.   res@mpMinLonF           = 70
  92.   res@mpMaxLonF           = 140

  93.   res@mpLandFillColor         = "white"

  94. ;---Resources for polyline
  95.   ; lnres                  = True
  96.   ; lnres@gsLineColor      = "gray"
  97.   ; lnres@gsLineThicknessF = 1.0            ; 2x thickness)

  98. ; 画中国,用什么的shp画出来的就是一团乱七八糟的线
  99.     cnres           = True
  100.     cnres@china     = True       ;draw china map or not
  101.     cnres@river     = False      ;draw changjiang&huanghe or not
  102.     cnres@province  = False       ;draw province boundary or not
  103.     cnres@nanhai    = True       ;draw nanhai or not
  104.     cnres@diqu      = False       ; draw diqujie or not

  105.    

  106. ;---Draw contours of masked data
  107.   map_mask      = gsn_csm_contour_map(wks,mpi_fracLut_mask(0,0,:,:),res)
  108.   ;mrb_line_mask = gsn_add_polyline(wks, map_mask, mrb_lon,mrb_lat, lnres)
  109.   chinamap = add_china_map(wks,map_mask,cnres)

  110.   draw(map_mask)
  111.   frame(wks)

  112. ;----------绘制并输出第二个图
  113.     res@tiMainString = "masked from origin data"
  114.     res@mpOutlineOn             = True  ; Use outlines from shapefile
  115.     res@mpDataBaseVersion       = "MediumRes"
  116.     res@mpDataSetName           = "Earth..4"
  117.     res@mpAreaMaskingOn         = True
  118.     res@mpMaskAreaSpecifiers    = (/"China","Taiwan","Disputed area between India and China","India:Arunachal Pradesh"/)
  119.     res@mpLandFillColor         = "white"
  120.     res@mpInlandWaterFillColor  = "white"
  121.     res@mpOceanFillColor        = "white"
  122.     res@mpOutlineBoundarySets   = "NoBoundaries" ; 先不要画,随后再打开
  123.     res@mpOutlineSpecifiers=(/"China","Taiwan"/)
  124.     res@mpGeophysicalLineThicknessF=2.0 ;这两行是为了加粗边界和国界线
  125.     res@mpNationalLineThicknessF=2.0

  126. ;--------------遇到的奇怪的bug,这里的数字后面不要加.0,比如55和55.0是不同的数字,会产生错误。
  127.     res@mpMinLatF=0
  128.     res@mpMaxLatF=55
  129.     res@mpMinLonF=70
  130.     res@mpMaxLonF=140

  131.     res@cnFillDrawOrder="PreDraw";先画填充
  132.     res@cnFillOn=True;画填充图
  133.     res@cnLinesOn=False;不画等值线
  134.     res@cnLineLabelsOn=False;不要等值线上的标签
  135.     res@cnFillPalette        = "cmocean_tempo"     ; set color map
  136.   
  137.     wks  = gsn_open_wks("eps","mask_mpi_v16")        
  138.     plot1=gsn_csm_contour_map(wks,mpi_fracLut(0,0,:,:),res)

  139.     draw(plot1)
  140.     frame(wks)




  141. end
复制代码


元数据mask

元数据mask

切割后的不全的

切割后的不全的

bou1_4p.shp

1.02 MB, 下载次数: 22, 下载积分: 金钱 -5

bou1_4p.dbf

70.91 KB, 下载次数: 12, 下载积分: 金钱 -5

bou1_4p.shp

1.02 MB, 下载次数: 11, 下载积分: 金钱 -5

bou1_4p.shx

7.08 KB, 下载次数: 12, 下载积分: 金钱 -5

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

新浪微博达人勋

发表于 2020-11-16 17:20:29 | 显示全部楼层
为什么要切割
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-11-16 17:38:13 | 显示全部楼层

因为要做区域平均等处理
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-11-17 21:54:10 | 显示全部楼层
俺的问题解决了,是因为shp文件的影响,换了一个shp文件就好了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-11-21 20:03:02 | 显示全部楼层
请问您换的是哪一个shp文件呀,我也遇到了相同的问题
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-11-22 15:25:07 | 显示全部楼层
换成区域内有填充的,类似这样的
Image.png
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-11-22 15:28:16 | 显示全部楼层
某某蒙 发表于 2020-11-21 20:03
请问您换的是哪一个shp文件呀,我也遇到了相同的问题

忘记直接回复你了QAQ,看上面
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-12-3 18:56:42 | 显示全部楼层
星星薇 发表于 2020-11-22 15:28
忘记直接回复你了QAQ,看上面

好滴好滴,我试试去,谢谢!!!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-12-25 09:08:15 | 显示全部楼层
大神你好请问也可以发我一份吗?谢谢你252277973@qq.com
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-25 09:50:36 | 显示全部楼层
杰西卡·芬 发表于 2020-12-25 09:08
大神你好请问也可以发我一份吗?谢谢你

附件我放到后面了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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