def swap(data, outname): """ byte swapping from small to big endian (as required by GAMMA) Parameters ---------- data: str the DEM file to be swapped outname: str the name of the file to write Returns ------- """ with raster.Raster(data) as ras: dtype = ras.dtype ras_format = ras.format if ras_format != 'ENVI': raise IOError('only ENVI format supported') dtype_lookup = {'Int16': 2, 'CInt16': 2, 'Int32': 4, 'Float32': 4, 'CFloat32': 4, 'Float64': 8} if dtype not in dtype_lookup: raise IOError('data type {} not supported'.format(dtype)) disp.swap_bytes(infile=data, outfile=outname, swap_type=dtype_lookup[dtype]) with HDRobject(data + '.hdr') as header: header.byte_order = 1 header.write(outname + '.hdr')
def makeSRTM(scenes, srtmdir, outname): """ Create a DEM in Gamma format from SRTM tiles - coordinates are read to determine the required DEM extent and select the necessary hgt tiles - mosaics SRTM DEM tiles, converts them to Gamma format and subtracts offset to WGS84 ellipsoid intended for SRTM products downloaded from: - USGS: https://gdex.cr.usgs.gov/gdex/ - CGIAR: http://srtm.csi.cgiar.org Parameters ---------- scenes: list of str or pyroSAR.ID a list of Gamma parameter files or pyroSAR ID objects to read the DEM extent from srtmdir: str a directory containing the SRTM hgt tiles outname: str the name of the final DEM file Returns ------- """ tempdir = outname + '___temp' os.makedirs(tempdir) hgt_options = hgt(scenes) hgt_files = finder(srtmdir, hgt_options) nodatas = list(set([raster.Raster(x).nodata for x in hgt_files])) if len(nodatas) == 1: nodata = nodatas[0] else: raise RuntimeError('different nodata values are not permitted') srtm_vrt = os.path.join(tempdir, 'srtm.vrt') srtm_temp = srtm_vrt.replace('.vrt', '_tmp') srtm_final = srtm_vrt.replace('.vrt', '') gdalbuildvrt(hgt_files, srtm_vrt, {'srcNodata': nodata, 'options': ['-overwrite']}) gdal_translate(srtm_vrt, srtm_temp, {'format': 'ENVI', 'noData': nodata}) diff.srtm2dem(SRTM_DEM=srtm_temp, DEM=srtm_final, DEM_par=srtm_final + '.par', gflg=2, geoid='-', outdir=tempdir) shutil.move(srtm_final, outname) shutil.move(srtm_final + '.par', outname + '.par') par2hdr(outname + '.par', outname + '.hdr') shutil.rmtree(tempdir)
def dempar(dem, logpath=None): """ create GAMMA parameter text files for DEM files currently only EQA and UTM projections with WGS84 ellipsoid are supported Parameters ---------- dem: str the name of the DEM logpath: str a directory to write logfiles to Returns ------- """ rast = raster.Raster(dem) # determine data type dtypes = {'Int16': 'INTEGER*2', 'UInt16': 'INTEGER*2', 'Float32': 'REAL*4'} if rast.dtype not in dtypes: raise IOError('data type not supported') else: dtype = dtypes[rast.dtype] # format pixel posting and top left coordinate posting = str(rast.geo['yres']) + ' ' + str(rast.geo['xres']) latlon = str(rast.geo['ymax']) + ' ' + str(rast.geo['xmin']) # evaluate projection projections = {'longlat': 'EQA', 'utm': 'UTM'} if rast.proj4args['proj'] not in projections: raise ValueError('projection not supported (yet)') else: projection = projections[rast.proj4args['proj']] # get ellipsoid ellipsoid = rast.proj4args['ellps'] if 'ellps' in rast.proj4args else rast.proj4args['datum'] if ellipsoid != 'WGS84': raise ValueError('ellipsoid not supported (yet)') # create list for GAMMA command input if projection == 'UTM': zone = rast.proj4args['zone'] falsenorthing = 10000000. if rast.geo['ymin'] < 0 else 0 parlist = [projection, ellipsoid, 1, zone, falsenorthing, os.path.basename(dem), dtype, 0, 1, rast.cols, rast.rows, posting, latlon] else: parlist = [projection, ellipsoid, 1, os.path.basename(dem), dtype, 0, 1, rast.cols, rast.rows, posting, latlon] # execute GAMMA command diff.create_dem_par(DEM_par=os.path.splitext(dem)[0] + '.par', inlist=parlist, outdir=os.path.dirname(dem), logpath=logpath)
def mosaic(demlist, outname, byteorder=1, gammapar=True): """ mosaicing of multiple DEMs Parameters ---------- demlist: list a list of DEM names to be mosaiced outname: str the name of the final mosaic file byteorder: {0, 1} the byte order of the mosaic - 0: small endian - 1: big endian gammapar: bool create a Gamma parameter file for the mosaic? Returns ------- """ if len(demlist) < 2: raise IOError('length of demlist < 2') with raster.Raster(demlist[0]) as ras: nodata = ras.nodata par = { 'format': 'ENVI', 'srcNodata': nodata, ' dstNodata': nodata, 'options': ['-q'] } gdalwarp(demlist, outname, par) if byteorder == 1: swap(outname, outname + '_swap') for item in [outname, outname + '.hdr', outname + '.aux.xml']: os.remove(item) os.rename(outname + '_swap', outname) os.rename(outname + '_swap.hdr', outname + '.hdr') if gammapar: dempar(outname)
def mosaic(demlist, outname, byteorder=1, gammapar=True): """ mosaicing of multiple DEMs """ if len(demlist) < 2: raise IOError('length of demlist < 2') nodata = str(raster.Raster(demlist[0]).nodata) run([ 'gdalwarp', '-q', '-of', 'ENVI', '-srcnodata', nodata, '-dstnodata', nodata, demlist, outname ]) if byteorder == 1: swap(outname, outname + '_swap') for item in [outname, outname + '.hdr', outname + '.aux.xml']: os.remove(item) os.rename(outname + '_swap', outname) os.rename(outname + '_swap.hdr', outname + '.hdr') if gammapar: dempar(outname)
def makeSRTM(scenes, srtmdir, outname): """ Create a DEM from SRTM tiles Input is a list of pyroSAR.ID objects from which coordinates are read to determine the required DEM extent Mosaics SRTM DEM tiles, converts them to Gamma format and subtracts offset to WGS84 ellipsoid for DEMs downloaded from USGS http://gdex.cr.usgs.gov or CGIAR http://srtm.csi.cgiar.org """ tempdir = outname + '___temp' os.makedirs(tempdir) hgt_options = hgt(scenes) hgt_files = finder(srtmdir, hgt_options) # todo: check if really needed nodatas = [str(int(raster.Raster(x).nodata)) for x in hgt_files] srtm_vrt = os.path.join(tempdir, 'srtm.vrt') srtm_temp = srtm_vrt.replace('.vrt', '_tmp') srtm_final = srtm_vrt.replace('.vrt', '') run([ 'gdalbuildvrt', '-overwrite', '-srcnodata', ' '.join(nodatas), srtm_vrt, hgt_files ]) run([ 'gdal_translate', '-of', 'ENVI', '-a_nodata', -32768, srtm_vrt, srtm_temp ]) process(['srtm2dem', srtm_temp, srtm_final, srtm_final + '.par', 2, '-'], outdir=tempdir) shutil.move(srtm_final, outname) shutil.move(srtm_final + '.par', outname + '.par') hdr(outname + '.par') shutil.rmtree(tempdir)
def swap(data, outname): """ byte swapping from small to big endian (as required by GAMMA) """ rast = raster.Raster(data) dtype = rast.dtype if rast.format != 'ENVI': raise IOError('only ENVI format supported') dtype_lookup = { 'Int16': 2, 'CInt16': 2, 'Int32': 4, 'Float32': 4, 'CFloat32': 4, 'Float64': 8 } if dtype not in dtype_lookup: raise IOError('data type {} not supported'.format(dtype)) process(['swap_bytes', data, outname, str(dtype_lookup[dtype])]) header = HDRobject(data + '.hdr') header.byte_order = 1 hdr(header, outname + '.hdr')