CALCUL DE DISTANCE À PARTIR DES COORDONNÉES

DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 - 21 janv. 2006 à 11:41
posop Messages postés 1 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 12 mai 2010 - 12 mai 2010 à 12:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35685-calcul-de-distance-a-partir-des-coordonnees

posop Messages postés 1 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 12 mai 2010
12 mai 2010 à 12:50
salut
j'ai télécharger le zip
mais comment ouvrir l'interface?

merci de répondre
pbg40 Messages postés 1 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 28 août 2009
28 août 2009 à 17:37
Un peu étonnant, si vous utilisez le code tel quel, il génère une erreur de l'ordre de +10%. La faute au rayon de la terre (ligne 106) codé à 6535 alors qu'il est de 6371 km (+ ou - 5km).
sberdli Messages postés 2 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 22 novembre 2007
28 juil. 2008 à 12:52
une daube quoi....
sneb6 Messages postés 1 Date d'inscription jeudi 8 novembre 2007 Statut Membre Dernière intervention 8 novembre 2007
8 nov. 2007 à 18:37
bon je c ke vou allé dire ke je suis nul mé la g besoin d'aide. g télécharger le fichier zip mé une fois décompréssé j'obtien des fichier keje peu ouvir mé ki son écri dans un charabia. commen pourége faire pour pouvoir utilisé le logiciel merci de me répondre ^_^
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 janv. 2006 à 10:41
patch rapide pour ValidFloat :



function ValidFloat(const S : string) : boolean;
var VX : integer;
const
// ensemble des nombres
VN : set of char = ['0'..'9'];
// ensemble nombres et separateur de decimales
VES : set of char = ['0'..'9','.',','];

function CountAChar(const C : char) : integer;
var CX : integer;
begin
result := 0;
for CX := 1 to Length(S) do begin
if S[CX] = C then Result := Result + 1;
end;
end;

begin
// par defaut on considere que le chiffre representé n'est pas valide.
result := false;

IF
// si la chaine est vide ou bien
(length(S) = 0) or
// si le premier et le dernier caractere n'est pas un chiffre ou bien
( (NOT (S[1] IN VN)) or (NOT (S[Length(S)] IN VN)) ) or
// si il y a plusieurs separateurs identique dans la chaine ou bien
( (CountAChar('.') > 1) or (CountAChar(',') > 1) ) or
// si il y a (au moins) deux separateur different dans la chaine alors
( (pos('.',s) <> 0) and (pos(',',s) <> 0) )
THEN
// on sort...
exit;

for VX := 1 to length(s) do begin
// si l'un des caracteres est invalide on sort...
if NOT (S[VX] IN VES) then exit;
end;
// si tout vas bien jusqu'ici, c'est que la chaine represente bien un nombre valide.
result := true;
end;
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 janv. 2006 à 10:24
j'oublis toujours un truc :



performance de StringToFloat : 250ms / 500000rq (0.0005ms/rq)
preformance de ValidFloat : 155ms / 500000rq (0.0003ms/rq)
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 janv. 2006 à 10:17
utilise l'unitée Math pour ArcCos :

function ArcCos(const X: Extended): Extended;
begin
Result := ArcTan2(Sqrt(1 - X * X), X);
end;


----------------------------------------------------------------------------------------

convertir une chaine en nombre flottant avec gestion auto du separateur de decimales :

function StringToFloat(const S : string;const def : real = 0) : real;
var SDS : char;
begin
// sauvegarde de la valeur de DecimalSeparator
SDS := DecimalSeparator;
// on selectionne le bon separateur (attention, methode imcompatible avec les threads)
if pos('.',s) <> 0 then DecimalSeparator := '.'
else
if pos(',',s) <> 0 then DecimalSeparator := ',';
// convertion
result := StrToFloatDef(s,def);
// on restaure DecimalSeparator
DecimalSeparator := SDS;
end;

----------------------------------------------------------------------------------------

verifier si une chaine represente un nombre (flottant ou non) valide :

function ValidFloat(const S : string) : boolean;
var VX : integer;
const
VN : set of char = ['0'..'9','.',','];
function CountAChar(const C : char) : integer;
var CX : integer;
begin
result := 0;
for CX := 1 to Length(S) do begin
if S[CX] = C then Result := Result + 1;
end;
end;
begin
result := false;
if (length(S) = 0) or
((S[1] = '.') or (S[1] = ',')) or
((S[length(S)] = '.') or (S[length(S)] = ',')) or
((CountAChar('.') > 1) or (CountAChar(',') > 1)) or
((pos('.',s) <> 0) and (pos(',',s) <> 0)) then exit;
for VX := 1 to length(s) do begin
if S[VX] IN VN then
result := true
else begin
result := false;
exit;
end;
end;
end;

----------------------------------------------------------------------------------------

a la place de :
result:=(d+(m+s/60)/60) / 180*pi;

utlise (si je me trompe pas) :
result := DegToRad((d+(m+s/60)/60));

----------------------------------------------------------------------------------------

pour les retour de valeur dans les captions, prefere :

distance.Caption := format('%.4f Km',[d]);
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
21 janv. 2006 à 11:41
T'aurais pu commenter un poil, genre declarer :
const Rt=6378187; //Rayon Terre en mètre (en gros hein...)

Et blinder les cas selon lattitude Nord ou sud, et longitude Est ou West, ou au moins commenter.

Aller hop, t'as plus qu'a coder la lectures des sentences $GPGLL, $GPGGA, $GPRMC sur un port série (lol) en sachant qu'une sentence NMEA s'exprime en "DDDMM.mmmm".

http://vancouver-webpages.com/peter/nmeafaq.txt

Bon codage.
Rejoignez-nous