def generate_runoff_coefficent(maindb, landuse_file, slope_file, soil_texture_file, runoff_coeff_file, landuse_shp, imper_perc=0.3): """Generate potential runoff coefficient.""" # read landuselookup table from MongoDB prc_fields = ['PRC_ST%d' % (i,) for i in range(1, 13)] sc_fields = ['SC_ST%d' % (i,) for i in range(1, 13)] query_result = maindb['LANDUSELOOKUP'].find() if query_result is None: raise RuntimeError("LanduseLoop Collection is not existed or empty!") runoff_c0 = dict() runoff_s0 = dict() for row in query_result: tmpid = row.get('LANDUSE_ID') runoff_c0[tmpid] = [float(row.get(item)) for item in prc_fields] runoff_s0[tmpid] = [float(row.get(item)) for item in sc_fields] landu_raster = RasterUtilClass.read_raster(landuse_file) landu_data = landu_raster.data nodata_value1 = landu_raster.noDataValue xsize = landu_raster.nCols ysize = landu_raster.nRows nodata_value2 = landu_raster.noDataValue slo_data = RasterUtilClass.read_raster(slope_file).data soil_texture_array = RasterUtilClass.read_raster(soil_texture_file).data id_omited = [] def coef_cal(lu_id, soil_texture, slope): """Calculate runoff coefficient by landuse, soil texture and slope.""" if abs(lu_id - nodata_value1) < UTIL_ZERO or int(lu_id) < 0: return nodata_value2 if int(lu_id) not in list(runoff_c0.keys()): if int(lu_id) not in id_omited: print('The landuse ID: %d does not exist.' % int(lu_id)) id_omited.append(int(lu_id)) stid = int(soil_texture) - 1 c0 = runoff_c0[int(lu_id)][stid] s0 = runoff_s0[int(lu_id)][stid] / 100. slp = slope if slp + s0 < 0.0001: return c0 coef1 = (1 - c0) * slp / (slp + s0) coef2 = c0 + coef1 # TODO, Check if it is (lu_id >= 98), by lj if int(lu_id) == 106 or int(lu_id) == 107 or int(lu_id) == 105: return coef2 * (1 - imper_perc) + imper_perc else: return coef2 coef_cal_numpy = np_frompyfunc(coef_cal, 3, 1) coef = coef_cal_numpy(landu_data, soil_texture_array, slo_data) RasterUtilClass.write_gtiff_file(runoff_coeff_file, ysize, xsize, coef, landu_raster.geotrans, landu_raster.srs, nodata_value2, GDT_Float32) runoff_co_csv = r'D:\SEIMS\data\zts\data_prepare\spatial\test\runoff_co.csv' RasterUtilClass.count_raster_moist(runoff_coeff_file, landuse_shp, runoff_co_csv)
def generate_cn2(maindb, landuse_file, hydrogroup_file, cn2_filename, landuse_shp): """Generate CN2 raster.""" query_result = maindb['LANDUSELOOKUP'].find() if query_result is None: raise RuntimeError( "LanduseLoop Collection is not existed or empty!") # cn2 list for each landuse type and hydrological soil group cn2_map = dict() for row in query_result: lu_id = row.get('LANDUSE_ID') cn2_list = [ row.get('CN2A'), row.get('CN2B'), row.get('CN2C'), row.get('CN2D') ] cn2_map[lu_id] = cn2_list # print(cn2Map) lu_r = RasterUtilClass.read_raster(landuse_file) data_landuse = lu_r.data xsize = lu_r.nCols ysize = lu_r.nRows nodata_value = lu_r.noDataValue hg_r = RasterUtilClass.read_raster(hydrogroup_file) data_hg = hg_r.data def cal_cn2(lucc_id, hg): """Calculate CN2 value from landuse ID and Hydro Group number.""" lucc_id = int(lucc_id) if lucc_id < 0 or MathClass.floatequal(lucc_id, nodata_value): return DEFAULT_NODATA else: hg = int(hg) - 1 return cn2_map[lucc_id][hg] cal_cn2_numpy = np_frompyfunc(cal_cn2, 2, 1) data_prop = cal_cn2_numpy(data_landuse, data_hg) print(cn2_filename) cn2_csv = r'D:\SEIMS\data\zts\data_prepare\spatial\test\cn2.csv' RasterUtilClass.write_gtiff_file(cn2_filename, ysize, xsize, data_prop, lu_r.geotrans, lu_r.srs, nodata_value, GDT_Float32) RasterUtilClass.count_raster_moist(cn2_filename, landuse_shp, cn2_csv)
def generate_cn2(maindb, landuse_file, hydrogroup_file, cn2_filename, landuse_shp): """Generate CN2 raster.""" query_result = maindb['LANDUSELOOKUP'].find() if query_result is None: raise RuntimeError("LanduseLoop Collection is not existed or empty!") # cn2 list for each landuse type and hydrological soil group cn2_map = dict() for row in query_result: lu_id = row.get('LANDUSE_ID') cn2_list = [row.get('CN2A'), row.get('CN2B'), row.get('CN2C'), row.get('CN2D')] cn2_map[lu_id] = cn2_list # print(cn2Map) lu_r = RasterUtilClass.read_raster(landuse_file) data_landuse = lu_r.data xsize = lu_r.nCols ysize = lu_r.nRows nodata_value = lu_r.noDataValue hg_r = RasterUtilClass.read_raster(hydrogroup_file) data_hg = hg_r.data def cal_cn2(lucc_id, hg): """Calculate CN2 value from landuse ID and Hydro Group number.""" lucc_id = int(lucc_id) if lucc_id < 0 or MathClass.floatequal(lucc_id, nodata_value): return DEFAULT_NODATA else: hg = int(hg) - 1 return cn2_map[lucc_id][hg] cal_cn2_numpy = np_frompyfunc(cal_cn2, 2, 1) data_prop = cal_cn2_numpy(data_landuse, data_hg) print (cn2_filename) cn2_csv = r'D:\SEIMS\data\zts\data_prepare\spatial\test\cn2.csv' RasterUtilClass.write_gtiff_file(cn2_filename, ysize, xsize, data_prop, lu_r.geotrans, lu_r.srs, nodata_value, GDT_Float32) RasterUtilClass.count_raster_moist(cn2_filename, landuse_shp, cn2_csv)