- 积分
- 10751
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2017-3-14
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 星星薇 于 2020-12-27 14:54 编辑
问题已经解决,使用这种内部有填充的shp文件就可以了。附件在脚本后面。
------------------------------------------------------------------------------------------------------------------------------------------
如题,使用官方的示例,从全球数据里往下切中国的nc数据,因为还要做区域平均所以这一步是必须的,脚本运行无误,但是不知道为什么相比用元数据mask的结果,切下来的数据不全,有很多地方缺失了,不知道有没有人遇到和我一样的问题。
- ;切割nc数据切成中国区域,参考mask9.ncl,以及气象家园一些帖子。
- load "/home/max/data/shp/china/cnmap/cnmap.ncl"
- begin
- MASK_INSIDE = False ; 区域内还是区域外
- dir = "/home/max/cmip6/fracLUT/hist/"
- mpi = addfile(dir+"fracLut_Emon_MPI-ESM1-2-LR_land-hist_r1i1p1f1_gn_201001-201412.nc", "r") ;NOTE 时间范围
- mpi_fracLut = mpi ->fracLut
- lat_mpi = mpi ->lat
- delete(mpi)
- ;--------- 处理missingvalue --------把nan处理掉 -------[year | 1980] x [landuse | 4] x [lat | 192] x [lon | 288]----------
- if (any(isnan_ieee(mpi_fracLut))) then
- value = 1.e20
- replace_ieeenan (mpi_fracLut, value, 0)
- mpi_fracLut@_FillValue = value
- end if
- ;---读取 shp文件
- dirshp = "/home/max/data/shp/china/cnmap/"
- f = addfile(dirshp + "cnmap.shp", "r")
- mrb_lon = f->x
- mrb_lat = f->y
- nmrb = dimsizes(mrb_lon) ;计算顶点数
- min_mrb_lat = min(mrb_lat) ;估计轮廓线范围
- max_mrb_lat = max(mrb_lat)
- min_mrb_lon = min(mrb_lon)
- max_mrb_lon = max(mrb_lon)
- ;
- ;实现mask效果取决于区域内外缺省值的赋值
- if(MASK_INSIDE) then
- ;---Start with data filled in.
- mpi_fracLut_mask = mpi_fracLut ;数据区
- else
- ;---Start with data all missing
- mpi_fracLut_mask = new(dimsizes(mpi_fracLut),typeof(mpi_fracLut),mpi_fracLut@_FillValue)
- copy_VarCoords(mpi_fracLut,mpi_fracLut_mask)
- end if
- ;让gc_inout更快的小技巧,估算轮廓线的大致范围
- ;与元数据的数据范围和分辨率相同最好,速度差不了多少。
- lat1d = fspan(-88.6, 88.6, 96)
- lon1d = fspan(0, 359, 192)
- lat1d@units = "degrees_north"
- lon1d@units = "degrees_east"
- ilt_mn = ind(min_mrb_lat.gt.lat1d) ;小于轮廓线最小纬度值的索引,以下类似
- ilt_mx = ind(max_mrb_lat.lt.lat1d)
- iln_mn = ind(min_mrb_lon.gt.lon1d)
- iln_mx = ind(max_mrb_lon.lt.lon1d)
- ;http://bbs.06climate.com/forum.php?mod=viewthread&tid=43465&extra=&page=1
- ; 已经找到错误就在下面四句,由于经纬度不同,必要时可以手动赋值。
- ilt1 = ilt_mn(dimsizes(ilt_mn)-1) ; 纬度值起始判断点
- iln1 = iln_mn(dimsizes(iln_mn)-1) ; 经度值起始判断点
- ilt2 = ilt_mx(0) ; 纬度值结束判断点
- iln2 = iln_mx(0) ; 经度值结束判断点
- ;print(ilt1) ;3
- ;print(ilt2) ;54
- ;print(iln1) ;3
- ;print(iln2) ;67
- ;---蒙版区域缺省值
- if(MASK_INSIDE) then
- do ilt=ilt1,ilt2
- do iln=iln1,iln2
- if(gc_inout(lat1d(ilt),lon1d(iln),mrb_lat,mrb_lon)) then
- mpi_fracLut_mask(:,:,ilt,iln) = mpi_fracLut_mask@_FillValue
- end if
- end do
- end do
- else
- ;---非蒙版区域放入数据
- do ilt=ilt1,ilt2
- do iln=iln1,iln2
- if(gc_inout(lat1d(ilt),lon1d(iln),mrb_lat,mrb_lon)) then
- mpi_fracLut_mask(:,:,ilt,iln) = mpi_fracLut(:,:,ilt,iln)
- end if
- end do
- end do
- end if
- printVarSummary(mpi_fracLut_mask)
- ; print(mpi_fracLut_mask(0,0,48,88))
- ;---画图
- wks = gsn_open_wks("eps","mask_mpi_v17") ; send graphics to PNG file
- res = True
- res@gsnMaximize = True ; maximize plot in frame
- res@gsnDraw = False ; don't draw plot yet
- res@gsnFrame = False ; don't advance frame yet
- res@gsnAddCyclic = False ; Don't add a cyclic point.
- res@mpDataBaseVersion = "MediumRes" ; slightly better resolution
- res@cnFillOn=True;画填充图
- res@cnLinesOn=False;不画等值线
- res@cnLineLabelsOn=False;不要等值线上的标签
- res@cnFillPalette = "cmocean_tempo"
- res@mpMinLatF = 0
- res@mpMaxLatF = 55
- res@mpMinLonF = 70
- res@mpMaxLonF = 140
- res@mpLandFillColor = "white"
- ;---Resources for polyline
- ; lnres = True
- ; lnres@gsLineColor = "gray"
- ; lnres@gsLineThicknessF = 1.0 ; 2x thickness)
- ; 画中国,用什么的shp画出来的就是一团乱七八糟的线
- cnres = True
- cnres@china = True ;draw china map or not
- cnres@river = False ;draw changjiang&huanghe or not
- cnres@province = False ;draw province boundary or not
- cnres@nanhai = True ;draw nanhai or not
- cnres@diqu = False ; draw diqujie or not
-
- ;---Draw contours of masked data
- map_mask = gsn_csm_contour_map(wks,mpi_fracLut_mask(0,0,:,:),res)
- ;mrb_line_mask = gsn_add_polyline(wks, map_mask, mrb_lon,mrb_lat, lnres)
- chinamap = add_china_map(wks,map_mask,cnres)
- draw(map_mask)
- frame(wks)
- ;----------绘制并输出第二个图
- res@tiMainString = "masked from origin data"
- res@mpOutlineOn = True ; Use outlines from shapefile
- res@mpDataBaseVersion = "MediumRes"
- res@mpDataSetName = "Earth..4"
- res@mpAreaMaskingOn = True
- res@mpMaskAreaSpecifiers = (/"China","Taiwan","Disputed area between India and China","India:Arunachal Pradesh"/)
- res@mpLandFillColor = "white"
- res@mpInlandWaterFillColor = "white"
- res@mpOceanFillColor = "white"
- res@mpOutlineBoundarySets = "NoBoundaries" ; 先不要画,随后再打开
- res@mpOutlineSpecifiers=(/"China","Taiwan"/)
- res@mpGeophysicalLineThicknessF=2.0 ;这两行是为了加粗边界和国界线
- res@mpNationalLineThicknessF=2.0
- ;--------------遇到的奇怪的bug,这里的数字后面不要加.0,比如55和55.0是不同的数字,会产生错误。
- res@mpMinLatF=0
- res@mpMaxLatF=55
- res@mpMinLonF=70
- res@mpMaxLonF=140
- res@cnFillDrawOrder="PreDraw";先画填充
- res@cnFillOn=True;画填充图
- res@cnLinesOn=False;不画等值线
- res@cnLineLabelsOn=False;不要等值线上的标签
- res@cnFillPalette = "cmocean_tempo" ; set color map
-
- wks = gsn_open_wks("eps","mask_mpi_v16")
- plot1=gsn_csm_contour_map(wks,mpi_fracLut(0,0,:,:),res)
- draw(plot1)
- frame(wks)
- end
复制代码
|
|