<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
rcm2rgrid_Wrap
實現舉個例子,將模式中設定為蘭伯特投影的網格:
插值為等間距網格:
主要的程式設計分為兩部分:
需要修改的就是路徑和變數,我下面展示指令碼不僅有風場資料u,v還有降水,海表面壓力,氣溫等,可自行修改
begin a = addfile("/Users/WRF/outdata/2022071000/wrfout_d01_2022-07-10_01:00:00","r") lat2d = a->XLAT(0,:,:) lon2d = a->XLONG(0,:,:) lat1d = lat2d(:,0) lon1d = lon2d(0,:) time = wrf_user_getvar(a,"XTIME",-1) u10 = wrf_user_getvar(a,"U10",0) v10 = wrf_user_getvar(a,"V10",0) slp = wrf_user_getvar(a,"slp",0) t2 = wrf_user_getvar(a,"T2",0) td = wrf_user_getvar(a,"td",0) rainc = wrf_user_getvar(a,"RAINC",0) rainnc = wrf_user_getvar(a,"RAINNC",0) u10@lat2d = lat2d u10@lon2d = lon2d u10_ip = rcm2rgrid_Wrap(lat2d,lon2d,u10,lat1d,lon1d,0) v10@lat2d = lat2d v10@lon2d = lon2d v10_ip = rcm2rgrid_Wrap(lat2d,lon2d,v10,lat1d,lon1d,0) slp_ip = rcm2rgrid_Wrap(lat2d,lon2d,slp,lat1d,lon1d,0) t2_ip = rcm2rgrid_Wrap(lat2d,lon2d,t2,lat1d,lon1d,0) td_ip = rcm2rgrid_Wrap(lat2d,lon2d,td,lat1d,lon1d,0) rainc_ip = rcm2rgrid_Wrap(lat2d,lon2d,rainc,lat1d,lon1d,0) rainnc_ip = rcm2rgrid_Wrap(lat2d,lon2d,rainnc,lat1d,lon1d,0) outf = addfile("/Users/wrfout_d01_2022-07-10_01:00:00.nc","c") outf->time = time outf->lat = lat2d outf->lon = lon2d outf->u10 = u10_ip outf->v10 = v10_ip outf->slp = slp_ip outf->t2 = t2_ip outf->td = td_ip outf->rainc = rainc_ip outf->rainnc = rainnc_ip end
上述指令碼的缺點在於只能基於模式模擬的經緯度區域進行插值,意思就是說他的經緯度區域是固定的那麼大
NCL還有一個函數可以實現上述過程,就是ESMF_regrid
,該函數的優點在於可以實現任意經緯度範圍的插值,但是不足在於對於存在高度層的變數,暫時無法進行高度層的資料讀取。
(也可能我水平有限不知道。。。。)這裡也附上指令碼:
load "$NCARG_ROOT/lib/ncarg/nclscripts/esmf/ESMF_regridding.ncl" begin a = addfile("/Users/WRF/outdata/2022071000/wrfout_d01_2022-07-10_01:00:00","r") u10 = wrf_user_getvar(a,"U10",0) v10 = wrf_user_getvar(a,"V10",0) slp = wrf_user_getvar(a,"slp",0) t2 = wrf_user_getvar(a,"T2",0) ; td = wrf_user_getvar(a,"td",0) rainc = wrf_user_getvar(a,"RAINC",0) rainnc = wrf_user_getvar(a,"RAINNC",0) u10@lat2d = a->XLAT(0,:,:) u10@lon2d = a->XLONG(0,:,:) v10@lat2d = a->XLAT(0,:,:) v10@lon2d = a->XLONG(0,:,:) slp@lat2d = a->XLAT(0,:,:) slp@lon2d = a->XLONG(0,:,:) t2@lat2d = a->XLAT(0,:,:) t2@lon2d = a->XLONG(0,:,:) ; td@lat2d = a->XLAT(0,:,:) ; td@lon2d = a->XLONG(0,:,:) rainc@lat2d = a->XLAT(0,:,:) rainc@lon2d = a->XLONG(0,:,:) rainnc@lat2d = a->XLAT(0,:,:) rainnc@lon2d = a->XLONG(0,:,:) lat2d = a->XLAT(0,:,:) lon2d = a->XLONG(0,:,:) lat1d = lat2d(:,0) lon1d = lon2d(0,:) latS = -20 latN = 50 lonW = 95 lonE = 145 Opt = True Opt@InterpMethod = "bilinear" Opt@ForceOverwrite = True Opt@SrcMask2D = where(.not. ismissing(v10),1,0) Opt@DstGridType = "0.1deg" Opt@DstLLCorner = (/latS, lonW /) Opt@DstURCorner = (/latN, lonE /) u10_regrid = ESMF_regrid(u10,Opt) v10_regrid = ESMF_regrid(v10,Opt) slp_regrid = ESMF_regrid(slp,Opt) t2_regrid = ESMF_regrid(t2,Opt) ; td_regrid = ESMF_regrid(td,Opt) rainc_regrid = ESMF_regrid(rainc,Opt) rainnc_regrid = ESMF_regrid(rainnc,Opt) time = wrf_user_getvar(a,"XTIME",-1) nlon = dimsizes(v10_regrid&lon) nlat = dimsizes(v10_regrid&lat) ofile = "wrfout_d01_2022-07-10_01:00:00.nc" system("rm -rf "+ofile) fout = addfile(ofile,"c") dimNames = (/"lat", "lon"/) dimSizes = (/nlat, nlon/) dimUnlim = (/False, False/) filedimdef(fout,dimNames,dimSizes,dimUnlim) ;-- define dimensions filevardef(fout,"lat",typeof(v10_regrid&lat),getvardims(v10_regrid&lat)) filevardef(fout,"lon",typeof(v10_regrid&lon),getvardims(v10_regrid&lon)) filevardef(fout,"u10",typeof(u10_regrid),getvardims(u10_regrid)) filevardef(fout,"v10",typeof(v10_regrid),getvardims(v10_regrid)) filevardef(fout,"slp",typeof(slp_regrid),getvardims(slp_regrid)) filevardef(fout,"t2",typeof(t2_regrid),getvardims(t2_regrid)) ; filevardef(fout,"td",typeof(td_regrid),getvardims(td_regrid)) filevardef(fout,"rainc",typeof(rainc_regrid),getvardims(rainc_regrid)) filevardef(fout,"rainnc",typeof(rainnc_regrid),getvardims(rainnc_regrid)) filevarattdef(fout,"lat",v10_regrid&lat) ;-- copy lat attributes filevarattdef(fout,"lon",v10_regrid&lon) ;-- copy lon attributes filevarattdef(fout,"u10",u10_regrid) filevarattdef(fout,"v10",v10_regrid) filevarattdef(fout,"slp",slp_regrid) filevarattdef(fout,"t2",t2_regrid) ; filevarattdef(fout,"td",td_regrid) filevarattdef(fout,"rainc",rainc_regrid) filevarattdef(fout,"rainnc",rainnc_regrid) setfileoption(fout,"DefineMode",False) fout->u10 = (/u10_regrid/) fout->v10 = (/v10_regrid/) fout->slp = (/slp_regrid/) fout->t2 = (/t2_regrid/) ; fout->td = (/td_regrid/) fout->rainc = (/rainc_regrid/) fout->rainnc = (/rainnc_regrid/) fout->lat = (/v10_regrid&lat/) ;-- write lat to new netCDF file fout->lon = (/v10_regrid&lon/) ;-- write lon to new netCDF file fout->time = time end
PS:執行該指令碼會生成四個nc檔案,分別為:destination_grid_file.nc、source_grid_file.nc、weights_file.nc、wrfout_d01_2022-07-10_01:00:00.nc。其中,wrfout_d01_2022-07-10_01:00:00.nc是我需要的檔案,但是其他三個檔案如何在執行指令碼的過程去掉暫未解決。
python指令碼如下所示:
# -*- coding: utf-8 -*- """ Created on %(date)s @author: %(jixianpu)s Email : 211311040008@hhu.edu.cn introduction : keep learning althongh walk slowly """ """ 用來讀取用ncl插值後的wrfoutput.nc 資料,並生成對應檔名的json格式 """ import pandas as pd import os import json import netCDF4 as nc import numpy as np import datetime from netCDF4 import Dataset import argparse from argparse import RawDescriptionHelpFormatter import xarray as xr import sys import glob date = sys.argv[1] date = str(date) frst = sys.argv[2] step = sys.argv[3] path = r'/Users/WRF/outdata/2022071000/'#只能是已經存在的檔案目錄且有資料才可以進行讀取 start = datetime.datetime.strptime(date,'%Y%m%d%H').strftime("%Y-%m-%d_%H:%M:%S") end = (datetime.datetime.strptime(date,'%Y%m%d%H')+datetime.timedelta(hours=int(frst))).strftime("%Y-%m-%d_%H:%M:%S") intp = (datetime.datetime.strptime(date,'%Y%m%d%H')+datetime.timedelta(hours=int(step))).strftime("%Y-%m-%d_%H:%M:%S") fstart = path+'/wrfout_d01_'+start+'*' fintp = path+'/wrfout_d01_'+intp+'*' fend = path+'/wrfout_d01_'+end+'*' file = path+'/*' filestart = glob.glob(fstart) fileintp = glob.glob(fintp) fileend = glob.glob(fend) filelist = glob.glob(file) filelist.sort() rstart = np.array(np.where(np.array(filelist)==filestart))[0][0] rintp = np.array(np.where(np.array(filelist)==fileintp))[0][0] rend = np.array(np.where(np.array(filelist)==fileend))[0][0] fn = filelist[rstart:rend:rintp] outroot = 'Users/' for i in fn: uhdr = {"header":{"discipline":0,"disciplineName":"Meteorological products","gribEdition":2,"gribLength":131858,"center":0,"centerName":"WRF OUTPUT","subcenter":0,"refTime":"2014-01-31T00:00:00.000Z","significanceOfRT":1,"significanceOfRTName":"Start of forecast","productStatus":0,"productStatusName":"Operational products","productType":1,"productTypeName":"Forecast products","productDefinitionTemplate":0,"productDefinitionTemplateName":"Analysis/forecast at horizontal level/layer at a point in time","parameterCategory":2,"parameterCategoryName":"Momentum","parameterNumber":2,"parameterNumberName":"U-component_of_wind","parameterUnit":"m.s-1","genProcessType":2,"genProcessTypeName":"Forecast","forecastTime":3,"surface1Type":103,"surface1TypeName":"Specified height level above ground","surface1Value":10,"surface2Type":255,"surface2TypeName":"Missing","surface2Value":0,"gridDefinitionTemplate":0,"gridDefinitionTemplateName":"Latitude_Longitude","numberPoints":65160,"shape":6,"shapeName":"Earth spherical with radius of 6,371,229.0 m","gridUnits":"degrees","resolution":48,"winds":"true","scanMode":0,"nx":360,"ny":181,"basicAngle":0,"subDivisions":0,"lo1":0,"la1":90,"lo2":359,"la2":-90,"dx":1,"dy":1}} vhdr = {"header":{"discipline":0,"disciplineName":"Meteorological products","gribEdition":2,"gribLength":131858,"center":0,"centerName":"WRF OUTPUT","subcenter":0,"refTime":"2014-01-31T00:00:00.000Z","significanceOfRT":1,"significanceOfRTName":"Start of forecast","productStatus":0,"productStatusName":"Operational products","productType":1,"productTypeName":"Forecast products","productDefinitionTemplate":0,"productDefinitionTemplateName":"Analysis/forecast at horizontal level/layer at a point in time","parameterCategory":2,"parameterCategoryName":"Momentum","parameterNumber":3,"parameterNumberName":"V-component_of_wind","parameterUnit":"m.s-1","genProcessType":2,"genProcessTypeName":"Forecast","forecastTime":3,"surface1Type":103,"surface1TypeName":"Specified height level above ground","surface1Value":10,"surface2Type":255,"surface2TypeName":"Missing","surface2Value":0,"gridDefinitionTemplate":0,"gridDefinitionTemplateName":"Latitude_Longitude","numberPoints":65160,"shape":6,"shapeName":"Earth spherical with radius of 6,371,229.0 m","gridUnits":"degrees","resolution":48,"winds":"true","scanMode":0,"nx":360,"ny":181,"basicAngle":0,"subDivisions":0,"lo1":0,"la1":90,"lo2":359,"la2":-90,"dx":1,"dy":1}} data = [uhdr, vhdr] newf = Dataset(i) lat = np.array(newf.variables['lat']) # print(fn,lat) lon = np.array(newf.variables['lon']) dys = np.diff(lat, axis = 0).mean(1) dy = float(dys.mean()) dxs = np.diff(lon, axis = 1).mean(0) dx = float(dxs.mean()) nx = float(lon.shape[1]) ny = float(lat.shape[0]) la1 = float(lat[-1, -1]) la2 = float(lat[0, 0]) lo1 = float(lon[0, 0]) lo2 = float(lon[-1, -1]) time =(newf.variables['time']) dates = nc.num2date(time[:],units=time.units) dt = pd.to_datetime(np.array(dates, dtype='datetime64[s]')).strftime("%Y%m%d%H%M%S") tms =pd.to_datetime(np.array(dates, dtype='datetime64[s]')).strftime("%Y-%m-%d_%H:%M:%S") for ti, time in enumerate(dt): datestr = (dt[0][:8]) timestr = (dt[0][8:10])+'00' dirpath = outroot + date os.makedirs(dirpath, exist_ok = True) outpath = os.path.join(dirpath, '%s.json' % (i[-19:])) for u0_or_v1 in [0, 1]: h = data[u0_or_v1]['header'] h['la1'] = la1 h['la2'] = la2 h['lo1'] = lo1 h['lo2'] = lo2 h['nx'] = nx h['ny'] = ny h['dx'] = dx h['dy'] = dy h['forecastTime'] = 0 h['refTime'] = tms[0] + '.000Z' h['gribLength'] = 1538 + nx * ny * 2 if u0_or_v1 == 0: data[u0_or_v1]['data'] = np.array(newf.variables['u10']).ravel().tolist() elif u0_or_v1 == 1: data[u0_or_v1]['data'] = np.array(newf.variables['v10']).ravel().tolist() if ti == 0: outf = open(outpath, 'w') json.dump(data, outf) outf.close() outf = open(outpath, 'w') json.dump(data, outf) outf.close()
上述指令碼為Linux系統下執行,執行方式如下:
python xx.py 起報時間 時常 間隔
舉個例子:
我的wrfout資料名稱如下:
python convert_to_json.py 2022071000 12 06
根據你需要的模式起始時間,起報的時長(小時)以及預報的時間間隔(小時)進行自動化轉換。
當然,這裡也準備了一個windows下的簡易指令碼,轉換出的資訊也比較簡單,
# -*- coding: utf-8 -*- """ Created on %(date)s @author: %(jixianpu)s Email : 211311040008@hhu.edu.cn introduction : keep learning althongh walk slowly """ from __future__ import print_function, unicode_literals import pandas as pd import os import json import netCDF4 as nc import numpy as np import datetime from netCDF4 import Dataset import argparse from argparse import RawDescriptionHelpFormatter import xarray as xr # parser = argparse.ArgumentParser(description = """ # """, formatter_class = RawDescriptionHelpFormatter) args = r'J:/wrf自動化/wrfout_d01_2022-07-10_01_00_00.nc' outroot = r'D:/' uhdr = {"header":{ "nx":360, "ny":181, "max":11, }} data = [uhdr] newf = Dataset(args) lat = np.array(newf.variables['lat']) lon = np.array(newf.variables['lon']) u10 = np.array(newf.variables['u10']) v10 = np.array(newf.variables['v10']) # indx = u10>1000 # u10[indx] = np.nan # v10[indx] = np.nan w10 = np.nanmax(np.sqrt(u10*u10+v10*v10)) dys = np.diff(lat, axis = 0).mean(1) dy = float(dys.mean()) print('Latitude Error:', np.abs((dy / dys) - 1).max()) print('Latitude Sum Error:', (dy / dys - 1).sum()) dxs = np.diff(lon, axis = 1).mean(0) dx = float(dxs.mean()) print('Longitude Error:', np.abs(dx / dxs - 1).max()) print('Longitude Sum Error:', (dx / dxs - 1).sum()) nx = float(lon.shape[1]) ny = float(lat.shape[0]) la1 = float(lat[-1, -1]) la2 = float(lat[0, 0]) lo1 = float(lon[0, 0]) lo2 = float(lon[-1, -1]) time =(newf.variables['time']) dates = nc.num2date(time[:],units=time.units) dt = pd.to_datetime(np.array(dates, dtype='datetime64[s]')).strftime("%Y%m%d%H%M%S") ds= { "nx":360, "ny":181, "max":11, # "lo1":0, # "la1":90, # "lo2":359, # "la2":-90, # "dx":1, # "dy":1, # "parameterUnit":"m.s-1", 'data':{} } ds['max'] = float(w10) ds['nx'] = (nx) ds['ny'] = (ny) for ti, time in enumerate(dt): #2012/02/07/0100Z/wind/surface/level/orthographic=-74.01,4.38,29184 datestr = (dt[0][:8]) timestr = (dt[0][8:10])+'00' print('Add "#' + datestr + '/' + timestr + 'Z/wind/surface/level/orthographic" to url to see this time') dirpath = os.path.join('D:', *datestr.split('/')) os.makedirs(dirpath, exist_ok = True) outpath = os.path.join(dirpath, '%s-wind-surface-level-gfs-1.0.json' % (timestr,)) udata=u10.ravel() data[0]['data']=[] for i in range(len(udata)): data[0]['data'].append([ u10.ravel().tolist()[i], v10.ravel().tolist()[i]]) ds['data'] = data[0]['data'] outf = open(outpath, 'w') json.dump(ds,outf) outf.close()
這個指令碼正常放在編輯器裡面執行即可。
執行完結束,會在你的輸出路徑下生成一個資料夾:
裡面有個json資料:
資料資訊比較簡單,只有nx(經度的大小),ny(緯度的大小)以及最大值:
ok,以上就是完整的過程,最終將得到的json資料通過.js指令碼執行就可以部署到網頁上了,簡單試了一下,大概如下圖所示,可以根據需要自行更改設定:
到此這篇關於python轉換wrf輸出的資料為網頁視覺化json格式的文章就介紹到這了,更多相關python視覺化json格式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45