Bon, je pense avoir essayé un peu toutes les combinaisons d'entrée ou sortie d'un nouvelle tuile et cela se passe toujours bien. Je ne prétends pas pour autant qu'il ne reste pas quelques cas vicieux où cela ne fonctionne pas.
J'ai été amené à modifier deux de mes procédures. La première est "MaJ_Carte". Elle était trop restrictive quant aux déplacements horizontaux et verticaux en excluant les angles. Du coup elle beaucoup plus simple :
Mais du coup, cela m'a amené à modifier la procédure "Infos_Tuile". Avant, la nouvelle tuile de référence était celle dont la latitude et la longitude étaient déterminées par la position du curseur. Cela semblait logique sauf que lorsque je me déplaçais par un angle, et ne franchissais pas le seuil en même temps en X et en Y, la nouvelle tuile de référence n'aurait dû être que déplacée dans le sens X ou Y. C'est ce que je fais cette fois-ci en ne jouant que sur les indices OSMLon ou OSMLat.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 procedure TAffCarte.MaJ_Carte(Dec: TPointF); var Cas: Integer; begin Cas:= 0; if (Abs(Dec.X) > MaxDecal) or (Abs(Dec.Y) > MaxDecal) then Cas:= 9 else if (Dec.X > SeuilDecal) then Cas:= 1 else // Augmentation de la longitude if (Dec.X < -SeuilDecal) then Cas:= 2 else // Diminution de la longitude if (Dec.Y > SeuilDecal) then Cas:= 3 else // Diminution de la latitude if (Dec.Y < -SeuilDecal) then Cas:= 4 ; // Augmentation de la latitude if (Cas > 0) and MajAff then begin MajAff:= False; Infos_Tuiles(Latitude, Longitude, ZoomCarte, Cas, Tuile); Charge_Tuiles(Tuile, Cas, Depl, TotDepl); end; end;
Dans le cas ou X et Y franchissent le seuil simultanément, dans la procédure suivante, ce sont toujours les Cas 1 et 2 qui sont mis en œuvre, sachant qu'au prochain déplacement d'un pixel ce seront systématiquement les Cas 3 et 4 qui seront sollicités.
Dans le cas où le déplacement est supérieur à la dimension d'une tuile, je reprends le choix par latitude et longitude, mais en rechargeant toutes les 25 tuiles ; ils n'y a donc pas de problème de mauvais décalage entre les tuiles décalées et les nouvelles chargées.
Cordialement.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 procedure Infos_Tuiles(La, Lo: Extended; Zm, Cas: Integer; var Tuile: TRefCarte); begin with Tuile do try case Cas of 1: Inc(OSMLon); 2: Dec(OSMLon); 3: Inc(OSMLat); 4: Dec(OSMLat); else OSMLat:= IndYOSM(La, Zm); // Indice du fichier tuile pour cette latitude OSMLon:= IndXOSM(Lo, Zm); // Indice du sous-répertoire des longitudes end; RepZoom:= Index_Zoom(LstZoom, Zm); // Nom du sous-répertoire des zoom Nom:= Fch_Tuile(OSMLat, OSMLon, Tuile); // Nom du fichier tuile Zoom:= Zm; // Zoom Lon:= Lo; // Longitude (en degrés décimaux) Lat:= La; // Latitude (en degrés décimaux) LatTuileH:= LatOSM(OSMLat, Zm); // Latitude du bord haut de la tuile LatTuileB:= LatOSM(OSMLat+1, Zm); // Latitude du bord bas de la tuile LonTuileG:= LonOSM(OSMLon, Zm); // Longitude du bord gauche de la tuile LonTuileD:= LonOSM(OSMLon+1, Zm); // Longitude du bord Droit de la tuile DeplX:= Round(DimTuile*(Lo-LonTuileG)/(LonTuileD-LonTuileG)); // Position en X dans la tuile DeplY:= Round(DimTuile*(LatTuileH-La)/(LatTuileH-LatTuileB)); // Position eh Y dans la tuile except end; end;
Pierre.