PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → [WD14] Calcul distance entre deux points GPS
[WD14] Calcul distance entre deux points GPS
Iniciado por progwdm, 11,ago. 2009 11:44 - 14 respuestas
Publicado el 11,agosto 2009 - 11:44
Bonjour,

Je tente de calculer la distance entre deux points GPS. J'ai trouvé une formule ainsi qu'un code javascript qui fonctionne parafaitement

Formule et code JS :
http://209.85.227.132/translate_c…=http://www.movable-type.co.uk/scripts/latlong-vincenty.html&prev=/translate_s%3Fhl%3Dfr%26q%3Dcalcul%2Bdistance%2Bpoint%2Bgps%26tq%3Dgps%2Bdistance%2Bcalculation%2Bpoint%26sl%3Dfr%26tl%3Den&rurl=translate.google.fr&usg=ALkJrhiSbp3T7fsJc1-pnzRp4hTB0LQEDA

J'ai converti le code en WLangage, mais le résultat n'est pas bon.

Procedure CalculDistDeuxPointsVincenty(lat1,lat2,long1,long2)
xa,xb,xf,xl sont des réels
// valeur pour WGS-84 ellipsiod
xa = 6378137
xb = 6356752.3142
xf = 1/298.257223563

xl = (long2-long1)*ValPI/180 // écart en longitude

// U est réduite de latitude
xU1, xU2 sont des réels

xU1 = ArcTang((1-xf)*Tang(lat1))
xU2 = ArcTang((1-xf)*Tang(lat2))

xLambda est un réels = xl //première approximation
xLambdap est un réels
nIterLimit est un entier = 100
xSinSigma,xCosSigma est un réels
xsigma,xsinAlpha,xcosSqAlpha,xcos2SigmaM est un réels
xc est un réels

//itération jusqu'au changement de ? est négligeable (par exemple 10 -12 ˜ 0.06mm)
BOUCLE
xSinSigma = Racine((Cos(xU2)*Sin(xLambda))^2+(Cos(xU1)*Sin(xU2)-Sin(xU1)*Cos(xU2)*Cos(xLambda))^2)
SI xSinSigma = 0 ALORS RENVOYER 0 //co-incidences des points
xCosSigma = Sin(xU1) * Sin(xU2) + Cos(xU1) * Cos(xU2) * Cos(xLambda)
xsigma = Atan2(xSinSigma,xCosSigma)*ValPI/180
xsinAlpha = Cos(xU1) * Cos(xU2) * Sin(xLambda) / xSinSigma;
xcosSqAlpha = 1 - xsinAlpha * xsinAlpha;
xcos2SigmaM = xCosSigma - 2 * Sin(xU1) * Sin(xU2)/xcosSqAlpha;
SI PAS xcos2SigmaM ALORS xcos2SigmaM = 0 // ligne équatoriale: cosSqAlpha = 0 (§ 6)
xc = xf/16 * xcosSqAlpha * (4 + xf * (4-3 * xcosSqAlpha))
xLambdap = xLambda
xLambda = xl + (1-xc) * xf * xsinAlpha* (xsigma + xc * xSinSigma * (xcos2SigmaM + xc * xCosSigma * (-1 +2 * xcos2SigmaM^2)))
nIterLimit--
A FAIRE TANTQUE (Abs(xLambda-xLambdap) > 1e-12 ET nIterLimit>0)

SI nIterLimit=0 ALORS RENVOYER 0
//si nIterLimit = 0 renvoyer 0
xUCarré est un réels

xUCarré = xcosSqAlpha*(xa^2-xb^2)/xb^2
xAA,xBB,xDeltasigma sont des réels
s est un réels

xAA = 1 + xUCarré/16384 * (4096 + xUCarré * (-768 + xUCarré * (320-175 *xUCarré)))
xBB = xUCarré/1024 * (256 + xUCarré * (-128 + xUCarré * (74-47* xUCarré)))
xDeltasigma = xBB * xSinSigma * (xcos2SigmaM + xBB / 4 * (xCosSigma * (-1 +2 * xcos2SigmaM * xcos2SigmaM) -xBB / 6 * xcos2SigmaM * (-3 +4 * xSinSigma * xSinSigma) * (-3 +4 * xcos2SigmaM * xcos2SigmaM)));
s = xBB*xAA*(xsigma-xDeltasigma)
s = Arrondi(s,3)
RENVOYER s


