metradar 0.1.5__py3-none-any.whl → 0.1.8__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} +19 -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/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.dist-info/METADATA +91 -0
- metradar-0.1.8.dist-info/RECORD +67 -0
- {metradar-0.1.5.dist-info → metradar-0.1.8.dist-info}/WHEEL +1 -1
- metradar-0.1.8.dist-info/licenses/LICENSE +21 -0
- 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.5.dist-info/METADATA +0 -37
- metradar-0.1.5.dist-info/RECORD +0 -33
- /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
- {metradar-0.1.5.dist-info → metradar-0.1.8.dist-info}/top_level.txt +0 -0
metradar/grid.py
DELETED
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
import math
|
|
2
|
-
import datetime
|
|
3
|
-
import re
|
|
4
|
-
from copy import deepcopy
|
|
5
|
-
import numpy as np
|
|
6
|
-
|
|
7
|
-
class grid:
|
|
8
|
-
'''
|
|
9
|
-
定义一个格点的类grid,来存储网格的范围包括(起始经纬度、格距、起止时间,时间间隔,起止时效,时效间隔,层次列表,数据成员)
|
|
10
|
-
约定坐标顺序为: member, time,ddtime, level, lat,lon
|
|
11
|
-
'''
|
|
12
|
-
def __init__(self,glon, glat, gtime=None, dtime_list=None,level_list=None,member_list = None):
|
|
13
|
-
|
|
14
|
-
#提取成员维度信息
|
|
15
|
-
if(member_list is None):
|
|
16
|
-
self.members =['data0']
|
|
17
|
-
else:
|
|
18
|
-
self.members = member_list
|
|
19
|
-
############################################################################
|
|
20
|
-
#提取层次维度信息
|
|
21
|
-
if(level_list is None):
|
|
22
|
-
self.levels =[0]
|
|
23
|
-
else:
|
|
24
|
-
self.levels = level_list
|
|
25
|
-
############################################################################
|
|
26
|
-
#提取时间维度信息
|
|
27
|
-
self.stime = np.datetime64('2099-01-01T00:00:00.000000')
|
|
28
|
-
self.etime = np.datetime64('2099-01-01T00:00:00.000000')
|
|
29
|
-
self.dtime_int = 1
|
|
30
|
-
self.dtime_type = "h"
|
|
31
|
-
self.dtimedelta = np.timedelta64(1,'h')
|
|
32
|
-
if(gtime == None):gtime = []
|
|
33
|
-
if len(gtime) == 1:
|
|
34
|
-
if type(gtime[0]) == str:
|
|
35
|
-
num = ''.join([x for x in gtime[0] if x.isdigit()])
|
|
36
|
-
# 用户输入2019041910十位字符,后面补全加0000,为14位统一处理
|
|
37
|
-
if len(num) == 4:
|
|
38
|
-
num += "0101000000"
|
|
39
|
-
elif len(num) == 6:
|
|
40
|
-
num +="01000000"
|
|
41
|
-
elif len(num) == 8:
|
|
42
|
-
num +="000000"
|
|
43
|
-
elif len(num) == 10:
|
|
44
|
-
num +="0000"
|
|
45
|
-
elif len(num) == 12:
|
|
46
|
-
num +="00"
|
|
47
|
-
elif len(num) == 14:
|
|
48
|
-
pass
|
|
49
|
-
else:
|
|
50
|
-
print("输入日期有误,请检查!")
|
|
51
|
-
# 统一将日期变为datetime类型
|
|
52
|
-
self.stime = datetime.datetime.strptime(num, '%Y%m%d%H%M%S')
|
|
53
|
-
self.etime = datetime.datetime.strptime(num, '%Y%m%d%H%M%S')
|
|
54
|
-
self.stime = np.datetime64(self.stime)
|
|
55
|
-
self.etime = np.datetime64(self.etime)
|
|
56
|
-
else:
|
|
57
|
-
self.stime = gtime[0]
|
|
58
|
-
self.etime = gtime[0]
|
|
59
|
-
self.dtime_int = 1
|
|
60
|
-
self.dtime_type = "h"
|
|
61
|
-
self.dtimedelta = np.timedelta64(0,'h')
|
|
62
|
-
elif len(gtime) ==3:
|
|
63
|
-
num1 =[]
|
|
64
|
-
if type(gtime[0]) == str:
|
|
65
|
-
for i in range (0,2):
|
|
66
|
-
num = ''.join([x for x in gtime[i] if x.isdigit()])
|
|
67
|
-
#用户输入2019041910十位字符,后面补全加0000,为14位统一处理
|
|
68
|
-
if len(num) == 4:
|
|
69
|
-
num1.append(num + "0101000000")
|
|
70
|
-
elif len(num) == 6:
|
|
71
|
-
num1.append(num + "01000000")
|
|
72
|
-
elif len(num) == 8:
|
|
73
|
-
num1.append(num + "000000")
|
|
74
|
-
elif len(num) == 10:
|
|
75
|
-
num1.append(num + "0000")
|
|
76
|
-
elif len(num) == 12:
|
|
77
|
-
num1.append(num + "00")
|
|
78
|
-
elif len(num) == 14:
|
|
79
|
-
num1.append(num)
|
|
80
|
-
else:
|
|
81
|
-
print("输入日期有误,请检查!")
|
|
82
|
-
#统一将日期变为datetime类型
|
|
83
|
-
#print(num1)
|
|
84
|
-
self.stime = datetime.datetime.strptime(num1[0], '%Y%m%d%H%M%S')
|
|
85
|
-
self.etime = datetime.datetime.strptime(num1[1], '%Y%m%d%H%M%S')
|
|
86
|
-
self.stime = np.datetime64(self.stime)
|
|
87
|
-
self.etime = np.datetime64(self.etime)
|
|
88
|
-
elif isinstance(gtime[0],np.datetime64):
|
|
89
|
-
stime = gtime[0].astype(datetime.datetime)
|
|
90
|
-
etime = gtime[1].astype(datetime.datetime)
|
|
91
|
-
if isinstance(stime, int):
|
|
92
|
-
stime = datetime.datetime.utcfromtimestamp(stime / 1000000000)
|
|
93
|
-
etime = datetime.datetime.utcfromtimestamp(etime / 1000000000)
|
|
94
|
-
self.stime = stime
|
|
95
|
-
self.etime = etime
|
|
96
|
-
else:
|
|
97
|
-
self.stime = gtime[0]
|
|
98
|
-
self.etime = gtime[1]
|
|
99
|
-
|
|
100
|
-
if type(gtime[2]) == str:
|
|
101
|
-
self.dtime_int = re.findall(r"\d+", gtime[2])[0]
|
|
102
|
-
dtime_type = re.findall(r"\D+", gtime[2])[0]
|
|
103
|
-
if dtime_type == 'h':
|
|
104
|
-
self.dtime_type ="h"
|
|
105
|
-
self.dtimedelta = np.timedelta64(self.dtime_int,'h')
|
|
106
|
-
elif dtime_type == 'd':
|
|
107
|
-
self.dtime_type ="D"
|
|
108
|
-
self.dtimedelta = np.timedelta64(self.dtime_int, 'D')
|
|
109
|
-
elif dtime_type == 'm':
|
|
110
|
-
self.dtime_type ="m"
|
|
111
|
-
self.dtimedelta = np.timedelta64(self.dtime_int, 'm')
|
|
112
|
-
elif isinstance(gtime[2],np.timedelta64):
|
|
113
|
-
seconds = int(gtime[2] / np.timedelta64(1, 's'))
|
|
114
|
-
if seconds % 3600 == 0:
|
|
115
|
-
self.dtime_type = "h"
|
|
116
|
-
self.dtime_int = int(seconds / 3600)
|
|
117
|
-
else:
|
|
118
|
-
self.dtime_type = "m"
|
|
119
|
-
self.dtime_int = int(seconds / 60)
|
|
120
|
-
else:
|
|
121
|
-
self.dtimedelta = gtime[2]
|
|
122
|
-
seconds = gtime[2].total_seconds()
|
|
123
|
-
if seconds % 3600 == 0:
|
|
124
|
-
self.dtime_type = "h"
|
|
125
|
-
self.dtime_int = int(seconds/3600)
|
|
126
|
-
else:
|
|
127
|
-
self.dtime_type = "m"
|
|
128
|
-
self.dtime_int = int(seconds / 60)
|
|
129
|
-
self.gtime = [self.stime,self.etime,str(self.dtime_int) + self.dtime_type]
|
|
130
|
-
self.stime_str = str(self.stime).replace("-","").replace(" ","").replace(":","").replace("T","")[0:14]
|
|
131
|
-
self.etime_str = str(self.etime).replace("-", "").replace(" ", "").replace(":", "").replace("T", "")[0:14]
|
|
132
|
-
self.dtime_str = str(self.dtime_int) + self.dtime_type
|
|
133
|
-
|
|
134
|
-
############################################################################
|
|
135
|
-
#提取预报时效维度信息
|
|
136
|
-
if dtime_list is None:
|
|
137
|
-
self.dtimes = [0]
|
|
138
|
-
else:
|
|
139
|
-
self.dtimes = dtime_list
|
|
140
|
-
############################################################################
|
|
141
|
-
#提取经度信息
|
|
142
|
-
|
|
143
|
-
self.slon = get_true_value(glon[0])
|
|
144
|
-
self.elon = get_true_value(glon[1])
|
|
145
|
-
self.dlon = get_true_value(glon[2])
|
|
146
|
-
nlon = 1 + (self.elon - self.slon) / self.dlon
|
|
147
|
-
error = abs(round(nlon) - nlon)/nlon
|
|
148
|
-
if (error > 0.01):
|
|
149
|
-
self.nlon = int(math.ceil(nlon))
|
|
150
|
-
else:
|
|
151
|
-
self.nlon = int(round(nlon))
|
|
152
|
-
|
|
153
|
-
self.elon = get_true_value(self.slon + (nlon - 1) * self.dlon)
|
|
154
|
-
self.glon = [self.slon,self.elon,self.dlon]
|
|
155
|
-
|
|
156
|
-
############################################################################
|
|
157
|
-
#提取纬度信息
|
|
158
|
-
self.slat = get_true_value(glat[0])
|
|
159
|
-
self.elat = get_true_value(glat[1])
|
|
160
|
-
self.dlat = get_true_value(glat[2])
|
|
161
|
-
nlat = 1 + (self.elat - self.slat) / self.dlat
|
|
162
|
-
error = abs(round(nlat) - nlat)/nlat
|
|
163
|
-
if (error > 0.01):
|
|
164
|
-
self.nlat = int(math.ceil(nlat))
|
|
165
|
-
else:
|
|
166
|
-
self.nlat = int(round(nlat))
|
|
167
|
-
self.elat = get_true_value(self.slat + (nlat - 1) * self.dlat)
|
|
168
|
-
self.glat = [self.slat,self.elat,self.dlat]
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
#对原有的格点数据进行一次深拷贝,不改变原有的值和结构。
|
|
173
|
-
def copy(self):
|
|
174
|
-
return deepcopy(self)
|
|
175
|
-
|
|
176
|
-
#reset的作用是把网格的坐标间隔统一为正数。
|
|
177
|
-
def reset(self):
|
|
178
|
-
if (self.dlon > 0 and self.dlat > 0):
|
|
179
|
-
pass
|
|
180
|
-
if (self.dlat < 0):
|
|
181
|
-
tran = self.slat
|
|
182
|
-
self.slat = self.elat
|
|
183
|
-
self.elat = tran
|
|
184
|
-
self.dlat = abs(self.dlat)
|
|
185
|
-
if (self.dlon < 0):
|
|
186
|
-
tran = self.slon
|
|
187
|
-
self.slon = self.elon
|
|
188
|
-
self.elon = tran
|
|
189
|
-
self.dlon = abs(self.dlon)
|
|
190
|
-
return
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
def __str__(self):
|
|
194
|
-
'''
|
|
195
|
-
重置系统自动的函数,在print(grid) 的时候可以很整齐的看到所有信息
|
|
196
|
-
:return: string
|
|
197
|
-
'''
|
|
198
|
-
grid_str = ""
|
|
199
|
-
grid_str += "members:" + str(self.members) +"\n"
|
|
200
|
-
grid_str += "levels:" + str(self.levels) + "\n"
|
|
201
|
-
grid_str += "gtime:" + str([self.stime_str,self.etime_str,self.dtime_str]) + "\n"
|
|
202
|
-
grid_str += "dtimes:" + str(self.dtimes) +"\n"
|
|
203
|
-
grid_str += "glon:" + str(self.glon) + "\n"
|
|
204
|
-
grid_str += "glat:" + str(self.glat) + "\n"
|
|
205
|
-
return grid_str
|
|
206
|
-
|
|
207
|
-
def get_true_value(value):
|
|
208
|
-
dlon2 = round(value, 2)
|
|
209
|
-
dlon3 = round(value, 3)
|
|
210
|
-
dlon4 = round(value, 4)
|
|
211
|
-
dlon5 = round(value, 5)
|
|
212
|
-
if dlon2 == dlon3 and dlon3 == dlon4:
|
|
213
|
-
return dlon3
|
|
214
|
-
elif dlon3 == dlon4 and dlon5 == dlon4:
|
|
215
|
-
return dlon3
|
|
216
|
-
else:
|
|
217
|
-
return value
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
def get_grid_of_data(grid_data0):
|
|
221
|
-
'''
|
|
222
|
-
获取grid的数据values值
|
|
223
|
-
:param grid_data0:初始化之后的网格数据
|
|
224
|
-
:return:返回grid数据。
|
|
225
|
-
'''
|
|
226
|
-
member_list = grid_data0['member'].values
|
|
227
|
-
level_list = grid_data0['level'].values
|
|
228
|
-
times = grid_data0['time'].values
|
|
229
|
-
#print(times)
|
|
230
|
-
if(len(times)>1):
|
|
231
|
-
gtime = [times[0],times[-1],times[1]-times[0]]
|
|
232
|
-
elif len(times) == 1:
|
|
233
|
-
gtime = times
|
|
234
|
-
else:
|
|
235
|
-
gtime = None
|
|
236
|
-
|
|
237
|
-
gdt = grid_data0['dtime'].values.tolist()
|
|
238
|
-
attrs_name = list(grid_data0.attrs)
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
lons = grid_data0['lon'].values
|
|
242
|
-
|
|
243
|
-
#dlon5 = round(lons[1] - lons[0], 5)
|
|
244
|
-
#dlon6 = round(lons[1] - lons[0], 6)
|
|
245
|
-
#dlon7 = round(lons[1] - lons[0], 7)
|
|
246
|
-
#if dlon5 == dlon6 and dlon6 == dlon7:
|
|
247
|
-
# dlon = dlon5
|
|
248
|
-
#else:
|
|
249
|
-
# dlon = lons[1]-lons[0]
|
|
250
|
-
dlon = get_true_value(lons[1] - lons[0])
|
|
251
|
-
|
|
252
|
-
#glon = [lons[0],round(lons[-1],5),round(lons[1]-lons[0],5)]
|
|
253
|
-
glon = [get_true_value(lons[0]), get_true_value(lons[-1]), dlon]
|
|
254
|
-
lats = grid_data0['lat'].values
|
|
255
|
-
#dlat5 = round(lats[1] - lats[0], 5)
|
|
256
|
-
#dlat6 = round(lats[1] - lats[0], 6)
|
|
257
|
-
#dlat7 = round(lats[1] - lats[0], 7)
|
|
258
|
-
#if dlat5 == dlat6 and dlat6 == dlat7:
|
|
259
|
-
# dlat = dlat5
|
|
260
|
-
#else:
|
|
261
|
-
# dlat = lats[1]-lats[0]
|
|
262
|
-
dlat = get_true_value(lats[1] - lats[0])
|
|
263
|
-
|
|
264
|
-
#glat = [lats[0],round(lats[-1],5),round(lats[1]-lats[0],5)]
|
|
265
|
-
glat = [get_true_value(lats[0]), get_true_value(lats[-1]), dlat]
|
|
266
|
-
grid01 = grid(glon, glat, gtime, gdt, level_list, member_list)
|
|
267
|
-
return grid01
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
def reset_grid(grid0):
|
|
271
|
-
if grid0.dlat <0:
|
|
272
|
-
grid0.dlat = - grid0.dlat
|
|
273
|
-
tran = grid0.slat
|
|
274
|
-
grid0.slat = grid0.elat
|
|
275
|
-
grid0.elat = tran
|
|
276
|
-
if grid0.dlon <0:
|
|
277
|
-
grid0.dlon = - grid0.dlon
|
|
278
|
-
tran = grid0.slon
|
|
279
|
-
grid0.slon = grid0.elon
|
|
280
|
-
grid0.elon = tran
|
|
281
|
-
return
|
metradar/grid_data.py
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/python3.6
|
|
2
|
-
# -*- coding:UTF-8 -*-
|
|
3
|
-
import xarray as xr
|
|
4
|
-
import numpy as np
|
|
5
|
-
import pandas as pd
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
#返回一个DataArray,其维度信息和grid描述一致,数组里面的值为0.
|
|
9
|
-
def grid_data(grid,data=None):
|
|
10
|
-
slon = grid.slon
|
|
11
|
-
dlon = grid.dlon
|
|
12
|
-
slat = grid.slat
|
|
13
|
-
dlat = grid.dlat
|
|
14
|
-
nlon = grid.nlon
|
|
15
|
-
nlat = grid.nlat
|
|
16
|
-
# 通过起始经纬度和格距计算经纬度格点数
|
|
17
|
-
lon = np.arange(nlon) * dlon + slon
|
|
18
|
-
lat = np.arange(nlat) * dlat + slat
|
|
19
|
-
dt_str = grid.gtime[2]
|
|
20
|
-
if dt_str.find("m")>=0:
|
|
21
|
-
dt_str = dt_str.replace("m","min")
|
|
22
|
-
|
|
23
|
-
times = pd.date_range(grid.stime, grid.etime, freq=dt_str)
|
|
24
|
-
#print(times)
|
|
25
|
-
ntime = len(times)
|
|
26
|
-
# 根据timedelta的格式,算出ndt次数和gds时效列表
|
|
27
|
-
|
|
28
|
-
ndt = len(grid.dtimes)
|
|
29
|
-
gdt_list = grid.dtimes
|
|
30
|
-
|
|
31
|
-
level_list = grid.levels
|
|
32
|
-
nlevel_list = len(level_list)
|
|
33
|
-
|
|
34
|
-
member_list = grid.members
|
|
35
|
-
nmember = len(member_list)
|
|
36
|
-
if data is None:
|
|
37
|
-
data = np.zeros((nmember, nlevel_list, ntime, ndt, nlat, nlon))
|
|
38
|
-
else:
|
|
39
|
-
data = data.reshape(nmember, nlevel_list, ntime, ndt, nlat, nlon)
|
|
40
|
-
|
|
41
|
-
grd = (xr.DataArray(data, coords={'member': member_list,'level': level_list,'time': times,'dtime':gdt_list,
|
|
42
|
-
'lat': lat, 'lon': lon},
|
|
43
|
-
dims=['member', 'level','time', 'dtime','lat', 'lon']))
|
|
44
|
-
|
|
45
|
-
grd.name = "data0"
|
|
46
|
-
return grd
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def reset(grd):
|
|
50
|
-
lats = grd["lat"].values
|
|
51
|
-
if lats[0]>lats[1]:
|
|
52
|
-
lats = grd["lat"].values[::-1]
|
|
53
|
-
grd['lat'] = lats
|
|
54
|
-
dat = grd.values[:, :, :, :, ::-1, :]
|
|
55
|
-
grd.values = dat
|
|
56
|
-
|
|
57
|
-
lons = grd["lon"].values
|
|
58
|
-
if lons[0]>lons[1]:
|
|
59
|
-
lons = grd["lon"].values[::-1]
|
|
60
|
-
grd['lon'] = lons
|
|
61
|
-
dat = grd.values[:, :, :, :, :, ::-1]
|
|
62
|
-
grd.values = dat
|
|
63
|
-
|
|
64
|
-
return
|
metradar/oa_couhua.py
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
'''
|
|
2
|
-
封装凑华的客观分析程序
|
|
3
|
-
2023年4月6日
|
|
4
|
-
朱文剑
|
|
5
|
-
|
|
6
|
-
'''
|
|
7
|
-
|
|
8
|
-
# %%
|
|
9
|
-
import numpy as np
|
|
10
|
-
import math
|
|
11
|
-
import time
|
|
12
|
-
from grid import *
|
|
13
|
-
from grid_data import *
|
|
14
|
-
|
|
15
|
-
# %%迭代函数
|
|
16
|
-
def frprmn2(x,targe,grads,tol = 0.001,caculate_time = 60,show = False):
|
|
17
|
-
x0 = x
|
|
18
|
-
n = len(x0)
|
|
19
|
-
x_min = math.sqrt(1.0/n)
|
|
20
|
-
df = grads(x0)
|
|
21
|
-
g_0 = -df
|
|
22
|
-
h_0 = g_0
|
|
23
|
-
f_min_line0 = 0
|
|
24
|
-
f_min_line1 = targe(x0)
|
|
25
|
-
start_time = time.time()
|
|
26
|
-
for i in range(10000):
|
|
27
|
-
d0 = np.dot(df,h_0)
|
|
28
|
-
x1 = x0 + h_0 * x_min
|
|
29
|
-
df = grads(x1)
|
|
30
|
-
d1 = np.dot(df,h_0)
|
|
31
|
-
if d0 == d1:
|
|
32
|
-
f_min_line1 = targe(x0)
|
|
33
|
-
return x0
|
|
34
|
-
else:
|
|
35
|
-
x_min = x_min * d0/(d0 - d1)
|
|
36
|
-
x0 += h_0 * x_min
|
|
37
|
-
df = grads(x0)
|
|
38
|
-
g_1 = -df
|
|
39
|
-
v1 = np.dot(g_1 - g_0, g_1)
|
|
40
|
-
v2 = np.dot(g_0,g_0)
|
|
41
|
-
h_0 = g_1 + (v1/v2) * h_0
|
|
42
|
-
g_0 = g_1
|
|
43
|
-
if i%10 == 0:
|
|
44
|
-
f_min_line0 = f_min_line1
|
|
45
|
-
f_min_line1 = targe(x0)
|
|
46
|
-
if show:print(str(i) + " " + str(f_min_line1))
|
|
47
|
-
delta = 2 * abs(f_min_line1 - f_min_line0) / (abs(f_min_line1) + abs(f_min_line0)) - tol
|
|
48
|
-
if delta < 0:
|
|
49
|
-
return x0
|
|
50
|
-
if(time.time() - start_time > caculate_time):
|
|
51
|
-
return x0
|
|
52
|
-
print('迭代分析超过10000次而退出')
|
|
53
|
-
return x0
|
|
54
|
-
|
|
55
|
-
# 客观分析算法的代码
|
|
56
|
-
# def interp_sg_oa(sta0,background,sm = 1,effectR = 1000,rate_of_model = 0,show = False):
|
|
57
|
-
def interp_sg_oa(x,y,z,reso,boundary=None,sm = 1,effectR = 1000,rate_of_model = 0,show = False):
|
|
58
|
-
|
|
59
|
-
if boundary is None:
|
|
60
|
-
wlon = int(np.min(x))
|
|
61
|
-
elon = int(np.max(x))+1
|
|
62
|
-
slat = int(np.min(y))
|
|
63
|
-
nlat = int(np.max(y))+1
|
|
64
|
-
else:
|
|
65
|
-
wlon = boundary[0]
|
|
66
|
-
elon = boundary[1]
|
|
67
|
-
slat = boundary[2]
|
|
68
|
-
nlat = boundary[3]
|
|
69
|
-
|
|
70
|
-
grid0 = grid([wlon,elon,reso],[slat,nlat,reso])
|
|
71
|
-
background = grid_data(grid0)
|
|
72
|
-
grd = background.copy()
|
|
73
|
-
ig = ((x - grid0.slon) // grid0.dlon).astype(dtype = 'int16')
|
|
74
|
-
jg = ((y - grid0.slat) // grid0.dlat).astype(dtype = 'int16')
|
|
75
|
-
dx = (x - grid0.slon) / grid0.dlon - ig
|
|
76
|
-
dy = (y - grid0.slat) / grid0.dlat - jg
|
|
77
|
-
|
|
78
|
-
# zhuwj add
|
|
79
|
-
flag1 = ig+1 <= grid0.nlon-1
|
|
80
|
-
flag2 = jg+1 <= grid0.nlat-1
|
|
81
|
-
flag = flag1 & flag2
|
|
82
|
-
ig = ig[flag]
|
|
83
|
-
jg = jg[flag]
|
|
84
|
-
dx = dx[flag]
|
|
85
|
-
dy = dy[flag]
|
|
86
|
-
z = z[flag]
|
|
87
|
-
|
|
88
|
-
c00 = (1 - dx) * (1 - dy)
|
|
89
|
-
c01 = dx * (1 - dy)
|
|
90
|
-
c10 = (1-dx) * dy
|
|
91
|
-
c11 = dx * dy
|
|
92
|
-
lat = grd["lat"].values
|
|
93
|
-
sr = 1/np.power(np.cos(lat*math.pi/180),4)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
def targe(x):
|
|
98
|
-
grdv = x.reshape(grid0.nlat,grid0.nlon)
|
|
99
|
-
dx = grdv[:,:-2] + grdv[:,2:] - 2 * grdv[:,1:-1]
|
|
100
|
-
dx2 = dx**2
|
|
101
|
-
sum_dx =np.sum(dx2,axis=1)
|
|
102
|
-
cost1 = np.sum(sum_dx * sr)
|
|
103
|
-
|
|
104
|
-
dy = grdv[:-2,:] + grdv[2:,:] - 2 * grdv[1:-1,:]
|
|
105
|
-
dy2 = dy**2
|
|
106
|
-
sum_dy = np.sum(dy2)
|
|
107
|
-
cost1 = cost1 + sum_dy
|
|
108
|
-
|
|
109
|
-
sta_g = c00 * grdv[jg, ig] + c01 * grdv[jg, ig + 1] + c10 * grdv[jg + 1, ig] + c11 * grdv[
|
|
110
|
-
jg + 1, ig + 1]
|
|
111
|
-
error = z - sta_g
|
|
112
|
-
cost2 = np.sum(error**2)
|
|
113
|
-
cost3 = 0
|
|
114
|
-
cost = sm * cost1 + cost2 + cost3
|
|
115
|
-
return cost
|
|
116
|
-
|
|
117
|
-
def grads(x):
|
|
118
|
-
grdv = x.reshape(grid0.nlat,grid0.nlon)
|
|
119
|
-
g1 = np.zeros(grdv.shape)
|
|
120
|
-
|
|
121
|
-
sr_expend = np.tile(sr,[grid0.nlon-2,1]).T
|
|
122
|
-
|
|
123
|
-
dx = 2 * (grdv[:,:-2] + grdv[:,2:] - 2 * grdv[:,1:-1])
|
|
124
|
-
dx_sr = dx * sr_expend
|
|
125
|
-
g1[:,:-2] = dx_sr
|
|
126
|
-
g1[:,2:] += dx_sr
|
|
127
|
-
g1[:,1:-1] -= 2*dx_sr
|
|
128
|
-
|
|
129
|
-
dy = 2 *(grdv[:-2,:] + grdv[2:,:] - 2 * grdv[1:-1,:])
|
|
130
|
-
g1[:-2,:] += dy
|
|
131
|
-
g1[2:,:] += dy
|
|
132
|
-
g1[1:-1,:] -= 2 * dy
|
|
133
|
-
|
|
134
|
-
g2 = np.zeros(grdv.shape)
|
|
135
|
-
sta_g = c00 * grdv[jg, ig] + c01 * grdv[jg, ig + 1] + c10 * grdv[jg + 1, ig] + c11 * grdv[jg + 1, ig + 1]
|
|
136
|
-
d = 2 * (sta_g - z)
|
|
137
|
-
g2[jg,ig] += d * c00
|
|
138
|
-
g2[jg,ig + 1] += d * c01
|
|
139
|
-
g2[jg+1,ig] += d * c10
|
|
140
|
-
g2[jg+1,ig+1] += d * c11
|
|
141
|
-
|
|
142
|
-
g3 = 0
|
|
143
|
-
|
|
144
|
-
g = sm * g1 + g2 + g3
|
|
145
|
-
return g.reshape(-1)
|
|
146
|
-
|
|
147
|
-
x = grd.values.reshape(-1)
|
|
148
|
-
x_oa = frprmn2(x, targe, grads,show = show)
|
|
149
|
-
result = grid_data(grid0,x_oa)
|
|
150
|
-
|
|
151
|
-
grid_x = np.linspace(wlon, elon, grid0.nlon)
|
|
152
|
-
grid_y = np.linspace(slat, nlat, grid0.nlat)
|
|
153
|
-
|
|
154
|
-
gx, gy = np.meshgrid(grid_x, grid_y)
|
|
155
|
-
|
|
156
|
-
return gx, gy,result.data[0,0,0,0,:,:]
|
|
157
|
-
|
|
158
|
-
# return result
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
# %%
|
|
162
|
-
|
|
163
|
-
if __name__ == "__main__":
|
|
164
|
-
#读取观测数据
|
|
165
|
-
pass
|
|
166
|
-
|
metradar/read_new_mosaic.py
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
'''
|
|
2
|
-
读取新的雷达拼图数据
|
|
3
|
-
|
|
4
|
-
'''
|
|
5
|
-
from read_new_mosaic_func import decode_mosaic
|
|
6
|
-
from draw_mosaic_new import draw_mosaic
|
|
7
|
-
|
|
8
|
-
if __name__ == '__main__':
|
|
9
|
-
# filepath = '/Users/wenjianzhu/Downloads/CMADAAS/rdmosaic_bin/202208/'1
|
|
10
|
-
# filepath = '/Users/wenjianzhu/Library/CloudStorage/OneDrive-个人/推广应用/GR2/四川/测试数据/雷达拼图'
|
|
11
|
-
filepath = 'testdata/national_mosaic'
|
|
12
|
-
# filename = 'Z_RADA_C_BABJ_20220826001200_P_DOR_ACHN_QREF_20220826_001821.bin'
|
|
13
|
-
filename = 'ACHN_CREF_20210918_155000.BIN'
|
|
14
|
-
outpath = 'pic'
|
|
15
|
-
outname = filename + '.png'
|
|
16
|
-
data = decode_mosaic(filepath,filename)
|
|
17
|
-
|
|
18
|
-
pass
|
|
19
|
-
slat = 15.0
|
|
20
|
-
nlat = 56
|
|
21
|
-
wlon = 70.
|
|
22
|
-
elon = 140.
|
|
23
|
-
# newdata = data.CREF.sel(lat=slice(slat,nlat),lon=slice(wlon,elon))
|
|
24
|
-
# tstr = filename.split('_')[4]
|
|
25
|
-
# draw_mosaic(newdata.data,newdata.lat.data,newdata.lon.data,slat,nlat,wlon,elon,outpath,outname,tstr,thred=15,dpi=800)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
newdata = data.CREF.sel(lat=slice(slat,nlat),lon=slice(wlon,elon))
|
|
29
|
-
tstr = filename.split('_')[2]+'_'+filename.split('_')[3]
|
|
30
|
-
draw_mosaic(newdata.data,newdata.lat.data,newdata.lon.data,slat,nlat,wlon,elon,outpath,outname,tstr,add_title=1,
|
|
31
|
-
prefix_title='雷达组合反射率拼图',units='dBZ',thred=0,dpi=800)
|
|
32
|
-
|
|
33
|
-
# %%
|