metradar 0.1.0__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.
Files changed (41) hide show
  1. metradar/__init__.py +7 -0
  2. metradar/cnrad_level2.py +1326 -0
  3. metradar/comm_func.py +135 -0
  4. metradar/construct_aws_refvpr_mainprog.py +515 -0
  5. metradar/construct_aws_refvpr_mainprog_cams.py +310 -0
  6. metradar/construct_aws_refvpr_mainprog_datan3d.py +386 -0
  7. metradar/construct_aws_refvpr_mainprog_swan.py +306 -0
  8. metradar/decode_fmt_pyart.py +200 -0
  9. metradar/decode_pup_rose.py +1993 -0
  10. metradar/draw_mosaic_new.py +421 -0
  11. metradar/draw_radar_aws_jilin_new.py +206 -0
  12. metradar/draw_radar_comp_func.py +1379 -0
  13. metradar/exceptions.py +50 -0
  14. metradar/geo_transforms_pyart.py +627 -0
  15. metradar/get_cross_section_from_pyart.py +354 -0
  16. metradar/get_tlogp_from_sharppy.py +93 -0
  17. metradar/grid.py +281 -0
  18. metradar/grid_data.py +64 -0
  19. metradar/main_pydda.py +653 -0
  20. metradar/make_gif.py +24 -0
  21. metradar/make_mosaic_mp_archive.py +538 -0
  22. metradar/mosaic_merge.py +64 -0
  23. metradar/mosaic_quickdraw.py +338 -0
  24. metradar/nowcast_by_pysteps.py +219 -0
  25. metradar/oa_couhua.py +166 -0
  26. metradar/oa_dig_func.py +955 -0
  27. metradar/parse_pal.py +148 -0
  28. metradar/pgmb_io.py +169 -0
  29. metradar/prepare_for_radar_draw.py +197 -0
  30. metradar/read_new_mosaic.py +33 -0
  31. metradar/read_new_mosaic_func.py +231 -0
  32. metradar/retrieve_cmadaas.py +3126 -0
  33. metradar/retrieve_micaps_server.py +2061 -0
  34. metradar/rose_structer.py +807 -0
  35. metradar/trans_nc_pgmb.py +62 -0
  36. metradar/trans_new_mosaic_nc.py +309 -0
  37. metradar/trans_polor2grid_func.py +203 -0
  38. metradar-0.1.0.dist-info/METADATA +12 -0
  39. metradar-0.1.0.dist-info/RECORD +41 -0
  40. metradar-0.1.0.dist-info/WHEEL +5 -0
  41. metradar-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,807 @@
