def main(): #if not argument provided force the --help flag if (len(sys.argv) == 1): sys.argv.append('-h') # Use the epilog to add usage examples epilog = 'Usage examples:\n\n' epilog += 'Stitch (-a stitch) 1 arcsec dems (-s 1) in the bounding region 31 33 -114 -112 using the url (-u) and the log in credentials provided (-n,-w).\n' epilog += 'Create a rsc metadata file (-m) and report the download results (-r)\n' epilog += 'dem.py -a stitch -b 31 33 -114 -112 -s 1 -m rsc -r -n your_username -w your_password -u https://aria-alt-dav.jpl.nasa.gov/repository/products/SRTM1_v3/ \n\n' epilog += 'Download (-a download) the 3 arcsec (-s 3) whose lat/lon are 31 -114 and 31 -115 (-p)\n' epilog += 'dem.py -a download -p 31 -114 31 -115 -s 3 \n\n' epilog += 'Stitch the requested files and apply EGM96 -> WGS84 correction (-c)\n' epilog += 'dem.py -a stitch -b 31 33 -114 -113 -r -s 1 -c\n\n' epilog += 'Download from bounding boxes (-b)\n' epilog += 'dem.py -a download -b 31 33 -114 -113 -r -s 1\n\n' epilog += 'Stitch the files in the local directory (-l) in the bounding region provided keeping the\n' epilog += 'zip files after stitching (-k)\n' epilog += 'dem.py -a stitch -b 31 33 -114 -113 -k -r -l -s 1\n\n' #set the formatter_class=argparse.RawDescriptionHelpFormatter otherwise it splits the epilog lines with its own default format parser = argparse.ArgumentParser( formatter_class=argparse.RawDescriptionHelpFormatter, epilog=epilog) parser.add_argument( '-a', '--action', type=str, default='stitch', dest='action', help='Possible actions: stitch or download (default: %(default)s). ') parser.add_argument( '-c', '--correct', action='store_true', dest='correct', help= 'Apply correction EGM96 -> WGS84 (default: %(default)s). The output metadata is in xml format only' ) parser.add_argument( '-m', '--meta', type=str, default='xml', dest='meta', help='What type of metadata file is created. Possible values: \ xml or rsc (default: %(default)s)') parser.add_argument( '-s', '--source', type=int, default=1, dest='source', help='Dem SRTM source. Possible values 1 or 3 (default: %(default)s)') parser.add_argument( '-f', '--filling', action='store_true', dest='filling', help='Flag to instruct to fill missing Dems with null values \ (default null value -32768. Use -v or --filling_value option to change it)' ) parser.add_argument( '-v', '--filling_value', type=int, default=-32768, dest='fillingValue', help='Value used to fill missing Dems (default: %(default)s)') parser.add_argument( '-b', '--bbox', type=int, default=None, nargs='+', dest='bbox', help='Defines the spatial region in the format south north west east.\ The values should be integers from (-90,90) for latitudes and (0,360) or (-180,180) for longitudes.' ) parser.add_argument( '-p', '--pairs', type=int, default=None, nargs='+', dest='pairs', help= 'Set of latitude and longitude pairs for which --action = download is performed.\ The values should be integers from (-90,90) for latitudes and (0,360) or (-180,180) for longitudes' ) parser.add_argument( '-k', '--keep', action='store_true', dest='keep', help= 'If the option is present then the single files used for stitching are kept. If -l or --local is specified than the flag is automatically set (default: %(default)s)' ) parser.add_argument( '-r', '--report', action='store_true', dest='report', help= 'If the option is present then failed and succeeded downloads are printed (default: %(default)s)' ) parser.add_argument( '-l', '--local', action='store_true', dest='local', help= 'If the option is present then use the files that are in the location \ specified by --dir. If not present --dir indicates the directory where the files are downloaded (default: %(default)s)' ) parser.add_argument( '-d', '--dir', type=str, dest='dir', default='./', help= 'If used in conjunction with --local it specifies the location where the DEMs are located \ otherwise it specifies the directory where the DEMs are downloaded and the stitched DEM is generated (default: %(default)s)' ) parser.add_argument( '-o', '--output', type=str, dest='output', default=None, help= 'Name of the output file to be created in --dir. If not provided the system generates one based on the bbox extremes' ) parser.add_argument( '-n', '--uname', type=str, dest='uname', default=None, help='User name if using a server that requires authentication') parser.add_argument( '-w', '--password', type=str, dest='password', default=None, help='Password if using a server that requires authentication') parser.add_argument('-t', '--type', type = str, dest = 'type', default = 'version3', help = \ 'Use version 3 or version 2 SRTM') parser.add_argument( '-x', '--noextras', action='store_true', dest='noextras', help='Use this flag if the filenames do not have extra part') parser.add_argument('-u', '--url', type = str, dest = 'url', default = None, help = \ 'If --type=version2 then this is part of the url where the DEM files are located. The actual location must be' + \ 'the one specified by --url plus /srtm/version2_1/SRTM(1,3).' \ +'If --type=version3 then it represents the full path url') args = parser.parse_args() #first get the url,uname and password since are needed in the constructor ds = createDemStitcher(args.type) ds.configure() if (args.url): if (args.type == 'version3'): if (args.source == 1): ds._url1 = args.url elif (args.source == 3): ds._url3 = args.url else: print('Unrecognized source') raise ValueError else: ds.setUrl(args.url) ds.setUsername(args.uname) ds.setPassword(args.password) ds._keepAfterFailed = True #avoid to accidentally remove local file if -k is forgotten #if one wants can remove them manually if (args.local): args.keep = True if (args.meta == 'xml'): ds.setCreateXmlMetadata(True) elif (args.meta == 'rsc'): ds.setCreateRscMetadata(True) if (args.noextras): ds._hasExtras = False ds.setUseLocalDirectory(args.local) ds.setFillingValue(args.fillingValue) ds.setFilling() if args.filling else ds.setNoFilling() if (args.action == 'stitch'): if (args.bbox): lat = args.bbox[0:2] lon = args.bbox[2:4] if (args.output is None): args.output = ds.defaultName(args.bbox) if not (ds.stitchDems( lat, lon, args.source, args.output, args.dir, keep=args.keep)): print( 'Could not create a stitched DEM. Some tiles are missing') else: if (args.correct): #ds.correct(args.output,args.source,width,min(lat[0],lat[1]),min(lon[0],lon[1])) demImg = ds.correct() # replace filename with full path including dir in which file is located demImg.filename = os.path.abspath( os.path.join(args.dir, demImg.filename)) demImg.setAccessMode('READ') demImg.renderHdr() else: print( 'Error. The --bbox (or -b) option must be specified when --action stitch is used' ) raise ValueError elif (args.action == 'download'): if (args.bbox): lat = args.bbox[0:2] lon = args.bbox[2:4] ds.getDemsInBox(lat, lon, args.source, args.dir) #can make the bbox and pairs mutually esclusive if replace the if below with elif if (args.pairs): ds.downloadFilesFromList(args.pairs[::2], args.pairs[1::2], args.source, args.dir) if (not (args.bbox or args.pairs)): print( 'Error. Either the --bbox (-b) or the --pairs (-p) options must be specified when --action download is used' ) raise ValueError else: print('Unrecognized action -a or --action', args.action) return if (args.report): for k, v in list(ds._downloadReport.items()): print(k, '=', v)
def downloadDem(bbox, demType='version3', resolution=1, fillingValue=-32768, outputFile=None, userName=None, passWord=None): ''' bbox: [s, n, w, e] demType: can be 'version3' or 'nasadem'. nasadem is also tested. resolution: 1 or 3, NASADEM only available in 1-arc sec resolution ''' import numpy as np import isceobj from contrib.demUtils import createDemStitcher ds = createDemStitcher(demType) ds.configure() if demType == 'version3': if resolution == 1: ds._url1 = 'http://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL1.003/2000.02.11' else: ds._url3 = 'http://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL3.003/2000.02.11' elif demType == 'nasadem': resolution = 1 #this url is included in the module #ds._url1 = 'http://e4ftl01.cr.usgs.gov/MEASURES/NASADEM_HGT.001/2000.02.11' else: raise Exception( 'unknown DEM type, currently supported DEM types: version3 and nasadem' ) ds.setUsername(userName) ds.setPassword(passWord) ds._keepAfterFailed = True ds.setCreateXmlMetadata(True) ds.setUseLocalDirectory(False) ds.setFillingValue(fillingValue) ds.setFilling() bbox = [ np.int(np.floor(bbox[0])), np.int(np.ceil(bbox[1])), np.int(np.floor(bbox[2])), np.int(np.ceil(bbox[3])) ] if outputFile == None: outputFile = ds.defaultName(bbox) if not (ds.stitchDems( bbox[0:2], bbox[2:4], resolution, outputFile, './', keep=True)): print('Could not create a stitched DEM. Some tiles are missing') else: #Apply correction EGM96 -> WGS84 demImg = ds.correct() #report downloads for k, v in list(ds._downloadReport.items()): print(k, '=', v)