diff --git a/calipso/db.py b/calipso/db.py index 2eac558..c184191 100644 --- a/calipso/db.py +++ b/calipso/db.py @@ -307,7 +307,7 @@ def import_from_json(self, zip_fname): fshape = data[key][shape] tag = 'shape' + str(new) time = datetime.strptime(data['time'], DATEFORMAT) - hdf = data['hdfFile'] + hdf = data['hdffile'] color = fshape['color'] coordinates = fshape['coordinates'] attributes = fshape['attributes'] diff --git a/calipso/importdialog.py b/calipso/importdialog.py index 177a781..a8d29b9 100644 --- a/calipso/importdialog.py +++ b/calipso/importdialog.py @@ -15,7 +15,7 @@ from constants import CSV, TXT, DATEFORMAT, ICO from sqlalchemy import or_, Time, cast from db import db, DatabasePolygon -from tools.tools import center, get_shape_ranges, find_between, get_sec +from tools.tools import center, get_shape_ranges, find_between, get_sec, coord_tuple_list, coord_string from tools.treelistbox import TreeListBox from tools.tooltip import create_tool_tip from log.log import logger @@ -60,14 +60,15 @@ def __init__(self, root, master): self.filter_file = IntVar() # int_var for filtering by file self.advance_dialog = False self.extract_dialog = False - self.column_titles = ['name', 'plot', 'time range', 'latitude range', + self.column_titles = ['name', 'plot', 'time range', 'coordinates (time and alt.)','latitude range', 'altitude range', 'attributes', 'notes', 'last edited', 'file'] self.plot_type = StringVar() self.beg_time = None self.end_time = None - self.beg_lat = None + self.coordinates = None + self.beg_lat = None self.end_lat = None self.beg_alt = None self.end_alt = None @@ -185,10 +186,15 @@ def get_current_file_shapes(self): hdf=fn ): time_range = '%s - %s' % (obj.begin_time.strftime(DATEFORMAT), obj.end_time.strftime('%H:%M:%S')) - altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt) + + coord_list = obj.coordinates + final_coord_list = coord_tuple_list(coord_list) + final_coord_list = coord_string(final_coord_list) + + altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt) lat_range = '%.3f - %.3f' % (obj.begin_lat, obj.end_lat) lst.append( - (obj.tag, obj.plot, time_range, lat_range, altitude_range, obj.attributes[1:-1], + (obj.tag, obj.plot, time_range, final_coord_list, lat_range, altitude_range, obj.attributes[1:-1], obj.notes, obj.time_.strftime(DATEFORMAT), obj.hdf)) if not lst: logger.warning('Query returned None, no shapes found') @@ -228,10 +234,14 @@ def refine_search(self, event): DatabasePolygon.attributes.contains(self.__search_string.strip()), DatabasePolygon.notes.contains(self.__search_string.strip()))): time_range = '%s - %s' % (obj.begin_time.strftime(DATEFORMAT), obj.end_time.strftime('%H:%M:%S')) - altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt) + coord_list = obj.coordinates + final_coord_list = coord_tuple_list(coord_list) + final_coord_list = coord_string(final_coord_list) + altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt) lat_range = '%.3f - %.3f' % (obj.begin_lat, obj.end_lat) lst.append( # append any objects that were returned by the query - (obj.tag, obj.plot, time_range, lat_range, altitude_range, obj.attributes[1:-1], + (obj.tag, obj.plot, time_range, final_coord_list, + lat_range, altitude_range, obj.attributes[1:-1], obj.notes, obj.time_.strftime(DATEFORMAT), obj.hdf)) # push new query onto the stack and set display to list if self.filter_file.get(): @@ -320,10 +330,15 @@ def __display_all(self): self.__stack.append(self.tree.info) for obj in self.session.query(DatabasePolygon).all(): time_range = '%s - %s' % (obj.begin_time.strftime(DATEFORMAT), obj.end_time.strftime('%H:%M:%S')) - altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt) + + coord_list = obj.coordinates + final_coord_list = coord_tuple_list(coord_list) + final_coord_list = coord_string(final_coord_list) + + altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt) lat_range = '%.3f - %.3f' % (obj.begin_lat, obj.end_lat) - lst.append( # user see's this list - (obj.tag, obj.plot, time_range, lat_range, altitude_range, obj.attributes[1:-1], + lst.append(# user sees this list + (obj.tag, obj.plot, time_range, final_coord_list, lat_range, altitude_range, obj.attributes[1:-1], obj.notes, obj.time_.strftime(DATEFORMAT), obj.hdf)) self.tree.info = lst @@ -402,7 +417,12 @@ def receive_advanced_search(self, observer): for obj in query_result: time_range = '%s - %s' % (obj.begin_time.strftime(DATEFORMAT), obj.end_time.strftime('%H:%M:%S')) - altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt) + + coord_list = obj.coordinates + final_coord_list = coord_tuple_list(coord_list) + final_coord_list = coord_string(final_coord_list) + + altitude_range = '%.3f - %.3f' % (obj.begin_alt, obj.end_alt) lat_range = '%.3f - %.3f' % (obj.begin_lat, obj.end_lat) # If we're parsing a date, we can't just filter as we must transform # coordinates into time_range first, so we need to manually check and @@ -417,7 +437,7 @@ def receive_advanced_search(self, observer): continue lazy_list.append( - (obj.tag, obj.plot, time_range, lat_range, altitude_range, obj.attributes[1:-1], + (obj.tag, obj.plot, time_range, final_coord_list, lat_range, altitude_range, obj.attributes[1:-1], obj.notes, obj.time_.strftime(DATEFORMAT), obj.hdf)) self.tree.info = lazy_list diff --git a/calipso/tools/tools.py b/calipso/tools/tools.py index b69aaae..f069cba 100644 --- a/calipso/tools/tools.py +++ b/calipso/tools/tools.py @@ -9,6 +9,7 @@ from datetime import datetime import os import matplotlib as mpl +import numpy as np from log.log import logger def find_between( s, first, last ): @@ -55,6 +56,49 @@ def format_coord(axes, x, y, z): zs = z return 'x=%s y=%s lat=%s' % (xs, ys, zs) +def coord_tuple_list(uni_str): + """ + Takes as input Unicode string that ought to be list of tuples + and returns an actual list of tuples (used in coordinate formatting) + + :param str inp: Unicode string to be converted + """ + coords = uni_str.strip("[") + coords = coords.strip("]") + coords = coords.split(",") + temp_list = [b.replace("(",'') for b in coords] + temp_list2 = [b.replace(")",'') for b in temp_list] + + convert_list = list() + for c in temp_list2: + temp = c.replace("[","") + temp = temp.replace("]","") + temp2 = np.float64(temp) + convert_list.append(temp2) + temp_iter = iter(convert_list) + tup_coords = zip(temp_iter, temp_iter) + + time_list = [mpl.dates.num2date(x[0]).strftime('%H:%M:%S') for x in tup_coords] + for i, (a, b) in enumerate(tup_coords): + tup_coords[i] = (time_list[i], b) + final_coord_list = ['(%s, %.3f)' % (a, b) for a, b in tup_coords] + return final_coord_list + +def coord_string(coord_list): + """ + Takes as input a list of coordinates, converts to string, + removes extraneous remaining list notation, and finally + encapsulates the string with extra "" for output to CSV + so that programs such as Excel will ignore the list's commas. + + :param str inp: List of coordinate tuples + """ + final_coord_list = str(coord_list) + final_coord_list = final_coord_list.replace('\'', '') + final_coord_list = final_coord_list.replace('[', '') + final_coord_list = final_coord_list.replace(']', '') + final_coord_list = "\"" + final_coord_list + "\"" + return final_coord_list def byteify(inp): """