From 52b9831d814c9ad38bc615db75c788d9c016a1cc Mon Sep 17 00:00:00 2001 From: kienle <kienle@passcal.nmt.edu> Date: Thu, 1 Dec 2022 13:20:15 -0700 Subject: [PATCH] Implement plotting GPS points. --- sohstationviewer/view/plotting/gps_dialog.py | 94 +++++++++++++++----- 1 file changed, 74 insertions(+), 20 deletions(-) diff --git a/sohstationviewer/view/plotting/gps_dialog.py b/sohstationviewer/view/plotting/gps_dialog.py index 908754bc2..ac39adf0c 100644 --- a/sohstationviewer/view/plotting/gps_dialog.py +++ b/sohstationviewer/view/plotting/gps_dialog.py @@ -2,20 +2,63 @@ import sys from pathlib import Path from typing import List -from model.gps_point import GPSPoint -from model.mseed.mseed import MSeed -from view.plotting.plotting_widget.plotting_widget import PlottingWidget +from sohstationviewer.model.gps_point import GPSPoint +from sohstationviewer.model.mseed.mseed import MSeed from PySide2 import QtWidgets, QtCore +from matplotlib.backends.backend_qt5agg import ( + FigureCanvasQTAgg as Canvas) +from matplotlib.figure import Figure +from matplotlib.axes import Axes -class GPSWidget(PlottingWidget): - def __init__(self, parent, tracking_box): - super().__init__(parent, tracking_box) +class GPSWidget(QtWidgets.QWidget): + def __init__(self, parent, tracking_box, gps_points): + super().__init__(parent) + self.tracking_box = tracking_box + self.gps_points = gps_points + + self.fig = Figure(figsize=(6, 6), dpi=100) + self.ax: Axes = self.fig.add_axes((0, 0, 1, 1)) + self.ax.set_facecolor("dimgray") + + self.canvas = Canvas(self.fig) @QtCore.Slot() def plot_gps(self): - pass + good_gps_points = [point + for point in self.gps_points + if not point.is_bad_point()] + all_latitudes = [point.latitude for point in good_gps_points] + all_longitudes = [point.longitude for point in good_gps_points] + max_latitude = max(all_latitudes) + min_latitude = min(all_latitudes) + max_longitude = max(all_longitudes) + min_longitude = min(all_longitudes) + + latitude_range = max_latitude - min_latitude + longitude_range = max_longitude - min_longitude + if latitude_range > longitude_range: + longitude_average = (min_longitude + max_longitude) / 2 + min_longitude = longitude_average - latitude_range / 2 + max_longitude = longitude_average + latitude_range / 2 + else: + latitude_average = (min_latitude + max_latitude) / 2 + min_latitude = latitude_average - longitude_range / 2 + max_latitude = latitude_average + longitude_range / 2 + + self.ax.set_yticks([]) + self.ax.set_xticks([]) + self.ax.spines['right'].set_visible(False) + self.ax.spines['left'].set_visible(False) + self.ax.spines['top'].set_visible(False) + self.ax.spines['bottom'].set_visible(False) + self.ax.plot(all_longitudes, all_latitudes, 'ws', markersize=3, markeredgecolor='black') + if latitude_range > longitude_range: + self.ax.set_xlim(min_longitude, max_longitude) + else: + self.ax.set_ylim(min_latitude, max_latitude) + self.ax.set_box_aspect(1) class GPSDialog(QtWidgets.QWidget): @@ -26,17 +69,28 @@ class GPSDialog(QtWidgets.QWidget): self.data_path = None self.info_text_browser = QtWidgets.QTextBrowser(self) - self.setGeometry(300, 300, 400, 500) + # The height of the dialog is chosen so that the GPS plot is flush with + # the edges of the dialog. + dialog_height = 518 + self.setGeometry(300, 300, 400, dialog_height) self.setWindowTitle("GPS Plot") main_layout = QtWidgets.QVBoxLayout() self.setLayout(main_layout) - main_layout.setContentsMargins(5, 5, 5, 5) + main_layout.setContentsMargins(0, 0, 0, 0) main_layout.setSpacing(0) self.plotting_widget = GPSWidget( - self, self.info_text_browser) - main_layout.addWidget(self.plotting_widget, 2) + self, self.info_text_browser, gps_points + ) + main_layout.addWidget(self.plotting_widget.canvas) + + # Add a 1-pixel high widget to the main layout so that there is a + # visible border between the GPS plot and the button. QTextBrowser + # is used because it is known to have a visible border. + invisible_widget = QtWidgets.QTextBrowser() + invisible_widget.setFixedHeight(1) + main_layout.addWidget(invisible_widget) button_layout = QtWidgets.QHBoxLayout() button_layout.setContentsMargins(100, 0, 100, 0) @@ -72,10 +126,7 @@ class GPSDialog(QtWidgets.QWidget): with open(outside_folder / f'{folder_name}.gps.dat', 'w+') as outfile: outfile.write(f'# GPS data points for {folder_name}\n') for point in self.gps_points: - is_bad_point = (point.height == 0 and point.longitude == 0 and - point.longitude == 0 and - point.num_satellite_used == 0) - if is_bad_point: + if point.is_bad_point(): continue line = ( f'{point.last_timemark}\t{point.fix_type}\t' @@ -89,9 +140,12 @@ if __name__ == '__main__': import os os.chdir('/Users/kle/PycharmProjects/sohstationviewer') app = QtWidgets.QApplication(sys.argv) - data = MSeed(QtWidgets.QTextBrowser(), '/Users/kle/Documents/SOHView data/Q330/Q330_5281.sdr') + # data_path = '/Users/kle/PycharmProjects/sohstationviewer/tests/test_data/Q330-sample' + data_path = '/Users/kle/Documents/SOHView data/Q330/Q330_5281.sdr' + data = MSeed(QtWidgets.QTextBrowser(), data_path) wnd = GPSDialog(None, data.gps_points) - wnd.data_path = Path('/Users/kle/Documents/SOHView data/Q330/Q330_5281.sdr') - wnd.export_button.click() - # wnd.show() - # sys.exit(app.exec_()) + wnd.data_path = Path(data_path) + wnd.show() + wnd.read_button.click() + + sys.exit(app.exec_()) -- GitLab