Procedure Atan2(y,x)
xRes est un numérique

SI x= 0 ALORS
xRes = sgn(y) * 1.5707963267949
SINON
IF x > 0 THEN
xRes = ArcTang(y/x)
SINON
xRes = ArcTang(y/x)+ValPI+sgn(y)
END
FIN

RENVOYER xRes


Procedure sgn(nval)
xRes est un numérique
SI nval = 0 ALORS
xRes = 0
SINON
xRes = nval/Abs(nval)
FIN

RENVOYER xRes


J'ai testé avec le code suivant et je devrais avoir 795.647m dans la trace
Trace(CalculDistDeuxPointsVincenty(28.448696,28.445166,43.097073,43.104146)))


Si quelqu'un à une idée. Merci pour votre aide
http://progwdm.blogspot.com
Publicado el 11,agosto 2009 - 12:46
BONJOUR
une petite idée ? à la place de réels utilise plutôt des monétaires il y a
plus de chiffres significatifs et c'est plus précis...



"progwdm" <progwdm@free.fr> a écrit dans le message de news:
ef0a4549d7e358f55eda6f08832c989d@news.pcsoft...

Bonjour,

Je tente de calculer la distance entre deux points GPS. J'ai trouvé une
formule ainsi qu'un code javascript qui fonctionne parafaitement

Formule et code JS :
http://209.85.227.132/translate_c…=http://www.movable-type.co.uk/scripts/latlong-vincenty.html&prev=/translate_s%3Fhl%3Dfr%26q%3Dcalcul%2Bdistance%2Bpoint%2Bgps%26tq%3Dgps%2Bdistance%2Bcalculation%2Bpoint%26sl%3Dfr%26tl%3Den&rurl=translate.google.fr&usg=ALkJrhiSbp3T7fsJc1-pnzRp4hTB0LQEDA

J'ai converti le code en WLangage, mais le résultat n'est pas bon.

Procedure CalculDistDeuxPointsVincenty(lat1,lat2,long1,long2)
xa,xb,xf,xl sont des réels
// valeur pour WGS-84 ellipsiod
xa = 6378137
xb = 6356752.3142
xf = 1/298.257223563

xl = (long2-long1)*ValPI/180 // écart en longitude

// U est réduite de latitude
xU1, xU2 sont des réels

xU1 = ArcTang((1-xf)*Tang(lat1))
xU2 = ArcTang((1-xf)*Tang(lat2))

xLambda est un réels = xl //première approximation
xLambdap est un réels
nIterLimit est un entier = 100
xSinSigma,xCosSigma est un réels
xsigma,xsinAlpha,xcosSqAlpha,xcos2SigmaM est un réels
xc est un réels

//itération jusqu'au changement de ? est négligeable (par exemple 10 -12
˜ 0.06mm)
BOUCLE
xSinSigma =
Racine((Cos(xU2)*Sin(xLambda))^2+(Cos(xU1)*Sin(xU2)-Sin(xU1)*Cos(xU2)*Cos(xLambda))^2)
SI xSinSigma = 0 ALORS RENVOYER 0 //co-incidences des points
xCosSigma = Sin(xU1) * Sin(xU2) + Cos(xU1) * Cos(xU2) * Cos(xLambda)
xsigma = Atan2(xSinSigma,xCosSigma)*ValPI/180
xsinAlpha = Cos(xU1) * Cos(xU2) * Sin(xLambda) / xSinSigma;
xcosSqAlpha = 1 - xsinAlpha * xsinAlpha;
xcos2SigmaM = xCosSigma - 2 * Sin(xU1) * Sin(xU2)/xcosSqAlpha;
SI PAS xcos2SigmaM ALORS xcos2SigmaM = 0 // ligne équatoriale: cosSqAlpha
= 0 (§ 6)
xc = xf/16 * xcosSqAlpha * (4 + xf * (4-3 * xcosSqAlpha))
xLambdap = xLambda
xLambda = xl + (1-xc) * xf * xsinAlpha* (xsigma + xc * xSinSigma *
(xcos2SigmaM + xc * xCosSigma * (-1 +2 * xcos2SigmaM^2)))
nIterLimit--
A FAIRE TANTQUE (Abs(xLambda-xLambdap) > 1e-12 ET nIterLimit>0)

