Source code for regionate.overlaps
import numpy as np
from .utilities import *
[docs]
def find_indices_of_overlaps(r1, r2, closeness_threshold=5.e3, face_indices=False):
overlaps = distance_on_unit_sphere(
r1.lons_c[:, np.newaxis], r1.lats_c[:, np.newaxis],
r2.lons_c[np.newaxis, :], r2.lats_c[np.newaxis, :]
) < closeness_threshold
r1_oidx = consecutive_lists( np.where(np.any(overlaps, axis=1))[0], mod=r1.lons_c.size)
r2_oidx = consecutive_lists( np.where(np.any(overlaps, axis=0))[0], mod=r2.lons_c.size)
if face_indices:
r1_oidx = [l[:-1] for l in r1_oidx]
r2_oidx = [l[:-1] for l in r2_oidx]
return group_overlaps({r1.name: r1_oidx, r2.name: r2_oidx}, r1, r2, closeness_threshold=closeness_threshold)
[docs]
def group_overlaps(overlaps, r1, r2, closeness_threshold=5.e3):
grouped_overlaps = {r1.name: {}, r2.name: {}}
group_num = 0
for o2 in overlaps[r2.name]:
for o1 in overlaps[r1.name]:
if np.any(o1) and np.any(o2):
if np.any(distance_on_unit_sphere(
r1.lons_c[o1, np.newaxis], r1.lats_c[o1, np.newaxis],
r2.lons_c[np.newaxis, o2], r2.lats_c[np.newaxis, o2]
) < closeness_threshold):
grouped_overlaps[r1.name][group_num] = o1
grouped_overlaps[r2.name][group_num] = o2
group_num +=1
return grouped_overlaps
[docs]
def align_boundaries_with_overlap_sections(regions, remove_gaps=True):
for rname, r in regions.region_dict.items():
overlap_list = [o for o in list(regions.overlaps) if rname in o]
if len(overlap_list) != 0:
arbitrary_o = regions.overlaps[overlap_list[0]][rname]
regions.region_dict[rname] = roll_boundary_to_align_with_overlap(
r, arbitrary_o, remove_gaps=remove_gaps
)
[docs]
def roll_boundary_to_align_with_overlap(r, oidx, remove_gaps=True):
roll_idx = -consecutive_lists(oidx[0], mod=r.lons_c.size)[0][0]
new_oidx = {onum: np.mod(np.array(o) + roll_idx, r.lons_c.size) for (onum, o) in oidx.items()}
r.lons_c = np.roll(r.lons_c, roll_idx)
r.lats_c = np.roll(r.lats_c, roll_idx)
if remove_gaps:
for onum, o in new_oidx.items():
gaps = np.array([i for i in range(np.min(o), np.max(o)+1) if i not in o])
if any(gaps):
r.lons_c[gaps] = np.nan
r.lats_c[gaps] = np.nan
nan_idx = np.isnan(r.lons_c) | np.isnan(r.lats_c)
r.lons_c = r.lons_c[~nan_idx]
r.lats_c = r.lats_c[~nan_idx]
return r