metradar 0.1.6__py3-none-any.whl → 0.1.8.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- metradar/__init__.py +4 -2
- metradar/config.py +53 -0
- metradar/core/__init__.py +9 -0
- metradar/{get_cross_section_from_pyart.py → core/get_cross_section.py} +5 -157
- metradar/{mosaic_merge.py → core/mosaic_merge.py} +3 -1
- metradar/{oa_dig_func.py → core/oa_dig_func.py} +83 -333
- metradar/graph/__init__.py +9 -0
- metradar/{mosaic_quickdraw.py → graph/draw_comp_mosaic.py} +71 -68
- metradar/{draw_mosaic_new.py → graph/draw_latlon_func.py} +177 -173
- metradar/graph/draw_radar_aws.py +212 -0
- metradar/{draw_radar_comp_func.py → graph/draw_radar_comp_func.py} +319 -248
- metradar/graph/parse_pal.py +157 -0
- metradar/io/__init__.py +9 -0
- metradar/{cnrad_level2.py → io/cnrad_level2.py} +45 -2
- metradar/{decode_fmt_pyart.py → io/decode_fmt_pyart.py} +20 -3
- metradar/{decode_pup_rose.py → io/decode_pup_rose.py} +241 -684
- metradar/{read_new_mosaic_func.py → io/read_new_mosaic_func.py} +30 -2
- metradar/io/read_swan.py +250 -0
- metradar/{rose_structer.py → io/rose_structer.py} +2 -0
- metradar/project/__init__.py +9 -0
- metradar/project/make_mosaic/__init__.py +9 -0
- metradar/project/make_mosaic/batch_draw_mosaic.py +32 -0
- metradar/{make_mosaic_mp_archive.py → project/make_mosaic/make_mosaic_func.py} +144 -175
- metradar/project/make_mosaic/make_mosaic_mp.ini +29 -0
- metradar/project/make_mosaic/make_mosaic_mp.py +70 -0
- metradar/project/make_vpr_aws/__init__.py +9 -0
- metradar/project/make_vpr_aws/construct_aws_refvpr_mainprog.ini +39 -0
- metradar/project/make_vpr_aws/construct_aws_refvpr_mainprog.py +565 -0
- metradar/project/make_vpr_aws/make_mosaic_20230731_daxing.ini +29 -0
- metradar/project/make_vpr_aws/make_mosaic_basefile.ini +29 -0
- metradar/project/nowcasting/__init__.py +9 -0
- metradar/project/nowcasting/nowcast_by_pysteps.py +214 -0
- metradar/{trans_nc_pgmb.py → project/nowcasting/trans_mosaic_pgmb.py} +19 -17
- metradar/project/qpe/Archive /346/250/241/345/274/217/350/257/264/346/230/216.txt" +2 -0
- metradar/project/qpe/__init__.py +9 -0
- metradar/project/qpe/archive_main_qpe_cfg.ini +91 -0
- metradar/project/qpe/do_s1.sh +6 -0
- metradar/project/qpe/do_s2.sh +6 -0
- metradar/project/qpe/do_s3.sh +6 -0
- metradar/project/qpe/do_s4.sh +6 -0
- metradar/project/qpe/do_s5.sh +6 -0
- metradar/project/qpe/exec_all.sh +11 -0
- metradar/project/qpe/get_rainrate_func.py +80 -0
- metradar/project/qpe/main_qpe_cfg.ini +85 -0
- metradar/project/qpe/s1_download_radar_region_cmadaas.py +123 -0
- metradar/project/qpe/s2_pre_process_single_radar.py +183 -0
- metradar/project/qpe/s3_trans_rainrate_to_qpe.py +499 -0
- metradar/project/qpe/s4_mosaic_qpe.py +523 -0
- metradar/project/qpe/s5_draw_qpe_mosaic.py +308 -0
- metradar/project/wind_retrieval/__init__.py +9 -0
- metradar/project/wind_retrieval/config_3dwind.ini +45 -0
- metradar/{main_pydda.py → project/wind_retrieval/main_pydda.py} +152 -149
- metradar/util/__init__.py +9 -0
- metradar/{comm_func.py → util/comm_func.py} +1 -41
- metradar/util/exceptions.py +50 -0
- metradar/util/geo_transforms_pyart.py +627 -0
- metradar/{get_tlogp_from_sharppy.py → util/get_tlogp_from_sharppy.py} +16 -5
- metradar/{parse_pal.py → util/parse_pal.py} +147 -147
- metradar/util/radar_common.py +16 -0
- metradar/{trans_new_mosaic_nc.py → util/trans_new_mosaic_nc.py} +1 -1
- metradar-0.1.8.2.dist-info/METADATA +90 -0
- metradar-0.1.8.2.dist-info/RECORD +69 -0
- {metradar-0.1.6.dist-info → metradar-0.1.8.2.dist-info}/WHEEL +1 -1
- metradar-0.1.8.2.dist-info/licenses/LICENSE +21 -0
- {metradar-0.1.6.dist-info → metradar-0.1.8.2.dist-info}/top_level.txt +0 -1
- cfg/config.py +0 -90
- metradar/grid.py +0 -281
- metradar/grid_data.py +0 -64
- metradar/oa_couhua.py +0 -166
- metradar/read_new_mosaic.py +0 -33
- metradar/retrieve_cmadaas.py +0 -3126
- metradar/retrieve_micaps_server.py +0 -2061
- metradar-0.1.6.dist-info/METADATA +0 -37
- metradar-0.1.6.dist-info/RECORD +0 -34
- /metradar/{pgmb_io.py → io/pgmb_io.py} +0 -0
- /metradar/{exceptions.py → project/make_vpr_aws/exceptions.py} +0 -0
- /metradar/{geo_transforms_pyart.py → project/make_vpr_aws/geo_transforms_pyart.py} +0 -0
- /metradar/{make_gif.py → util/make_gif.py} +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
;雷达拼图制作程序配置文件,可支持实时模式和历史模式
|
|
3
|
+
;联系人:朱文剑 zhuwj@cma.gov.cn
|
|
4
|
+
;请不要使用txt文本进行编辑,否则会导致配置文件读取出错,推荐使用notepad++进行编辑
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
[SETTINGS]
|
|
8
|
+
#根输出目录
|
|
9
|
+
root_outpath=/mnt/e/metradar_test/vpr
|
|
10
|
+
; root_outpath=H:/radar_vpr
|
|
11
|
+
|
|
12
|
+
# 雷达单站基数据路径,用于历史模式
|
|
13
|
+
radar_basedata_path=FMT
|
|
14
|
+
|
|
15
|
+
;雷达基数据天擎API接口
|
|
16
|
+
data_code_radar_api=RADA_L2_FMT
|
|
17
|
+
|
|
18
|
+
;自动站数据天擎API接口
|
|
19
|
+
data_code_aws_api=SURF_CHN_MUL_MIN
|
|
20
|
+
|
|
21
|
+
# 时间设置,包括开始时间yyyymmddHHMMSS,结束时间yyyymmddHHMMSS,均采用世界时
|
|
22
|
+
starttime=20230731070000
|
|
23
|
+
endtime=20230731120000
|
|
24
|
+
|
|
25
|
+
# 自动站站点
|
|
26
|
+
aws_site=A1265
|
|
27
|
+
|
|
28
|
+
# 三维拼图半径 KM,整数
|
|
29
|
+
mosaic_range = 50
|
|
30
|
+
|
|
31
|
+
# 任务名称,这个用来在三维拼图路径下建立子文件夹,方便存储不同任务的数据,以便后期重复使用
|
|
32
|
+
task_name=20230731_daxing
|
|
33
|
+
|
|
34
|
+
# 图片格式:png or svg,其中svg是矢量格式
|
|
35
|
+
pic_format=png
|
|
36
|
+
pic_dpi=600
|
|
37
|
+
|
|
38
|
+
;雷达拼图制作的基本文件,不能随意修改
|
|
39
|
+
base_mosaic_inifile=/home/wjzhu/OneDrive/PythonCode/MyWork/metradar/metradar/project/make_vpr_aws/make_mosaic_basefile.ini
|
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
# _*_ coding: utf-8 _*_
|
|
2
|
+
|
|
3
|
+
'''
|
|
4
|
+
构建时间序列图的框架程序
|
|
5
|
+
'''
|
|
6
|
+
|
|
7
|
+
from nmc_met_io.retrieve_cmadaas import cmadaas_obs_by_time_range_and_id
|
|
8
|
+
from nmc_met_io.retrieve_cmadaas import cmadaas_sounding_by_time
|
|
9
|
+
from nmc_met_io.retrieve_cmadaas import cmadaas_radar_level2_by_timerange_and_id
|
|
10
|
+
|
|
11
|
+
import pandas as pd
|
|
12
|
+
import geo_transforms_pyart as geotrans
|
|
13
|
+
import math
|
|
14
|
+
import numpy as np
|
|
15
|
+
import os
|
|
16
|
+
import configparser
|
|
17
|
+
# from make_mosaic_mp_archive import MAKE_RADAR_MOSAIC
|
|
18
|
+
from metradar.project.make_mosaic.make_mosaic_func import MAKE_RADAR_MOSAIC
|
|
19
|
+
from multiprocessing import freeze_support
|
|
20
|
+
from datetime import datetime,timedelta
|
|
21
|
+
import xarray as xr
|
|
22
|
+
import numpy.ma as MA
|
|
23
|
+
import matplotlib.pyplot as plt
|
|
24
|
+
from metradar.util.parse_pal import parse_pro
|
|
25
|
+
from matplotlib.ticker import (MultipleLocator)
|
|
26
|
+
from matplotlib import font_manager
|
|
27
|
+
import matplotlib
|
|
28
|
+
from metradar.util.comm_func import geopotential_to_height
|
|
29
|
+
matplotlib.use('agg')
|
|
30
|
+
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
from metradar.config import CONFIG
|
|
33
|
+
|
|
34
|
+
# 资源文件路径
|
|
35
|
+
RESOURCES_PATH = CONFIG.get('SETTING','RESOURCES_PATH')
|
|
36
|
+
FONT_FILE = RESOURCES_PATH + '/fonts/YaHeiConsolasHybrid_1.12.ttf'
|
|
37
|
+
RADAR_FILE = RESOURCES_PATH + '/stations/radars.csv'
|
|
38
|
+
COLOR_FILE = RESOURCES_PATH + '/gr2_colors/default_BR_PUP1.pal'
|
|
39
|
+
|
|
40
|
+
# 获取当前脚本所在目录
|
|
41
|
+
SCRIPT_DIR = Path(__file__).resolve().parent
|
|
42
|
+
print("当前脚本路径:",SCRIPT_DIR)
|
|
43
|
+
|
|
44
|
+
# 一键生成VPR数据和自动站数据,并绘制图形
|
|
45
|
+
#数据来源:天擎
|
|
46
|
+
|
|
47
|
+
class CONSTRUCT_VPR:
|
|
48
|
+
|
|
49
|
+
# sub function for reading config file
|
|
50
|
+
def ConfigFetchError(Exception):
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
def _get_config_from_rcfile(self,rcfile):
|
|
54
|
+
"""
|
|
55
|
+
Get configure information from config_dk_met_io.ini file.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
rc = rcfile
|
|
59
|
+
print(rc)
|
|
60
|
+
if not os.path.exists(rc):
|
|
61
|
+
print(rc + ' not exist')
|
|
62
|
+
return None
|
|
63
|
+
try:
|
|
64
|
+
config = configparser.ConfigParser()
|
|
65
|
+
config.read(rc,encoding='UTF-8')
|
|
66
|
+
except IOError as e:
|
|
67
|
+
raise self.ConfigFetchError(str(e))
|
|
68
|
+
except Exception as e:
|
|
69
|
+
raise self.ConfigFetchError(str(e))
|
|
70
|
+
|
|
71
|
+
return config
|
|
72
|
+
|
|
73
|
+
def __init__(self,inifilepath) -> None:
|
|
74
|
+
pass
|
|
75
|
+
config = self._get_config_from_rcfile(inifilepath)
|
|
76
|
+
self.outpath = config['SETTINGS']['root_outpath']
|
|
77
|
+
self.outpath_fmt = self.outpath + os.sep + config['SETTINGS']['radar_basedata_path']
|
|
78
|
+
self.task_name = config['SETTINGS']['task_name']
|
|
79
|
+
|
|
80
|
+
self.start_time = config['SETTINGS']['starttime']
|
|
81
|
+
self.end_time = config['SETTINGS']['endtime']
|
|
82
|
+
self.staid = config['SETTINGS']['aws_site']
|
|
83
|
+
self.mosaic_range = int(config['SETTINGS']['mosaic_range'])
|
|
84
|
+
|
|
85
|
+
self.pic_format = config['SETTINGS']['pic_format']
|
|
86
|
+
self.pic_dpi = int(config['SETTINGS']['pic_dpi'])
|
|
87
|
+
|
|
88
|
+
self.time_range = "[%s,%s]"%(self.start_time, self.end_time)
|
|
89
|
+
|
|
90
|
+
# self.tlogp_time = '20230731000000'
|
|
91
|
+
# 自动计算探空时间,用起始日期08时的探空
|
|
92
|
+
self.tlogp_time = self.start_time[0:8] + '000000'
|
|
93
|
+
|
|
94
|
+
self.outpath_tlogp = self.outpath + os.sep + 'tlogp'
|
|
95
|
+
self.outpath_sta = self.outpath + os.sep + 'VPR'
|
|
96
|
+
self.outpath_pic = self.outpath + os.sep + 'VPR'
|
|
97
|
+
self.outpath_ref = self.outpath + os.sep + 'VPR'
|
|
98
|
+
self.outname_sta= '%s.csv'%self.staid
|
|
99
|
+
self.outname_ref = 'p3_vpr_%s_pyart.nc'%self.staid
|
|
100
|
+
self.outpath_mosaic = self.outpath + os.sep + 'mosaic' + os.sep + self.task_name
|
|
101
|
+
|
|
102
|
+
if not os.path.exists(self.outpath):
|
|
103
|
+
os.makedirs(self.outpath)
|
|
104
|
+
if not os.path.exists(self.outpath_fmt):
|
|
105
|
+
os.makedirs(self.outpath_fmt)
|
|
106
|
+
if not os.path.exists(self.outpath_tlogp):
|
|
107
|
+
os.makedirs(self.outpath_tlogp)
|
|
108
|
+
if not os.path.exists(self.outpath_sta):
|
|
109
|
+
os.makedirs(self.outpath_sta)
|
|
110
|
+
if not os.path.exists(self.outpath_pic):
|
|
111
|
+
os.makedirs(self.outpath_pic)
|
|
112
|
+
if not os.path.exists(self.outpath_ref):
|
|
113
|
+
os.makedirs(self.outpath_ref)
|
|
114
|
+
if not os.path.exists(self.outpath_mosaic):
|
|
115
|
+
os.makedirs(self.outpath_mosaic)
|
|
116
|
+
|
|
117
|
+
self.colorfile = COLOR_FILE
|
|
118
|
+
self.radarfile = RADAR_FILE
|
|
119
|
+
self.base_mosaic_inifile = config['SETTINGS']['base_mosaic_inifile']
|
|
120
|
+
self.fontfile = FONT_FILE
|
|
121
|
+
self.data_code_radar_api = config['SETTINGS']['data_code_radar_api']
|
|
122
|
+
self.data_code_aws_api = config['SETTINGS']['data_code_aws_api']
|
|
123
|
+
|
|
124
|
+
# 默认拼图文件不可用
|
|
125
|
+
self.bmosaic_vilid = False
|
|
126
|
+
|
|
127
|
+
# 第一步,从天擎下载自动站数据
|
|
128
|
+
def get_aws_data(self,):
|
|
129
|
+
# 读取自动站雨量数据
|
|
130
|
+
# A7606, A7607, A7055, A7617 重庆
|
|
131
|
+
# # 54501 斋堂, A1067 丰台千灵山 A1254 大兴庞各庄
|
|
132
|
+
|
|
133
|
+
print("entering get_aws_data function")
|
|
134
|
+
elements='Station_Name,Station_Id_C,Station_Id_d,lat,lon,Datetime,PRE,PRE_1h'
|
|
135
|
+
|
|
136
|
+
data_code = self.data_code_aws_api
|
|
137
|
+
|
|
138
|
+
# 读取数据
|
|
139
|
+
data = cmadaas_obs_by_time_range_and_id(time_range=self.time_range, data_code = data_code,elements=elements,sta_ids = self.staid)
|
|
140
|
+
if data is None:
|
|
141
|
+
print('required data is None, please check the site number!')
|
|
142
|
+
return False
|
|
143
|
+
|
|
144
|
+
self.sta_lat = data['lat'][0]
|
|
145
|
+
self.sta_lon = data['lon'][0]
|
|
146
|
+
self.sta_name = data['Station_Name'][0]
|
|
147
|
+
|
|
148
|
+
# data.to_csv(outpath_sta + os.sep + outname_sta,index=False)
|
|
149
|
+
data2 = data.set_index('Datetime')
|
|
150
|
+
# data2['PRE_1h'][0]=0
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
diff_rain =[]
|
|
154
|
+
diff_rain.append(0)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
# PRE_1h表示当前小时的累计雨量
|
|
158
|
+
# pre_5min表示当前5分钟的累计雨量
|
|
159
|
+
# pre_1min表示当前1分钟的累计雨量
|
|
160
|
+
# accsum表示从起始时刻到当前时刻的累计雨量
|
|
161
|
+
# 时间均为UTC时间
|
|
162
|
+
|
|
163
|
+
# diff()为求差,mode()为获取众数
|
|
164
|
+
# steps 为数据的时间间隔,单位为分钟
|
|
165
|
+
steps = int(data['Datetime'].diff().mode()[0].seconds/60)
|
|
166
|
+
difrain_name = 'pre_%dmin'%steps
|
|
167
|
+
for nn in np.arange(0,data2.shape[0]-1):
|
|
168
|
+
|
|
169
|
+
if data2['PRE_1h'][nn+1] >= data2['PRE_1h'][nn]:
|
|
170
|
+
diff_rain.append(round(data2['PRE_1h'][nn+1]-data2['PRE_1h'][nn],2))
|
|
171
|
+
else:
|
|
172
|
+
diff_rain.append(round(data2['PRE_1h'][nn+1],2))
|
|
173
|
+
newpd = pd.DataFrame(diff_rain,columns=[difrain_name],index=data2.index)
|
|
174
|
+
# 如果间隔是1分钟,那么还需要求出5分钟的雨量
|
|
175
|
+
if steps == 1:
|
|
176
|
+
newpd['pre_5min'] = newpd[difrain_name].rolling(5).sum()
|
|
177
|
+
newpd['pre_5min'] = newpd['pre_5min'].round(2)
|
|
178
|
+
else:
|
|
179
|
+
pass
|
|
180
|
+
newindex = [tt for tt in newpd.index if tt.minute%5==0]
|
|
181
|
+
newpd['accsum'] = newpd[difrain_name].cumsum()
|
|
182
|
+
newpd['accsum'] = newpd['accsum'].round(2)
|
|
183
|
+
newpd['PRE_1h'] = data2['PRE_1h']
|
|
184
|
+
newpd['PRE'] = data2['PRE']
|
|
185
|
+
newpd['lat'] = data2['lat']
|
|
186
|
+
newpd['lon'] = data2['lon']
|
|
187
|
+
newpd['staname']=data2['Station_Name']
|
|
188
|
+
newpd.to_csv(self.outpath_sta + os.sep + self.outname_sta,index=True,encoding='gbk')
|
|
189
|
+
return True
|
|
190
|
+
|
|
191
|
+
def get_tlogp_data(self,):
|
|
192
|
+
# 第二步,从离自动站最近的探空站中获取探空数据,提取零度层高度和-20度层高度
|
|
193
|
+
# 读取探空站信息,获取经纬度、站号等信息
|
|
194
|
+
# tlogpinfo = pd.read_csv('../common/stationinfo_new/china_tlogp_stations_m3.txt',delimiter=r"\s+",skiprows=3,names=['stanum','lon','lat','alt','num2'])
|
|
195
|
+
|
|
196
|
+
# tmpdata['stanum'].values[0] int
|
|
197
|
+
# staid_tlogp = str(tmpdata['stanum'].values[0])
|
|
198
|
+
|
|
199
|
+
print("entering get_tlogp_data function")
|
|
200
|
+
tlogpdata = cmadaas_sounding_by_time(times=self.tlogp_time)
|
|
201
|
+
allstas = np.unique(tlogpdata['Station_Id_C'])
|
|
202
|
+
alllons=[]
|
|
203
|
+
alllats=[]
|
|
204
|
+
#获取所有站点的经纬度信息
|
|
205
|
+
for ts in allstas:
|
|
206
|
+
tmpd = tlogpdata[tlogpdata['Station_Id_C']==ts]
|
|
207
|
+
curlat = tmpd['Lat'].values[0]
|
|
208
|
+
curlon = tmpd['Lon'].values[0]
|
|
209
|
+
alllons.append(curlon)
|
|
210
|
+
alllats.append(curlat)
|
|
211
|
+
|
|
212
|
+
x,y= geotrans.geographic_to_cartesian_aeqd(lon=alllons,lat=alllats,lon_0=self.sta_lon,lat_0=self.sta_lat)
|
|
213
|
+
dis = [math.sqrt(pow(x[k],2) + pow(y[k],2))/1000 for k in range(len(x))]
|
|
214
|
+
flag = np.array(dis) <= min(dis)+0.1
|
|
215
|
+
tmpts = allstas[flag]
|
|
216
|
+
tmpdata = tlogpdata[tlogpdata['Station_Id_C']==tmpts[0]]
|
|
217
|
+
tmpdata = tmpdata.sort_values(by='PRS_HWC',ascending=False)
|
|
218
|
+
tmpdata.dropna(subset=['PRS_HWC'],inplace=True)
|
|
219
|
+
tmpdata.to_csv(self.outpath_tlogp + os.sep + 'tlogp_%s.csv'%tmpts[0],index=False)
|
|
220
|
+
#查找离零度层和-20度层最近的高度
|
|
221
|
+
flag = np.array(abs(tmpdata['TEM'])) <= abs(tmpdata['TEM']).min()+0.01
|
|
222
|
+
z0 = tmpdata['GPH'][flag].values[0]
|
|
223
|
+
flag = np.array(abs(tmpdata['TEM']+20)) <= abs(tmpdata['TEM']+20).min()+0.01
|
|
224
|
+
z20 = tmpdata['GPH'][flag].values[0]
|
|
225
|
+
|
|
226
|
+
self.z0 = geopotential_to_height(z0*9.80665)
|
|
227
|
+
self.z20 = geopotential_to_height(z20*9.80665)
|
|
228
|
+
return True
|
|
229
|
+
|
|
230
|
+
def get_fmt_data(self,):
|
|
231
|
+
# 第三步,从天擎读取雷达数据
|
|
232
|
+
# 先检查是否已经存在拼图文件,而且拼图文件中的时间和范围能够覆盖当前自动站
|
|
233
|
+
# 如果已经能满足要求,则不再下载雷达数据
|
|
234
|
+
print("entering get_fmt_data function")
|
|
235
|
+
|
|
236
|
+
startt = datetime.strptime(self.start_time,'%Y%m%d%H%M%S')
|
|
237
|
+
endt = datetime.strptime(self.end_time,'%Y%m%d%H%M%S')
|
|
238
|
+
curt = startt
|
|
239
|
+
allref=[]
|
|
240
|
+
grd_height = None
|
|
241
|
+
need_file_times=[]
|
|
242
|
+
while curt <= endt:
|
|
243
|
+
|
|
244
|
+
curname = 'mosaic_' + curt.strftime('%Y%m%d%H%M') + '.nc'
|
|
245
|
+
if os.path.exists(self.outpath_mosaic + os.sep + curname):
|
|
246
|
+
# print('file exist: %s'%(outpath_mosaic + os.sep + curname))
|
|
247
|
+
|
|
248
|
+
ref = xr.open_dataset(self.outpath_mosaic + os.sep + curname)
|
|
249
|
+
|
|
250
|
+
cent_lat = ref.origin_latitude.values[0]
|
|
251
|
+
cent_lon = ref.origin_longitude.values[0]
|
|
252
|
+
x,y= geotrans.geographic_to_cartesian_aeqd(lon=self.sta_lon,lat=self.sta_lat,lon_0=cent_lon,lat_0=cent_lat)
|
|
253
|
+
grd_height = ref['z'].values
|
|
254
|
+
reso_x = ref['x'][1]-ref['x'][0]
|
|
255
|
+
reso_y = ref['y'][1]-ref['y'][0]
|
|
256
|
+
xx = x[0]/reso_x
|
|
257
|
+
yy = y[0]/reso_y
|
|
258
|
+
xx = int(xx.round())
|
|
259
|
+
yy = int(yy.round())
|
|
260
|
+
radius = int((len(ref.x)-1)/2)
|
|
261
|
+
|
|
262
|
+
if xx+radius >=0 and xx+radius < len(ref.x) and yy+radius >=0 and yy+radius < len(ref.y):
|
|
263
|
+
pass
|
|
264
|
+
else:
|
|
265
|
+
# 表示当前拼图范围不能覆盖自动站,需要重新下载数据进行拼图
|
|
266
|
+
need_file_times.append(curt)
|
|
267
|
+
ref.close()
|
|
268
|
+
else:
|
|
269
|
+
need_file_times.append(curt)
|
|
270
|
+
curt += timedelta(minutes=6)
|
|
271
|
+
|
|
272
|
+
if len(need_file_times) == 0:
|
|
273
|
+
self.bmosaic_vilid = True
|
|
274
|
+
return True
|
|
275
|
+
|
|
276
|
+
# 如果不能满足要求,则下载雷达数据
|
|
277
|
+
|
|
278
|
+
# 根据自动站经纬度,自动判断应该下载哪些雷达站的数据
|
|
279
|
+
# 读取雷达站点信息,获取经纬度、站号等信息
|
|
280
|
+
valid_range = 200
|
|
281
|
+
radinfo = pd.read_csv(self.radarfile,header=0,index_col=0)
|
|
282
|
+
|
|
283
|
+
x,y = geotrans.geographic_to_cartesian_aeqd(radinfo['经度'],radinfo['纬度'],self.sta_lon,self.sta_lat, R=6370997.0)
|
|
284
|
+
# dis = math.sqrt(pow(x[0],2) + pow(y[0],2))
|
|
285
|
+
dis = [math.sqrt(pow(x[k],2) + pow(y[k],2))/1000 for k in range(len(x))]
|
|
286
|
+
flag = np.array(dis) <= valid_range
|
|
287
|
+
# flag = np.where(dis<=valid_range)[0]
|
|
288
|
+
tmpdata = radinfo.loc[flag]
|
|
289
|
+
self.rdinfo = tmpdata.loc[:,['站名','纬度','经度']]
|
|
290
|
+
# # 暂时去掉不以Z9开头的站点
|
|
291
|
+
|
|
292
|
+
self.used_radars = self.rdinfo.index.to_list()
|
|
293
|
+
|
|
294
|
+
for site in self.rdinfo.index:
|
|
295
|
+
print(site)
|
|
296
|
+
# 暂时去掉不以Z9开头的站点
|
|
297
|
+
if not site.startswith('Z9'):
|
|
298
|
+
print("暂时不支持不以Z9开头的站点!")
|
|
299
|
+
self.used_radars.remove(site)
|
|
300
|
+
continue
|
|
301
|
+
|
|
302
|
+
# 从天擎下载该站号的雷达资料
|
|
303
|
+
if len(need_file_times) == 0:
|
|
304
|
+
pass
|
|
305
|
+
else:
|
|
306
|
+
tmp_starttime = min(need_file_times).strftime('%Y%m%d%H%M%S')
|
|
307
|
+
tmp_endtime = max(need_file_times).strftime('%Y%m%d%H%M%S')
|
|
308
|
+
time_range = '[ ' + tmp_starttime + ',' + tmp_endtime + ']'
|
|
309
|
+
cmadaas_radar_level2_by_timerange_and_id(radar_ids=site,time_range=time_range,outpath=self.outpath_fmt)
|
|
310
|
+
|
|
311
|
+
return True
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
# 第四步,制作区域三维拼图
|
|
316
|
+
def make_mosaic(self,):
|
|
317
|
+
# 修改配置文件
|
|
318
|
+
print("entering make_mosaic function")
|
|
319
|
+
config = configparser.ConfigParser()
|
|
320
|
+
config.read(self.base_mosaic_inifile)
|
|
321
|
+
config.set('ARCHIVE', 'input_path_archive', self.outpath_fmt) #
|
|
322
|
+
config.set('ARCHIVE', 'output_path_archive', self.outpath_mosaic) #
|
|
323
|
+
config.set('ARCHIVE', 'starttime', self.start_time[0:12]) #
|
|
324
|
+
config.set('ARCHIVE', 'endtime', self.end_time[0:12]) #
|
|
325
|
+
config.set('COMMON_SETTING', 'center_lon', '%.3f'%self.sta_lon) #
|
|
326
|
+
config.set('COMMON_SETTING', 'center_lat', '%.3f'%self.sta_lat) #
|
|
327
|
+
config.set('COMMON_SETTING', 'mosaic_range', '50') #
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
str_site=''
|
|
331
|
+
for site in self.used_radars:
|
|
332
|
+
str_site += site+','
|
|
333
|
+
config.set('COMMON_SETTING', 'radars', str_site) #
|
|
334
|
+
# 在当前脚本路径下,创建临时ini文件,其中包含任务名
|
|
335
|
+
cur_ini = SCRIPT_DIR / ('make_mosaic_' + self.task_name + '.ini')
|
|
336
|
+
config.write(open(cur_ini, 'w')) # 将修改后的配置写入文件
|
|
337
|
+
|
|
338
|
+
_make_mosaic = MAKE_RADAR_MOSAIC(cur_ini)
|
|
339
|
+
|
|
340
|
+
if not _make_mosaic.berror:
|
|
341
|
+
if _make_mosaic.run_mode == 'archive':
|
|
342
|
+
_make_mosaic.do_archive()
|
|
343
|
+
else:
|
|
344
|
+
print('run mode is not archive!')
|
|
345
|
+
return True
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
# 第五步:从三维拼图数据中获取格点的时间序列
|
|
349
|
+
def make_vpr(self,):
|
|
350
|
+
print("entering make_vpr function")
|
|
351
|
+
data = pd.read_csv(self.outpath_sta+os.sep+self.outname_sta,index_col=0,encoding='gbk')
|
|
352
|
+
sta_lat = data['lat'][0]
|
|
353
|
+
sta_lon = data['lon'][0]
|
|
354
|
+
sta_name = data['staname'][0]
|
|
355
|
+
startt = datetime.strptime(self.start_time,'%Y%m%d%H%M%S')
|
|
356
|
+
endt = datetime.strptime(self.end_time,'%Y%m%d%H%M%S')
|
|
357
|
+
curt = startt
|
|
358
|
+
allref=[]
|
|
359
|
+
grd_height = None
|
|
360
|
+
file_times=[]
|
|
361
|
+
while curt <= endt:
|
|
362
|
+
|
|
363
|
+
curname = 'mosaic_' + curt.strftime('%Y%m%d%H%M') + '.nc'
|
|
364
|
+
if not os.path.exists(self.outpath_mosaic + os.sep + curname):
|
|
365
|
+
print('file not exist: %s'%(self.outpath_mosaic + os.sep + curname))
|
|
366
|
+
curt += timedelta(minutes=6)
|
|
367
|
+
continue
|
|
368
|
+
|
|
369
|
+
ref = xr.open_dataset(self.outpath_mosaic + os.sep + curname)
|
|
370
|
+
|
|
371
|
+
cent_lat = ref.origin_latitude.values[0]
|
|
372
|
+
cent_lon = ref.origin_longitude.values[0]
|
|
373
|
+
x,y= geotrans.geographic_to_cartesian_aeqd(lon=sta_lon,lat=sta_lat,lon_0=cent_lon,lat_0=cent_lat)
|
|
374
|
+
grd_height = ref['z'].values
|
|
375
|
+
reso_x = ref['x'][1]-ref['x'][0]
|
|
376
|
+
reso_y = ref['y'][1]-ref['y'][0]
|
|
377
|
+
xx = x[0]/reso_x
|
|
378
|
+
yy = y[0]/reso_y
|
|
379
|
+
xx = int(xx.round())
|
|
380
|
+
yy = int(yy.round())
|
|
381
|
+
radius = int((len(ref.x)-1)/2)
|
|
382
|
+
ref2 = ref.isel(x=xx+radius,y=yy+radius)['reflectivity'].values
|
|
383
|
+
# 对ref2进行线性插值
|
|
384
|
+
tmpdf = pd.DataFrame(ref2[0],columns=['ref_raw'])
|
|
385
|
+
tmpdf['ref_new'] = tmpdf['ref_raw'].interpolate(method='slinear')
|
|
386
|
+
ref2 = tmpdf['ref_new'].values
|
|
387
|
+
allref.append(ref2)
|
|
388
|
+
file_times.append(curt)
|
|
389
|
+
curt += timedelta(minutes=6)
|
|
390
|
+
ref.close()
|
|
391
|
+
allref = np.array(allref)
|
|
392
|
+
# allref = allref.reshape(allref.shape[0],allref.shape[2])
|
|
393
|
+
|
|
394
|
+
alldata = MA.masked_array(allref, mask=allref==-9999)
|
|
395
|
+
xrdata = xr.Dataset({
|
|
396
|
+
'dbz':(['z', 'time'], alldata.T, {'long name':'time-height dBZ'})},
|
|
397
|
+
coords={'z':grd_height, 'time':file_times},
|
|
398
|
+
attrs={'lat':sta_lat, 'lon':sta_lon})
|
|
399
|
+
|
|
400
|
+
xrdata.to_netcdf(self.outpath_ref + os.sep + self.outname_ref)
|
|
401
|
+
print('ref data success!')
|
|
402
|
+
return True
|
|
403
|
+
|
|
404
|
+
# 第六步,绘制图形
|
|
405
|
+
def draw_pic(self,):
|
|
406
|
+
|
|
407
|
+
print("entering draw_pic function")
|
|
408
|
+
oridf = pd.read_csv(self.outpath_sta+os.sep+self.outname_sta,encoding='gbk')#,index_col=0
|
|
409
|
+
|
|
410
|
+
oridf['Datetime'] = pd.to_datetime(oridf['Datetime'], format="%Y-%m-%d %H:%M:%S")
|
|
411
|
+
oridf = oridf.set_index('Datetime')
|
|
412
|
+
newindex = [tt for tt in oridf.index if tt.minute%5==0]
|
|
413
|
+
df = oridf.loc[newindex]
|
|
414
|
+
# df.set_index('staname',inplace=True)
|
|
415
|
+
df.reset_index(inplace=True)
|
|
416
|
+
|
|
417
|
+
#将缺失的时间进行插值处理
|
|
418
|
+
helper = pd.DataFrame({'Datetime': pd.date_range(start=df['Datetime'].min(), end=df['Datetime'].max(),freq='300s')})
|
|
419
|
+
newdf = pd.merge(df, helper, on='Datetime', how='outer').sort_values('Datetime')
|
|
420
|
+
newdf['accsum'] = newdf['accsum'].interpolate(method='linear')
|
|
421
|
+
|
|
422
|
+
# ref_colorfile='gr2_colors/default_BR_PUP1.pal'
|
|
423
|
+
# ref_colorfile = 'gr2_colors/BR_WDTB_Bright.pal'
|
|
424
|
+
outdic= parse_pro(self.colorfile)
|
|
425
|
+
cmap=outdic['cmap']
|
|
426
|
+
norm=outdic['norm']
|
|
427
|
+
units=outdic['units']
|
|
428
|
+
# from pyart.graph import common
|
|
429
|
+
# cmapname = 'pyart_NWSRef'
|
|
430
|
+
# cmap = common.parse_cmap(cmapname, 'reflectivity')
|
|
431
|
+
|
|
432
|
+
data = xr.open_dataset(self.outpath_ref + os.sep + self.outname_ref)
|
|
433
|
+
|
|
434
|
+
data = data.rolling(z=2, time=2, min_periods=1, center=True).mean()
|
|
435
|
+
|
|
436
|
+
font_path = self.fontfile
|
|
437
|
+
font_manager.fontManager.addfont(font_path)
|
|
438
|
+
prop = font_manager.FontProperties(fname=font_path)
|
|
439
|
+
|
|
440
|
+
plt.rcParams["font.size"] = 12
|
|
441
|
+
plt.rcParams["font.sans-serif"] = prop.get_name()
|
|
442
|
+
fig = plt.figure(figsize=(10,6))
|
|
443
|
+
ax1 = fig.add_axes([0.1,0.18,0.8,0.3])#位置[左,下,右,上]
|
|
444
|
+
ax3 = fig.add_axes([0.1,0.64,0.8,0.3])#位置[左,下,右,上]
|
|
445
|
+
ax2 = ax3.twinx()
|
|
446
|
+
ax1.minorticks_on()
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
cb_ax = fig.add_axes([0.25, 0.08, 0.5, 0.03])
|
|
450
|
+
|
|
451
|
+
grid_y,grid_x=np.meshgrid(np.arange(0,data.dbz.shape[1]),data.z.values,)
|
|
452
|
+
pcm = ax1.pcolormesh(grid_y,grid_x,data.dbz,cmap=cmap,norm=norm)
|
|
453
|
+
# pcm = ax1.pcolormesh(data.dbz,cmap=cmap,norm=norm)
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
# flag = np.array(abs(data.z.values - z0)) <= abs(data.z.values - z0).min()+0.01
|
|
457
|
+
# z0h = ax1.plot(np.arange(0,data.dbz.shape[1]),np.ones(data.dbz.shape[1])*int(np.where(flag)[0][0]),'y--',
|
|
458
|
+
# linewidth=2,label='0度层高度')
|
|
459
|
+
# flag = np.array(abs(data.z.values - z20)) <= abs(data.z.values - z20).min()+0.01
|
|
460
|
+
# z20h=ax1.plot(np.arange(0,data.dbz.shape[1]),np.ones(data.dbz.shape[1])*int(np.where(flag)[0][0]),'r--',
|
|
461
|
+
# linewidth=2,label='-20度层高度')
|
|
462
|
+
z0h = ax1.plot(np.arange(0,data.dbz.shape[1]),np.ones(data.dbz.shape[1])*self.z0,'k--',linewidth=2,label='0度层高度')
|
|
463
|
+
z20h=ax1.plot(np.arange(0,data.dbz.shape[1]),np.ones(data.dbz.shape[1])*self.z20,'r--',linewidth=2,label='-20度层高度')
|
|
464
|
+
|
|
465
|
+
# leg = ax1.legend([z0h], ["零度层高度",], loc='upper right',title_fontproperties=prop)
|
|
466
|
+
ax1.legend()
|
|
467
|
+
ax1.tick_params(axis='x',which='minor',length=3,width=0.8,)
|
|
468
|
+
ax1.tick_params(axis='x',which='major',length=5,width=1,)
|
|
469
|
+
cb = plt.colorbar(mappable=pcm,cax=cb_ax,extend='both',ticks=np.arange(-10,85,5),orientation='horizontal')
|
|
470
|
+
cb.set_label('反射率因子 dBZ',fontsize=12)
|
|
471
|
+
ah1=ax2.plot(newdf['accsum'].values,'r',linewidth=2,label='累计雨量')
|
|
472
|
+
ah2=ax3.bar(np.arange(0,newdf.shape[0]),newdf['pre_5min'],label='5分钟雨量')
|
|
473
|
+
ax2.legend(loc='upper right')
|
|
474
|
+
ax3.legend(loc='upper left')
|
|
475
|
+
ax3.minorticks_on()
|
|
476
|
+
ax3.tick_params(axis='x',which='minor',length=3,width=0.8,)
|
|
477
|
+
ax3.tick_params(axis='x',which='major',length=5,width=1,)
|
|
478
|
+
ax3.xaxis.set_minor_locator(MultipleLocator(1))
|
|
479
|
+
ax1.set_xlim([0,data.dbz.shape[1]+1])
|
|
480
|
+
ax2.set_xlim([0,newdf.shape[0]])
|
|
481
|
+
ax1.grid('y')
|
|
482
|
+
ax2.grid('y')
|
|
483
|
+
# plt.xticks(fontsize=12)
|
|
484
|
+
# plt.yticks(fontsize=12)
|
|
485
|
+
# ax1.set_xlabel('Time(BJT, day hour:min)')
|
|
486
|
+
ax1.set_ylabel('距离地面的高度(米)')
|
|
487
|
+
ax1.set_title('单点回波强度时间-高度图(%.2f°N,%.2f°E)'%(data.lat,data.lon),fontsize=12)
|
|
488
|
+
ax2.set_ylabel('累计雨量(毫米)',color='r')
|
|
489
|
+
ax3.set_ylabel('5分钟雨量(毫米)',color=[59/255,117/255,175/255])
|
|
490
|
+
|
|
491
|
+
tmpdate = pd.to_datetime(data.time)+ timedelta(hours=8)
|
|
492
|
+
dates1 = [date.strftime('%H:%M') for date in tmpdate]
|
|
493
|
+
dates1[0] = tmpdate.min().strftime('%H:%M \n%Y-%m-%d')
|
|
494
|
+
|
|
495
|
+
datestr = dates1[::5]
|
|
496
|
+
tmpd = tmpdate[::5]
|
|
497
|
+
datestr[-1] = tmpd.max().strftime('%H:%M \n%Y-%m-%d')
|
|
498
|
+
|
|
499
|
+
ax1.set_xticks(np.arange(0,data.time.shape[0],5))
|
|
500
|
+
ax1.set_xticklabels(datestr)
|
|
501
|
+
# ax1.set_yticks(np.arange(0,data.z.shape[0],5))
|
|
502
|
+
# ax1.set_yticklabels(data.z[::5].values.astype('int'))
|
|
503
|
+
# ax1.set_yticks(data.z[::5])
|
|
504
|
+
# ax1.set_ylim([data.z.min(),data.z.max()])
|
|
505
|
+
ax1.set_ylim([0,20000])
|
|
506
|
+
ax1.set_yticks(np.arange(0,20000,2500))
|
|
507
|
+
|
|
508
|
+
tmpdate = pd.to_datetime(newdf['Datetime'])+ timedelta(hours=8)
|
|
509
|
+
dates2 = [date.strftime('%H:%M') for date in tmpdate]
|
|
510
|
+
dates2[0] = tmpdate.min().strftime('%H:%M \n%Y-%m-%d')
|
|
511
|
+
dates2[-1] = tmpdate.max().strftime('%H:%M \n%Y-%m-%d')
|
|
512
|
+
ax2.set_xticks(np.arange(0,newdf.shape[0],6))
|
|
513
|
+
|
|
514
|
+
ax2.set_xticklabels(dates2[::6])
|
|
515
|
+
ax3.set_xlabel('时间(时:分,北京时)')
|
|
516
|
+
ax2.set_title('5分钟雨量(柱)、自动站累积雨量(红实线), 站号:%s,%s(%.2f°N,%.2f°E)'%(self.staid,self.sta_name,self.sta_lat,self.sta_lon),fontsize=12)
|
|
517
|
+
# plt.figtext(0.73,0.02,'国家气象中心-天气预报技术研发室制作',fontsize=10)
|
|
518
|
+
plt.savefig(self.outpath_pic + os.sep + self.outname_ref.replace('.nc','.%s'%self.pic_format),dpi=self.pic_dpi)#,dpi=600
|
|
519
|
+
print(self.outpath_pic + os.sep + self.outname_ref.replace('.nc','.%s'%self.pic_format) + ' saved!')
|
|
520
|
+
# plt.show()
|
|
521
|
+
plt.close()
|
|
522
|
+
return True
|
|
523
|
+
|
|
524
|
+
# 一键生成VPR数据和自动站数据,并绘制图形
|
|
525
|
+
def do_all(self,):
|
|
526
|
+
|
|
527
|
+
if not self.get_aws_data():
|
|
528
|
+
return False
|
|
529
|
+
if not self.get_tlogp_data():
|
|
530
|
+
return False
|
|
531
|
+
if not self.get_fmt_data():
|
|
532
|
+
return False
|
|
533
|
+
|
|
534
|
+
# 如果拼图文件不可用,则重新制作拼图
|
|
535
|
+
if not self.bmosaic_vilid:
|
|
536
|
+
if not self.make_mosaic():
|
|
537
|
+
return False
|
|
538
|
+
else:
|
|
539
|
+
print("拼图文件已经存在,跳过拼图制作步骤。")
|
|
540
|
+
|
|
541
|
+
if not self.make_vpr():
|
|
542
|
+
return False
|
|
543
|
+
if not self.draw_pic():
|
|
544
|
+
return False
|
|
545
|
+
|
|
546
|
+
if __name__ == "__main__":
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
freeze_support()
|
|
550
|
+
|
|
551
|
+
# sitelist=['G1174','G3522']
|
|
552
|
+
# for st in sitelist:
|
|
553
|
+
# _construct_vpr = CONSTRUCT_VPR(inifilepath='construct_aws_refvpr_mainprog_%s.ini'%st)
|
|
554
|
+
# _construct_vpr.do_all()
|
|
555
|
+
|
|
556
|
+
# 根据实际情况修改配置文件路径
|
|
557
|
+
_construct_vpr = CONSTRUCT_VPR(inifilepath='/home/wjzhu/OneDrive/PythonCode/MyWork/metradar/metradar/project/make_vpr_aws/construct_aws_refvpr_mainprog.ini')
|
|
558
|
+
_construct_vpr.do_all()
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
[RUN_MODE]
|
|
2
|
+
run_mode = archive
|
|
3
|
+
|
|
4
|
+
[REAL_TIME]
|
|
5
|
+
input_path_realtime = X:/radar/Archives
|
|
6
|
+
output_path_realtime = E:/metradar_test/realtime_mosaic
|
|
7
|
+
realtime_peroids = 3
|
|
8
|
+
|
|
9
|
+
[ARCHIVE]
|
|
10
|
+
input_path_archive = /mnt/e/metradar_test/vpr/FMT
|
|
11
|
+
output_path_archive = /mnt/e/metradar_test/vpr/mosaic/20230731_daxing
|
|
12
|
+
starttime = 202307310700
|
|
13
|
+
endtime = 202307311200
|
|
14
|
+
tstep = 6
|
|
15
|
+
|
|
16
|
+
[COMMON_SETTING]
|
|
17
|
+
filename_type = Z_RADR_TDMOSAIC_$YYYYMMDDhhmmss$.nc
|
|
18
|
+
radar_mode = manul
|
|
19
|
+
radars = Z9010,Z9220,Z9311,Z9317,Z9024,Z9025,
|
|
20
|
+
center_lon = 116.347
|
|
21
|
+
center_lat = 39.458
|
|
22
|
+
mosaic_range = 50
|
|
23
|
+
hori_reso = 1.0
|
|
24
|
+
verti_reso = 0.5
|
|
25
|
+
multi_levels = 0, 3,6, 9, 12, 15, 18, 20
|
|
26
|
+
mosaic_vars = REF,ZDR
|
|
27
|
+
breplace = 1
|
|
28
|
+
bshow_debuginfo = 1
|
|
29
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
[RUN_MODE]
|
|
2
|
+
run_mode = archive
|
|
3
|
+
|
|
4
|
+
[REAL_TIME]
|
|
5
|
+
input_path_realtime = X:/radar/Archives
|
|
6
|
+
output_path_realtime = E:/metradar_test/realtime_mosaic
|
|
7
|
+
realtime_peroids = 3
|
|
8
|
+
|
|
9
|
+
[ARCHIVE]
|
|
10
|
+
input_path_archive = /mnt/e/metradar_test/vpr/FMT
|
|
11
|
+
output_path_archive = /mnt/e/metradar_test/vpr/mosaic/20230731_daxing
|
|
12
|
+
starttime = 202307310700
|
|
13
|
+
endtime = 202307311200
|
|
14
|
+
tstep = 6
|
|
15
|
+
|
|
16
|
+
[COMMON_SETTING]
|
|
17
|
+
filename_type = Z_RADR_TDMOSAIC_$YYYYMMDDhhmmss$.nc
|
|
18
|
+
radar_mode = manul
|
|
19
|
+
radars = Z9010,Z9220,Z9311,Z9317,Z9024,Z9025,
|
|
20
|
+
center_lon = 116.347
|
|
21
|
+
center_lat = 39.458
|
|
22
|
+
mosaic_range = 50
|
|
23
|
+
hori_reso = 1.0
|
|
24
|
+
verti_reso = 0.5
|
|
25
|
+
multi_levels = 0, 3,6, 9, 12, 15, 18, 20
|
|
26
|
+
mosaic_vars = REF,ZDR
|
|
27
|
+
breplace = 1
|
|
28
|
+
bshow_debuginfo = 1
|
|
29
|
+
|