SI nIterLimit=0 ALORS RENVOYER 0
//si nIterLimit = 0 renvoyer 0
xUCarré est un réels

xUCarré = xcosSqAlpha*(xa^2-xb^2)/xb^2
xAA,xBB,xDeltasigma sont des réels
s est un réels

xAA = 1 + xUCarré/16384 * (4096 + xUCarré * (-768 + xUCarré * (320-175
*xUCarré)))
xBB = xUCarré/1024 * (256 + xUCarré * (-128 + xUCarré * (74-47* xUCarré)))
xDeltasigma = xBB * xSinSigma * (xcos2SigmaM + xBB / 4 * (xCosSigma * (-1
+2 * xcos2SigmaM * xcos2SigmaM) -xBB / 6 * xcos2SigmaM * (-3 +4 *
xSinSigma * xSinSigma) * (-3 +4 * xcos2SigmaM * xcos2SigmaM)));
s = xBB*xAA*(xsigma-xDeltasigma)
s = Arrondi(s,3)
RENVOYER s


Procedure Atan2(y,x)
xRes est un numérique

SI x= 0 ALORS
xRes = sgn(y) * 1.5707963267949
SINON
IF x > 0 THEN
xRes = ArcTang(y/x)
SINON
xRes = ArcTang(y/x)+ValPI+sgn(y)
END
FIN

RENVOYER xRes


Procedure sgn(nval)
xRes est un numérique
SI nval = 0 ALORS
xRes = 0
SINON
xRes = nval/Abs(nval)
FIN

RENVOYER xRes


J'ai testé avec le code suivant et je devrais avoir 795.647m dans la trace
Trace(CalculDistDeuxPointsVincenty(28.448696,28.445166,43.097073,43.104146)))


Si quelqu'un à une idée. Merci pour votre aide
http://progwdm.blogspot.com
Publicado el 11,agosto 2009 - 22:01
bonjour,

merci, mais ca change rien. Une autre idée ?

Bon dev
http://progwdm.blogspot.com
Publicado el 12,agosto 2009 - 11:24
progwdm a écrit :
bonjour,

merci, mais ca change rien. Une autre idée ?

Bon dev
http://progwdm.blogspot.com


il faut trouver la formule de calcul d'une distance sur une sphère.
(remise sur un même cercle des points et identifier l'angle entre les
deux et calculer la distance de la portion de courbe entre les deux)
A++
Goof
Publicado el 12,agosto 2009 - 12:26
Bonjour,

la problématique n'est pas là puisque le code JS fonctionne.
Mon problème est que la transformation du code JS en WL pose quelques soucis puisque les résultats ne sont pas identiques.

Merci pour vos réponses
Bon dev
http://progwdm.blogspot.com
Publicado el 12,agosto 2009 - 15:17
Bonjour,

Il y a effectievement quelques problèmes dans ton code.
Comme le problème m'intéressait je me suis aussi penché sur la formulation de Vincenty pour calculer les distances entre 2 points d'un ellipsoide (ici la terre), pour l'instant je me contentais de la formule classique sur une sphère.

