From d30e8713f39da5ad13e01a4ff1446d148eff3a32 Mon Sep 17 00:00:00 2001 From: Joern Ungermann Date: Fri, 30 Sep 2022 17:22:06 +0200 Subject: [PATCH] Do not crash for consecutive points with identical coordinates. Fix #1571 --- mslib/msui/mpl_map.py | 20 ++++++++++++-------- mslib/msui/remotesensing_dockwidget.py | 10 ++++++---- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/mslib/msui/mpl_map.py b/mslib/msui/mpl_map.py index eb15a1abf..bdf7c00c5 100644 --- a/mslib/msui/mpl_map.py +++ b/mslib/msui/mpl_map.py @@ -694,14 +694,18 @@ def gcpoints2(self, lon0, lat0, lon1, lat1, del_s=100., map_coords=True): # use great circle formula for a perfect sphere. _, _, dist = self.gc.inv(lon0, lat0, lon1, lat1) npoints = int((dist + 0.5 * 1000. * del_s) / (1000. * del_s)) - lonlats = self.gc.npts(lon0, lat0, lon1, lat1, npoints) - lons = [lon0] - lats = [lat0] - for lon, lat in lonlats: - lons.append(lon) - lats.append(lat) - lons.append(lon1) - lats.append(lat1) + if npoints == 0: + lons = [lon0, lon1] + lats = [lat0, lat1] + else: + lonlats = self.gc.npts(lon0, lat0, lon1, lat1, npoints) + lons = [lon0] + lats = [lat0] + for lon, lat in lonlats: + lons.append(lon) + lats.append(lat) + lons.append(lon1) + lats.append(lat1) if map_coords: x, y = self(lons, lats) else: diff --git a/mslib/msui/remotesensing_dockwidget.py b/mslib/msui/remotesensing_dockwidget.py index 3712f114e..d44868f87 100644 --- a/mslib/msui/remotesensing_dockwidget.py +++ b/mslib/msui/remotesensing_dockwidget.py @@ -316,10 +316,12 @@ def direction_coordinates(self, gc_lines): Returns: List of tuples of longitude/latitude coordinates """ - lins = [(_line[0][mid], _line[0][mid + 1], - _line[1][mid], _line[1][mid + 1]) for _line, mid in - zip(gc_lines, [len(_line[0]) // 2 for _line in gc_lines])] - lens = [np.hypot(_line[0][0] - _line[0][-1], _line[0][0] - _line[0][-1]) * 110. for _line in gc_lines] + lins = [(_line[0][mid], _line[0][mid + 1], _line[1][mid], _line[1][mid + 1]) + for _line, mid in zip(gc_lines, [len(_line[0]) // 2 for _line in gc_lines]) + if len(_line[0]) > 2] + lens = [np.hypot(_line[0][0] - _line[0][-1], _line[0][0] - _line[0][-1]) * 110. + for _line in gc_lines + if len(_line[0]) > 2] lins = [(x0 * np.cos(np.deg2rad(np.mean([y0, y1]))), x1 * np.cos(np.deg2rad(np.mean([y0, y1]))), y0, y1) for x0, x1, y0, y1 in lins] lins = [_x for _x, _l in zip(lins, lens) if _l > 10]