Beispiel #1
0
    def __init__(self):
        super(Browser, self).__init__()
        # QApplication.__init__(self, [])
        # self.window = QWidget()
        # self.window.setWindowTitle("pyFlightRadar")

        # Model
        self.flapi = FlightRadarAPI()
        self.all_planes = self.flapi.get_aircrafts()
        print(self.all_planes)

        # if filters is on
        self.from_filter = False
        self.to_filter = False
        self.from_filter_iata = None
        self.to_filter_iata = None

        pyDir = os.path.abspath(os.path.dirname(__file__))
        baseUrl = QUrl.fromLocalFile(os.path.join(pyDir, "map.html"))
        print(baseUrl)

        self.web = QWebView(self)
        self.web.setMinimumSize(800, 800)
        self.web.page().mainFrame().addToJavaScriptWindowObject("self", self)
        self.web.setUrl(baseUrl)

        # self.text = QTextEdit(self.window)

        # self.remove_all_planes_button = QPushButton("remove markers", self.window)
        # self.load_all_planes_button = QPushButton("load all planes (very slow)", self)
        self.get_me_to_ekb_button = QPushButton("Go to Ekb", self)

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.web)
        # self.layout.addWidget(self.text)
        # self.layout.addWidget(self.remove_all_planes_button)
        # self.layout.addWidget(self.load_all_planes_button)
        self.layout.addWidget(self.get_me_to_ekb_button)

        self.flight_finder_widget = FlightFinderWidget(self, self.flapi)
        self.layout.addWidget(self.flight_finder_widget)

        self.from_to_iata_filter_widget = FromToIataFilterWidget(self, self.flapi)
        self.layout.addWidget(self.from_to_iata_filter_widget)

        # self.remove_all_planes_button.clicked.connect(self.remove_all_planes)
        # self.load_all_planes_button.clicked.connect(self.load_all_planes)
        self.get_me_to_ekb_button.clicked.connect(self.get_me_to_ekb)

        # Current state of map bounds
        self.lat_ne = None
        self.lng_ne = None
        self.lat_sw = None
        self.lng_sw = None

        # Save current aircrafts data
        self.aircrafts = None
