def add_mtl_info(scene_dict, scene_root, scene_dir): mtl_filename = '%s/%s_MTL.txt' % (scene_dir, scene_root) mtl_dict = mtlutils.parsemeta(mtl_filename) # Strip useless level of indirection. mtl_dict = mtl_dict['L1_METADATA_FILE'] scene_dict['entityId'] = scene_root acq_datetime = datetime.datetime.combine( mtl_dict['PRODUCT_METADATA']['DATE_ACQUIRED'], mtl_dict['PRODUCT_METADATA']['SCENE_CENTER_TIME']) scene_dict['acquisitionDate'] = str(acq_datetime) scene_dict['cloudCover'] = mtl_dict['IMAGE_ATTRIBUTES']['CLOUD_COVER'] scene_dict['processingLevel'] = mtl_dict['PRODUCT_METADATA']['DATA_TYPE'] scene_dict['path'] = mtl_dict['PRODUCT_METADATA']['WRS_PATH'] scene_dict['row'] = mtl_dict['PRODUCT_METADATA']['WRS_ROW'] lats = [mtl_dict['PRODUCT_METADATA']['CORNER_LL_LAT_PRODUCT'], mtl_dict['PRODUCT_METADATA']['CORNER_LR_LAT_PRODUCT'], mtl_dict['PRODUCT_METADATA']['CORNER_UL_LAT_PRODUCT'], mtl_dict['PRODUCT_METADATA']['CORNER_UL_LAT_PRODUCT']] lons = [mtl_dict['PRODUCT_METADATA']['CORNER_LL_LON_PRODUCT'], mtl_dict['PRODUCT_METADATA']['CORNER_LR_LON_PRODUCT'], mtl_dict['PRODUCT_METADATA']['CORNER_UL_LON_PRODUCT'], mtl_dict['PRODUCT_METADATA']['CORNER_UL_LON_PRODUCT']] scene_dict['min_lat'] = min(lats) scene_dict['max_lat'] = max(lats) scene_dict['min_lon'] = min(lons) scene_dict['max_lon'] = max(lons) return scene_dict
def main(infile, inaot, inwv, inoz, outputdir): metadatafile = infile[:-4] + "_MTL.txt" if (os.path.isfile(outputdir+os.sep+os.path.basename(infile).split('.')[0]+"_luts.npz")): print(("%s exists, skipping\n") % (outputdir+os.sep+os.path.basename(infile).split('.')[0]+"_luts.npz")) sys.exit(0) if (os.path.isfile(infile)): try: inds = gdal.Open(infile, gdal.GA_ReadOnly) except: print(("%s could not open.\n") % (infile)) sys.exit(1) else: print(("%s file not found.\n") % (infile)) sys.exit(0) metadata = mtlutils.parsemeta(metadatafile) mymonth = metadata['L1_METADATA_FILE']['PRODUCT_METADATA']['DATE_ACQUIRED'].month myday = metadata['L1_METADATA_FILE']['PRODUCT_METADATA']['DATE_ACQUIRED'].day myhour = metadata['L1_METADATA_FILE']['PRODUCT_METADATA']['SCENE_CENTER_TIME'].hour myminute = metadata['L1_METADATA_FILE']['PRODUCT_METADATA']['SCENE_CENTER_TIME'].minute mysecond = metadata['L1_METADATA_FILE']['PRODUCT_METADATA']['SCENE_CENTER_TIME'].second ## get date and time from Planet file name ## mymonth = np.int(os.path.basename(infile)[4:6]) ## myday = np.int(os.path.basename(infile)[6:8]) ## myhour = np.int(os.path.basename(infile)[9:11]) ## myminute = np.int(os.path.basename(infile)[11:13]) ## mysecond = np.int(os.path.basename(infile)[13:15]) mydechr = myhour + myminute/60.0 + mysecond/3600.0 ## get projection and geotreansform info to determine center longitude and latitude ingt = inds.GetGeoTransform() centerutm = [] centerutm.append(ingt[0] + (inds.RasterXSize * ingt[1])/2.) centerutm.append(ingt[3] + (inds.RasterYSize * ingt[5])/2.) projinfo = osr.SpatialReference() projinfo.ImportFromWkt(inds.GetProjectionRef()) projutm = pyproj.Proj(projinfo.ExportToProj4()) centerlonlat = projutm(centerutm[0], centerutm[1], inverse=True) radmins = np.zeros(7, dtype=np.float32) radmaxs = np.zeros(7, dtype=np.float32) gains = [] offsets = [] gains.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_MULT_BAND_1']) gains.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_MULT_BAND_2']) gains.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_MULT_BAND_3']) gains.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_MULT_BAND_4']) gains.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_MULT_BAND_5']) gains.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_MULT_BAND_6']) gains.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_MULT_BAND_7']) offsets.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_ADD_BAND_1']) offsets.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_ADD_BAND_2']) offsets.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_ADD_BAND_3']) offsets.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_ADD_BAND_4']) offsets.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_ADD_BAND_5']) offsets.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_ADD_BAND_6']) offsets.append(metadata['L1_METADATA_FILE']['RADIOMETRIC_RESCALING']['RADIANCE_ADD_BAND_7']) for band in range(inds.RasterCount): thisBand = inds.GetRasterBand(band+1).ReadAsArray() notzero = np.greater(thisBand, 0) radmins[band] = np.min(thisBand[notzero] * gains[band] + offsets[band]) radmaxs[band] = np.max(thisBand[notzero] * gains[band] + offsets[band]) print(("Range in Band %d: %d, %d") % (band+1, radmins[band], radmaxs[band])) del inds, thisBand rangecoast = np.zeros((2, 256), dtype=np.float32) rangeblue = np.zeros((2, 256), dtype=np.float32) rangegreen = np.zeros((2, 256), dtype=np.float32) rangered = np.zeros((2, 256), dtype=np.float32) rangenir = np.zeros((2, 256), dtype=np.float32) rangeswir1 = np.zeros((2, 256), dtype=np.float32) rangeswir2 = np.zeros((2, 256), dtype=np.float32) for lev in np.arange(256): rangecoast[0, lev] = (lev * (radmaxs[0] - radmins[0])/255. + radmins[0]) rangeblue[0, lev] = (lev * (radmaxs[1] - radmins[1])/255. + radmins[1]) rangegreen[0, lev] = (lev * (radmaxs[2] - radmins[2])/255. + radmins[2]) rangered[0, lev] = (lev * (radmaxs[3] - radmins[3])/255. + radmins[3]) rangenir[0, lev] = (lev * (radmaxs[4] - radmins[4])/255. + radmins[4]) rangeswir1[0, lev] = (lev * (radmaxs[5] - radmins[5])/255. + radmins[5]) rangeswir2[0, lev] = (lev * (radmaxs[6] - radmins[6])/255. + radmins[6]) print("Running Iterations of Atmos. Correction") for lev in np.arange(256): ## create command line string cmd1 = "sbatch -p SHARED -n 1 --mem=100 rad_level_landsat.py "+infile + ((" %d") % (lev)) + (" %6f") % (rangecoast[0,lev]) cmd2a = (" %6f") % (rangeblue[0,lev]) + (" %6f") % (rangegreen[0,lev]) + (" %6f") % (rangered[0,lev]) cmd2b = (" %6f") % (rangenir[0,lev]) + (" %6f") % (rangeswir1[0,lev]) + (" %6f") % (rangeswir2[0,lev]) cmd3 = " " + inaot + " " + inwv + " " + inoz + (" %d") % (mymonth) + (" %d") % (myday) cmd4 = (" %6f") % (mydechr) + (" %8f") % (centerlonlat[0]) + (" %8f") % (centerlonlat[1]) ## cmd1 = "rad_level.py "+infile + ((" %d") % (lev)) + (" %6f") % (rangeblue[0,lev]) ## cmd2 = (" %6f") % (rangegreen[0,lev]) + (" %6f") % (rangered[0,lev]) + (" %6f") % (rangenir[0,lev]) ## cmd3 = " " + inaot + " " + inwv + " " + inoz + (" %d") % (mymonth) + (" %d") % (myday) ## cmd4 = (" %6f") % (mydechr) + (" %8f") % (centerlonlat[0]) + (" %8f") % (centerlonlat[1]) print(cmd1+cmd2a+cmd2b+cmd3+cmd4) subprocess.Popen([cmd1+cmd2a+cmd2b+cmd3+cmd4], cwd=outputdir, shell=True) print("Waiting for 3 minutes") time.sleep(180.0) print("Iterations Done - Finishing LUT") for lev in np.arange(256): inrefl = np.load(outputdir+os.sep+os.path.basename(infile).split('.')[0]+("_%03d" % lev)+".npy") rangecoast[1, lev] = inrefl[0,1] * 10000 rangeblue[1, lev] = inrefl[1,1] * 10000 rangegreen[1, lev] = inrefl[2,1] * 10000 rangered[1, lev] = inrefl[3,1] * 10000 rangenir[1, lev] = inrefl[4,1] * 10000 rangeswir1[1, lev] = inrefl[5,1] * 10000 rangeswir2[1, lev] = inrefl[6,1] * 10000 np.savez(outputdir+os.sep+os.path.basename(infile).split('.')[0][:-4]+"_luts.npz", rangecoast=rangecoast, \ rangeblue=rangeblue, rangegreen=rangegreen, rangered=rangered, rangenir=rangenir, rangeswir1=rangeswir1, \ rangeswir2=rangeswir2) print("Done! Luts saved in " + os.path.basename(infile).split('.')[0][:-4]+"_luts.npz") ## remove the unneeded files for lev in np.arange(256): os.remove(outputdir+os.sep+os.path.basename(infile).split('.')[0]+("_%03d" % lev)+".npy")
def test_quoted_times(self): mtl_dict = mtlutils.parsemeta('data/LC82200762015113LGN00_MTL.txt') self.assertEqual( datetime.time(13, 9, 52, 809375), mtl_dict['L1_METADATA_FILE']['PRODUCT_METADATA']['SCENE_CENTER_TIME'])
def test_unquoted_times(self): mtl_dict = mtlutils.parsemeta('data/LC80010052015083LGN00_MTL.txt') self.assertEqual( datetime.time(14, 8, 18, 854493), mtl_dict['L1_METADATA_FILE']['PRODUCT_METADATA']['SCENE_CENTER_TIME'])
def test_quoted_times(self): mtl_dict = mtlutils.parsemeta('data/LC82200762015113LGN00_MTL.txt') self.assertEqual( datetime.time(13, 9, 52, 809375), mtl_dict['L1_METADATA_FILE'] ['PRODUCT_METADATA']['SCENE_CENTER_TIME'])
def test_unquoted_times(self): mtl_dict = mtlutils.parsemeta('data/LC80010052015083LGN00_MTL.txt') self.assertEqual( datetime.time(14, 8, 18, 854493), mtl_dict['L1_METADATA_FILE'] ['PRODUCT_METADATA']['SCENE_CENTER_TIME'])