2626 limitations under the License.
2727"""
2828
29- import logging
3029import netCDF4 as nc
3130import numpy as np
3231from pyproj import Geod
3332from scipy .interpolate import interp1d
3433from scipy .ndimage import map_coordinates
3534
36- from mslib .utils .config import config_loader
37-
38-
3935__PR = Geod (ellps = 'WGS84' )
4036
4137
@@ -54,23 +50,6 @@ def get_distance(lat0, lon0, lat1, lon1):
5450 return __PR .inv (lon0 , lat0 , lon1 , lat1 )[- 1 ] / 1000.
5551
5652
57- def find_location (lat , lon , tolerance = 5 ):
58- """
59- Checks if a location is present at given coordinates
60- :param lat: latitude
61- :param lon: longitude
62- :param tolerance: maximum distance between location and coordinates in km
63- :return: None or lat/lon, name
64- """
65- locations = config_loader (dataset = 'locations' )
66- distances = sorted ([(get_distance (lat , lon , loc_lat , loc_lon ), loc )
67- for loc , (loc_lat , loc_lon ) in locations .items ()])
68- if len (distances ) > 0 and distances [0 ][0 ] <= tolerance :
69- return locations [distances [0 ][1 ]], distances [0 ][1 ]
70- else :
71- return None
72-
73-
7453def fix_angle (ang ):
7554 """
7655 Normalizes an angle between -180 and 180 degree.
@@ -107,127 +86,6 @@ def rotate_point(point, angle, origin=(0, 0)):
10786 return temp_point
10887
10988
110- def get_projection_params (proj ):
111- proj = proj .lower ()
112- if proj .startswith ("crs:" ):
113- projid = proj [4 :]
114- if projid == "84" :
115- proj_params = {
116- "basemap" : {"projection" : "cyl" },
117- "bbox" : "degree" }
118- else :
119- raise ValueError ("Only CRS code 84 is supported: '%s' given" , proj )
120-
121- elif proj .startswith ("auto:" ):
122- raise ValueError ("AUTO not supported" )
123-
124- projid , unitsid , lon0 , lat0 = proj [5 :].split ("," )
125- if projid == "42001" :
126- proj_params = {
127- "basemap" : {"projection" : "tmerc" , "lon_0" : lon0 , "lat_0" : lat0 },
128- "bbox" : f"meter({ lon0 } ,{ lat0 } )" }
129- elif projid == "42002" :
130- proj_params = {
131- "basemap" : {"projection" : "tmerc" , "lon_0" : lon0 , "lat_0" : lat0 },
132- "bbox" : f"meter({ lon0 } ,{ lat0 } )" }
133- elif projid == "42003" :
134- proj_params = {
135- "basemap" : {"projection" : "ortho" , "lon_0" : lon0 , "lat_0" : lat0 },
136- "bbox" : f"meter({ lon0 } ,{ lat0 } )" }
137- else :
138- raise ValueError ("unspecified AUTO code: '%s'" , proj )
139-
140- elif proj .startswith ("auto2:" ):
141- raise ValueError ("AUTO2 not supported" )
142-
143- projid , factor , lon0 , lat0 = proj [6 :].split ("," )
144- if projid == "42001" :
145- proj_params = {
146- "basemap" : {"projection" : "tmerc" , "lon_0" : lon0 , "lat_0" : lat0 },
147- "bbox" : f"meter({ lon0 } ,{ lat0 } )" }
148- elif projid == "42002" :
149- proj_params = {
150- "basemap" : {"projection" : "tmerc" , "lon_0" : lon0 , "lat_0" : lat0 },
151- "bbox" : f"meter({ lon0 } ,{ lat0 } )" }
152- elif projid == "42003" :
153- proj_params = {
154- "basemap" : {"projection" : "ortho" , "lon_0" : lon0 , "lat_0" : lat0 },
155- "bbox" : f"meter({ lon0 } ,{ lat0 } )" }
156- elif projid == "42004" :
157- proj_params = {
158- "basemap" : {"projection" : "cyl" },
159- "bbox" : f"meter({ lon0 } ,{ lat0 } )" }
160- elif projid == "42005" :
161- proj_params = {
162- "basemap" : {"projection" : "moll" , "lon_0" : lon0 , "lat_0" : lat0 },
163- "bbox" : "meter???" }
164- else :
165- raise ValueError ("unspecified AUTO2 code: '%s'" , proj )
166-
167- elif proj .startswith ("epsg:" ):
168- epsg = proj [5 :]
169- if epsg .startswith ("777" ) and len (epsg ) == 8 : # user defined MSS code. deprecated.
170- logging .warning ("Using deprecated MSS-specific EPSG code. Switch to 'MSS:stere' instead." )
171- lat_0 , lon_0 = int (epsg [3 :5 ]), int (epsg [5 :])
172- proj_params = {
173- "basemap" : {"projection" : "stere" , "lat_0" : lat_0 , "lon_0" : lon_0 },
174- "bbox" : "degree" }
175- elif epsg .startswith ("778" ) and len (epsg ) == 8 : # user defined MSS code. deprecated.
176- logging .warning ("Using deprecated MSS-specific EPSG code. Switch to 'MSS:stere' instead." )
177- lat_0 , lon_0 = int (epsg [3 :5 ]), int (epsg [5 :])
178- proj_params = {
179- "basemap" : {"projection" : "stere" , "lat_0" : - lat_0 , "lon_0" : lon_0 },
180- "bbox" : "degree" }
181- elif epsg in ("4258" , "4326" ):
182- proj_params = {"basemap" : {"epsg" : epsg }, "bbox" : "degree" }
183- elif epsg in ("3031" , "3412" ):
184- proj_params = {"basemap" : {"epsg" : epsg }, "bbox" : "meter(0,-90)" }
185- elif epsg in ("3411" , "3413" , "3575" , "3995" ):
186- proj_params = {"basemap" : {"epsg" : epsg }, "bbox" : "meter(0,90)" }
187- elif epsg in ("3395" , "3857" ):
188- proj_params = {"basemap" : {"epsg" : epsg }, "bbox" : "meter(0,0)" }
189- elif epsg in ("4839" ):
190- proj_params = {"basemap" : {"epsg" : epsg }, "bbox" : "meter(10.5,51)" }
191- elif epsg in ("31467" ):
192- proj_params = {"basemap" : {"epsg" : epsg }, "bbox" : "meter(-20.9631343,0.0037502)" }
193- elif epsg in ("31468" ):
194- proj_params = {"basemap" : {"epsg" : epsg }, "bbox" : "meter(-25.4097892,0.0037466)" }
195- else :
196- raise ValueError ("EPSG code not supported by basemap module: '%s'" , proj )
197-
198- elif proj .startswith ("mss:" ):
199- # some MSS-specific codes
200- params = proj [4 :].split ("," )
201- name = params [0 ]
202- if name == "stere" :
203- lon0 , lat0 , lat_ts = params [1 :]
204- proj_params = {
205- "basemap" : {"projection" : name , "lat_0" : lat0 , "lon_0" : lon0 , "lat_ts" : lat_ts },
206- "bbox" : "degree" }
207- elif name == "cass" :
208- lon0 , lat0 = params [1 :]
209- proj_params = {
210- "basemap" : {"projection" : name , "lon_0" : lon0 , "lat_0" : lat0 },
211- "bbox" : "degree" }
212- elif name == "lcc" :
213- lon0 , lat0 , lat1 , lat2 = params [1 :]
214- proj_params = {
215- "basemap" : {"projection" : name , "lon_0" : lon0 , "lat_0" : lat0 , "lat_1" : lat1 , "lat_2" : lat2 },
216- "bbox" : "degree" }
217- elif name == "merc" :
218- lat_ts = params [1 ]
219- proj_params = {
220- "basemap" : {"projection" : name , "lat_ts" : lat_ts },
221- "bbox" : "degree" }
222- else :
223- raise ValueError ("unknown MSS projection: '%s'" , proj )
224-
225- else :
226- raise ValueError ("unknown projection: '%s'" , proj )
227- logging .debug ("Identified CRS '%s' as '%s'" , proj , proj_params )
228- return proj_params
229-
230-
23189def interpolate_vertsec (data3D , data3D_lats , data3D_lons , lats , lons ):
23290 """
23391 Interpolate curtain[z,pos] (curtain[level,pos]) from data3D[z,y,x]
0 commit comments