def output(self, jfile, unitraster, unitshp): """output json file and slope position units raster file""" json_updown_data = json.dumps(self.units_updwon, indent=4) with open(jfile, 'w', encoding='utf-8') as f: f.write('%s' % json_updown_data) RasterUtilClass.write_gtiff_file(unitraster, self.nrows, self.ncols, self.slppos_ids, self.geotrans, self.srs, DEFAULT_NODATA, self.datatype) VectorUtilClass.raster2shp(unitraster, unitshp) print("Original unique spatial units ID raster saved as '%s'" % unitraster)
def output(self, jfile, unitraster, unitshp): """output json file and slope position units raster file""" json_updown_data = json.dumps(self.units_updwon, indent=4) with open(jfile, 'w') as f: f.write(json_updown_data) RasterUtilClass.write_gtiff_file(unitraster, self.nrows, self.ncols, self.slppos_ids, self.geotrans, self.srs, DEFAULT_NODATA, self.datatype) VectorUtilClass.raster2shp(unitraster, unitshp) print("Original unique spatial units ID raster saved as '%s'" % unitraster)
def post_process_of_delineated_data(cfg): """Do some necessary transfer for subbasin, stream, and flow direction raster.""" # inputs stream_net_file = cfg.taudems.streamnet_shp subbasin_file = cfg.taudems.subbsn_m flow_dir_file_tau = cfg.taudems.d8flow_m stream_raster_file = cfg.taudems.stream_m # outputs # -- shapefile shp_dir = cfg.dirs.geoshp UtilClass.mkdir(shp_dir) # ---- outlet, copy from DirNameUtils.TauDEM FileClass.copy_files(cfg.taudems.outlet_m, cfg.vecs.outlet) # ---- reaches output_reach_file = cfg.vecs.reach # ---- subbasins subbasin_vector_file = cfg.vecs.subbsn # -- raster file output_subbasin_file = cfg.spatials.subbsn output_flow_dir_file = cfg.spatials.d8flow output_stream_link_file = cfg.spatials.stream_link output_hillslope_file = cfg.spatials.hillslope id_map = StreamnetUtil.serialize_streamnet(stream_net_file, output_reach_file) RasterUtilClass.raster_reclassify(subbasin_file, id_map, output_subbasin_file, GDT_Int32) StreamnetUtil.assign_stream_id_raster(stream_raster_file, output_subbasin_file, output_stream_link_file) # Convert D8 encoding rule to ArcGIS D8Util.convert_code(flow_dir_file_tau, output_flow_dir_file) # convert raster to shapefile (for subbasin and basin) print('Generating subbasin vector...') VectorUtilClass.raster2shp(output_subbasin_file, subbasin_vector_file, 'subbasin', FieldNames.subbasin_id) mask_file = cfg.spatials.mask basin_vector = cfg.vecs.bsn print('Generating basin vector...') VectorUtilClass.raster2shp(mask_file, basin_vector, 'basin', FieldNames.basin) # delineate hillslope DelineateHillslope.downstream_method_whitebox(output_stream_link_file, flow_dir_file_tau, output_hillslope_file)
def watershed_delineation(np, dem, outlet_file=None, thresh=0, singlebasin=False, workingdir=None, mpi_bin=None, bin_dir=None, logfile=None, runtime_file=None, hostfile=None, avoid_redo=False): """Watershed Delineation based on D8 flow direction. Args: np: process number for MPI dem: DEM path outlet_file: predefined outlet shapefile path thresh: predefined threshold for extracting stream from accumulated flow direction singlebasin: when set True, only extract subbasins that drains into predefined outlets workingdir: directory that store outputs mpi_bin: directory of MPI executable binary, e.g., mpiexec, mpirun bin_dir: directory of TauDEM and other executable binaries logfile: log file path runtime_file: runtime file path hostfile: host list file path for MPI avoid_redo: avoid executing some functions that do not depend on input arguments when repeatedly invoke this function """ # 1. Check directories if not os.path.exists(dem): TauDEM.error('DEM: %s is not existed!' % dem) dem = os.path.abspath(dem) if workingdir is None or workingdir is '': workingdir = os.path.dirname(dem) nc = TauDEMFilesUtils(workingdir) # predefined names workingdir = nc.workspace UtilClass.mkdir(workingdir) # 2. Check log file if logfile is not None and FileClass.is_file_exists(logfile): os.remove(logfile) # 3. perform calculation # Filling DEM if not (avoid_redo and FileClass.is_file_exists(nc.filldem)): UtilClass.writelog(logfile, '[Output] %s' % 'remove pit...', 'a') TauDEM.pitremove(np, dem, nc.filldem, workingdir, mpi_bin, bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) # Flow direction based on D8 algorithm if not (avoid_redo and FileClass.is_file_exists(nc.d8flow)): UtilClass.writelog(logfile, '[Output] %s' % 'D8 flow direction...', 'a') TauDEM.d8flowdir(np, nc.filldem, nc.d8flow, nc.slp, workingdir, mpi_bin, bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) # Flow accumulation without stream skeleton as weight if not (avoid_redo and FileClass.is_file_exists(nc.d8acc)): UtilClass.writelog(logfile, '[Output] %s' % 'D8 flow accumulation...', 'a') TauDEM.aread8(np, nc.d8flow, nc.d8acc, None, None, False, workingdir, mpi_bin, bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) # Initial stream network using mean accumulation as threshold UtilClass.writelog(logfile, '[Output] %s' % 'Generating stream raster initially...', 'a') min_accum, max_accum, mean_accum, std_accum = RasterUtilClass.raster_statistics(nc.d8acc) TauDEM.threshold(np, nc.d8acc, nc.stream_raster, mean_accum, workingdir, mpi_bin, bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) # Outlets position initialization and adjustment UtilClass.writelog(logfile, '[Output] %s' % 'Moving outlet to stream...', 'a') if outlet_file is None: # if not given, take cell with maximum accumulation as outlet outlet_file = nc.outlet_pre TauDEM.connectdown(np, nc.d8flow, nc.d8acc, outlet_file, nc.outlet_m, wtsd=None, workingdir=workingdir, mpiexedir=mpi_bin, exedir=bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) TauDEM.moveoutletstostrm(np, nc.d8flow, nc.stream_raster, outlet_file, nc.outlet_m, workingdir=workingdir, mpiexedir=mpi_bin, exedir=bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) # Stream skeleton by peuker-douglas algorithm UtilClass.writelog(logfile, '[Output] %s' % 'Generating stream skeleton ...', 'a') TauDEM.peukerdouglas(np, nc.filldem, nc.stream_pd, workingdir, mpi_bin, bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) # Weighted flow acculation with outlet UtilClass.writelog(logfile, '[Output] %s' % 'Flow accumulation with outlet...', 'a') tmp_outlet = None if singlebasin: tmp_outlet = nc.outlet_m TauDEM.aread8(np, nc.d8flow, nc.d8acc_weight, tmp_outlet, nc.stream_pd, False, workingdir, mpi_bin, bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) # Determine threshold by input argument or dropanalysis function if thresh <= 0: # find the optimal threshold using dropanalysis function UtilClass.writelog(logfile, '[Output] %s' % 'Drop analysis to select optimal threshold...', 'a') min_accum, max_accum, mean_accum, std_accum = \ RasterUtilClass.raster_statistics(nc.d8acc_weight) if mean_accum - std_accum < 0: minthresh = mean_accum else: minthresh = mean_accum - std_accum maxthresh = mean_accum + std_accum TauDEM.dropanalysis(np, nc.filldem, nc.d8flow, nc.d8acc_weight, nc.d8acc_weight, nc.outlet_m, minthresh, maxthresh, 20, 'true', nc.drptxt, workingdir, mpi_bin, bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) if not FileClass.is_file_exists(nc.drptxt): # raise RuntimeError('Dropanalysis failed and drp.txt was not created!') UtilClass.writelog(logfile, '[Output] %s' % 'dropanalysis failed!', 'a') thresh = 0.5 * (maxthresh - minthresh) + minthresh else: with open(nc.drptxt, 'r', encoding='utf-8') as drpf: temp_contents = drpf.read() (beg, thresh) = temp_contents.rsplit(' ', 1) thresh = float(thresh) UtilClass.writelog(logfile, '[Output] %s: %f' % ('Selected optimal threshold: ', thresh), 'a') # Final stream network UtilClass.writelog(logfile, '[Output] %s' % 'Generating stream raster...', 'a') TauDEM.threshold(np, nc.d8acc_weight, nc.stream_raster, thresh, workingdir, mpi_bin, bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) UtilClass.writelog(logfile, '[Output] %s' % 'Generating stream net...', 'a') TauDEM.streamnet(np, nc.filldem, nc.d8flow, nc.d8acc_weight, nc.stream_raster, nc.outlet_m, nc.stream_order, nc.channel_net, nc.channel_coord, nc.streamnet_shp, nc.subbsn, workingdir, mpi_bin, bin_dir, log_file=logfile, runtime_file=runtime_file, hostfile=hostfile) # Serialize IDs of subbasins and the corresponding streams UtilClass.writelog(logfile, '[Output] %s' % 'Serialize subbasin&stream IDs...', 'a') id_map = StreamnetUtil.serialize_streamnet(nc.streamnet_shp, nc.streamnet_m) RasterUtilClass.raster_reclassify(nc.subbsn, id_map, nc.subbsn_m, GDT_Int32) StreamnetUtil.assign_stream_id_raster(nc.stream_raster, nc.subbsn_m, nc.stream_m) # convert raster to shapefile (for subbasin and basin) UtilClass.writelog(logfile, '[Output] %s' % 'Generating subbasin vector...', 'a') VectorUtilClass.raster2shp(nc.subbsn_m, nc.subbsn_shp, 'subbasin', 'SUBBASINID') # Finish the workflow UtilClass.writelog(logfile, '[Output] %s' % 'Original subbasin delineation is finished!', 'a')