PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Calculer des coordonnées GPS (Latitude & Longitude)
Calculer des coordonnées GPS (Latitude & Longitude)
Iniciado por DREAM-TECH (BE), 25,sep. 2019 17:25 - 18 respuestas
Miembro registrado
94 mensajes
Publicado el 25,septiembre 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.
Miembro registrado
160 mensajes
Publicado el 25,septiembre 2019 - 21:36
left(X,2)
Miembro registrado
94 mensajes
Publicado el 25,septiembre 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.
Miembro registrado
54 mensajes
Publicado el 26,septiembre 2019 - 07:50
Bonjour,
J'ai trouvé cette page avec des vidéos explicatives.
Bonne journée

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

--
Gilles
Publicado el 26,septiembre 2019 - 09:15
SI Taille(Lng) = 7 ALORS
Lng = Gauche(Lng, 1) = ","
SINON
Lng = Gauche(Lng, 2) = ","
FIN
Miembro registrado
94 mensajes
Publicado el 26,septiembre 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:
Publicado el 26,septiembre 2019 - 16:19
Latitude : max/min +90 à -90
Longitude : max/min +180 à -180

Donc aucun souci avec la méthode donnée au dessus.
Miembro registrado
94 mensajes
Publicado el 26,septiembre 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:
Miembro registrado
94 mensajes
Publicado el 26,septiembre 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
Miembro registrado
4.361 mensajes
Publicado el 27,septiembre 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
Miembro registrado
94 mensajes
Publicado el 27,septiembre 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 :)
Mensaje modificado, 27,septiembre 2019 - 13:40
Miembro registrado
4.361 mensajes
Publicado el 27,septiembre 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
Miembro registrado
94 mensajes
Publicado el 27,septiembre 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).
Mensaje modificado, 27,septiembre 2019 - 20:19
Miembro registrado
4.361 mensajes
Publicado el 27,septiembre 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
Miembro registrado
4.361 mensajes
Publicado el 28,septiembre 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
Miembro registrado
94 mensajes
Publicado el 28,septiembre 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 ;)
Miembro registrado
4.361 mensajes
Publicado el 29,septiembre 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
Mensaje modificado, 29,septiembre 2019 - 10:50
Miembro registrado
94 mensajes
Publicado el 29,septiembre 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.