|
| Calculer des coordonnées GPS (Latitude & Longitude) |
| Débuté par DREAM-TECH (BE), 25 sep. 2019 17:25 - 18 réponses |
| |
| | | |
|
| |
Membre enregistré 94 messages |
|
| Posté le 25 septembre 2019 - 17:25 |
Hello 
J'ai des coordonnées GPS mais en décimal,
Je souhaite convertir ces coordonnées en Latitude et Longitude, exemple : Avec ce décimal 547146368 c'est 54.714636
Pour le signe (positif ou négatif) je dois juste regarder le premier bit, si zéro la position reste positive sinon négative.
Donc, mon problème c'est le point (qui sépare la partie entière) je ne sais pas où le mettre (plutôt comment le calculer).
Lorsque j'essaye : 547146368 * 0.0000001 = 54.714636 (c'est correct) mais si j'essaye avec une autre position :
50895408 * 0.0000001 = 5.08954 (c'est pas correct).
Y a-t-il un magicien qui peut m'aider 
Merci. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 160 messages |
|
| Posté le 25 septembre 2019 - 21:36 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 94 messages |
|
| Posté le 25 septembre 2019 - 22:17 |
Salut,
Non, la fonction Left récupère n premières positions (à partir de la gauche). La partie entière d'une position GPS n'est pas toujours de 2 positions. Exemple : 0.130304 est ne position valide : ou encore : 2.367319.
il me manque justement l'algorithme pour savoir comment déterminer la position.
Merci d'avance. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 54 messages |
|
| Posté le 26 septembre 2019 - 07:50 |
| |
| |
| | | |
|
| | |
| |
| Posté le 26 septembre 2019 - 09:15 |
SI Taille(Lng) = 7 ALORS Lng = Gauche(Lng, 1) = "," SINON Lng = Gauche(Lng, 2) = "," FIN |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 94 messages |
|
| Posté le 26 septembre 2019 - 10:16 |
Bonjour,
J'ai pensé à cette approche, mais je ne pense pas que c'est suffisant,
J'ai peur de tomber sur des postions genre : 123.12345678 ou 1234.12345 ou 123.12345678911.
J'ai l'impression qu'il faut mettre en place un algorithme :
Wikipedia : https://en.wikipedia.org/wiki/Decimal_degrees
Quelqu'un a encore quelque chose dans son chapeau ?
Merci  |
| |
| |
| | | |
|
| | |
| |
| Posté le 26 septembre 2019 - 16:19 |
Latitude : max/min +90 à -90 Longitude : max/min +180 à -180
Donc aucun souci avec la méthode donnée au dessus. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 94 messages |
|
| Posté le 26 septembre 2019 - 22:14 |
Bonsoir,
Je ne suis pas encore très convaincu 
SI Taille(Lng) = 7 ALORS Lng = Gauche(Lng, 1) = "," SINON Lng = Gauche(Lng, 2) = "," FIN
Pourquoi 7 (j'ai 8 et 9 positions dans l'exemple de mon premier post). Pourquoi extraire 1 ou 2 positions (gauche) à la place d'insérer directement un point après la première ou la deuxième position. ou encore plus simple, faire une multiplication pour éviter les zéros inutiles (à droite).
Latitude : max/min +90 à -90 Longitude : max/min +180 à -180
Justement, je peux donc avoir un décimal 180123456 qui peut être : 180.123456 ou 18.0123456 ou 1.80123456....
Si je me base sur la Taille(180123456 vaut 10) ça devient 18.0123456 mais pourquoi pas 180.123456 c'est quoi la logique cachée derrière ?
Donc pour le moment je n'ai pas trop le choix (mais pas très convaincu) je me base sur la taille comme vous me le conseillez :
sResult is string iDecimal is int = 44125450
IF Length(iDecimal) = 8 THEN sResult = iDecimal * 0.000001 ELSE sResult = iDecimal * 0.0000001 END
Trace(sResult)
Merci en tout cas  |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 94 messages |
|
| Posté le 26 septembre 2019 - 23:22 |
sResult is string = "44125450"
IF Length(sResult) = 8 THEN sResult = StringInsert(sResult,".",2) ELSE sResult = StringInsert(sResult,".",3) END
Trace(sResult) |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 317 messages |
|
| Posté le 27 septembre 2019 - 09:59 |
Bonjour, Si j'ai bien tout suivi, suite à ton post précédent, tu récupères un hexa et tu veux le convertir en réel.
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 394 messages |
|
| Posté le 27 septembre 2019 - 10:05 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 94 messages |
|
| Posté le 27 septembre 2019 - 13:38 |
Salut 
Bonjour, Si j'ai bien tout suivi, suite à ton post précédent, tu récupères un hexa et tu veux le convertir en réel.
Non, j'ai un chiffre décimal (ex: 44125450) qui correspond à une position GPS, mais pour utiliser une API MAP pour positionner mon marqueur (de google map ou autre) je dois convertir ce décimal en DD (Degrés Décimaux) ex: 44125450 devient : 4.412545, mais je ne trouve pas comment le faire (il me manque peut être un élément).
LM Concept a écrit :
Votre lien est très intéressant (la partie comment passer de Degrés Sexagésimaux à Degrés Décimaux) c'est écrit "Garder 45 et mettez un point après", mais sur quoi il s'est basé ? peut-être sur le signe degré (°) mais j'ai pas cette info (45°), j'ai juste un décimal, donc comment je peux déterminer le degré pour convertir mon décimal pour en DD.
Merci à vous  Message modifié, 27 septembre 2019 - 13:40 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 317 messages |
|
| Posté le 27 septembre 2019 - 19:22 |
Est ce que ton entier correspond à la trame brute sur 32 bits que tu a reçue ?
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 94 messages |
|
| Posté le 27 septembre 2019 - 20:18 |
La trame contient plusieurs infos, je parse pour avoir ça :

Si je prends la longitude : 02A14D0A (Hexa) et grâce à la fonction Val(sHexaCoordinate,"x") j'ai un entier 44125450.
Mais l'entier tel qu'il est ne peut pas être interprété par Google Map (il manque le point).Message modifié, 27 septembre 2019 - 20:19 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 317 messages |
|
| Posté le 27 septembre 2019 - 23:50 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 317 messages |
|
| Posté le 28 septembre 2019 - 00:33 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 94 messages |
|
| Posté le 28 septembre 2019 - 02:14 |
Voroltinquo a écrit :
Dans l'absolu, la représentation d'un réel suit la norme IEEE-754. Le premier bit représente le signe, les 8 bits suivant l'exposant et les derniers la mantisse. En effet, c'est pour la norme IEEE-754 
Demain, j’essayerai la solution proposée dans Stackoverflow.
Merci  |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 317 messages |
|
| Posté le 29 septembre 2019 - 10:46 |
Le code devrait ressembler à ça, avec une verif à faire au niveau du "recalage"
FONCTION EntierVersGPS(sCoord est une chaîne,eLatLong est ETypeCoordonnées,eCodageCoordonnées est ETypeMessage=HEX):monétaire unCoordEntier est entier sans signe sur 4 nDeg est entier moCoordDec est monétaire
unCoordEntier=Val(sCoord,"x") SELON eCodageCoordonnées CAS HEX unCoordEntier=Val(sCoord,"x") CAS BIN unCoordEntier=Val(sCoord,2) FIN moCoordDec=unCoordEntier/30000
nDeg=moCoordDec/60 moCoordDec=moCoordDec-(60*nDeg) moCoordDec=Arrondi(moCoordDec/100,4)
nDeg=Modulo(nDeg,2*eLatLong..Valeur) moCoordDec+=nDeg SI moCoordDec>eLatLong..Valeur ALORS moCoordDec=moCoordDec-2*eLatLong..Valeur FIN
RENVOYER moCoordDec
ETypeCoordonnées est une Enumération Longitude=90 Latitude=45 FIN
Avec les données fournies, on se trouve au N du Lac Castagnier et au NE de St Domique du Rosaire Déjà, on ne se trouve pas en plein milieu de l'océan, donc, ça peut coller -- Il y a peut être plus simple, mais, ça tourneMessage modifié, 29 septembre 2019 - 10:50 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 94 messages |
|
| Posté le 29 septembre 2019 - 16:11 |
Oui, c'est ce genre de calcul qu'il me faut (j'ai essayé plusieurs sans succès). Je viens d'essayer ton exemple (avec adaptation pour que ça fonctionne) :
nDeg is int sCoord is string = "02A14D0A" unCoordEntier is 4-byte unsigned int eLatLong is ETypeCoordonnées moCoordDec is currency
unCoordEntier = Val(sCoord,"x") moCoordDec=unCoordEntier/30000
nDeg=moCoordDec/60 moCoordDec=moCoordDec-(60*nDeg) moCoordDec=Round(moCoordDec/100,4)
nDeg=Modulo(nDeg,2*eLatLong..Value) moCoordDec+=nDeg IF moCoordDec>eLatLong..Value THEN moCoordDec=moCoordDec-2*eLatLong..Value END
Trace(moCoordDec) La conversion reste incorrecte, normalement le bon résultat c'est : 44.125450. |
| |
| |
| | | |
|
| | | | |
| | |
|