1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
| #!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Calcul de la distance en vol d'oiseau entre 2 lieux connus par leurs
coordonnées GPS.
(Tyrtamos 12/2020)
Pour calcul distance:
https://geodesie.ign.fr/contenu/fichiers/Distance_longitude_latitude.pdf
Pour correction GPS (non intégrée dans ce code):
https://geodesie.ign.fr/contenu/fichiers/Modeles_ellipsoides_France.pdf
"""
import sys
import os
from math import sin, cos, acos, pi
from PyQt5 import (QtWidgets, QtGui, QtCore,uic)
fenetre_ui = "distanceGPS.ui" # fenêtre issue de QtDesigner
#############################################################################
def dms2dd(d, m, s):
"""Convertit un angle "degrés minutes secondes" en "degrés décimaux"
"""
return d + m/60 + s/3600
#############################################################################
def dd2dms(dd):
"""Convertit un angle "degrés décimaux" en "degrés minutes secondes"
"""
d = int(dd)
x = (dd-d)*60
m = int(x)
s = (x-m)*60
return d, m, s
#############################################################################
def deg2rad(dd):
"""Convertit un angle "degrés décimaux" en "radians"
"""
return dd/180*pi
#############################################################################
def rad2deg(rd):
"""Convertit un angle "radians" en "degrés décimaux"
"""
return rd/pi*180
#############################################################################
def distanceGPS(latA, longA, latB, longB):
"""Retourne la distance en mètres entre les 2 points A et B connus grâce à
leurs coordonnées GPS (en radians).
"""
# Rayon de la terre en mètres (sphère IAG-GRS80)
RT = 6378137
# angle en radians entre les 2 points
S = acos(sin(latA)*sin(latB) + cos(latA)*cos(latB)*cos(abs(longB-longA)))
# distance entre les 2 points, comptée sur un arc de grand cercle
return S*RT
#############################################################################
class Fenetre(QtWidgets.QWidget):
#========================================================================
def __init__(self, parent=None):
super().__init__(parent)
# charge les paramètres de dessin de la fenêtre
self.ui = uic.loadUi(os.path.join(REPEXE, fenetre_ui), self)
# lien entre le clic du bouton calculer et la méthode à lancer
self.ui.calculer.clicked.connect(self.calculdistance)
#========================================================================
def calculdistance(self):
try:
#-----------------------------------------------------------------
# latitude 1
if self.ui.chxlat1dec.isChecked():
vallat1dec = float(self.ui.lat1dec.text().replace(',', '.'))
else:
vallat1dec = dms2dd(float(self.ui.lat1deg.text().replace(',', '.')), float(self.ui.lat1min.text().replace(',', '.')), float(self.ui.lat1sec.text().replace(',', '.')))
latitude1 = deg2rad(vallat1dec)
#-----------------------------------------------------------------
# longitude 1
if self.ui.chxlong1dec.isChecked():
vallong1dec = float(self.ui.long1dec.text().replace(',', '.'))
else:
vallong1dec = dms2dd(float(self.ui.long1deg.text().replace(',', '.')), float(self.ui.long1min.text().replace(',', '.')), float(self.ui.long1sec.text().replace(',', '.')))
longitude1 = deg2rad(vallong1dec)
#-----------------------------------------------------------------
# latitude 2
if self.ui.chxlat2dec.isChecked():
vallat2dec = float(self.ui.lat2dec.text().replace(',', '.'))
else:
vallat2dec = dms2dd(float(self.ui.lat2deg.text().replace(',', '.')), float(self.ui.lat2min.text().replace(',', '.')), float(self.ui.lat2sec.text().replace(',', '.')))
latitude2 = deg2rad(vallat2dec)
#-----------------------------------------------------------------
# longitude 2
if self.ui.chxlong2dec.isChecked():
vallong2dec = float(self.ui.long2dec.text().replace(',', '.'))
else:
vallong2dec = dms2dd(float(self.ui.long2deg.text().replace(',', '.')), float(self.ui.long2min.text().replace(',', '.')), float(self.ui.long2sec.text().replace(',', '.')))
longitude2 = deg2rad(vallong2dec)
except Exception:
QtWidgets.QMessageBox.warning(self,
"Erreur",
"L'une des valeurs saisies n'est pas un nombre")
return
#---------------------------------------------------------------------
# calcul et affichage de la distance en km
distGPS = distanceGPS(latitude1, longitude1, latitude2, longitude2)
self.ui.distancekm.setText("{:.3f}".format(distGPS/1000))
#############################################################################
if __name__ == "__main__":
#========================================================================
# Répertoire d'exécution avec ou sans pyinstaller (onedir ou onefile)
if getattr(sys, 'frozen', False):
REPEXE = sys._MEIPASS # programme traité par pyinstaller
else:
REPEXE = os.path.dirname(os.path.abspath(__file__)) # prog. normal
#========================================================================
# initialisation de la bibliothèque graphique
app = QtWidgets.QApplication(sys.argv)
#========================================================================
#mettre la même icône pour toutes les fenêtres du programme
app.setWindowIcon(QtGui.QIcon(os.path.join(REPEXE, "distanceGPS.png")))
#========================================================================
# style pour toute l'application
if "Fusion" in [st for st in QtWidgets.QStyleFactory.keys()]:
app.setStyle(QtWidgets.QStyleFactory.create("Fusion"))
elif sys.platform=="win32":
app.setStyle(QtWidgets.QStyleFactory.create("WindowsVista"))
elif sys.platform=="linux":
app.setStyle(QtWidgets.QStyleFactory.create("gtk"))
elif sys.platform=="darwin":
app.setStyle(QtWidgets.QStyleFactory.create("macintosh"))
app.setPalette(QtWidgets.QApplication.style().standardPalette())
#========================================================================
# pour assurer la traduction automatique du conversationnel à la locale
locale = QtCore.QLocale.system().name()
translator = QtCore.QTranslator()
reptrad = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
translator.load("qtbase_" + locale, reptrad) # <==qtbase_fr.qm
app.installTranslator(translator)
#========================================================================
# lancement de la fenêtre
fen = Fenetre()
fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
fen.show()
#========================================================================
# boucle de traitement des évènements et sortie
sys.exit(app.exec_()) |