Skip to content

Commit

Permalink
gnss: handle longitude <=-180 or >=360 (#1290)
Browse files Browse the repository at this point in the history
+ `utils.utils0.py`: add `standardize_longitude()` to handle the longitude data range
   - ensure longitude is within (-180, 360)
   - could specify the data range format, in either [0, 360) or (-180, 180] via `lon_range` arg

+ `objects.gnss.py`: call `ut.standardize_longitude()` in all the child class of GNSS

This error occurs for the GNSS_UNR sites in Japan, where the longitude of G073 can be -229. In the old code, this results in a NaN value for inc/az_angle extraction from the geometry file.
  • Loading branch information
yunjunz authored Nov 11, 2024
1 parent 718027c commit c7e77cc
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 4 deletions.
19 changes: 15 additions & 4 deletions src/mintpy/objects/gnss.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ def search_gnss(SNWE, start_date=None, end_date=None, source='UNR', site_list_fi

# ensure that site data formatting is consistent
sites['site'] = np.array([site.upper() for site in sites['site']])
sites['lon'][sites['lon'] > 180] -= 360 # ensure lon values in (-180, 180]
# ensure longitude values in (-180, 180]
sites['lon'] = ut.standardize_longitude(sites['lon'], limit='-180to180')
vprint(f'load {len(sites["site"]):d} GNSS sites with fields: {" ".join(sites.keys())}')

# limit in space
Expand Down Expand Up @@ -867,6 +868,9 @@ def get_site_lat_lon(self, print_msg=False) -> (float, float):

data = np.loadtxt(self.file, dtype=bytes, skiprows=1, max_rows=10)
self.site_lat, self.site_lon = data[0, 20:22].astype(float)
# ensure longitude in the range of (-180, 180]
self.site_lon = ut.standardize_longitude(self.site_lon, limit='-180to180')

return self.site_lat, self.site_lon


Expand Down Expand Up @@ -987,8 +991,9 @@ def get_site_lat_lon(self, print_msg=False) -> (float, float):
# longitude
lon_line = [x for x in lines if x.startswith('# East Longitude')][0].strip('\n')
self.site_lon = float(lon_line.split()[-1])
# ensure longitude in the range of (-180, 180]
self.site_lon -= 0 if self.site_lon <= 180 else 360

# ensure longitude in the range of (-180, 180]
self.site_lon = ut.standardize_longitude(self.site_lon, limit='-180to180')

return self.site_lat, self.site_lon

Expand Down Expand Up @@ -1094,6 +1099,8 @@ def get_site_lat_lon(self, print_msg=False) -> (float, float):
# format
self.site_lat = float(site_lat)
self.site_lon = float(site_lon)
# ensure longitude in the range of (-180, 180]
self.site_lon = ut.standardize_longitude(self.site_lon, limit='-180to180')

if print_msg == True:
print(f'\t{self.site_lat:f}, {self.site_lon:f}')
Expand Down Expand Up @@ -1185,7 +1192,11 @@ def get_site_lat_lon(self, print_msg=False) -> (str, str):
"""
sites = read_GENERIC_site_list('GenericList.txt')
ind = sites['site'].tolist().index(self.site)
return sites['lat'][ind], sites['lon'][ind]
site_lat, site_lon = sites['lat'][ind], sites['lon'][ind]
# ensure longitude in the range of (-180, 180]
site_lon = ut.standardize_longitude(site_lon, limit='-180to180')

return site_lat, site_lon


def read_displacement(self, start_date=None, end_date=None, print_msg=True, display=False):
Expand Down
24 changes: 24 additions & 0 deletions src/mintpy/utils/utils0.py
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,30 @@ def touch(fname_list, times=None):


################################## Coordinate ##########################################
def standardize_longitude(lon, limit='-180to180'):
"""Normalize the longitude value range into (-180, 180] or [0, 360).
Parameters: lon - float / np.ndarray, longitude in degree
limit - str, -180to180 or 0to360
Returns: lon - float / np.ndarray, longitude in degree
"""
lon = np.asarray(lon)

# ensure data within (-180, 360)
lon = np.where(lon >= 360, lon - 360, lon)
lon = np.where(lon <= -180, lon + 360, lon)

# range option 1: ensure data within (-180, 180]
if limit == '-180to180':
lon = np.where(lon > 180, lon - 360, lon)

# range option 2: ensure data within [0, 360)
elif limit == '0to360' and np.nanmin(lon) < 0:
lon = np.where(lon < 0, lon + 360, lon)

return float(lon) if np.isscalar(lon) else lon


def utm_zone2epsg_code(utm_zone):
"""Convert UTM Zone string to EPSG code.
Expand Down

0 comments on commit c7e77cc

Please sign in to comment.