Les problèmes principaux dans ton code :
- utilisation désordonnée des radians et des dégrés (WD utilise les deg lors des calculs des fonctions trigo)
- précision des numériques insuffisante (par défaut 6 chiffres pour la partie décimale), il vaut mieux utiliser les réels (sur 8. )
- quelques anomalies de codage (xBB à la place de xb dans formule finale, inversion x et y dans atan2...

Je te laisse le soin de passer un comparateur de code pour voir les autres différences.
En reprenant tes notations et la structure de ton code voila une version corrigée
Procedure CalculDistDeuxPointsVincenty(xLat1,xLong1,xLat2,xLong2)

xa,xb,xf,xl sont des réels

// valeur pour WGS-84 ellipsoid
xa = 6378137
xb = 6356752.3142
xf = 1/298.257223563
xl = (xLong2-xLong1)*ValPI/180 // écart en longitude

// U est réduite de latitude
xU1, xU2 sont des réels
xU1 = ArcTang((1-xf)*Tang(xLat1))
xU2 = ArcTang((1-xf)*Tang(xLat2))
xLambda est un réels = xl //première approximation
xLambdap est un réels
nIterLimit est un entier = 100
xSinSigma,xCosSigma est un réels
xsigma,xsinAlpha,xcosSqAlpha,xcos2SigmaM est un réels
xc est un réels

//itération jusqu'au changement de ? est négligeable (par exemple 10 -12 ˜ 0.06mm)
BOUCLE
xSinSigma = Racine((Cos(xU2)*Sin(toDeg(xLambda)))^2+(Cos(xU1)*Sin(xU2)-Sin(xU1)*Cos(xU2)*Cos(toDeg(xLambda)))^2)
SI xSinSigma = 0 ALORS RENVOYER 0 //co-incidences des points
xCosSigma = Sin(xU1) * Sin(xU2) + Cos(xU1) * Cos(xU2) * Cos(toDeg(xLambda))
xsigma = Atan2(xCosSigma,xSinSigma)*ValPI/180
xsinAlpha = Cos(xU1) * Cos(xU2) * Sin(toDeg(xLambda)) / xSinSigma;
xcosSqAlpha = 1 - xsinAlpha * xsinAlpha;
xcos2SigmaM = xCosSigma - 2 * Sin(xU1) * Sin(xU2)/xcosSqAlpha;
SI PAS xcos2SigmaM ALORS xcos2SigmaM = 0 // ligne équatoriale: cosSqAlpha = 0 (§ 6)
xc = xf/16 * xcosSqAlpha * (4 + xf * (4-3 * xcosSqAlpha))
xLambdap = xLambda
xLambda = xl + (1-xc) * xf * xsinAlpha* (xsigma + xc * xSinSigma * (xcos2SigmaM + xc * xCosSigma * (-1 +2 * xcos2SigmaM^2)))
nIterLimit--
A FAIRE TANTQUE (Abs(xLambda-xLambdap) > 1e-12 ET nIterLimit>0)

SI nIterLimit=0 ALORS RENVOYER 0
//si nIterLimit = 0 renvoyer 0
xUCarré est un réels
xUCarré = xcosSqAlpha*(xa^2-xb^2)/xb^2
xAA,xBB,xDeltasigma sont des réels
s est un réels
xAA = 1 + xUCarré/16384 * (4096 + xUCarré * (-768 + xUCarré * (320-175 *xUCarré)))
xBB = xUCarré/1024 * (256 + xUCarré * (-128 + xUCarré * (74-47* xUCarré)))
xDeltasigma = xBB * xSinSigma * (xcos2SigmaM + xBB / 4 * (xCosSigma * (-1 +2 * xcos2SigmaM * xcos2SigmaM) -xBB / 6 * xcos2SigmaM * (-3 +4 * xSinSigma * xSinSigma) * (-3 +4 * xcos2SigmaM * xcos2SigmaM)))
s = xb*xAA*(xsigma-xDeltasigma)
s = Arrondi(s,3)
RENVOYER s

Procedure Atan2(x,y)
xRes est un réel sur 8
SI x= 0 ALORS
xRes = sgn(y) * ValPI/2.
SINON
IF x > 0 THEN
xRes = ArcTang(y/x)
SINON
xRes = ArcTang(y/x)+ValPI*sgn(y)
END
FIN
RENVOYER xRes

Procedure sgn(nval)

xRes est un réel sur 8
SI nval = 0 ALORS
xRes = 0
SINON
xRes = nval/Abs(nval)
FIN
RENVOYER xRes

// Conversion radian -> degrés
Procedure toDeg(xRad)
RENVOYER Conversion(xRad,"rad","degré")


A+
--
Francis MOREL
http://www.SoftProtect.fr
Publicado el 12,agosto 2009 - 16:00
Bonjour,

Merci beaucoup pour les corrections apportées. En effet il y avait quelques incohérences.
Maintenant ça marche.


Merci beaucoup
bon dev,
http://progwdm.blogspot.com
Publicado el 12,agosto 2009 - 16:14
progwdm a écrit :
Bonjour,

la problématique n'est pas là puisque le code JS fonctionne.
Mon problème est que la transformation du code JS en WL pose quelques soucis puisque les résultats ne sont pas identiques.

Merci pour vos réponses
Bon dev
http://progwdm.blogspot.com

as tu converti tes coordonnées en radian ?


sinon, si tu n'as pas besoin de précision absolue, l'orthonormie suffit
.... ( voir post plus haut)


my 2 cents...
Publicado el 14,agosto 2009 - 17:25
Voici la fonction sous SQL Server...
Quelques conversions s'imposent mais ce code a l'air plus simple que le
tient.

ALTER FUNCTION [dbo].[Get_Dist] (@La1 varchar(10) , @Lo1 varchar(10) , @La2
varchar(10), @Lo2 varchar(10) )
RETURNS float AS
BEGIN
DECLARE @DIST float,
@La1Rad float,
@La2Rad float,
@EarthRadius float,
@DeltaLoRad float
SET @EarthRadius = 6372.795477598
SET @La1Rad = RADIANS(CONVERT(float,@La1))
SET @La2Rad =RADIANS(CONVERT(float,@La2))
SET @DeltaLoRad = RADIANS(ABS(CONVERT(float,@Lo1) -CONVERT(float,@Lo2)))
SET @DIST =
(ACOS((SIN(@La1rad)*SIN(@La2rad))+(ABS(COS(@La1rad))*ABS(COS(@La2rad))*COS(@DeltaLoRad))))*
@EarthRadius
RETURN @DIST
END


B. Neve
"progwdm" <progwdm@free.fr> a écrit dans le message de
news:ef0a4549d7e358f55eda6f08832c989d@news.pcsoft...

Bonjour,

Je tente de calculer la distance entre deux points GPS. J'ai trouvé une
formule ainsi qu'un code javascript qui fonctionne parafaitement

Formule et code JS :
http://209.85.227.132/translate_c…=http://www.movable-type.co.uk/scripts/latlong-vincenty.html&prev=/translate_s%3Fhl%3Dfr%26q%3Dcalcul%2Bdistance%2Bpoint%2Bgps%26tq%3Dgps%2Bdistance%2Bcalculation%2Bpoint%26sl%3Dfr%26tl%3Den&rurl=translate.google.fr&usg=ALkJrhiSbp3T7fsJc1-pnzRp4hTB0LQEDA

J'ai converti le code en WLangage, mais le résultat n'est pas bon.

Procedure CalculDistDeuxPointsVincenty(lat1,lat2,long1,long2)
xa,xb,xf,xl sont des réels
// valeur pour WGS-84 ellipsiod
xa = 6378137
xb = 6356752.3142
xf = 1/298.257223563

xl = (long2-long1)*ValPI/180 // écart en longitude

// U est réduite de latitude
xU1, xU2 sont des réels

xU1 = ArcTang((1-xf)*Tang(lat1))
xU2 = ArcTang((1-xf)*Tang(lat2))

xLambda est un réels = xl //première approximation
xLambdap est un réels
nIterLimit est un entier = 100
xSinSigma,xCosSigma est un réels
xsigma,xsinAlpha,xcosSqAlpha,xcos2SigmaM est un réels
xc est un réels

//itération jusqu'au changement de ? est négligeable (par exemple 10 -12
~ 0.06mm)
BOUCLE
xSinSigma =
Racine((Cos(xU2)*Sin(xLambda))^2+(Cos(xU1)*Sin(xU2)-Sin(xU1)*Cos(xU2)*Cos(xLambda))^2)
SI xSinSigma = 0 ALORS RENVOYER 0 //co-incidences des points
xCosSigma = Sin(xU1) * Sin(xU2) + Cos(xU1) * Cos(xU2) * Cos(xLambda)
xsigma = Atan2(xSinSigma,xCosSigma)*ValPI/180
xsinAlpha = Cos(xU1) * Cos(xU2) * Sin(xLambda) / xSinSigma;
xcosSqAlpha = 1 - xsinAlpha * xsinAlpha;
xcos2SigmaM = xCosSigma - 2 * Sin(xU1) * Sin(xU2)/xcosSqAlpha;
SI PAS xcos2SigmaM ALORS xcos2SigmaM = 0 // ligne équatoriale: cosSqAlpha
= 0 (§ 6)
xc = xf/16 * xcosSqAlpha * (4 + xf * (4-3 * xcosSqAlpha))
xLambdap = xLambda
xLambda = xl + (1-xc) * xf * xsinAlpha* (xsigma + xc * xSinSigma *
(xcos2SigmaM + xc * xCosSigma * (-1 +2 * xcos2SigmaM^2)))
nIterLimit--
A FAIRE TANTQUE (Abs(xLambda-xLambdap) > 1e-12 ET nIterLimit>0)

