PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Calculer des coordonnées GPS (Latitude & Longitude)
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 :p

Merci.
Membre enregistré
160 messages
Posté le 25 septembre 2019 - 21:36
left(X,2)
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
Bonjour,
J'ai trouvé cette page avec des vidéos explicatives.
Bonne journée

https://www.google.com/search…

--
Gilles
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 :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 :o

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) // 4.412545


Merci en tout cas :merci:
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) // 4.412545
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é
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
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 décomposant cela, tu pourras récupérer la position de la décimale.
https://www.wikihow.com/Convert-a-Number-from-Decimal-to-IEEE-754-Floating-Point-Representation

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
4 317 messages
Posté le 28 septembre 2019 - 00:33
Malheureusement les coordonnées GPS ne respectent pas ces normes.
En fouillant un peu, j'ai récupéré ça https://stackoverflow.com/questions/17355604/how-to-convert-gps-longitude-and-latitude-from-hex

--
Il y a peut être plus simple, mais, ça tourne
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) //à priori les minutes en décimal
moCoordDec=Arrondi(moCoordDec/100,4)


//On recale la valeur pour entrer dans l'intervalle
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 tourne
Message 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" // 44125450
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) //à priori les minutes en décimal
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) // 24.3085

La conversion reste incorrecte, normalement le bon résultat c'est : 44.125450.