def make_agg_pairs(pour_points, dom_data, fdr_data, config_dict): # def make_agg_pairs(lons, lats, dom_lon, dom_lat, dom_ids, # fdr_lons, fdr_lats, fdr_srcarea, agg_type='agg'): """ Group pour points by domain grid outlet cell """ lons = pour_points['lons'] lats = pour_points['lats'] dom_lon = dom_data[config_dict['DOMAIN']['LONGITUDE_VAR']] dom_lat = dom_data[config_dict['DOMAIN']['LATITUDE_VAR']] dom_ids = dom_data['cell_ids'] fdr_lons = fdr_data[config_dict['ROUTING']['LONGITUDE_VAR']] fdr_lats = fdr_data[config_dict['ROUTING']['LATITUDE_VAR']] fdr_srcarea = fdr_data[config_dict['ROUTING']['SOURCE_AREA_VAR']] routys, routxs = latlon2yx(plats=lats, plons=lons, glats=fdr_lats, glons=fdr_lons) # ---------------------------------------------------------------- # #Find Destination grid cells log.info('Finding addresses now...') if (min(lons) < 0 and dom_lon.min() >= 0): posinds = np.nonzero(dom_lon > 180) dom_lon[posinds] -= 360 log.info('adjusted domain lon minimum') if (min(lons) < 0 and fdr_lons.min() >= 0): posinds = np.nonzero(fdr_lons > 180) fdr_lons[posinds] -= 360 log.info('adjusted fdr lon minimum') combined = np.dstack(([dom_lat.ravel(), dom_lon.ravel()]))[0] points = list(np.vstack((np.array(lats), np.array(lons))).transpose()) mytree = cKDTree(combined) dist, indexes = mytree.query(points, k=1) gridys, gridxs = np.unravel_index(np.array(indexes), dom_lat.shape) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Do the aggregation outlets = {} for i, ind in enumerate(indexes): # Define pour point object (on ) pour_point = Point(lat=lats[i], lon=lons[i], gridx=gridxs[i], gridy=gridys[i], routx=routxs[i], routy=routys[i], name=None, cell_id=dom_ids[gridys[i], gridxs[i]]) pour_point.source_area = fdr_srcarea[pour_point.routy, pour_point.routx] cell_id = dom_ids[gridys[i], gridxs[i]] if cell_id in outlets: outlets[cell_id].pour_points.append(pour_point) outlets[cell_id].upstream_area += pour_point.source_area else: # define outlet grid cell (on domain grid) outlets[cell_id] = Point(gridy=gridys[i], gridx=gridxs[i], lat=combined[ind][0], lon=combined[ind][1]) outlets[cell_id].pour_points = [pour_point] outlets[cell_id].cell_id = cell_id outlets[cell_id].upstream_area = pour_point.source_area # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Sort based on outlet total source area pour_point.source_area outlets = OrderedDict(sorted(outlets.items(), key=lambda t: t[1].upstream_area, reverse=True)) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Count the pairs pp_count = 0 key_count = 0 num = len(lons) for i, key in enumerate(outlets): key_count += 1 pp_count += len(outlets[key].pour_points) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Print Debug Results log.info('\n------------------ SUMMARY OF MakeAggPairs ------------------') log.info('NUMBER OF POUR POINTS IN INPUT LIST: %i' % num) log.info('NUMBER OF POINTS TO AGGREGATE TO: %i' % key_count) log.info('NUMBER OF POUR POINTS AGGREGATED: %i' % pp_count) log.info('EFFECIENCY OF: %.2f %%' % (100.*pp_count / num)) log.info('UNASSIGNED POUR POINTS: %i \n' % (num-pp_count)) log.info('---------------------------------------------------------------\n') # ---------------------------------------------------------------- # return outlets
def make_agg_pairs(pour_points, dom_data, fdr_data, config_dict): """ Group pour points by domain grid outlet cell """ lons = pour_points['lons'] lats = pour_points['lats'] dom_lon = dom_data[config_dict['DOMAIN']['LONGITUDE_VAR']] dom_lat = dom_data[config_dict['DOMAIN']['LATITUDE_VAR']] dom_ids = dom_data['cell_ids'] fdr_lons = fdr_data[config_dict['ROUTING']['LONGITUDE_VAR']] fdr_lats = fdr_data[config_dict['ROUTING']['LATITUDE_VAR']] fdr_srcarea = fdr_data[config_dict['ROUTING']['SOURCE_AREA_VAR']] # ---------------------------------------------------------------- # #Find Destination grid cells log.info('Finding addresses now...') routys, routxs = latlon2yx(plats=lats, plons=lons, glats=fdr_lats, glons=fdr_lons) domys, domxs = latlon2yx(plats=lats, plons=lons, glats=dom_lat, glons=dom_lon) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Do the aggregation outlets = {} for i, (lat, lon) in enumerate(zip(lats, lons)): # Define pour point object (on ) pour_point = Point(lat=lat, lon=lon, domx=domxs[i], domy=domys[i], routx=routxs[i], routy=routys[i], name=None, cell_id=dom_ids[domys[i], domxs[i]]) pour_point.source_area = fdr_srcarea[pour_point.routy, pour_point.routx] cell_id = dom_ids[domys[i], domxs[i]] if cell_id in outlets: outlets[cell_id].pour_points.append(pour_point) outlets[cell_id].upstream_area += pour_point.source_area else: # define outlet grid cell (on domain grid) outlets[cell_id] = Point(domy=domys[i], domx=domxs[i], lat=dom_lat[domys[i], domxs[i]], lon=dom_lon[domys[i], domxs[i]]) outlets[cell_id].pour_points = [pour_point] outlets[cell_id].cell_id = cell_id outlets[cell_id].upstream_area = pour_point.source_area # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Sort based on outlet total source area pour_point.source_area outlets = OrderedDict( sorted(outlets.items(), key=lambda t: t[1].upstream_area, reverse=True)) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Count the pairs pp_count = 0 key_count = 0 num = len(lons) for i, key in enumerate(outlets): key_count += 1 pp_count += len(outlets[key].pour_points) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Print Debug Results log.info('\n------------------ SUMMARY OF MakeAggPairs ------------------') log.info('NUMBER OF POUR POINTS IN INPUT LIST: %i' % num) log.info('NUMBER OF POINTS TO AGGREGATE TO: %i' % key_count) log.info('NUMBER OF POUR POINTS AGGREGATED: %i' % pp_count) log.info('EFFECIENCY OF: %.2f %%' % (100. * pp_count / num)) log.info('UNASSIGNED POUR POINTS: %i' % (num - pp_count)) log.info('-------------------------------------------------------------\n') # ---------------------------------------------------------------- # return outlets
def make_agg_pairs(pour_points, dom_data, fdr_data, config_dict): """ Group pour points by domain grid outlet cell """ lons = pour_points["lons"] lats = pour_points["lats"] dom_lon = dom_data[config_dict["DOMAIN"]["LONGITUDE_VAR"]] dom_lat = dom_data[config_dict["DOMAIN"]["LATITUDE_VAR"]] dom_ids = dom_data["cell_ids"] fdr_lons = fdr_data[config_dict["ROUTING"]["LONGITUDE_VAR"]] fdr_lats = fdr_data[config_dict["ROUTING"]["LATITUDE_VAR"]] fdr_srcarea = fdr_data[config_dict["ROUTING"]["SOURCE_AREA_VAR"]] # ---------------------------------------------------------------- # # Find Destination grid cells log.info("Finding addresses now...") routys, routxs = latlon2yx(plats=lats, plons=lons, glats=fdr_lats, glons=fdr_lons) domys, domxs = latlon2yx(plats=lats, plons=lons, glats=dom_lat, glons=dom_lon) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Do the aggregation outlets = {} for i, (lat, lon) in enumerate(zip(lats, lons)): # Define pour point object pour_point = Point( lat=lat, lon=lon, domx=domxs[i], domy=domys[i], routx=routxs[i], routy=routys[i], name=None, cell_id=dom_ids[domys[i], domxs[i]], ) pour_point.source_area = fdr_srcarea[pour_point.routy, pour_point.routx] cell_id = dom_ids[domys[i], domxs[i]] if cell_id in outlets: outlets[cell_id].pour_points.append(pour_point) outlets[cell_id].upstream_area += pour_point.source_area else: # define outlet grid cell (on domain grid) outlets[cell_id] = Point( domy=domys[i], domx=domxs[i], lat=dom_lat[domys[i], domxs[i]], lon=dom_lon[domys[i], domxs[i]] ) outlets[cell_id].pour_points = [pour_point] outlets[cell_id].cell_id = cell_id outlets[cell_id].upstream_area = pour_point.source_area # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Sort based on outlet total source area pour_point.source_area outlets = OrderedDict(sorted(outlets.items(), key=lambda t: t[1].upstream_area, reverse=True)) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Count the pairs pp_count = 0 key_count = 0 num = len(lons) for i, key in enumerate(outlets): key_count += 1 pp_count += len(outlets[key].pour_points) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Print Debug Results log.info("\n------------------ SUMMARY OF MakeAggPairs ------------------") log.info("NUMBER OF POUR POINTS IN INPUT LIST: %i" % num) log.info("NUMBER OF POINTS TO AGGREGATE TO: %i" % key_count) log.info("NUMBER OF POUR POINTS AGGREGATED: %i" % pp_count) log.info("EFFECIENCY OF: %.2f %%" % (100.0 * pp_count / num)) log.info("UNASSIGNED POUR POINTS: %i" % (num - pp_count)) log.info("-------------------------------------------------------------\n") # ---------------------------------------------------------------- # return outlets