def get_dates(inps): # Given the SLC directory This function extracts the acquisition dates # and prepares a dictionary of sentinel slc files such that keys are # acquisition dates and values are object instances of sentinelSLC class # which is defined in Stack.py if inps.bbox is not None: bbox = [float(val) for val in inps.bbox.split()] if inps.exclude_dates is not None: excludeList = inps.exclude_dates.split(',') else: excludeList = [] if inps.include_dates is not None: includeList = inps.include_dates.split(',') else: includeList = [] if os.path.isfile(inps.slc_dirname): print('reading SAFE files from: ' + inps.slc_dirname) SAFE_files = [] for line in open(inps.slc_dirname): SAFE_files.append(str.replace(line,'\n','').strip()) else: SAFE_files = glob.glob(os.path.join(inps.slc_dirname,'S1*_IW_SLC*zip')) # changed to zip file by Minyan Zhong if len(SAFE_files) == 0: raise Exception('No SAFE file found') elif len(SAFE_files) == 1: raise Exception('At least two SAFE file is required. Only one SAFE file found.') else: print ("Number of SAFE files found: "+str(len(SAFE_files))) if inps.startDate is not None: stackStartDate = datetime.datetime(*time.strptime(inps.startDate, "%Y-%m-%d")[0:6]) else: #if startDate is None let's fix it to first JPL's staellite lunch date :) stackStartDate = datetime.datetime(*time.strptime("1958-01-31", "%Y-%m-%d")[0:6]) if inps.stopDate is not None: stackStopDate = datetime.datetime(*time.strptime(inps.stopDate, "%Y-%m-%d")[0:6]) else: stackStopDate = datetime.datetime(*time.strptime("2158-01-31", "%Y-%m-%d")[0:6]) ################################ # write down the list of SAFE files in a txt file which will be used: f = open('SAFE_files.txt','w') safe_count=0 safe_dict={} #bbox_poly = [[bbox[0],bbox[2]],[bbox[0],bbox[3]],[bbox[1],bbox[3]],[bbox[1],bbox[2]]] bbox_poly = np.array([[bbox[2],bbox[0]],[bbox[3],bbox[0]],[bbox[3],bbox[1]],[bbox[2],bbox[1]]]) def generate_geopolygon(bbox): """generate geopandas GeoDataFrame Polygon""" # convert pnts to geopandas format # the order of pnts is conter-clockwise, starting from the lower ldft corner # the order for Point is lon,lat p1 = Point(bbox[0][0], bbox[0][1]) p2 = Point(bbox[1][0], bbox[1][1]) p3 = Point(bbox[2][0], bbox[2][1]) p4 = Point(bbox[3][0], bbox[3][1]) np1 = (p1.coords.xy[0][0], p1.coords.xy[1][0]) np2 = (p2.coords.xy[0][0], p2.coords.xy[1][0]) np3 = (p3.coords.xy[0][0], p3.coords.xy[1][0]) np4 = (p4.coords.xy[0][0], p4.coords.xy[1][0]) bb_polygon = Polygon([np1, np2, np3, np4]) bb_geopolygon = gpd.GeoDataFrame(gpd.GeoSeries(bb_polygon), columns=['geometry']) return bb_geopolygon for safe in SAFE_files: safeObj=sentinelSLC(safe) safeObj.get_dates() if safeObj.start_date_time < stackStartDate or safeObj.start_date_time > stackStopDate: excludeList.append(safeObj.date) continue safeObj.get_orbit(inps.orbit_dirname, inps.work_dir) # check if the date safe file is needed to cover the BBOX reject_SAFE=False if safeObj.date not in excludeList and inps.bbox is not None: reject_SAFE=True pnts = safeObj.getkmlQUAD(safe) # process pnts to use generate_geopolygon function pnts_bbox = np.empty((4,2)) count = 0 for pnt in pnts: pnts_bbox[count, 0] = float(pnt.split(',')[0]) # longitude pnts_bbox[count, 1] = float(pnt.split(',')[1]) # latitude count += 1 pnts_polygon = generate_geopolygon(pnts_bbox) bbox_polygon = generate_geopolygon(bbox_poly) # judge whether these two polygon overlap overlap_flag = gpd.overlay(pnts_polygon, bbox_polygon, how='intersection') if overlap_flag.empty: reject_SAFE = True else: reject_SAFE = False if not reject_SAFE: if safeObj.date not in safe_dict.keys() and safeObj.date not in excludeList: safe_dict[safeObj.date]=safeObj elif safeObj.date not in excludeList: safe_dict[safeObj.date].safe_file = safe_dict[safeObj.date].safe_file + ' ' + safe # write the SAFE file as it will be used f.write(safe + '\n') safe_count += 1 # closing the SAFE file overview f.close() print ("Number of SAFE files to be used (cover BBOX): "+str(safe_count)) ################################ dateList = [key for key in safe_dict.keys()] dateList.sort() print ("*****************************************") print ("Number of dates : " +str(len(dateList))) print ("List of dates : ") print (dateList) ################################ #get the overlap lat and lon bounding box S=[] N=[] W=[] E=[] safe_dict_bbox={} safe_dict_bbox_finclude={} safe_dict_finclude={} safe_dict_frameGAP={} print ('date south north') for date in dateList: #safe_dict[date].get_lat_lon() safe_dict[date].get_lat_lon_v2() #safe_dict[date].get_lat_lon_v3(inps) S.append(safe_dict[date].SNWE[0]) N.append(safe_dict[date].SNWE[1]) W.append(safe_dict[date].SNWE[2]) E.append(safe_dict[date].SNWE[3]) print (date , safe_dict[date].SNWE[0],safe_dict[date].SNWE[1]) if inps.bbox is not None: if safe_dict[date].SNWE[0] <= bbox[0] and safe_dict[date].SNWE[1] >= bbox[1]: safe_dict_bbox[date] = safe_dict[date] safe_dict_bbox_finclude[date] = safe_dict[date] elif date in includeList: safe_dict_finclude[date] = safe_dict[date] safe_dict_bbox_finclude[date] = safe_dict[date] # tracking dates for which there seems to be a gap in coverage if not safe_dict[date].frame_nogap: safe_dict_frameGAP[date] = safe_dict[date] print ("*****************************************") print ("The overlap region among all dates (based on the preview kml files):") print (" South North East West ") print (max(S),min(N),max(W),min(E)) print ("*****************************************") if max(S) > min(N): print ("""WARNING: There might not be overlap between some dates""") print ("*****************************************") ################################ print ('All dates (' + str(len(dateList)) + ')') print (dateList) print("") if inps.bbox is not None: safe_dict = safe_dict_bbox dateList = [key for key in safe_dict.keys()] dateList.sort() print ('dates covering the bbox (' + str(len(dateList)) + ')' ) print (dateList) print("") if len(safe_dict_finclude)>0: # updating the dateList that will be used for those dates that are forced include # but which are not covering teh BBOX completely safe_dict = safe_dict_bbox_finclude dateList = [key for key in safe_dict.keys()] dateList.sort() # sorting the dates of the forced include dateListFinclude = [key for key in safe_dict_finclude.keys()] print('dates forced included (do not cover the bbox completely, ' + str(len(dateListFinclude)) + ')') print(dateListFinclude) print("") # report any potential gaps in fame coverage if len(safe_dict_frameGAP)>0: dateListframeGAP = [key for key in safe_dict_frameGAP.keys()] print('dates for which it looks like there are missing frames') print(dateListframeGAP) print("") if inps.master_date is None: if len(dateList)<1: print('*************************************') print('Error:') print('No acquisition forfills the temporal range and bbox requirement.') sys.exit(1) inps.master_date = dateList[0] print ("The master date was not chosen. The first date is considered as master date.") print ("") print ("All SLCs will be coregistered to : " + inps.master_date) slaveList = [key for key in safe_dict.keys()] slaveList.sort() slaveList.remove(inps.master_date) print ("slave dates :") print (slaveList) print ("") return dateList, inps.master_date, slaveList, safe_dict
def get_dates(inps): # Given the SLC directory This function extracts the acquisition dates # and prepares a dictionary of sentinel slc files such that keys are # acquisition dates and values are object instances of sentinelSLC class # which is defined in Stack.py if inps.bbox is not None: bbox = [float(val) for val in inps.bbox.split()] if inps.exclude_dates is not None: excludeList = inps.exclude_dates.split(',') else: excludeList = [] if inps.include_dates is not None: includeList = inps.include_dates.split(',') else: includeList = [] if os.path.isfile(inps.slc_dirname): print('reading SAFE files from: ' + inps.slc_dirname) SAFE_files = [] for line in open(inps.slc_dirname): SAFE_files.append(str.replace(line,'\n','').strip()) else: SAFE_files = glob.glob(os.path.join(inps.slc_dirname,'S1*_IW_SLC*zip')) # changed to zip file by Minyan Zhong if len(SAFE_files) == 0: raise Exception('No SAFE file found') elif len(SAFE_files) == 1: raise Exception('At least two SAFE file is required. Only one SAFE file found.') else: print ("Number of SAFE files found: "+str(len(SAFE_files))) if inps.startDate is not None: stackStartDate = datetime.datetime(*time.strptime(inps.startDate, "%Y-%m-%d")[0:6]) else: #if startDate is None let's fix it to first JPL's staellite lunch date :) stackStartDate = datetime.datetime(*time.strptime("1958-01-31", "%Y-%m-%d")[0:6]) if inps.stopDate is not None: stackStopDate = datetime.datetime(*time.strptime(inps.stopDate, "%Y-%m-%d")[0:6]) else: stackStopDate = datetime.datetime(*time.strptime("2158-01-31", "%Y-%m-%d")[0:6]) ################################ # write down the list of SAFE files in a txt file which will be used: f = open('SAFE_files.txt','w') safe_count=0 safe_dict={} bbox_poly = [[bbox[0],bbox[2]],[bbox[0],bbox[3]],[bbox[1],bbox[3]],[bbox[1],bbox[2]]] for safe in SAFE_files: safeObj=sentinelSLC(safe) safeObj.get_dates() if safeObj.start_date_time < stackStartDate or safeObj.start_date_time > stackStopDate: excludeList.append(safeObj.date) continue safeObj.get_orbit(inps.orbit_dirname, inps.work_dir) # check if the date safe file is needed to cover the BBOX reject_SAFE=False if safeObj.date not in excludeList and inps.bbox is not None: reject_SAFE=True pnts = safeObj.getkmlQUAD(safe) # looping over the corners, keep the SAF is one of the corners is within the BBOX lats = [] lons = [] for pnt in pnts: lon = float(pnt.split(',')[0]) lat = float(pnt.split(',')[1]) # keep track of all the corners to see of the product is larger than the bbox lats.append(lat) lons.append(lon) import matplotlib from matplotlib.path import Path as Path # bbox = SNWE # polygon = bbox[0] bbox[2] SW # bbox[0] bbox[3] SE # bbox[1] bbox[3] NE # bbox[1] bbox[2] NW poly =Path(bbox_poly) point = (lat,lon) in_bbox = poly.contains_point(point) # product corner falls within BBOX (SNWE) if in_bbox: reject_SAFE=False # If the product is till being rejected, check if the BBOX corners fall within the frame if reject_SAFE: for point in bbox_poly: frame= [[a,b] for a,b in zip(lats,lons)] poly=Path(frame) in_frame = poly.contains_point(point) if in_frame: reject_SAFE=False if not reject_SAFE: if safeObj.date not in safe_dict.keys() and safeObj.date not in excludeList: safe_dict[safeObj.date]=safeObj elif safeObj.date not in excludeList: safe_dict[safeObj.date].safe_file = safe_dict[safeObj.date].safe_file + ' ' + safe # write the SAFE file as it will be used f.write(safe + '\n') safe_count += 1 # closing the SAFE file overview f.close() print ("Number of SAFE files to be used (cover BBOX): "+str(safe_count)) ################################ dateList = [key for key in safe_dict.keys()] dateList.sort() print ("*****************************************") print ("Number of dates : " +str(len(dateList))) print ("List of dates : ") print (dateList) ################################ #get the overlap lat and lon bounding box S=[] N=[] W=[] E=[] safe_dict_bbox={} safe_dict_bbox_finclude={} safe_dict_finclude={} safe_dict_frameGAP={} print ('date south north') for date in dateList: #safe_dict[date].get_lat_lon() safe_dict[date].get_lat_lon_v2() #safe_dict[date].get_lat_lon_v3(inps) S.append(safe_dict[date].SNWE[0]) N.append(safe_dict[date].SNWE[1]) W.append(safe_dict[date].SNWE[2]) E.append(safe_dict[date].SNWE[3]) print (date , safe_dict[date].SNWE[0],safe_dict[date].SNWE[1]) if inps.bbox is not None: if safe_dict[date].SNWE[0] <= bbox[0] and safe_dict[date].SNWE[1] >= bbox[1]: safe_dict_bbox[date] = safe_dict[date] safe_dict_bbox_finclude[date] = safe_dict[date] elif date in includeList: safe_dict_finclude[date] = safe_dict[date] safe_dict_bbox_finclude[date] = safe_dict[date] # tracking dates for which there seems to be a gap in coverage if not safe_dict[date].frame_nogap: safe_dict_frameGAP[date] = safe_dict[date] print ("*****************************************") print ("The overlap region among all dates (based on the preview kml files):") print (" South North East West ") print (max(S),min(N),max(W),min(E)) print ("*****************************************") if max(S) > min(N): print ("""WARNING: There might not be overlap between some dates""") print ("*****************************************") ################################ print ('All dates (' + str(len(dateList)) + ')') print (dateList) print("") if inps.bbox is not None: safe_dict = safe_dict_bbox dateList = [key for key in safe_dict.keys()] dateList.sort() print ('dates covering the bbox (' + str(len(dateList)) + ')' ) print (dateList) print("") if len(safe_dict_finclude)>0: # updating the dateList that will be used for those dates that are forced include # but which are not covering teh BBOX completely safe_dict = safe_dict_bbox_finclude dateList = [key for key in safe_dict.keys()] dateList.sort() # sorting the dates of the forced include dateListFinclude = [key for key in safe_dict_finclude.keys()] print('dates forced included (do not cover the bbox completely, ' + str(len(dateListFinclude)) + ')') print(dateListFinclude) print("") # report any potential gaps in fame coverage if len(safe_dict_frameGAP)>0: dateListframeGAP = [key for key in safe_dict_frameGAP.keys()] print('dates for which it looks like there are missing frames') print(dateListframeGAP) print("") if inps.master_date is None: if len(dateList)<1: print('*************************************') print('Error:') print('No acquisition forfills the temporal range and bbox requirement.') sys.exit(1) inps.master_date = dateList[0] print ("The master date was not chosen. The first date is considered as master date.") print ("") print ("All SLCs will be coregistered to : " + inps.master_date) slaveList = [key for key in safe_dict.keys()] slaveList.sort() slaveList.remove(inps.master_date) print ("slave dates :") print (slaveList) print ("") return dateList, inps.master_date, slaveList, safe_dict
def get_dates(inps): # Given the SLC directory This function extracts the acquisition dates # and prepares a dictionary of sentinel slc files such that keys are # acquisition dates and values are object instances of sentinelSLC class # which is defined in Stack.py if inps.bbox is not None: bbox = [float(val) for val in inps.bbox.split()] if os.path.isfile(inps.slc_dirname): print('reading SAFE files from: ' + inps.slc_dirname) SAFE_files = [] for line in open(inps.slc_dirname): SAFE_files.append(str.replace(line, '\n', '').strip()) else: SAFE_files = glob.glob(os.path.join( inps.slc_dirname, 'S1*_IW_SLC*zip')) # changed to zip file by Minyan Zhong if len(SAFE_files) == 0: raise Exception('No SAFE file found') else: print("Number of SAFE files found: " + str(len(SAFE_files))) ################################ # write down the list of SAFE files in a txt file: f = open('SAFE_files.txt', 'w') for safe in SAFE_files: f.write(safe + '\n') f.close() ################################ # group the files based on dates safe_dict = {} for safe in SAFE_files: safeObj = sentinelSLC(safe) safeObj.get_dates() safeObj.get_orbit(inps.orbit_dirname, inps.work_dir) if safeObj.date not in safe_dict.keys(): safe_dict[safeObj.date] = safeObj else: safe_dict[safeObj.date].safe_file = safe_dict[ safeObj.date].safe_file + ' ' + safe ################################ dateList = [key for key in safe_dict.keys()] dateList.sort() print("*****************************************") print("Number of dates : " + str(len(dateList))) print("List of dates : ") print(dateList) ################################ #get the files covering the bounding box S = [] N = [] W = [] E = [] safe_dict_bbox = {} print('date south north west east') for date in dateList: #safe_dict[date].get_lat_lon() safe_dict[date].get_lat_lon_v2() #safe_dict[date].get_lat_lon_v3(inps) S.append(safe_dict[date].SNWE[0]) N.append(safe_dict[date].SNWE[1]) W.append(safe_dict[date].SNWE[2]) E.append(safe_dict[date].SNWE[3]) print(date, safe_dict[date].SNWE[0], safe_dict[date].SNWE[1], safe_dict[date].SNWE[2], safe_dict[date].SNWE[3]) if inps.bbox is not None: if safe_dict[date].SNWE[0] <= bbox[0] and safe_dict[date].SNWE[ 1] >= bbox[1] and safe_dict[date].SNWE[2] <= bbox[ 2] and safe_dict[date].SNWE[3] >= bbox[3]: safe_dict_bbox[date] = safe_dict[date] print("*****************************************") ################################ print('All dates') print(dateList) if inps.bbox is not None: safe_dict = safe_dict_bbox dateList = [key for key in safe_dict.keys()] dateList.sort() print('dates covering the bbox') print(dateList) return dateList, safe_dict