def __init__(self, parent): QtCore.QObject.__init__(self, parent) self.positionSource = Location.QGeoPositionInfoSource.createDefaultSource(self) if self.positionSource == None: self.valid = False return self.positionSource.positionUpdated.connect(self.locationUpdated) self.currentPosition = QGeoCoordinate() self.positionSource.startUpdates() self.coordinate = QGeoCoordinate() self.compass = QCompass(self) self.compass.readingChanged.connect(self.compassReadingChanged) self.compass.setDataRate(10) self.compass.start() self.compassAzimuth = 0 self.gpsactive = False
def setupUi(self): scene = QGraphicsScene(self) self.view = QGraphicsView(scene, self) self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.view.setVisible(True) self.view.setInteractive(True) self.createPixmapIcon() self.mapWidget = MapWidget(self.mapManager) scene.addItem(self.mapWidget) self.mapWidget.setCenter(QGeoCoordinate(-8.1, -34.95)) self.mapWidget.setZoomLevel(5) #... self.slider = QSlider(Qt.Vertical, self) self.slider.setTickInterval(1) self.slider.setTickPosition(QSlider.TicksBothSides) self.slider.setMaximum(self.mapManager.maximumZoomLevel()) self.slider.setMinimum(self.mapManager.minimumZoomLevel()) self.slider.valueChanged[int].connect(self.sliderValueChanged) self.mapWidget.zoomLevelChanged[float].connect(self.mapZoomLevelChanged) mapControlLayout = QVBoxLayout() self.mapWidget.mapTypeChanged.connect(self.mapTypeChanged) for mapType in self.mapWidget.supportedMapTypes(): radio = QRadioButton(self) if mapType == QGraphicsGeoMap.StreetMap: radio.setText('Street') elif mapType == QGraphicsGeoMap.SatelliteMapDay: radio.setText('Sattelite') elif mapType == QGraphicsGeoMap.SatelliteMapNight: radio.setText('Sattelite - Night') elif mapType == QGraphicsGeoMap.TerrainMap: radio.setText('Terrain') if mapType == self.mapWidget.mapType(): radio.setChecked(True) radio.toggled[bool].connect(self.mapTypeToggled) self.mapControlButtons.append(radio) self.mapControlTypes.append(mapType) mapControlLayout.addWidget(radio) self.latitudeEdit = QLineEdit() self.longitudeEdit = QLineEdit() formLayout = QFormLayout() formLayout.addRow('Latitude', self.latitudeEdit) formLayout.addRow('Longitude', self.longitudeEdit) self.captureCoordsButton = QToolButton() self.captureCoordsButton.setText('Capture coordinates') self.captureCoordsButton.setCheckable(True) self.captureCoordsButton.toggled[bool].connect( self.mapWidget.setMouseClickCoordQuery) self.mapWidget.coordQueryResult.connect(self.updateCoords) self.setCoordsButton = QPushButton() self.setCoordsButton.setText('Set coordinates') self.setCoordsButton.clicked.connect(self.setCoordsClicked) buttonLayout = QHBoxLayout() buttonLayout.addWidget(self.captureCoordsButton) buttonLayout.addWidget(self.setCoordsButton) coordControlLayout = QVBoxLayout() coordControlLayout.addLayout(formLayout) coordControlLayout.addLayout(buttonLayout) widget = QWidget(self) layout = QGridLayout() layout.setRowStretch(0, 1) layout.setRowStretch(1, 0) topLayout = QGridLayout() bottomLayout = QGridLayout() topLayout.setColumnStretch(0, 0) topLayout.setColumnStretch(1, 1) bottomLayout.setColumnStretch(0, 0) bottomLayout.setColumnStretch(1, 1) topLayout.addWidget(self.slider, 0, 0) topLayout.addWidget(self.view, 0, 1) bottomLayout.addLayout(mapControlLayout, 0, 0) bottomLayout.addLayout(coordControlLayout, 0, 1) layout.addLayout(topLayout, 0, 0) layout.addLayout(bottomLayout, 1, 0) self.layout = layout widget.setLayout(layout) self.setCentralWidget(widget) self.view.setContextMenuPolicy(Qt.CustomContextMenu) self.view.customContextMenuRequested.connect(self.customContextMenuRequest)
def setCoordsClicked(self): lat = float(self.latitudeEdit.text()) lon = float(self.longitudeEdit.text()) self.mapWidget.setCenter(QGeoCoordinate(lat, lon))
class GPSCompass(QtCore.QObject): '''GPSCompass gives distance and bearing to a gps position from the current gps position''' def __init__(self, parent): QtCore.QObject.__init__(self, parent) self.positionSource = Location.QGeoPositionInfoSource.createDefaultSource(self) if self.positionSource == None: self.valid = False return self.positionSource.positionUpdated.connect(self.locationUpdated) self.currentPosition = QGeoCoordinate() self.positionSource.startUpdates() self.coordinate = QGeoCoordinate() self.compass = QCompass(self) self.compass.readingChanged.connect(self.compassReadingChanged) self.compass.setDataRate(10) self.compass.start() self.compassAzimuth = 0 self.gpsactive = False location_changed = QtCore.Signal() bearing_changed = QtCore.Signal() destination_changed = QtCore.Signal() gps_activated = QtCore.Signal() def __del__(self): self.compass.stop() self.positionSource.stopUpdates() @QtCore.Slot() def compassReadingChanged(self): reading = self.compass.reading() if reading: self.compassAzimuth = reading.azimuth() self.bearing_changed.emit() @QtCore.Slot(float, float) def setDestination(self, lat, lon): self.coordinate = QGeoCoordinate(lat, lon) self.destination_changed.emit() def locationUpdated(self, update): self.currentPosition = update.coordinate() if not self.gpsactive: self.gpsactive = True self.gps_activated.emit() self.location_changed.emit() self.bearing_changed.emit() def _distance(self): if not self.currentPosition.isValid() or not self.coordinate.isValid(): return 0 return self.currentPosition.distanceTo(self.coordinate) def _bearing(self): if not self.currentPosition.isValid() or not self.coordinate.isValid(): return 0 return ((360 - self.compassAzimuth) - (360 - self.currentPosition.azimuthTo(self.coordinate))) def _destinationLatitude(self): return self.coordinate.latitude() def _destinationLongitude(self): return self.coordinate.longitude() def _latitude(self): return self.currentPosition.latitude() def _longitude(self): return self.currentPosition.longitude() def _gpsfix(self): return self.gpsactive distance = QtCore.Property(int, _distance, notify=location_changed) bearing = QtCore.Property(int, _bearing, notify=bearing_changed) latitude = QtCore.Property(float, _latitude, notify=location_changed) longitude = QtCore.Property(float, _longitude, notify=location_changed) dest_latitude = QtCore.Property(float, _destinationLatitude, notify=destination_changed) dest_longitude = QtCore.Property(float, _destinationLongitude, notify=destination_changed) gps = QtCore.Property(bool, _gpsfix, notify=gps_activated)
def setDestination(self, lat, lon): self.coordinate = QGeoCoordinate(lat, lon) self.destination_changed.emit()