SI nIterLimit=0 ALORS RENVOYER 0
//si nIterLimit = 0 renvoyer 0
xUCarré est un réels

xUCarré = xcosSqAlpha*(xa^2-xb^2)/xb^2
xAA,xBB,xDeltasigma sont des réels
s est un réels

xAA = 1 + xUCarré/16384 * (4096 + xUCarré * (-768 + xUCarré * (320-175
*xUCarré)))
xBB = xUCarré/1024 * (256 + xUCarré * (-128 + xUCarré * (74-47* xUCarré)))
xDeltasigma = xBB * xSinSigma * (xcos2SigmaM + xBB / 4 * (xCosSigma * (-1
+2 * xcos2SigmaM * xcos2SigmaM) -xBB / 6 * xcos2SigmaM * (-3 +4 *
xSinSigma * xSinSigma) * (-3 +4 * xcos2SigmaM * xcos2SigmaM)));
s = xBB*xAA*(xsigma-xDeltasigma)
s = Arrondi(s,3)
RENVOYER s


Procedure Atan2(y,x)
xRes est un numérique

SI x= 0 ALORS
xRes = sgn(y) * 1.5707963267949
SINON
IF x > 0 THEN
xRes = ArcTang(y/x)
SINON
xRes = ArcTang(y/x)+ValPI+sgn(y)
END
FIN

