diff --git a/dpp/DAScleaner.py b/dpp/DAScleaner.py index 59bdf90..d6a4261 100644 --- a/dpp/DAScleaner.py +++ b/dpp/DAScleaner.py @@ -62,6 +62,7 @@ def __init__(self, root): self.root.bind("", self.add_bad) self.root.bind("", self.add_red) self.root.bind("",self.add_ice) + self.root.bind("", self.add_unknown) def load_directory(self): @@ -82,6 +83,7 @@ def load_directory(self): self.bad_list = [' '] * len(self.file_paths) self.red_list = [' '] * len(self.file_paths) self.ice_list = [' '] *len(self.file_paths) + self.unknown_list = [' '] * len(self.file_paths) self.showships = False @@ -149,7 +151,8 @@ def savetable(self): 'earthquake_flag':self.earthquake_list, 'ice_flag':self.ice_list, 'bad_flag':self.bad_list, - 'red_flag':self.red_list + 'red_flag':self.red_list, + 'unknown_flag':self.unknown_list }) df.to_csv(fname,index=False) prefix = df['Filenames'][0].split('_')[0] @@ -172,12 +175,21 @@ def savetable(self): plotpath = os.path.join(os.path.split(self.file_paths[1])[0] , 'id_flag.png') plt.savefig(plotpath) + def extract_frequency_band(self, path): + # extract frequency band from file path, if format is '0.5Hz_5Hz' + match = re.search(r'(\d+\.?\d*)\s*Hz[_/](\d+\.?\d*)\s*Hz', path, re.IGNORECASE) + if match: + low, high = match.groups() + return f"{low}-{high} Hz" + + return "unknown" + def display_images(self): self.canvas.delete("all") self.current_images.clear() self.current_images = [] - flag_list = list(zip(self.whale_list,self.ship_list,self.earthquake_list,self.ice_list,self.bad_list,self.red_list)) + flag_list = list(zip(self.whale_list,self.ship_list,self.earthquake_list,self.ice_list,self.bad_list,self.red_list, self.unknown_list)) match self.direction: case 'next': @@ -206,13 +218,37 @@ def display_images(self): self.flag_showing[-1] = ''.join(flag_list[self.file_index]) - image = self.array_to_photoimage(combined_array, highlight_region=self.data_showing[-1].shape, file_names=self.files_showing, ships = None) - img_obj = self.canvas.create_image(self.canvas.winfo_width() // 2, self.canvas.winfo_height() // 2, anchor=tk.CENTER, image=image) + image = self.array_to_photoimage( + combined_array, + highlight_region=self.data_showing[-1].shape, + file_names=self.files_showing, + ships=None + ) + + img_obj = self.canvas.create_image( + self.canvas.winfo_width() // 2, + self.canvas.winfo_height() // 2, + anchor=tk.CENTER, + image=image + ) self.current_images.append(image) - self.canvas.config(scrollregion=self.canvas.bbox("all")) + self.canvas.update_idletasks() + + freq_band = self.extract_frequency_band(self.files_showing[-1]) + title_text = f"Frequency band: {freq_band}" + + self.canvas.create_text( + self.canvas.winfo_width() // 2, + 20, + text=title_text, + fill="black", + font=("Arial", 15), + anchor="n" + ) + + self.canvas.config(scrollregion=self.canvas.bbox("all")) - def array_to_photoimage(self, array, highlight_region=None, file_names=None, ships = None): #norm_array = (array - np.min(array)) / (np.max(array) - np.min(array)) # Normalize to 0-1 a_mean = np.mean(array,axis=0) @@ -397,6 +433,14 @@ def add_red(self, event = None): else: self.red_list[self.file_index] = 'R' self.display_images() + + def add_unknown(self, event = None): + self.direction = 'flag' + if self.unknown_list[self.file_index] == 'U': + self.unknown_list[self.file_index] = ' ' + else: + self.unknown_list[self.file_index] = 'U' + self.display_images() def toggleships(self, event = None): self.direction = 'flag' diff --git a/dpp/FetchMapAIS.py b/dpp/FetchMapAIS.py index 13f247e..50a7fd5 100644 --- a/dpp/FetchMapAIS.py +++ b/dpp/FetchMapAIS.py @@ -54,7 +54,8 @@ def get_ais(bbox,start,end,minspeed,token): response = requests.request("POST", aisURL, data=payload, headers=headersList).json() flag = response['success'] rows = response['data'] - columns = ["mmsi", "datettimeUTC", "lon", "lat","CoG", "SoG", "MsgN", "S_kph", "Sec2prev", "Dist2prev", "TrueHeading","rate_of_turn"] + columns = ["mmsi", "datetimeUTC", "lon", "lat", "CoG", "SoG", "MsgN", "S_kph", "Sec2prev", "Dist2prev", "TrueHeading","rate_of_turn"] + df = pd.DataFrame(rows, columns=columns) return flag, df @@ -75,9 +76,28 @@ def get_nameMMSI(mmsi, start,end,token): response = requests.request("POST", mmsiURL, data=payload, headers=headersList).json() flag = response['success'] rows = response['data'] - columns = ["mmsi", "imo_num", "name", "callsign","gt", "length", "draught", "depth", "shiptypelevel", "statcode", "type"] df = pd.DataFrame(rows) - return flag,df + df = df.rename(columns={ + "mmsino": "mmsi", + "imono": "imo_num", + "shipname": "name", + "grosstonnage": "gt", + "shiptypegroupnor": "type", + "breadth": "depth" + }) + + if 'name' not in df.columns: + df['name'] = df['mmsi'] + else: + df['name'] = df['name'].fillna('') + df['name'] = df.apply( + lambda row: f"Unknown {row['mmsi']}" if row['name'] == '' or pd.isna(row['name']) else row['name'], + axis=1 + ) + + df['name'] = df['name'].astype(str) + + return flag, df def cable2linestring(path,zone,southern = False, sp = None,buffer_size = 10000):