Skip to content

Commit

Permalink
Merge pull request #918 from metno/regions901
Browse files Browse the repository at this point in the history
Fix Regions 901
  • Loading branch information
lewisblake authored Oct 10, 2023
2 parents f36b9f0 + 6288c41 commit 749811b
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 9 deletions.
7 changes: 5 additions & 2 deletions pyaerocom/aeroval/coldatatojson_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -632,10 +632,11 @@ def _init_site_coord_arrays(data):
return (sites, lats, lons, alts, countries, jsdates)


def _get_stat_regions(lats, lons, regions):
def _get_stat_regions(lats, lons, regions, **kwargs):
regs = []
regions_how = kwargs.get("regions_how", None)
for lat, lon in zip(lats, lons):
reg = find_closest_region_coord(lat, lon, regions=regions)
reg = find_closest_region_coord(lat, lon, regions=regions, regions_how=regions_how)
regs.append(reg)
return regs

Expand All @@ -645,6 +646,8 @@ def _process_sites(data, regions, regions_how, meta_glob):
(sites, lats, lons, alts, countries, jsdates) = _init_site_coord_arrays(data)
if regions_how == "country":
regs = countries
elif regions_how == "htap":
regs = _get_stat_regions(lats, lons, regions, regions_how=regions_how)
else:
regs = _get_stat_regions(lats, lons, regions)

Expand Down
24 changes: 17 additions & 7 deletions pyaerocom/region.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
from pyaerocom.region_defs import REGION_DEFS # all region definitions
from pyaerocom.region_defs import OLD_AEROCOM_REGIONS, REGION_NAMES # custom names (dict)

POSSIBLE_REGION_OCEAN_NAMES = ["OCN", "Oceans"]


class Region(BrowseDict):
"""Class specifying a region
Expand Down Expand Up @@ -349,24 +351,25 @@ def get_regions_coord(lat, lon, regions=None):
if regions is None:
regions = get_all_default_regions()
ocean_mask = load_region_mask_xr("OCN")
on_ocean = get_mask_value(lat, lon, ocean_mask)
on_ocean = bool(get_mask_value(lat, lon, ocean_mask))
for rname, reg in regions.items():
if rname == ALL_REGION_NAME: # always True for ALL_REGION_NAME
matches.append(rname)
continue
# OCN needs special handling determined by the rname, not hardcoded to return OCN b/c of HTAP issues
if rname in POSSIBLE_REGION_OCEAN_NAMES:
if on_ocean:
matches.append(rname)
continue
if reg.contains_coordinate(lat, lon) and not on_ocean:
matches.append(rname)
if rname == "OCN" and on_ocean:
matches.append(rname)
if len(matches) == 0:
matches.append(ALL_REGION_NAME)
return matches


def find_closest_region_coord(
lat: float,
lon: float,
regions: dict | None = None,
lat: float, lon: float, regions: dict | None = None, **kwargs
) -> list[str]:
"""Finds list of regions sorted by their center closest to input coordinate
Expand All @@ -389,5 +392,12 @@ def find_closest_region_coord(
regions = get_all_default_regions()
matches = get_regions_coord(lat, lon, regions)
matches.sort(key=lambda id: regions[id].distance_to_center(lat, lon))

if kwargs.get("regions_how") == "htap":
# keep only first entry and Oceans if it exists
keep = matches[:1]
if "Oceans" in matches[1:]:
keep += ["Oceans"]
if ALL_REGION_NAME in matches[1:]:
keep += [ALL_REGION_NAME]
return list(set(keep))
return matches

0 comments on commit 749811b

Please sign in to comment.