Beispiel #2
0
class Browser(QWidget):
    def __init__(self):
        super(Browser, self).__init__()
        # QApplication.__init__(self, [])
        # self.window = QWidget()
        # self.window.setWindowTitle("pyFlightRadar")

        # Model
        self.flapi = FlightRadarAPI()
        self.all_planes = self.flapi.get_aircrafts()
        print(self.all_planes)

        # if filters is on
        self.from_filter = False
        self.to_filter = False
        self.from_filter_iata = None
        self.to_filter_iata = None

        pyDir = os.path.abspath(os.path.dirname(__file__))
        baseUrl = QUrl.fromLocalFile(os.path.join(pyDir, "map.html"))
        print(baseUrl)

        self.web = QWebView(self)
        self.web.setMinimumSize(800, 800)
        self.web.page().mainFrame().addToJavaScriptWindowObject("self", self)
        self.web.setUrl(baseUrl)

        # self.text = QTextEdit(self.window)

        # self.remove_all_planes_button = QPushButton("remove markers", self.window)
        # self.load_all_planes_button = QPushButton("load all planes (very slow)", self)
        self.get_me_to_ekb_button = QPushButton("Go to Ekb", self)

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.web)
        # self.layout.addWidget(self.text)
        # self.layout.addWidget(self.remove_all_planes_button)
        # self.layout.addWidget(self.load_all_planes_button)
        self.layout.addWidget(self.get_me_to_ekb_button)

        self.flight_finder_widget = FlightFinderWidget(self, self.flapi)
        self.layout.addWidget(self.flight_finder_widget)

        self.from_to_iata_filter_widget = FromToIataFilterWidget(self, self.flapi)
        self.layout.addWidget(self.from_to_iata_filter_widget)

        # self.remove_all_planes_button.clicked.connect(self.remove_all_planes)
        # self.load_all_planes_button.clicked.connect(self.load_all_planes)
        self.get_me_to_ekb_button.clicked.connect(self.get_me_to_ekb)

        # Current state of map bounds
        self.lat_ne = None
        self.lng_ne = None
        self.lat_sw = None
        self.lng_sw = None

        # Save current aircrafts data
        self.aircrafts = None

        # self.window.show()
        # self.exec_()

    @pyqtSlot(float, float)
    def print_center(self, lat, lng):
        """
        Print current center of map. Calling from javascript
        :param lat: current map latitude
        :param lng: current map longitude
        """
        print(lat, lng)

    @pyqtSlot(float, float, float, float)
    def print_bounds(self, lat_ne, lng_ne, lat_sw, lng_sw):
        """
        Print current borders of map. Calling from javascript
        :param lat_ne: latitude north east
        :param lng_ne: longitude north east
        :param lat_sw: latitude south west
        :param lng_sw: longitude south west
        """
        print(lat_ne, lng_ne, lat_sw, lng_sw)

    @pyqtSlot(float, float, float, float)
    def load_aircrafts_by_bounds(self, lat_ne, lng_ne, lat_sw, lng_sw):
        """
        Getting and loading aircrafts by given bounds. Before that remove all planes on map.
        Works on bound changed event
        :param lat_ne: latitude north east
        :param lng_ne: longitude north east
        :param lat_sw: latitude south west
        :param lng_sw: longitude south west
        """
        # Save current state of map
        self.lat_ne = lat_ne
        self.lng_ne = lng_ne
        self.lat_sw = lat_sw
        self.lng_sw = lng_sw

        self.remove_all_planes()
        # if filters is set
        if self.from_filter:
            aircrafts = self.flapi.get_aircrafts_by_bounds(
                lat_ne, lat_sw, lng_sw, lng_ne, filter_type="from_iata", iata=self.from_filter_iata
            )
        elif self.to_filter:
            aircrafts = self.flapi.get_aircrafts_by_bounds(
                lat_ne, lat_sw, lng_sw, lng_ne, filter_type="to_iata", iata=self.to_filter_iata
            )
        else:
            aircrafts = self.flapi.get_aircrafts_by_bounds(lat_ne, lat_sw, lng_sw, lng_ne)

        # print(aircrafts)

        self.aircrafts = aircrafts

        self.threads = []
        if len(aircrafts):
            for aircraft in aircrafts:
                downloader = DownloadThread(self.flapi, aircraft)
                downloader.data_downloaded.connect(self.on_data_ready)
                self.threads.append(downloader)
                downloader.start()
                # 0 -flight_id, 2- latitude, 3 - longitude, 4 - track
                # self._add_marker(aircraft[0], aircraft[3], aircraft[2], aircraft[4])
                # print(aircraft)

    def on_data_ready(self, flights_inform, s_full_data):
        # print(flights_inform, s_full_data)
        self._add_marker(flights_inform[0], flights_inform[3], flights_inform[2], flights_inform[4], s_full_data)

    def refresh(self):
        """
        After initial loading refresh aircrafts positions on map. There are 3 options
        1) add aircraft
        2) update aircraft position
        3) remove aircraft (for ex. when landed)
        """
        # if filters is set
        if self.from_filter:
            new_aircrafts = self.flapi.get_aircrafts_by_bounds(
                self.lat_ne, self.lat_sw, self.lng_sw, self.lng_ne, filter_type="from_iata", iata=self.from_filter_iata
            )
        elif self.to_filter:
            new_aircrafts = self.flapi.get_aircrafts_by_bounds(
                self.lat_ne, self.lat_sw, self.lng_sw, self.lng_ne, filter_type="to_iata", iata=self.to_filter_iata
            )
        else:
            new_aircrafts = self.flapi.get_aircrafts_by_bounds(self.lat_ne, self.lat_sw, self.lng_sw, self.lng_ne)
        # print(new_aircrafts)
        new_aircrafts_set = set()
        for aircraft in new_aircrafts:
            new_aircrafts_set.add(aircraft[0])

        aircrafts_set = set()
        for aircraft in self.aircrafts:
            aircrafts_set.add(aircraft[0])

        for aircraft in new_aircrafts_set:
            if aircraft not in aircrafts_set:
                # Add new (Add new thread to download)
                data = linear_list_search(new_aircrafts, aircraft)
                downloader = DownloadThread(self.flapi, data)
                downloader.data_downloaded.connect(self.on_data_ready)
                self.threads.append(downloader)
                downloader.start()
                # self._add_marker(data[0], data[2], data[3], data[4])
            else:
                # Update
                data = linear_list_search(new_aircrafts, aircraft)
                self._move_marker(aircraft, data[2], data[3], data[4])
                aircrafts_set.remove(aircraft)

        if not len(aircrafts_set):
            for aircraft in aircrafts_set:
                # Delete
                self._remove_marker(aircraft)
        self.aircrafts = new_aircrafts

    # Markers work
    def _add_marker(self, flight_id, lat, lon, track, s_full_data):
        """
        Get detailed information on flight id
        Add aircraft on map
        :param flight_id: Flight id of a plane
        :param lat: plane curr latitude
        :param lon: plane curr longitude
        :param track: plane curr rotation
        :param s_full_data: detailed data about the flight in json format
        """
        # full_data = self.flapi.get_aircraft_info(flight_id)
        # s_full_data = json.dumps(full_data)

        frame = self.web.page().mainFrame()
        # print(lon, lat, track, s_full_data, flight_id)
        frame.evaluateJavaScript("addMarker({}, {}, {}, '{}', '{}')".format(lon, lat, track, s_full_data, flight_id))

    def _move_marker(self, flight_id, lat, lon, track):
        frame = self.web.page().mainFrame()
        frame.evaluateJavaScript('changeMarkerPos("{}", {}, {}, {})'.format(flight_id, lat, lon, track))

    def _remove_marker(self, flight_id):
        frame = self.web.page().mainFrame()
        frame.evaluateJavaScript('removeMarker("{}")'.format(flight_id))

    def remove_all_planes(self):
        frame = self.web.page().mainFrame()
        frame.evaluateJavaScript("clearOverlays()")

    def _plane_data_maker(self, data):
        pass

    @pyqtSlot()
    def loaded_complete(self):
        """
        Calling this function from javascript when "tilesloaded" event on google maps emmitTed
        """
        # frame = self.web.page().mainFrame()
        # frame.evaluateJavaScript('alert("tilesloaded")')

        # msgBox = QMessageBox()
        # msgBox.setText("Welcome to pyFlightRadar")
        # msgBox.setModal(True)
        # msgBox.setInformativeText("Version 0.1")
        # msgBox.setStandardButtons(QMessageBox.Ok)
        # ret = msgBox.exec_()

        # Start updating
        self.start_timer()
        print("Tiles loaded")

    @pyqtSlot()
    def load_all_planes(self):
        """
        Load all aircrafts all around the world
        (Very slow)
        """
        frame = self.web.page().mainFrame()
        for flight_id in self.all_planes:
            try:
                flight_number = self.flapi.get_aircraft_info(flight_id)["flight"]
            except KeyError:
                flight_number = ""
            try:
                # print(flight_id)
                frame.evaluateJavaScript(
                    'addMarker({}, {}, "{}", "{}")'.format(
                        self.all_planes[flight_id][1], self.all_planes[flight_id][2], flight_number, str(flight_id)
                    )
                )
            except:
                print("{} - {}".format(flight_id, self.all_planes[flight_id]))
                print("This is not valid flight_id")
        frame.evaluateJavaScript("alert(count)")

    @pyqtSlot()
    def get_me_to_ekb(self):
        frame = self.web.page().mainFrame()
        frame.evaluateJavaScript("var pos = new google.maps.LatLng(56.7974, 60.556641); map.setCenter(pos);")
        frame.evaluateJavaScript("repaint_by_hand()")

    def start_timer(self):
        """
        Event for map refreshing
        """
        self.main_timer = QTimer(self)
        self.main_timer.timeout.connect(self.refresh)
        self.main_timer.start(3000)