1
+
2
+ '''
3
+ 记录rose产品的文件结构
4
+
5
+ '''
6
+ import struct
7
+
8
+
9
+ CODE1 = 'B'
10
+ CODE2 = 'H'
11
+ INT1 = 'B'
12
+ INT2 = 'H'
13
+ INT4 = 'I'
14
+ REAL4 = 'f'
15
+ REAL8 = 'd'
16
+ SINT1 = 'b'
17
+ SINT2 = 'h'
18
+ SINT4 = 'i'
19
+
20
+ # 下面的文件头信息来源于 北京敏视达公司的双偏振天气雷达基数据格式,2016
21
+
22
+ # 表2-2
23
+ GENERIC_HEADER = (
24
+ ('magic_number', INT4),
25
+ ('major_version', INT2),
26
+ ('minor_version', INT2),
27
+ ('generic_type', INT4),
28
+ ('product_type', INT4),
29
+ ('reserved', '16s')
30
+ )
31
+
32
+ # 表2-3
33
+ SITE_CONFIG = (
34
+ ('site_code', '8s'),
35
+ ('site_name', '32s'),
36
+ ('lat', REAL4),
37
+ ('lon', REAL4),
38
+ ('ana_height', INT4),
39
+ ('grd_height', INT4),
40
+ ('freq', REAL4),
41
+ ('beamwidth_h', REAL4),
42
+ ('beamwidth_v', REAL4),
43
+ ('rda_version', INT4),
44
+ ('radar_type', INT2),
45
+ ('reserved', '54s')
46
+ )
47
+ RADAR_TYPE = {
48
+ 1: 'SA',
49
+ 2: 'SB',
50
+ 3: 'SC',
51
+ 4: 'SAD',
52
+ 5: 'SBD',
53
+ 6: 'SCD',
54
+ 33: 'CA',
55
+ 34: 'CB',
56
+ 35: 'CC',
57
+ 36: 'CCJ',
58
+ 37: 'CD',
59
+ 38: 'CAD',
60
+ 39: 'CBD',
61
+ 40: 'CCD',
62
+ 41: 'CCJD',
63
+ 42: 'CDD',
64
+ 65: 'XA',
65
+ 66: 'XAD',
66
+ 68: 'XSD'
67
+ }
68
+
69
+ '''
70
+ radar_type
71
+ 1–SA 2–SB
72
+ 3–SC 4–SAD
73
+ 5–SBD 6–SCD
74
+ 33–CA 34–CB
75
+ 35–CC 36–CCJ
76
+ 37–CD 38–CAD
77
+ 39–CBD 40–CCD
78
+ 41–CCJD 42–CDD
79
+ 65–XA 66–XAD
80
+ 68-XSD
81
+ '''
82
+ # 表2-4
83
+ TASK_CONFIG = (
84
+ ('task_name', '32s'),
85
+ ('task_disp', '128s'),
86
+ ('pol_type', INT4),
87
+ ('scan_type', INT4),
88
+ ('pulse_wid', INT4),
89
+ ('scan_stime', INT4),
90
+ ('cut_number', INT4),
91
+ ('hor_noise', REAL4),
92
+ ('ver_noise', REAL4),
93
+ ('hor_calib', REAL4),
94
+ ('ver_calib', REAL4),
95
+ ('hor_noise_t', REAL4),
96
+ ('ver_noise_t', REAL4),
97
+ ('zdr_calib', REAL4),
98
+ ('phi_calib', REAL4),
99
+ ('ldr_calib', REAL4),
100
+ ('reserved', '40s')
101
+ )
102
+
103
+ # 表2-5
104
+ SCAN_CONFIG = (
105
+ ('process_mod', INT4),
106
+ ('wave_form', INT4),
107
+ ('prf1', REAL4),
108
+ ('prf2', REAL4),
109
+ ('dias_mode', INT4),
110
+ ('azimuth', REAL4),
111
+ ('elevation', REAL4),
112
+ ('start_angle', REAL4),
113
+ ('end_angle', REAL4),
114
+ ('ang_reso', REAL4),
115
+ ('scan_speed', REAL4),
116
+ ('ref_reso', INT4),
117
+ ('vel_reso', INT4),
118
+ ('max_range1', INT4),
119
+ ('max_range2', INT4),
120
+ ('start_range', INT4),
121
+ ('sample_num1', INT4),
122
+ ('sample_num2', INT4),
123
+ ('phase_mode', INT4),
124
+ ('atmo_loss', REAL4),
125
+ ('nyquist', REAL4),
126
+ ('mom_mask', REAL8),
127
+ ('mom_size_mask', REAL8),
128
+ ('mgk_fil_mask', INT4),
129
+ ('sqi_thr', REAL4),
130
+ ('sig_thr', REAL4),
131
+ ('csr_thr', REAL4),
132
+ ('log_thr', REAL4),
133
+ ('cpa_thr', REAL4),
134
+ ('pmi_thr', REAL4),
135
+ ('dplog_thr', REAL4),
136
+ ('thr_reserved', '4s'),
137
+ ('dbt_mask', INT4),
138
+ ('dbz_mask', INT4),
139
+ ('vel_mask', INT4),
140
+ ('sw_mask', INT4),
141
+ ('dp_mask', INT4),
142
+ ('mask_reserved', '12s'),
143
+ ('scan_sync', INT4),
144
+ ('direction', INT4),
145
+ ('grd_clutter_clsify', INT2),
146
+ ('grd_clutter_filt', INT2),
147
+ ('grd_clutter_filt_ntwidth', INT2),
148
+ ('grd_clutter_filt_window', INT2),
149
+ ('reserved', '72s')
150
+ )
151
+
152
+
153
+
154
+
155
+ # 表3-1 产品头块
156
+ PRODUCT_HEADER_BLOCK = (
157
+ ('product_type', INT4),
158
+ ('product_name', '32s'),
159
+ ('product_time_ms', INT4),
160
+ ('scan_start_ms', INT4),
161
+ ('data_start_ms', INT4),
162
+ ('data_end_ms', INT4),
163
+ ('project_type', INT4),
164
+ ('data_type1', INT4),
165
+ ('data_type2', INT4),
166
+ ('reserved', '64s')
167
+ )
168
+
169
+ # 表 3-4 产品参数块
170
+ PRODUCT_DEPENDENT_PARAMETER={
171
+ 'PPI':(
172
+ ('ele',REAL4), # 仰角,度
173
+ ),
174
+ 'CR':(
175
+ ('top',INT4,), # 截断顶高,米
176
+ ('bottom',INT4,),# 截断底高,米
177
+ ),
178
+ 'VIL':(
179
+ ('top',INT4,), # 截断顶高,米
180
+ ('bottom',INT4,),# 截断底高,米
181
+ ),
182
+ 'RHI':(
183
+ ('azi',REAL4), # 方位角,度
184
+ ('top',INT4,), #顶高,米
185
+ ('bottom',INT4,), # 底高,米
186
+ ),
187
+ 'CAPPI':(
188
+ ('layers',INT4), # 层数
189
+ ('top',INT4,),# 顶高,米
190
+ ('bottom',INT4,),# 底高,米
191
+ ('cappi_fill',INT4,), # 是否填充CAPPI,0-未填充,1-填充
192
+ ),
193
+ 'MAX':(
194
+ ('top',INT4,), # 截断顶高,米
195
+ ('bottom',INT4,),# 截断底高,米
196
+ ),
197
+ 'ET':(
198
+ ('dbz_ct',REAL4,), # dBZ阈值
199
+ ),
200
+ 'VCS':(
201
+ ('start_azi',REAL4), # 起始方位角,度
202
+ ('start_range',INT4,), # 起始距离,米
203
+ ('end_azi',REAL4,), # 结束方位角,度
204
+ ('end_range',INT4,), # 结束距离,米
205
+ ('top',INT4,), # 顶高,米
206
+ ('bottom',INT4,), # 底高,米
207
+ ),
208
+ 'LRA':(
209
+ ('top',INT4,),# 顶高,米
210
+ ('bottom',INT4,),# 底高,米
211
+ ),
212
+ 'LRM':(
213
+ ('top',INT4,),# 顶高,米
214
+ ('bottom',INT4,),# 底高,米
215
+ ),
216
+ 'SRR':(
217
+ ('ele',REAL4), # 仰角,度
218
+ ('range_center',INT4,), # 中心距离,米
219
+ ('azi_center',REAL4,), # 中心方位角,度
220
+ ('side_len',INT4,), # 边长,米
221
+ ('wspd',REAL4,), # 风速,米/秒
222
+ ('wdir',REAL4,), # 风向,度
223
+ ),
224
+ 'SRM':(
225
+ ('ele',REAL4), # 仰角,度
226
+ ('wspd',REAL4,), # 风速,米/秒
227
+ ('wdir',REAL4,), # 风向,度
228
+ ),
229
+ 'SWA':(
230
+ ('ele',REAL4),# 仰角,度
231
+ ('range_center',INT4,), # 中心范围,米
232
+ ('azi_center',REAL4,), # 中心方位,度
233
+ ('side_len',INT4,), # 边长,米
234
+ ),
235
+ 'WEA':(
236
+ ('range',INT4), # 中心距离,米
237
+ ('azi',REAL4,), # 中心方位角,度
238
+ ('side_len',INT4,), # 边长,米
239
+ ('levels',INT4,), # 层数
240
+ ),
241
+ 'OHP':(
242
+ ('base_prod',INT4), # 输入产品类型 产品类型为HSR,CAPPI或QPE,见表3-2
243
+ ('cappi_height',INT4,), # CAPPI高度,米
244
+ ('cappi_fill',INT4,), #是否CAPPI填充
245
+ ('rain_gage_adjust',INT4,),# 是否雨量计修正
246
+ ),
247
+ 'THP':(
248
+ ('base_prod',INT4),# 输入产品类型
249
+ ('cappi_height',INT4,),# CAPPI高度,米
250
+ ('cappi_fill',INT4,),#是否CAPPI填充
251
+ ('rain_gage_adjust',INT4,),# 是否雨量计修正
252
+ ('hours',INT4,), # 用户请求的雨量积累的小时数
253
+ ),
254
+ 'STP':(
255
+ ('base_prod',INT4),# 输入产品类型
256
+ ('cappi_height',INT4,),# CAPPI高度,米
257
+ ('cappi_fill',INT4,),#是否CAPPI填充
258
+ ('rain_gage_adjust',INT4,),# 是否雨量计修正
259
+ ),
260
+ 'USP':(
261
+ ('base_prod',INT4),# 输入产品类型
262
+ ('cappi_height',INT4,),# CAPPI高度,米
263
+ ('cappi_fill',INT4,),#是否CAPPI填充
264
+ ('rain_gage_adjust',INT4,),# 是否雨量计修正
265
+ ('hours',INT4,),# 用户请求的雨量积累的小时数
266
+ ),
267
+ 'VAD':(
268
+ ('layers',INT4),# VAD高度的个数
269
+ # 接下来是第1~N层的高度,INT2类型
270
+ ),
271
+ 'VWP':(
272
+ ('layers',INT4), # VAD高度的个数
273
+ # 接下来是第1~N层的高度,INT2类型
274
+ ),
275
+ 'SHEAR':(
276
+ ('ele',REAL4), # 仰角,度,基于切变数据的仰角
277
+ ('radial_shear',INT4,),# 是否包含径向切变
278
+ ('azi_shear',INT4,), # 是否包含方位切变
279
+ ('ele_shear',INT4,),# 是否包含仰角切变
280
+ ),
281
+ 'SWP':(
282
+ ('max_range',INT4), # 最大范围
283
+ ),
284
+ 'STI':(
285
+ ('max_range',INT4),# 最大范围
286
+ ),
287
+ 'HI':(
288
+ ('max_range',INT4),# 最大范围
289
+ ),
290
+ 'M':(
291
+ ('max_range',INT4),# 最大范围
292
+ ),
293
+ 'TVS':(
294
+ ('max_range',INT4),# 最大范围
295
+ ),
296
+ 'SS':(
297
+ ('max_range',INT4),# 最大范围
298
+ ),
299
+ 'GAGE':(
300
+ ('max_range',INT4),# 最大范围
301
+ ),
302
+ 'HCL':(
303
+ ('ele',REAL4), # 仰角
304
+ ),
305
+ }
306
+
307
+ # 产品类型列表3-2
308
+ PRODUCT_ID_NAME_MAP = {
309
+ 1: 'PPI',
310
+ 2: 'RHI',
311
+ 3: 'CAPPI',
312
+ 4: 'MAX',
313
+ 6: 'ET',
314
+ 8: 'VCS',
315
+ 9: 'LRA',
316
+ 10: 'LRM',
317
+ 13: 'SRR',
318
+ 14: 'SRM',
319
+ 18: 'CR',
320
+ 20: 'WEA',
321
+ 23: 'VIL',
322
+ 24: 'HSR',
323
+ 25: 'OHP',
324
+ 26: 'THP',
325
+ 27: 'STP',
326
+ 28: 'USP',
327
+ 31: 'VAD',
328
+ 32: 'VWP',
329
+ 34: 'SHEAR',
330
+ 36: 'SWP',
331
+ 37: 'STI',
332
+ 38: 'HI',
333
+ 39: 'M',
334
+ 40: 'TVS',
335
+ 41: 'SS',
336
+ 48: 'GAGE',
337
+ 51: 'HCL',
338
+ 52: 'QPE',
339
+
340
+ }
341
+
342
+ # 表6-21 ss产品头
343
+ SS_HEAD_BLOCK = (
344
+ ('storm_number', INT4), # 风暴个数
345
+ )
346
+
347
+ # 表6-22 ss表结构
348
+ SS_TAB = (
349
+ ('storm_id', INT4), # 风暴个数
350
+ ('azi', REAL4), # 方位 度
351
+ ('range', INT4), # 距离 米
352
+ ('base', INT4), # 回波底 米
353
+ ('top', INT4), # 回波顶 米
354
+ ('vil', REAL4), # 垂直积分液态水含量 kg/m**2
355
+ ('mref', REAL4), # 最大反射率 dBZ
356
+ ('hmref', INT4), # 最大反射率高度 米
357
+
358
+ )
359
+
360
+ # 表6-23 风暴趋势数据
361
+ CELL_TREND = (
362
+ ('storm_id', INT4), # 风暴ID
363
+ ('his_vol_num', INT4), # 历史体扫个数,本表03~11项可能会重复
364
+ # CELL_TREND_BASE 3~11项
365
+ )
366
+ HIS_VOL = (
367
+ ('vol_time', INT4), # 体扫时间,秒
368
+ ('height', INT4), # 高度 米
369
+ ('base_h', INT4), # 回波底 米
370
+ ('top_h', INT4), # 回波顶 米
371
+ ('vil', INT4), # 垂直积分液态水含量 kg/m**2
372
+ ('mref', INT4), # 最大反射率 dBZ
373
+ ('hmref', INT4), # 最大反射率高度 米
374
+ ('ph', INT4), # 冰雹概率 %
375
+ ('psh', INT4), # 强冰雹概率 %
376
+ )
377
+
378
+ # 表6-24 SEGMENT ADAPTATION DATA
379
+ SEG_ADAPT = (
380
+ ('REFLECTH1', INT4), # 反射率因子门限
381
+ ('REFLECTH2', INT4), # 反射率因子门限
382
+ ('REFLECTH3', INT4), # 反射率因子门限
383
+ ('REFLECTH4', INT4), # 反射率因子门限
384
+ ('REFLECTH5', INT4), # 反射率因子门限
385
+ ('REFLECTH6', INT4), # 反射率因子门限
386
+ ('REFLECTH7', INT4), # 反射率因子门限
387
+ ('NREFLEVL', INT4), # 反射率因子等级数
388
+ ('NUMAVGBN', INT4), # 平均库数
389
+ ('SEGRNGMX', INT4), # 段搜索距离
390
+ ('MCOEFCTR', REAL4), # 系数因子
391
+ ('MULTFCTR', REAL4), # 倍数因子
392
+ ('MWGTFCTR', REAL4), # 权重因子
393
+
394
+ ('SEGLENTH1', REAL4), # 段长度
395
+ ('SEGLENTH2', REAL4), # 段长度
396
+ ('SEGLENTH3', REAL4), # 段长度
397
+ ('SEGLENTH4', REAL4), # 段长度
398
+ ('SEGLENTH5', REAL4), # 段长度
399
+ ('SEGLENTH6', REAL4), # 段长度
400
+ ('SEGLENTH7', REAL4), # 段长度
401
+ ('DRREFDFF', INT4), # 丢弃反射率因子差
402
+ ('NDROPBIN', INT4), # 丢弃库数
403
+ ('NUMSEGMX', INT4), # 仰角段数
404
+ ('RADSEGMX', INT4), # 径向段数
405
+
406
+ )
407
+
408
+ # 表6-25 CENTROIDS ADAPTATION DATA
409
+ CENTROIDS_ADAPT = (
410
+ ('CMPARETH1', INT4), # 风暴组1面积 平方千米
411
+ ('CMPARETH2', INT4), # 风暴组2面积
412
+ ('CMPARETH3', INT4), # 风暴组3面积
413
+ ('CMPARETH4', INT4), # 风暴组4面积
414
+ ('CMPARETH5', INT4), # 风暴组5面积
415
+ ('CMPARETH6', INT4), # 风暴组6面积
416
+ ('CMPARETH7', INT4), # 风暴组7面积
417
+ ('RADIUSTH1', INT4), # 搜索半径1 千米
418
+ ('RADIUSTH2', INT4), # 搜索半径2
419
+ ('RADIUSTH3', INT4), # 搜索半径3
420
+ ('STMVILMX', REAL4), # 风暴单体VIL最大值 千克/平方米
421
+ ('MXDETSTM', REAL4), # 最大单体个数
422
+ ('OVLAPADJ', REAL4), # 邻近重叠距离 库数
423
+
424
+ ('AZMDLTHR', REAL4), # 方位角差门限 度
425
+ ('DEPTHDEL', REAL4), # 删除深度 千米
426
+ ('HORIZDEL', REAL4), # 删除距离 千米
427
+ ('ELVMERGE', REAL4), # 合并仰角 度
428
+ ('HGTMERGE', REAL4), # 合并高度 千米
429
+ ('HRZMERGE', REAL4), # 合并距离 千米
430
+ ('NBRSEGMN', REAL4), # 最少段数
431
+ ('NUMCMPMX', INT4), # 最多组数
432
+ ('MXPOTCMP', INT4), # 最多可能组数
433
+ ('NUMSTMMX', INT4), # 最多单体数
434
+
435
+ )
436
+
437
+ # 表6-2
438
+ SIT_HEADER_BLOCK = (
439
+ ('storm_number', INT4), # 风暴个数
440
+ ('con_storm_number', INT4), # 连续风暴个数
441
+ ('component_number', INT4), # 构成个数
442
+ ('storm_speed_ave', REAL4), # 平均风暴移动速度 米/秒
443
+ ('storm_dir_ave', REAL4), # 平均风暴移动方向 度
444
+ )
445
+
446
+ # 表6-3
447
+ STORM_MOTION_BLOCK = (
448
+ ('azi', REAL4), # 风暴单体到雷达的方位:度
449
+ ('range', INT4), # 风暴到雷达的距离:米
450
+ ('mv_spd', REAL4), # 风暴的移动速度 米/秒
451
+ ('mv_dir', REAL4), # 风暴单体的移动方向 度
452
+ ('forecast_error', INT4), # 预报错误,米
453
+ ('mean_forecast_error', INT4), # 平均预报错误,米
454
+
455
+ )
456
+
457
+ # 表6-4 风暴预报或历史信息
458
+ STORM_FST_HIS_NUM = ('position_number', INT4), # 随后的位置个数N
459
+
460
+ STORM_FST_HIS_BLOCK = (
461
+ ('azi', REAL4), # 第1个风暴的方位角,度
462
+ ('range', INT4), # 第1个风暴的距离,米
463
+ ('vol_time_position', INT4),# 第1个风暴的体扫时间,秒
464
+ # 后面是N-1个风暴信息
465
+ )
466
+
467
+ # 表6-5 风暴属性
468
+ STORM_PROPERTY = (
469
+ ('id', INT4), # 风暴ID
470
+ ('type', INT4), # 风暴类型 0-连续风暴, 1–新生风暴
471
+ ('vol_num', INT4), # 体扫个数
472
+ ('azi', REAL4), # 方位,度
473
+ ('range', INT4), # 距离,米
474
+ ('height', INT4), # 高度,米
475
+ ('max_ref', REAL4), # 最大反射率,dBZ
476
+ ('max_ref_height', INT4), # 最大反射率高度,米
477
+ ('vil', REAL4), # VIL值,kg/m**2
478
+ ('num_comp', INT4), # 构成的个数
479
+ ('index_first_comp', INT4), # 第一个构成编号
480
+ ('top_height', INT4), # 风暴顶高,米
481
+ ('index_top', INT4), # 风暴顶的风暴编号
482
+ ('base_height', INT4), # 风暴底高,米
483
+ ('index_base', INT4), # 风暴底风暴编号
484
+ )
485
+
486
+ # 表6-6 风暴构成表
487
+ STORM_COMPONENT = (
488
+ ('height', INT4), # 高度,米
489
+ ('max_ref', REAL4), # 最大反射率,dBZ
490
+ ('index_next', INT4), # 下一风暴构成编号
491
+
492
+ )
493
+
494
+ # 表6-7 风暴追踪适配数据
495
+ STORM_TRACK_PARAM = (
496
+ ('def_direc', INT4), # 默认风向,度
497
+ ('def_speed', REAL4), # 默认风速,米/秒
498
+ ('max_vtime', INT4), # 最大体扫时间间隔,分钟
499
+ ('num_past_vol', INT4), # 历史体扫数
500
+ ('cor_speed', REAL4), # 相关速度,米/秒
501
+ ('min_speed', REAL4), # 最小速度,米/秒
502
+ ('error_allow', INT4), # 允许误差 KM
503
+ ('fst_step', INT4), # 预报间隔,分钟
504
+ ('fst_num', INT4), # 预报个数
505
+ ('error_step', INT4), # 误差间隔,分钟
506
+
507
+ )
508
+
509
+ # 表6-12 中尺度气旋头信息块
510
+ MESO_HEADER_BLOCK = (
511
+ ('storm_number', INT4), # 风暴个数
512
+ ('meso_number', INT4), # 中尺度气旋个数
513
+ ('feature_number', INT4), # 特征个数
514
+ )
515
+
516
+ # 表6-13 中尺度气旋表块
517
+ MESO_TABLE = (
518
+ ('feature_id', INT4), # 中气旋特征ID
519
+ ('storm_id', INT4), # 风暴ID
520
+ ('azi', REAL4), # 方位角 度
521
+ ('range', INT4), # 距离 米
522
+ ('ele', REAL4), # 仰角 度
523
+ ('ave_shear', REAL4), # 平均切变 E-3/S
524
+ ('height', INT4), # 高度 米
525
+
526
+ ('azi_diam', INT4), # 方位直径 米
527
+ ('radial_diam', INT4), # 径向直径 米
528
+ ('ave_rot_spd', REAL4), # 平均旋转速度 米/秒
529
+ ('max_rot_spd', REAL4), # 最大旋转速度 米/秒
530
+ ('top', INT4), # 顶高 米
531
+ ('base', INT4), # 底高 米
532
+ ('base_azi', REAL4), # 回波底方位 度
533
+ ('base_range', INT4), # 回波底距离 米
534
+ ('base_ele', REAL4), # 回波底仰角 度
535
+ ('max_t_shear', REAL4), # 最大切向切变 E-3/S
536
+ )
537
+
538
+ # 表6-14 中尺度气旋特征表
539
+ MESO_FEATURE_TAB = (
540
+ ('feature_id', INT4), # 中气旋特征ID
541
+ ('storm_id', INT4), # 风暴ID
542
+ ('feature_type', INT4), # 特征类型 1–气旋 2–3D相关切变 3–非相关切变
543
+
544
+ ('azi', REAL4), # 方位角 度
545
+ ('range', INT4), # 距离 米
546
+ ('ele', REAL4), # 仰角 度
547
+ ('height', INT4), # 高度 米
548
+
549
+ ('azi_diam', INT4), # 方位直径 米
550
+ ('radial_diam', INT4), # 径向直径 米
551
+ ('ave_shear', REAL4), # 平均切变 E-3/S
552
+ ('max_shear', REAL4), # 最大切变 E-3/S
553
+ ('ave_rot_spd', REAL4), # 平均旋转速度 米/秒
554
+ ('max_rot_spd', REAL4), # 最大旋转速度 米/秒
555
+ ('top', INT4), # 顶高 米
556
+ ('base', INT4), # 底高 米
557
+ ('base_azi', REAL4), # 回波底方位 度
558
+ ('base_range', INT4), # 回波底距离 米
559
+ ('base_ele', REAL4), # 回波底仰角 度
560
+
561
+ )
562
+
563
+ # 表6-15 中尺度适配数据
564
+ MESO_ADAPTATION_DATA = (
565
+ ('NPVTHR', INT4), # 特征向量个数门限
566
+ ('FHTHR', REAL4), # 特征高度 千米
567
+ ('HMTHR', REAL4), # 高角动量门限 平方千米/小时
568
+
569
+ ('LMTHR', REAL4), # 低角动量门限 平方千米/小时
570
+ ('HSTHR', REAL4), # 高切变门限 1/小时
571
+ ('LSTHR', REAL4), # 低切变门限 1/小时
572
+ ('MRTHR', REAL4), # 直径比率上限
573
+
574
+ ('FMRTHR', REAL4), # 远比率上限
575
+ ('NRTHR', REAL4), # 近比率下限
576
+ ('FNRTHR', REAL4), # 远比率下限
577
+ ('RNGTHR', REAL4), # 距离门限 千米
578
+ ('DISTHR', REAL4), # 最大径向差 千米
579
+ ('AZTHR', REAL4), # 最大方位差 度
580
+
581
+ )
582
+
583
+
584
+ # 表6-17 TVS头信息
585
+ TVS_HEADER_BLOCK = (
586
+ ('tvs_number', INT4), # 风暴个数
587
+ ('etvs_numer', INT4), # 中尺度气旋个数
588
+ )
589
+
590
+ # 表6-18 TVS表信息
591
+ TVS_TAB = (
592
+ ('storm_id', INT4), # 风暴ID
593
+ ('type', INT4), # TVS类型 1-TVS 2-ETVS
594
+ ('azi', REAL4), # 方位角 度
595
+ ('range', INT4), # 距离 米
596
+ ('ele', REAL4), # 仰角 度
597
+ ('lldv', REAL4), # 低层速度差值 米/秒
598
+ ('adv', REAL4), # 平均速度差值 米/秒
599
+ ('mxdv', REAL4), # 最大速度差值 米/秒
600
+ ('hmdv', INT4), # 最大速度差值高度 米
601
+ ('depth', INT4), # 深度 米
602
+ ('base', INT4), # 回波底高 米
603
+ ('top', INT4), # 回波顶高 米
604
+ ('max_shear', REAL4), # 最大切变 10E-3/S
605
+ ('h_max_shear', INT4), # 最大切变高度 米
606
+
607
+ )
608
+
609
+ # 表6-19 TVS适配数据
610
+ TVS_ADAPTATION_DATA = (
611
+ ('MINREFL', INT4), # 最小反射率
612
+ ('MINPVDV', REAL4), # 最小速度差
613
+ ('MAXPVRNG', REAL4), # 最大模式向量距离
614
+
615
+ ('MAXPVHT', REAL4), # 最大模式向量高度
616
+ ('MAXNUMPV', REAL4), # 最大模式向量个数
617
+ ('TH2DDV1', REAL4), # 差分速度门限1
618
+ ('TH2DDV2', REAL4), # 差分速度门限2
619
+
620
+ ('TH2DDV3', REAL4), # 差分速度门限3
621
+ ('TH2DDV4', REAL4), # 差分速度门限4
622
+ ('TH2DDV5', REAL4), # 差分速度门限5
623
+ ('TH2DDV6', REAL4), # 差分速度门限6
624
+ ('MIN1DP2D', REAL4), # 最小模式向量个数
625
+ ('MAXPVRD', REAL4), # 最大模式向量距离
626
+
627
+ ('MAXPVAD', REAL4), # 最大模式方位距离
628
+ ('MAX2DAR', REAL4), # 二维特征最大比率
629
+ ('THCR1', REAL4), # 搜索径向距离1
630
+ ('THCR2', REAL4), # 搜索径向距离2
631
+ ('THCRR', REAL4), # 径向距离门限
632
+ ('MAXNUM2D', REAL4), # 最大二维特征数
633
+
634
+ ('MIN2DP3D', REAL4), # 最小二维特征数
635
+ ('MINTVSD', REAL4), # 最小深度
636
+ ('MINLLDV', REAL4), # 最小低层速度差
637
+ ('MINMTDV', REAL4), # 最小速度差
638
+ ('MAXNUM3D', REAL4), # 最大三维特征个数
639
+ ('MAXNUMTV', REAL4), # 最大TVS个数
640
+
641
+ ('MAXNUMET', REAL4), # 最大ETVS个数
642
+ ('MINTVSBH', REAL4), # TVS最小底高
643
+ ('MINTVSBE', REAL4), # TVS最低仰角
644
+ ('MINADVHT', REAL4), # 最小速度差高度
645
+ ('MAXTSTMD', REAL4), # 最大风暴关联距离
646
+
647
+ )
648
+
649
+ # 冰雹个数
650
+ HAIL_NUMBER = (
651
+ ('hail_number', INT4), # 冰雹个数
652
+ )
653
+
654
+ # 表6-9 冰雹表信息
655
+ HAIL_TAB = (
656
+ ('hail_id', INT4), # 冰雹ID
657
+ ('azi', REAL4), # 方位角 度
658
+ ('range', INT4), # 距离 米
659
+ ('ph', INT4), # 冰雹概率
660
+ ('psh', INT4), # 极端冰雹概率
661
+ ('hsize', REAL4), # 冰雹大小 ,厘米
662
+ ('rcm_code', INT4), # RCM编码
663
+
664
+ )
665
+
666
+ # 表6-10 HAIL适配数据
667
+ HAIL_ADAPTATION_DATA = (
668
+ ('HT0MSL', INT4), # 0度层高度
669
+ ('HT20MSL', REAL4), # -20度层高度
670
+ ('HKECOF1', REAL4), # 动能系数1
671
+
672
+ ('HKECOF2', REAL4), # 动能系数2
673
+ ('HKECOF3', REAL4), # 动能系数3
674
+ ('POSHCOF', REAL4), # 强冰雹概率系数
675
+ ('POSHOFS', REAL4), # 强冰雹概率偏置量
676
+
677
+ ('HSCOF', REAL4), # 冰雹尺寸系数
678
+ ('HSEXP', REAL4), # 冰雹尺寸指数
679
+ ('LLHKEREF', REAL4), # 反射率下限
680
+ ('ULHKEREF', REAL4), # 反射率上限
681
+ ('RCMPRBL', REAL4), # RCM冰雹概率门限
682
+ ('WTCOF', REAL4), # 报警门限系数
683
+
684
+ ('MXHLRNG', REAL4), # 冰雹计算最大范围
685
+ ('POHHDTH1', REAL4), # 冰雹概率1高度差
686
+ ('POHHDTH2', REAL4), # 冰雹概率2高度差
687
+ ('POHHDTH3', REAL4), # 冰雹概率3高度差
688
+ ('POHHDTH4', REAL4), # 冰雹概率4高度差
689
+ ('POHHDTH5', REAL4), # 冰雹概率5高度差
690
+
691
+ ('POHHDTH6', REAL4), # 冰雹概率6高度差
692
+ ('POHHDTH7', REAL4), # 冰雹概率7高度差
693
+ ('POHHDTH8', REAL4), # 冰雹概率8高度差差
694
+ ('POHHDTH9', REAL4), # 冰雹概率9高度差
695
+ ('POHHDTH10', REAL4), # 冰雹概率10高度差
696
+ ('MRPOHTH', REAL4), # 最小反射率门限
697
+ ('RCMPSTV', REAL4), # RCM强冰雹概率
698
+
699
+
700
+ )
701
+
702
+ # 表2-6 数据类型掩码定义
703
+ PRODUCT_DATA_TYPE = {
704
+ 1: '滤波前反射率(Total Reflectivity)',
705
+ 2: '滤波后反射率(Reflectivity)',
706
+ 3: '径向速度(Doppler Velocity)',
707
+ 4: '谱宽(Spectrum Width)',
708
+ 5: '信号质量指数(Signal Quality Index)',
709
+ 6: '杂波相位一致性(Clutter Phase Alignment)',
710
+ 7: '差分反射率(Differential Reflectivity)',
711
+ 8: '退偏振比(Liner Differential Ratio)',
712
+ 9: '协相关系数(Cross Correlation Coefficient)',
713
+ 10:'差分相移(Differential Phase)',
714
+ 11:'差分相移率(Specific Differential Phase)',
715
+ 12:'杂波可能性(Clutter Probability)',
716
+ 13:'数据标志,保留',
717
+ 14:'双偏振相态分类(Hydro Classification)',
718
+ 15:'杂波标志(Clutter Flag)',
719
+ 16:'信噪比(Signal Noise Ratio)',
720
+ 17:'数据标志,保留',
721
+ 18:'数据标志,保留',
722
+ 19:'数据标志,保留',
723
+ 20:'数据标志,保留',
724
+ 21:'数据标志,保留',
725
+ 22:'数据标志,保留',
726
+ 23:'数据标志,保留',
727
+ 24:'数据标志,保留',
728
+ 25:'数据标志,保留',
729
+ 26:'数据标志,保留',
730
+ 27:'数据标志,保留',
731
+ 28:'数据标志,保留',
732
+ 29:'数据标志,保留',
733
+ 30:'数据标志,保留',
734
+ 31:'数据标志,保留',
735
+ 32:'订正后反射率(Corrected Reflectivity)',
736
+ 33:'订正后径向速度(Corrected Doppler Velocity)',
737
+ 34:'订正后谱宽(Corrected Spectrum Width)',
738
+ 35:'订正后差分反射率(Corrected Differential Reflectivity)',
739
+ 72:'回波顶高(Echo Top)',
740
+ 73:'垂直积分液态水含量(Vertical Integrated Liquid)',
741
+ 75:'累计降水量(Accumulated Precipitation)',
742
+ }
743
+ # 表4-2 径向头信息块
744
+ RADIAL_HEADER=(
745
+ ('data_type', INT4), # 数据类型
746
+ ('scale', INT4), # 数据压缩比
747
+ ('offset', INT4), # 数据偏移
748
+ ('bin_length', INT2), # 数据长度
749
+ ('flags', INT2), # 数据标志
750
+ ('resolution', INT4), # 数据分辨率
751
+ ('start_angle', INT4), # 起始角度
752
+ ('max_range', INT4), # 最大距离
753
+ ('radial_number', INT4), # 径向数
754
+ ('max_value', INT4), # 最大值
755
+ ('range_of_max_value', INT4), # 最大值距禈
756
+ ('azi_of_max_value', REAL4), # 最大值方位
757
+ ('min_value', INT4), # 最小值
758
+ ('range_of_min_value', INT4), # 最小值距离
759
+ ('azi_of_min_value', REAL4), # 最小值方位
760
+ ('reserved', '8s') # 保留
761
+
762
+ )
763
+
764
+ # 表4-3 径向数据块信息
765
+ RADIAL_DATA=(
766
+ ('start_azi', REAL4), # 起始方位角
767
+ ('anglular_width', REAL4), # 角宽度
768
+ ('num_bins', INT4), # 距离库个数
769
+ ('reserved', '20s'), # 保留数据
770
+ # 后续是第1~N个方位角的数据
771
+ )
772
+
773
+ # 表 4-4 柵格头信息块
774
+ GRID_HEADER=(
775
+ ('data_type', INT4), # 数据类型
776
+ ('scale', INT4), # 数据压缩比
777
+ ('offset', INT4), # 数据偏移
778
+ ('bin_length', INT2), # 数据长度
779
+ ('flags', INT2), # 数据标志
780
+ ('row_resolution', INT4), # 横轴分辨率
781
+ ('col_resolution', INT4), # 纵轴分辨率
782
+ ('row_side_len', INT4), # 横轴边长
783
+ ('col_side_len', INT4), # 纵轴边长
784
+ ('max_value', INT4), # 最大值
785
+ ('range_of_max_value', INT4), # 最大值距禿
786
+ ('azi_of_max_value', REAL4), # 最大值方位
787
+ ('min_value', INT4), # 最小值
788
+ ('range_of_min_value', INT4), # 最小值距禿
789
+ ('azi_of_min_value', REAL4), # 最小值方位
790
+ ('reserved', '8s'), # 保留
791
+ )
792
+
793
+ def _structure_size(structure):
794
+ """ Find the size of a structure in bytes. """
795
+ return struct.calcsize('<' + ''.join([i[1] for i in structure]))
796
+
797
+
798
+ def _unpack_structure(string, structure):
799
+ """ Unpack a structure from a string """
800
+ fmt = '<' + ''.join([i[1] for i in structure]) # little-endian
801
+ lst = struct.unpack(fmt, string)
802
+ return dict(zip([i[0] for i in structure], lst))
803
+
804
+ def _unpack_from_buf( buf, pos, structure):
805
+ """ Unpack a structure from a buffer. """
806
+ size = _structure_size(structure)
807
+ return _unpack_structure(buf[pos:pos + size], structure)