Skip to content

Commit

Permalink
fix: dist len error by float round-off (#125)
Browse files Browse the repository at this point in the history
* fix:dist len error by float round-off

* add safe_range

* chore: naming

---------

Co-authored-by: CyanideCN <[email protected]>
  • Loading branch information
pysoer and CyanideCN authored Jan 17, 2025
1 parent dd1d74b commit 4ae3e22
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 7 deletions.
10 changes: 10 additions & 0 deletions cinrad/io/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,13 @@ def get_range(drange: Number_T, reso: Number_T) -> np.ndarray:
rng = np.arange(reso, drange + reso, reso)
valid_entry = int(drange // reso)
return rng[:valid_entry]

@staticmethod
def get_range_safe(start: Number_T, stop: Number_T, step: Number_T) -> np.ndarray:
r"""
Level2中切片时使用了//, 所以只能使用上面的get_range, 否则dist长度不一致;
Level3中没有切片功能, 所以使用这个函数来确保不出现浮点数溢出的长度BUG.
"""
int_start = int(start / step) + 1
int_stop = int(stop / step) + 1
return step * np.arange(int_start, int_stop)
17 changes: 10 additions & 7 deletions cinrad/io/level3.py
Original file line number Diff line number Diff line change
Expand Up @@ -568,8 +568,8 @@ def _parse_radial_fmt(self):
# az += azi[0]
# az[az > 360] -= 360
# azi = np.deg2rad(az)
self.azi = np.deg2rad(azi)
dist = np.arange(start_range // reso + 1, end_range // reso + 1, 1) * reso
azi = np.deg2rad(azi)
dist = self.get_range_safe(start_range, end_range, reso)
lon, lat = get_coordinate(
dist, azi, self.params["elevation"], self.stationlon, self.stationlat
)
Expand Down Expand Up @@ -672,11 +672,12 @@ def _parse_cappi_fmt(self):
azi0.append(start_a)
if len(azi) == 0:
raw = np.vstack(data).astype(int)
az = np.linspace(0, 360, raw.shape[0])
az += azi0[0]
az[az > 360] -= 360
azi = np.deg2rad(az)
dist = np.arange(start_range + reso, end_range + reso, reso)
# az = np.linspace(0, 360, raw.shape[0])
# az += azi0[0]
# az[az > 360] -= 360
# azi = np.deg2rad(az)
azi = np.deg2rad(azi0)
dist = self.get_range_safe(start_range, end_range, reso)
raw = np.vstack(data).astype(int)
raw = np.ma.masked_less(raw, 5)
data = (raw - offset) / scale
Expand All @@ -701,6 +702,8 @@ def _parse_cappi_fmt(self):
)
ds["longitude"] = (["azimuth", "distance"], lon)
ds["latitude"] = (["azimuth", "distance"], lat)
if len(height) == 1:
ds = ds.squeeze("height")
self._dataset = ds

def _parse_vwp_fmt(self):
Expand Down

0 comments on commit 4ae3e22

Please sign in to comment.