|
| [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
xa = 6378137 xb = 6356752.3142 xf = 1/298.257223563
xl = (long2-long1)*ValPI/180
xU1, xU2 sont des réels
xU1 = ArcTang((1-xf)*Tang(lat1)) xU2 = ArcTang((1-xf)*Tang(lat2))
xLambda est un réels = xl 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
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 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 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
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-pnzRp4hTB0LQEDAJ'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
xa = 6378137 xb = 6356752.3142 xf = 1/298.257223563
xl = (long2-long1)*ValPI/180
xU1, xU2 sont des réels
xU1 = ArcTang((1-xf)*Tang(lat1)) xU2 = ArcTang((1-xf)*Tang(lat2))
xLambda est un réels = xl 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
˜ 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 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 = 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
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 |
| |
| |
| | | |
|
| | |
| |
| Publicado el 12,agosto 2009 - 11:24 |
progwdm a écrit :
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
xa = 6378137 xb = 6356752.3142 xf = 1/298.257223563 xl = (xLong2-xLong1)*ValPI/180
xU1, xU2 sont des réels xU1 = ArcTang((1-xf)*Tang(xLat1)) xU2 = ArcTang((1-xf)*Tang(xLat2)) xLambda est un réels = xl 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
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 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 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
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
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.comas 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-pnzRp4hTB0LQEDAJ'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
xa = 6378137 xb = 6356752.3142 xf = 1/298.257223563
xl = (long2-long1)*ValPI/180
xU1, xU2 sont des réels
xU1 = ArcTang((1-xf)*Tang(lat1)) xU2 = ArcTang((1-xf)*Tang(lat2))
xLambda est un réels = xl 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
~ 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 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 = 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
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 |
| |
| |
| | | |
|
| | | | |
| | |
|