Repository: climate
Updated Branches:
  refs/heads/master e05cff99c -> ab51ff651


CLIMATE-510, Find spatial overlap between models and observations

To be able to add the multi obs/model functionality to OCW cli, there is need 
to find the spatial overlap between all datasets (models and observations).
If any dataset (model or observation) does not have overlap with other, it 
should be notifies to user.


Project: http://git-wip-us.apache.org/repos/asf/climate/repo
Commit: http://git-wip-us.apache.org/repos/asf/climate/commit/f47e9ec0
Tree: http://git-wip-us.apache.org/repos/asf/climate/tree/f47e9ec0
Diff: http://git-wip-us.apache.org/repos/asf/climate/diff/f47e9ec0

Branch: refs/heads/master
Commit: f47e9ec055cf39864e755802c557544f08392b10
Parents: e05cff9
Author: Maziyar Boustani <[email protected]>
Authored: Mon Aug 11 14:45:46 2014 -0700
Committer: Maziyar Boustani <[email protected]>
Committed: Mon Aug 11 14:45:46 2014 -0700

----------------------------------------------------------------------
 ocw-cli/ocw_cli.py | 69 +++++++++++++++++++++----------------------------
 1 file changed, 30 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/climate/blob/f47e9ec0/ocw-cli/ocw_cli.py
----------------------------------------------------------------------
diff --git a/ocw-cli/ocw_cli.py b/ocw-cli/ocw_cli.py
index 66213ff..85fe2ab 100644
--- a/ocw-cli/ocw_cli.py
+++ b/ocw-cli/ocw_cli.py
@@ -538,62 +538,53 @@ def get_temp_overlap(models_start_time, models_end_time, 
observations_start_time
 def get_model_spatial_bound():               #TODO: convert longitudes to 
-180, 180 to match with observation data
      '''Get model spatial bound.
 
-     :returns: model spatial boundaries
-     :rtype: (float, float, float, float)
+     :returns: all models spatial boundaries
+     :rtype: list
      '''
 
-     model_bound = model_datasets[0].spatial_boundaries()    #just accepts one 
model at this time
-     model_min_lat = model_bound[0]
-     model_max_lat = model_bound[1]
-     model_min_lon = model_bound[2]
-     model_max_lon = model_bound[3]
+     models_bound = []
+     for model in model_datasets:
+          models_bound.append(model.spatial_boundaries())
 
-     return model_min_lat, model_max_lat, model_min_lon, model_max_lon
+     return models_bound
 
 
 def get_obs_spatial_bound():
      '''Get observation spatial bound.
 
-     :returns: observation spatial boundaries
-     :rtype: (float, float, float, float)
+     :returns: all observations spatial boundaries
+     :rtype: list
      '''
 
-     obs_min_lat = observations_info[0]['min_lat']     #just accepts one obs 
at this time
-     obs_max_lat = observations_info[0]['max_lat']     #just accepts one obs 
at this time
-     obs_min_lon = observations_info[0]['min_lon']     #just accepts one obs 
at this time
-     obs_max_lon = observations_info[0]['max_lon']     #just accepts one obs 
at this time
+     observations_bound = []
+     for obs in observations_info:
+          observations_bound.append([obs['min_lat'], obs['max_lat'], 
obs['min_lon'], obs['max_lon']])
 
-     return obs_min_lat, obs_max_lat, obs_min_lon, obs_max_lon
+     return observations_bound
 
 
-def get_spatial_overlap(model_min_lat, model_max_lat, model_min_lon, 
model_max_lon, obs_min_lat, obs_max_lat, obs_min_lon, obs_max_lon):
+def get_spatial_overlap(models_bound, observations_bound):
      '''Calculate spatial overlap between given datasets.
 
-     :param model_min_lat: model minumum latitude
-     :type model_min_lat: float
-     :param model_max_lat: model maximum latitude
-     :type model_max_lat: float
-     :param model_min_lon: model minimum longitude
-     :type model_min_lon: float
-     :param model_max_lon: model maximum longitude
-     :type model_max_lon: float
-     :param obs_min_lat: observation minimum latitude
-     :type obs_min_lat: float
-     :param obs_max_lat: observation maximum latitude
-     :type obs_max_lat: float
-     :param obs_min_lon: observation minimum longitude
-     :type obs_min_lon: float
-     :param obs_max_lon: observation maximum longitude
-     :type obs_max_lon: float
+     :param models_bound: all models spatial boundaries information
+     :type models_bound: list
+     :param observations_bound: all observations spatial boundaries information
+     :type observations_bound: list
 
      :returns: spatial boundaries overlap between model and observation
      :rtype: (float, float, float, float)
      '''
 
-     overlap_min_lat = max(model_min_lat, obs_min_lat)
-     overlap_max_lat = min(model_max_lat, obs_max_lat)
-     overlap_min_lon = max(model_min_lon, obs_min_lon)
-     overlap_max_lon = min(model_max_lon, obs_max_lon)
+     datasets_bound = models_bound + observations_bound
+     overlap_min_lat = max(each[0] for each in datasets_bound)
+     overlap_max_lat = min(each[1] for each in datasets_bound)
+     overlap_min_lon = max(each[2] for each in datasets_bound)
+     overlap_max_lon = min(each[3] for each in datasets_bound)
+
+     #Need to check if all datasets have spatial overlap, otherwise return
+     # to main menu and print a warning as notification.
+     if overlap_max_lat <= overlap_min_lat or overlap_max_lon <= 
overlap_min_lon:
+          main_menu(model_datasets, models_info, observation_datasets, 
observations_info, note="WARNING: One or more dataset does not have spatial 
overlap with others.")
 
      return overlap_min_lat, overlap_max_lat, overlap_min_lon, overlap_max_lon
 
@@ -609,9 +600,9 @@ def settings_screen(header):
      models_start_time, models_end_time = get_model_temp_bound()
      observations_start_time, observations_end_time = get_obs_temp_bound()
      overlap_start_time, overlap_end_time = 
get_temp_overlap(models_start_time, models_end_time, observations_start_time, 
observations_end_time)
-     model_min_lat, model_max_lat, model_min_lon, model_max_lon = 
get_model_spatial_bound()
-     obs_min_lat, obs_max_lat, obs_min_lon, obs_max_lon = 
get_obs_spatial_bound()
-     overlap_min_lat, overlap_max_lat, overlap_min_lon, overlap_max_lon = 
get_spatial_overlap(model_min_lat, model_max_lat, model_min_lon, model_max_lon, 
obs_min_lat, obs_max_lat, obs_min_lon, obs_max_lon)
+     models_bound = get_model_spatial_bound()
+     observations_bound = get_obs_spatial_bound()
+     overlap_min_lat, overlap_max_lat, overlap_min_lon, overlap_max_lon = 
get_spatial_overlap(models_bound, observations_bound)
      model_temp_res = model_datasets[0].temporal_resolution()       #just 
accepts one model at this time
      obs_temp_res = observations_info[0]['timestep']        #just accepts one 
obs at this time
      model_lat_res = model_datasets[0].spatial_resolution()[0] #just accepts 
one model at this time

Reply via email to