|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : avril 2003 Messages : 152 ![]() |
Bonjour,
Je développe une application qui gère des aéroports. Une table (fichier texte) contient la liste de ces aéroports(10600 lignes). les lignes sont composées de: Code Aéroport : XXXX; 4 caractères Nom : XX..X; Caractères nombre variable Élévation en pieds : XX.X; Caractères nombre variable. Code (autre) Aéroport : XXX; 4 caractères. Latitude: +/-XX.XXXXXX; Signe - si nécessaire + 1 à 2 caractères + '.'+ 6 caractères. Longitude: +/- XXX.XXXXXX; Signe - si nécessaire + 1 à 3 caractères + '.' + 6 caractères. Nombre de pistes : XX; 2 caractères Le séparateur est ';'. Mon problème est le suivant: Partant des coordonnées d'un aéroport, je souhaite trouver tous ceux qui sont dans rayon de 225 miles nautiques autour de lui. Pourriez vous m'aider à trouver un algorithme pour parvenir à ce résultat? Merci d'avance pour votre aide Cordialement Pierre |
|
|
00
|
|
|
#2 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
A partir du moment où l'on sait calculer la distance entre 2 points long/lat, le reste du problème n'est qu'une question de performance:
parcours exhaustif, tables pré-calculées, partitionnement de l'espace, ...
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
10
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : avril 2003 Messages : 152 ![]() |
Merci de ta réponse,
Pourrais-tu m'en dire un peu plus car je suis assez novice dans ce domaine. Je sais calculer la distance entre deux points, mais c'est la méthode de traitement qui me pose problème. Je ne sait comment organiser celui-ci. Merci d'avance Cordialement Pierre |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : janvier 2007 Messages : 9 651 ![]() |
En es-tu sûr ??
Ce n'est pas la distance eucilidenne entre 2 couples (lat-lon) qui te donnera la distance réelle en mètres..
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#5 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2006 Messages : 5 424 ![]() |
Citation:
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson |
|
|
|
00
|
|
|
#6 |
|
Nouveau Membre du Club
![]() Inscription : avril 2003 Messages : 152 ![]() |
Merci de vos réponses,
Oui, je sais calculer un triangle sphérique qui donne la distance orthodromique. Voila mon idée: - je parcours tous les aéroports de ma liste et calcule leur distance par rapport au mien. - Je mets dans une liste ceux situés à moins de 225 nm de mon aéroport. - Je trie la liste par distance ascendante. Qu'en pensez vous ? Cordialement Pierre |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Ingénieur intégration Inscription : décembre 2012 Messages : 515 ![]() |
Bonjour,
Ton algorithme semble bon, mais le mieux serait d'avoir déjà un fichier trié comme ça cela réduirait la quantité de calcul. Après tu peux aussi trier ta liste au fur et a mesure. Le choix dépend surtout de l'utilisation dans le temps: -Ton fichier est il figé (évolue-t-il dans le temps) ? -Là, tu parles d'une distance de 225 mn, se sera toujours le cas ou on peut te redemander la même chose avec une autre valeur ? Cordialement, disedorgue |
|
|
00
|
|
|
#8 |
|
Nouveau Membre du Club
![]() Inscription : avril 2003 Messages : 152 ![]() |
Bonjour,
Merci de cette réponse qui me rassure. Le fichier peut se voir modifié, (nouvel aéroport construit ou mis hors service), La distance de 225 nautiques va changée définitivement (ce qui sera le cas bientôt pour 600 nautiques) c'est surtout l'aéroport central qui change à chaque fois. Je m'explique. En aéronautique, un vol doit comporter un aéroport de départ, un aéroport d'arrivée et un aéroport de dégagement au cas ou il serait impossible de se poser sur celui d'arrivée. Mon appli doit trouver sur lequel(s) dans un rayon de 600 nautiques. Cordialement Pierre |
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2006 Messages : 5 424 ![]() |
J'ai fait un petit test avec les 9500 positions des stations aéronautiques de COM VHF en Europe, déjà chargées en mémoire par mon application. Dans un environnement C#/.net, avec le parcours exhaustif (sans optimisation) de toutes ce positions, le calcul des 9500 distances prend 6 millisecondes.
Pour info, le code : Code :
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson |
||
|
|
00
|
|
|
#10 | |
|
Expert Confirmé Sénior
![]() ![]() Inscription : janvier 2007 Messages : 9 651 ![]() |
Citation:
Calculer une distance (au carré) demande au minimum 3 additions et 2 multiplications. Faire de 1 à 4 tests, tu y gagnes. Et du coup ta liste serait déjà réduite aux aéroports tombant dans le "rectangle".
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#11 |
|
Nouveau Membre du Club
![]() Inscription : avril 2003 Messages : 152 ![]() |
Merci à vous deux.
En fait Souviron34, il ne s'agit pas d'un rectangle, mais d'un cercle. C'est peut être plus complexe non ? Cordialement Pierre |
|
|
00
|
|
|
#12 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2006 Messages : 5 424 ![]() |
Citation:
Par contre, sa proposition sur l'optimisation avec le carré de la distance ne s'appliquerait que pour une distance dans le plan, mais pas à une distance orthodromique sur la sphère.
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson |
|
|
|
00
|
|
|
#13 | |||
|
Expert Confirmé Sénior
![]() ![]() Inscription : janvier 2007 Messages : 9 651 ![]() |
Citation:
Pourquoi ?? Quand tu vas calculer des distances, tu vas bien faire une racine carrée, non ?? On n'a tout simplement pas besoin de calculer la racine. Si distance < 600 km <=> Si carré(distance) < 600*600 ... Donc on calcule une fois 600*600, et ensuite on en fait que calculer en utilisant la formule appropriée le carré de la distance.. On évite une racine carrée.. Et l'ordre reste le même, donc le tri suit la même règle.. @Pierre95 : ton cercle centré sur ton aéroport définit un rectangle englobant maximum en lat/lon. Donc, comme dans ta table tu as les lat/lon des aéroports, tu calcules ce rectangle en départ, et ensuie, au lieu de claculer les distances pour tous les aéroports, tu testes : Code :
Comme ça, tu évites tout plein de calculs... Et tu n'as grosso-modo que des calculs à faire pour le cercle + qques points... Et comme e disais pour liminer un aéroport tu as au max 4 tests, et en moyenne beaucoup moins.. (on peut ordonner différemment les tests si on sait comment les aéroports sont triès au départ dans la table)
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|||
|
|
00
|
|
|
#14 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2006 Messages : 5 424 ![]() |
Citation:
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson |
|
|
|
00
|
|
|
#15 | |||
|
Expert Confirmé Sénior
![]() ![]() Inscription : janvier 2007 Messages : 9 651 ![]() |
OK, autant pour moi alors...
Citation:
Ensuite, pour chaque demande : déterminer l'indice correspondant à la latitude max du "rectangle" par dichotomie (log(N)), parcourir, et si latitude < latitude min on s'arrête. Tu enlèves en plus un test , tu t'arrêtes, et tu ne parcoures que le strict minimum... Et je pense qu'il est plus judicieux de trier par latitude que par longitude... Le pseudocode donné deviendrait alors simplement : Code :
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|||
|
|
00
|
|
|
#16 | ||||
|
Nouveau Membre du Club
![]() Inscription : avril 2003 Messages : 152 ![]() |
Bonjour,
Merci à tous pour vos idées très intéressantes. Finalement j'ai opté pour le parcours de tous les aéroports dont ceux dans le rayon de 600 nm seront placés dans un stringlist. Le soucis restant est le tri sur la distance. J'ai cherché sur le web des précisions sur CustomSort, mais je ne parviens pas à en maîtriser l'usage. J'ai écrits une fonction de tri sur le modèle: Code :
Code :
Merci de votre aide. Cordialement Pierre |
||||
|
|
00
|
|
|
#17 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : janvier 2007 Messages : 9 651 ![]() |
euh.. Tu dois avoir un quicksort incorporé dans la biblo (qsort)
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#18 |
|
Nouveau Membre du Club
![]() Inscription : avril 2003 Messages : 152 ![]() |
Bonjour,
J'ai fini par trouver une solution qui résout ce problème. Je vous remercie vivement de m'avoir mis sur la piste. Très cordialement Pierre |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com