RENVOYER xRes


Procedure sgn(nval)
xRes est un numérique
SI nval = 0 ALORS
xRes = 0
SINON
xRes = nval/Abs(nval)
FIN

RENVOYER xRes


J'ai testé avec le code suivant et je devrais avoir 795.647m dans la trace
Trace(CalculDistDeuxPointsVincenty(28.448696,28.445166,43.097073,43.104146)))


Si quelqu'un à une idée. Merci pour votre aide
http://progwdm.blogspot.com
Publicado el 05,octubre 2009 - 23:53
BOnjour à tous

J'ai essayé de traduire le code qui est en SQL dans ce topic, ce qui donnerait :

distance3(paramLat1,paramLong1,paramLat2 ,paramLong2)

VarRadLat1 est un réel = Conversion(Val(paramLat1,"d"),"degré","radian")
VarRadLat2 est un réel = Conversion(Val(paramLong1,"d"),"degré","radian")
VarRadiusTerre est un réel = 6372.795477598
VarDeltaLoRad est un réel = Conversion(Abs(Val(paramLong1,"d"))-Val(paramLong2,"d"),"degré","radian")
VarDistance est réel = ArcCosinus((Sinus(VarRadLat1) *Sinus(VarRadLat2))+(Abs(Cosinus(VarRadLat1))*Abs(Cosinus(VarRadLat2))*Cosinus(VarDeltaLoRad)))*VarRadiusTerre

RENVOYER VarDistance


Mais voila, ca ne fonctionne pas. Avec les valeurs suivantes :

Trace(distance3(48.572751,2.10205,48.573813,2.104187))


il me renvoie :
5168.762446442

alors que j'attends une valeur autour de 315 m., pas plus

Merci à tous de votre aide.

Fbe66
Publicado el 06,octubre 2009 - 14:10
Bonjour,

Ton problème principal vient du fait que Windev utilise les degrés et non les radians pour toutes les fonctions trigonométriques.
Petite correction aussi sur l'évaluation de VarLat2.

La fonction corrigée s'écrit donc (en reprenant tes notations) :
VarLat1 est un réel = paramLat1
VarLat2 est un réel = paramLat2
VarRadiusTerre est un réel = 6372.795477598
VarDeltaLo est un réel = paramLong1-paramLong2
VarDistance est réel = Conversion(ArcCosinus( Sinus(VarLat1)*Sinus(VarLat2) + Cosinus(VarLat1)*Cosinus(VarLat2)*Cosinus(VarDeltaLo) ),"degré","radian")*VarRadiusTerre


Par contre la valeur retournée (pour tes données) est plutôt de l'ordre de 197m.

A+
--
Francis MOREL
http://www.SoftProtect.fr
Publicado el 06,octubre 2009 - 16:31
Francis,

Merci bcp pour ta réponse.

