我正在使用leaflet-velocity.js来处理风动画,它可以在我自己的大气模型输出(WRF)的npm或github(https://github.com/danwild/leaflet-velocity)中找到。
为了执行风动画,我写下了自己的python代码,将模型输出从netCDF格式转换为json格式。代码显示在下面
import os, sys, json, numpy as np
from glob import glob
from netCDF4 import Dataset, num2date, date2num
#- header templete
header = {
'parameterUnit': 'm.s-1',
'parameterNumber': 2,
'dx': 1.0,
'dy': 1.0,
'parameterNumberName': 'eastward_wind',
'la1': 90.0,
'la2': -90.0,
'parameterCategory': 2,
'lo1': 0.0,
'nx': 360,
'ny': 181,
'refTime': '2016-04-30T06:00:00.000Z',
'lo2': 359.0,
}
lists = glob('TXGLO.surf_wind4json.nc')
ntimes= 8
for fid in lists[:1]:
nc = Dataset(fid)
tm = nc.variables['Times'][:]
dim1, dim2 = nc.variables['XLAT'][0].shape
nPoints = dim1*dim2
lat= np.flipud(nc.variables['XLAT'][0]).flatten().tolist()
lon= np.flipud(nc.variables['XLONG'][0]+360.).flatten().tolist()
header['nx'] = dim1
header['ny'] = dim2
header['la1']= lat[0]
header['la2']= lat[-1]
header['lo1']= lon[0]
header['lo2']= lon[-1]
numPoints = nPoints
for num, tim in enumerate(tm[:1]):
refTime = ''.join(tim).replace('_',' ')
print(' Processing file : '+fid+' , time : '+str(num)+' '+refTime)
header['refTime'] = refTime
with open('cresm_atmos_surf.json','w') as outfile:
outfile.write('[')
#- U10
header['parameterNumberName'] = 'eastward_wind'
u10 = np.flipud(nc.variables['U10'][num]).flatten().tolist()
json.dump({'data':u10,'header':header}, outfile)
outfile.write(',')
#- V10
header['parameterNumberName'] = 'northward_wind'
v10 = np.flipud(nc.variables['V10'][num]).flatten().tolist()
json.dump({'data':v10,'header':header}, outfile)
outfile.write(']')
json输出的结果与demo json文件类似,例如wind-gbr.json(https://github.com/danwild/leaflet-velocity/blob/master/demo/wind-gbr.json)
完成转换后,我刷新了网页,发现读取我的json文件时出错。
有人可以帮我弄清楚错误是什么吗?
谢谢,
我的netcdf文件:https://www.dropbox.com/s/tmyrrinraetvcxs/TXGLO.surf_wind4json.nc?dl=0
我的json文件: https://www.dropbox.com/s/huiffld05zmldrs/cresm_atmos_surf.json?dl=0
demo json文件: https://www.dropbox.com/s/17pr3vdkl1v3bq7/wind_gbr.json?dl=0
答案 0 :(得分:0)
如果您拒绝错误调用堆栈,则会检查createBuilder
函数,该函数会显示如何从您提供的JSON数据中提取uComp
和vComp
。
您会看到它使用您的记录标题parameterCategory
和parameterNumber
字段来确定是否应将记录数据分配到uComp
或vComp
:
switch (record.header.parameterCategory + "," + record.header.parameterNumber) {
case "1,2":
case "2,2":
uComp = record;
break;
case "1,3":
case "2,3":
vComp = record;
break;
default:
scalar = record;
}
看起来您的数据有2条记录,这两个字段的值完全相同:
"parameterNumber": 2,
"parameterCategory": 2
因此,您似乎没有提供vComp
类型记录。
通过使用"parameterNumber": 3
强制您的一条记录,传单速度脚本不再引发错误并在地图上显示某些内容,尽管它可能不是合适的显示。