#! /usr/bin/env python ################################################################# ### This program is part of PyINT v2.1 ### ### Copy Right (c): 2017-2019, Yunmeng Cao ### ### Author: Yunmeng Cao ### ### Contact : ymcmrs@gmail.com ### ################################################################# import numpy as np import os import sys import getopt import array import argparse from skimage import io from pyint import _utils as ut def get_sufix(STR): n = len(STR.split('.')) SUFIX = STR.split('.')[n-1] return SUFIX def read_region(STR): WEST = STR.split('/')[0] EAST = STR.split('/')[1].split('/')[0] SOUTH = STR.split(EAST+'/')[1].split('/')[0] NORTH = STR.split(EAST+'/')[1].split('/')[1] WEST =float(WEST) SOUTH=float(SOUTH) EAST=float(EAST) NORTH=float(NORTH) return WEST,SOUTH,EAST,NORTH def write_demrsc_file(FILE,Corner_LON,Corner_LAT,X_STEP,Y_STEP,WIDTH,LENGTH): f = open(FILE,'w') f.write('DATE12 111111-222222\n') f.write('FILE_LENGTH ' + str(int(LENGTH)) + '\n') f.write('FILE_TYPE .dem\n') f.write('PROCESSOR roipac\n') f.write('PROJECTION LATLON\n') f.write('RLOOKS 1\n') f.write('WIDTH ' + str(int(WIDTH)) + '\n') f.write('XMAX ' + str(int(int(WIDTH)-1)) + '\n') f.write('XMIN 0\n') f.write('X_FIRST ' + str(float(Corner_LON)) + '\n') f.write('X_STEP ' + str(float(X_STEP)) + '\n') f.write('X_UNIT degrees\n') f.write('YMAX ' + str(int(int(LENGTH)-1)) + '\n') f.write('YMIN 0\n') f.write('Y_FIRST ' + str(float(Corner_LAT)) + '\n') f.write('Y_STEP ' + str(float(Y_STEP)) + '\n') f.write('Y_UNIT degrees\n') f.write('Z_OFFSET 0\n') f.write('Z_SCALE 1\n') f.close def write_dempar_file(FILE,Corner_LON,Corner_LAT,X_STEP,Y_STEP,WIDTH,LENGTH,DATA_FORMAT): DEM_TYPE = 'SRTM1' Proj = 'EQA' f=open(FILE,'w') f.write("Gamma DIFF&GEO DEM/MAP parameter file\n") f.write("title:\tIMPORTED DEM FROM %s\n" % DEM_TYPE) # SRTM1 (30m) or SRTM3 (90m) f.write("DEM_projection: %s\n" % Proj) # Projection should be checked. f.write("data_format: %s\n" % DATA_FORMAT) # INTEGER*2 OR REAL*4 should be modified f.write("DEM_hgt_offset: 0.00000\n") f.write("DEM_scale: 1.00000\n") f.write("width: %s\n" % WIDTH) f.write("nlines: %s\n" % LENGTH) f.write("corner_lat: %s decimal degrees\n" % Corner_LAT) f.write("corner_lon: %s decimal degrees\n" % Corner_LON) f.write("post_lat: %s decimal degrees\n" % Y_STEP) f.write("post_lon: %s decimal degrees\n" % X_STEP) f.write("\n") f.write("ellipsoid_name: WGS 84\n") f.write("ellipsoid_ra: 6378137.000 m\n") f.write("ellipsoid_reciprocal_flattening: 298.2572236\n") f.write("\n") f.write("datum_name: WGS 1984\n") f.write("datum_shift_dx: 0.000 m\n") f.write("datum_shift_dy: 0.000 m\n") f.write("datum_shift_dz: 0.000 m\n") f.write("datum_scale_m: 0.00000e+00\n") f.write("datum_rotation_alpha: 0.00000e+00 arc-sec\n") f.write("datum_rotation_beta: 0.00000e+00 arc-sec\n") f.write("datum_rotation_gamma: 0.00000e+00 arc-sec\n") f.write("datum_country_list Global Definition, WGS84, World\n") f.write("\n") f.close() def UseGamma(inFile, task, keyword): if task == "read": f = open(inFile, "r") while 1: line = f.readline() if not line: break if line.count(keyword) == 1: strtemp = line.split(":") value = strtemp[1].strip() return value print("Keyword " + keyword + " doesn't exist in " + inFile) f.close() ######################################################################### INTRODUCTION = ''' ############################################################################# Copy Right(c): 2017-2019, Yunmeng Cao [ymcmrs@gmail.com] Generating DEM used in interferometry both for GAMMA and ROI_PAC processor. 1) Available raw DEM files can be used, e.g., dem.tif, dem.grd; 2) If no raw DEM is provided, SRTM-1 (30m) can be downloaded automatically. Requirement: Python 2.7 or higher version. GDAL should be installed in your PC. ''' EXAMPLE = ''' Usage: makedem.py -r west/east/south/north -d raw_demfile -p processor -o output makedem.py -r west/east/south/north -p processor makedem.py -d raw_demfile --byteorder Examples: makedem.py -r " -118/-116/33/34 " -p gamma -o SouthCalifornia makedem.py -r " -118/-116/33/34 " --byteorder little makedem.py -d dem.tif -p roi_pac --byteorder big makedem.py -s 20101108.slc.par -p roi_pac ############################################################################## ''' def cmdLineParse(): parser = argparse.ArgumentParser(description='Generate DEM for interferometry processing.',\ formatter_class=argparse.RawTextHelpFormatter,\ epilog=INTRODUCTION+'\n'+EXAMPLE) #parser.add_argument('-r','--lalo', dest='region', nargs=4, type=float, help='lalo limit') parser.add_argument('-r',dest = 'region',help='Research region, west/east/south/north.') parser.add_argument('-d', dest='dem', help='Raw dem file that used for further processing.') parser.add_argument('-s', dest='par', help='SLC parameter file of SAR image used for determining research region.') parser.add_argument('-p', dest='processor', help='Interferometry processor. [ gamma or roi_pac ] [default: gamma]') parser.add_argument('-o', dest='out', help='Output name of the generated DEM.') parser.add_argument('--byteorder', dest='byteorder', help='Byteorder of the generated DEM: big or little. [default: big for gamma and little for roi_pac]') parser.add_argument('--dir', dest='PATH', help='Processing directory for generating DEM. [default: Current directory]') inps = parser.parse_args() if not inps.region and not inps.dem and not inps.par: parser.print_usage() sys.exit(os.path.basename(sys.argv[0])+': error: research region, raw_demfile and SLC parameter file, at least one is needed.') return inps ################################################################################ def main(argv): inps = cmdLineParse() if inps.par: Par = inps.par print("SLC_par file is provided: %s" % Par) print("SRTM1 over research region will be downloaded automatically based on %s" % Par) call_str = "SLC_corners "+ Par + " > corners.txt" os.system(call_str) File = open("corners.txt","r") InfoLine = File.readlines()[8:10] File.close() MinLat = float(InfoLine[0].split(':')[1].split(' max. ')[0]) MaxLat = float(InfoLine[0].split(':')[2]) MinLon = float(InfoLine[1].split(':')[1].split(' max. ')[0]) MaxLon = float(InfoLine[1].split(':')[2]) north = int(MaxLat) + 2 south = int(MinLat) east = int(MaxLon) + 2 west = int(MinLon) if inps.region: region = inps.region west,south,east,north = read_region(region) #print 'Research region: %s/%s/%s/%s' % west,south,east,north if inps.dem: dem = inps.dem print('Raw dem file is provided: %s .' % dem) if inps.out: Name = inps.out else: Name = "out" if inps.processor: processor = inps.processor else: processor ='gamma' if inps.byteorder: Byteorder = inps.byteorder else: if processor == 'gamma': Byteorder = 'big' else: Byteorder ='little' if inps.PATH: workdir = inps.PATH else: workdir = os.getcwd() os.chdir(workdir) if not inps.dem: print('Research region: %s(west) %s(south) %s(east) %s(north)' % (west,south,east,north)) print('>>> Ready to download SRTM1 dem over research region.') #call_str='wget -q -O dem.tif "http://ot-data1.sdsc.edu:9090/otr/getdem?north=%f&south=%f&east=%f&west=%f&demtype=SRTMGL1"' % (north,south,east,west) #os.system(call_str) #call_str = 'eio --product SRTM1 clip -o dem.tif --bounds ' + str(west) + ' ' + str(south) + ' ' + str(east) + ' ' + str(north) call_str = 'sardem --bbox ' + str(west) + ' ' + str(south) + ' ' + str(east) + ' ' + str(north) + ' -o ' + Name + '.dem' os.system(call_str) print('>>> DEM download finished.') DEM_TYPE='SRTM1' Proj = 'EQA' DEM = 'dem.tif' call_str = 'gdal_translate ' + Name + '.dem' + ' -of GTiff ' + DEM os.system(call_str) else: DEM = inps.dem SUFIX = get_sufix(DEM) SS ='.' + SUFIX DTIF = DEM.replace(SS,'.tif') if not SUFIX == 'tif': call_str = 'gdal_translate ' + DEM + ' -of GTiff ' + DTIF os.system(call_str) DEM = DTIF call_str = 'gdalinfo ' + DEM + ' >ttt' os.system(call_str) f = open('ttt') for line in f: if 'Origin =' in line: STR1 = line AA = STR1.split('Origin =')[1] Corner_LON = AA.split('(')[1].split(',')[0] Corner_LAT = AA.split('(')[1].split(',')[1].split(')')[0] elif 'Pixel Size ' in line: STR2 = line AA = STR2.split('Pixel Size =')[1] Post_LON = AA.split('(')[1].split(',')[0] Post_LAT = AA.split('(')[1].split(',')[1].split(')')[0] elif 'Size is' in line: STR3 = line AA =STR3.split('Size is')[1] WIDTH = AA.split(',')[0] FILE_LENGTH = AA.split(',')[1] f.close() dem_data = io.imread(DEM) if dem_data.dtype=='float32': DATA_FORMAT='REAL*4' else: DATA_FORMAT='INTEGER*2' if not sys.byteorder == Byteorder: dem_data.byteswap(True) if processor =='gamma': DEMDATA = Name + '.dem' DEMPAR = Name + '.dem.par' elif processor =='roi_pac': DEMDATA = Name + '.dem' DEMPAR = Name + '.dem.rsc' dem_data.tofile(DEMDATA) if processor =='gamma': write_dempar_file(DEMPAR,Corner_LON,Corner_LAT,Post_LON,Post_LAT,WIDTH,FILE_LENGTH,DATA_FORMAT) elif processor =='roi_pac': write_demrsc_file(DEMPAR,Corner_LON,Corner_LAT,Post_LON,Post_LAT,WIDTH,FILE_LENGTH) BB =Byteorder + ' endian' print('') print('%s %s and %s are generated.' % (BB,DEMDATA,DEMPAR)) print('Congratulations! Done!') #print "Generating %s processor %s and %s is done!" % (processor,DEMDATA,DEMPAR) sys.exit(1) if __name__ == '__main__': main(sys.argv[1:])