Les tuiles sont d'abord recherchées dans le cache mémoire (les tuiles affichées il y a peu), le cache local, l'archive locale puis sur internet si besoin.
Cache local
En attribuant un répertoire à la propriété LocalCache les tuiles téléchargées depuis internet sont enregistrées en local et sont disponibles hors connexion.Sous android vous allez devoir demander la permission pour lire et écrire vos données.
1...
System.Permissions,
{$IFDEF ANDROID}
Androidapi.Jni.Os,
Androidapi.jni.javatypes,
Androidapi.Helpers,
{$ENDIF}
...
{$IFDEF ANDROID}
PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE),
JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)],
procedure(const APermissions: TArray< string >;
const AGrantResults: TArray<TPermissionStatus>)
begin
if (Length(AGrantResults) = 2) and
(AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted)
then map.LocalCache := TPath.Combine(TPath.GetSharedDocumentsPath, 'cache')
else
map.LocalCache := '';
end)
{$ELSE}
map.LocalCache := TPath.Combine(TPath.GetSharedDocumentsPath, 'cache');
{$ENDIF}
Utilisez la propriété MaxDayInCache pour spécifier la durée de retention dans le cache, 0 pour un cache infini, par défaut 30 jours.
Archive Locale
Une archive locale correspond au cache local mis dans un Zip, cela simplifie le déploiement des tuiles et des autres fichiers.
Pour améliorer la vitesse les tuiles sont extraites de l'archive et placées dans le cache locale lors de la première demande, vous devez donc définir un cache local pour utiliser une archive.
map.TileServer := tsOSM;
map.LocalArchive := ExtractfilePath(ParamStr(0))+'ile_de_re.zip';
Si des routes ou des géolocations d'adresses sont enregistrées dans l'archive la récupération est totalement transparente
1// if an archive is connected and contains the route, no internet connection is made to return the way
map.Routing.Request('saint-martin de ré', 'la couarde sur mer');
Vous pouvez y stocker vos images ou des fichiers de données (kml, geojson etc...), pour les charger il suffira de faire débuter le nom du fichier par /
map.Shapes.LoadFromFile('/DATA/tdf.kml');
map.LoadFromFile('/DATA/tarbes.txt');
// load image in marker
marker.filename := '/IMAGE/node.png';
Utilisez MapArchive pour manipuler directement votre archive et extraire vos autres données.
try
map.MapArchive.ReadStream('DATA/mydata.txt',m);
memo1.Lines.LoadFromStream(m);
finally
m.Free;
end;
MapArchiveCreator
Ce petit utilitaire permet de créer vos archives, vous pouvez télécharger des zones de tuiles, enregistrer des routes, ajouter des images et des fichiers.
Vous pouvez interdire toute connexion internet pour les tuiles et le geocodage en utilisant la propriété OnlyLocal
2map.onlyLocal := true;
Téléchager une zone complète
La classe TECDownLoadTiles vous permet de télécharger en arrière-plan une zone complète, la demo EcNativeMapFiremonkeyDemo vous montre comment précharger la zone visible à l'écran.
FECDownLoadTiles:=TECDownLoadTiles.create;
FECDownLoadTiles.OnDownLoad := doDownLoadtiles;
FECDownLoadTiles.OnEndDownLoad :=
doEndDownLoadtiles;
// tiles are saved in
DirectoryTiles
FECDownLoadTiles.DirectoryTiles := map.LocalCache;
FECDownLoadTiles.TileServer := map.TileServer;
FECDownLoadTiles.TileSize := map.TileSize;
// download visible area from
zoom+1 to MaxZoom
FECDownLoadTiles.DownLoadTiles(map.Zoom+1,map.MaxZoom,
map.NorthEastLatitude,map.NorthEastLongitude,
map.SouthWestLatitude,map.SouthWestLongitude);
...
// for abort
FECDownLoadTiles.Cancel;
// for pause
FECDownLoadTiles.Pause := true;
// restart
FECDownLoadTiles.Pause := false;
// see ECNativeMapFiremokeyDemo for
complete use
Assurez-vous que votre fournisseur de tuiles autorise cela !
2Reprendre le téléchargement ultérieument
Vous devez sauvegarder les propriétés suivantes pour pouvoir reprendre le téléchargement à une position spécifique.
property StartY : integer
property StartZoom : byte
property StartCountTiles : integer
property StartDownLoadTiles : integer
property FromZoom : integer
property ToZoom : Integer
property NorthEastLatitude : double
property NorthEastLongitude : double
property SouthWestLatitude : double
property SouthWestLongitude : double
Pour la reprise il faudra appeler cette version de DownLoadTiles
const NorthEastLatitude, NorthEastLongitude,
SouthWestLatitude,SouthWestLongitude: double;
const StartX,StartY:integer;
const StartZoom:byte;
const StartCountTiles,
StartDownLoadtiles:integer);
Remplir le Stream des tuiles
Vous pouvez aussi directement retourner un stream contenant le jpeg ou le png de vos tuiles, utile si vous avez vos tuiles dans une base de données.
FECDownLoadTiles:=TECDownLoadTiles.create;
FECDownLoadTiles.OnDownLoad := doDownLoadtiles;
FECDownLoadTiles.OnEndDownLoad :=
doEndDownLoadtiles;
// tiles are saved in
DirectoryTiles
FECDownLoadTiles.DirectoryTiles := map.LocalCache;
FECDownLoadTiles.TileServer := map.TileServer;
FECDownLoadTiles.TileSize := map.TileSize;
// download visible area from
zoom+1 to MaxZoom
FECDownLoadTiles.DownLoadTiles(map.Zoom+1,map.MaxZoom,
map.NorthEastLatitude,map.NorthEastLongitude,
map.SouthWestLatitude,map.SouthWestLongitude);
...
// for abort
FECDownLoadTiles.Cancel;
// for pause
FECDownLoadTiles.Pause := true;
// restart
FECDownLoadTiles.Pause := false;
// see ECNativeMapFiremokeyDemo for
complete use
Vous pouvez aussi vous en servir pour utiliser un serveur de tuiles distant.
1