Je viens de la tester et effectivement je trouve 197 m. (au lieu de 250). je vais faire un nouveau relevé sur le terrain. Peut être que les données n'étaient pas assez précises lors du relvé précédent.

Préconises-tu un nbre minimum de satellites (je viens de le mettre à 7) pour le relévé et que le l'Etat soit à A. Y at'il d'autres paramètres à prendre en compte, afin de faire un relevé au plus juste ?

J'utilise la trame GPRMC, est ce bien ?

Merci encore.
A+
Franck

Francis MOREL a écrit dans le message de news <d5f9c5209fc8198417c1d1a2fbf6d680@news.pcsoft> :
Bonjour,

Ton problème principal vient du fait que Windev utilise les degrés et non les radians pour toutes les fonctions trigonométriques.
Petite correction aussi sur l'évaluation de VarLat2.

La fonction corrigée s'écrit donc (en reprenant tes notations) :
VarLat1 est un réel = paramLat1
VarLat2 est un réel = paramLat2
VarRadiusTerre est un réel = 6372.795477598
VarDeltaLo est un réel = paramLong1-paramLong2
VarDistance est réel = Conversion(ArcCosinus( Sinus(VarLat1)*Sinus(VarLat2) + Cosinus(VarLat1)*Cosinus(VarLat2)*Cosinus(VarDeltaLo) ),"degré","radian")*VarRadiusTerre


Par contre la valeur retournée (pour tes données) est plutôt de l'ordre de 197m.

A+
--
Francis MOREL
http://www.SoftProtect.fr


Publicado el 18,noviembre 2010 - 10:28
Le 06/10/2009 15:31, fbe66 a écrit :
Francis,

Merci bcp pour ta réponse.

Je viens de la tester et effectivement je trouve 197 m. (au lieu de 250). je vais faire un nouveau relevé sur le terrain. Peut être que les données n'étaient pas assez précises lors du relvé précédent.

Préconises-tu un nbre minimum de satellites (je viens de le mettre à 7) pour le relévé et que le l'Etat soit à A. Y at'il d'autres paramètres à prendre en compte, afin de faire un relevé au plus juste ?

J'utilise la trame GPRMC, est ce bien ?

Merci encore.
A+
Franck

Francis MOREL a écrit dans le message de news<d5f9c5209fc8198417c1d1a2fbf6d680@news.pcsoft> :
Bonjour,

Ton problème principal vient du fait que Windev utilise les degrés et non les radians pour toutes les fonctions trigonométriques.
Petite correction aussi sur l'évaluation de VarLat2.

La fonction corrigée s'écrit donc (en reprenant tes notations) :
VarLat1 est un réel = paramLat1
VarLat2 est un réel = paramLat2
VarRadiusTerre est un réel = 6372.795477598
VarDeltaLo est un réel = paramLong1-paramLong2
VarDistance est réel = Conversion(ArcCosinus( Sinus(VarLat1)*Sinus(VarLat2) + Cosinus(VarLat1)*Cosinus(VarLat2)*Cosinus(VarDeltaLo) ),"degré","radian")*VarRadiusTerre


Par contre la valeur retournée (pour tes données) est plutôt de l'ordre de 197m.

A+
--
Francis MOREL
http://www.SoftProtect.fr








salut.

le problème vient que utilise la methode par orthonormie sur la sphere
qui n'est pas très précise ( +/-0.3% avec la valeur du rayon précis et
un delta Z presque nul). Si tu as besoin de précision, il te faut
utiliser une methode par orthonormie sur l'éllipsoide ou la méthode de
vincenty ( mais qui n'est pas fiable aux antipodes ....
tu trouveras ( en anglais) les explications là:
http://www.ngs.noaa.gov/TOOLS/XYZ/xyz.html et là :
http://www.profsurv.com/magazine/article.aspx…
Publicado el 13,abril 2019 - 14:49
Après quelques heures de recherche, merci encore à tous car j'ai pu intégrer la procédure CalculDistDeuxPointsVincenty(xLat1,xLong1,xLat2,xLong2)
sous linux car la la fonction géodistance() de WD n'existe pas sous linux.
J'ai vérifié avec maps et géodistance() sous windows et le résultat est identique.


Philippe
Miembro registrado
41 mensajes
Publicado el 23,mayo 2019 - 16:02
Merci Francis.
Bonne journée