Composant Delphi / Google Maps / OpenStreetMap / Leaflet  / Mappilary / Native Maps 100% Delphi 0% WebBrowser 0% Javascript

Import/Export

Vous êtes ici :TECMap

TECNativeMap permet d'enregistrer et de recharger la totalité de ses données dans un simple fichier texte, cela comprend non seulement les paramètrages du composant et des vues mais aussi les données cartographiques

Vous pouvez aussi importer/exporter vos données aux formats GPX , GeoJSON et KML

Sauvegarde/Restauration

function SaveToFile(const filename:string):boolean;

Enregistre la carte dans un fichier texte.

Utilisez les extensions .gpx , .kml pour spécifier un format, autrement c'est le format interne d'ECNativeMap qui sera employé

function LoadFromFile(const filename:string):boolean;

Charge la carte avec un fichier texte

Utilisez les extensions .gpx, .json , .kml pour spécifier un format, autrement c'est le format interne d'ECNativeMap qui sera employé

 

LoadFromFile peut télécharger les fichiers sur internet

69

 

property toGPX : string;

Propriété en lecture/écriture qui donne accès aux données de la carte dans le format GPX.

Cette propriété est utilisée par SaveToFile, LoadFromFile.

property toTxt : string;

Propriété en lecture/écriture qui donne accès aux données de la carte dans un format texte.

Cette propriété est utilisée par SaveToFile, LoadFromFile.

property ToKml : string;

Propriété en lecture / écriture qui retourne les éléments géographique de la carte au format Kml

property toGeoJson : string;

Propriété en lecture/écriture qui donne accès aux données de la carte dans le format GeoJson.

Vous accédez aux données du champ "properties" avec TECShape.Properties, reportez vous au chapitre sur les Tuiles vectorielles pour apprendre à styler vos éléments.

Cette propriété est utilisée par SaveToFile, LoadFromFile.

Évenements

Pendant le chargement de la carte l'évenement OnLoadShapes(sender: TObject;const ShapeType:string;const index,max:integer;var cancel:boolean) se déclenche
pour chaque élement ajouté.

ShapeType peut prendre les valeurs 'TECShapePOI', 'TECShapeMarker', 'TECShapeLine' , 'TECShapePolygone' et 'TECShapeInfoWindow'.

Index indique le numéro de l'élément actuellement chargé et Max le nombre total d'éléments à charger.

Vous pouvez abandonner le chargement en basculant cancel à true

Lorsque le fichier à été chargé l'événement OnLoad(sender: TObject;const GroupName:string;const FinishLoading : boolean)

GroupName contient le nom du groupe qui a été chargé, vide pour un chargement direct de la carte (groupe par défaut)

FinishLoading vaut true si le fichier a été chargé en totalité et false s'il a été abandonné en basculant cancel à true


OSM XML

La classe TOSMFile de l'unité uecOSM vous permet de travailler avec des fichiers au format OSM XML ( format de base d'OpenMapStreet ).

Vous pouvez télécharger des régions du monde dans ce format sur le site geofabrik.de, prenez les fichiers .osm.bz2 et dézippez-les

OSM XML est volumineux, certains fichiers font plusieurs Giga, TOSMFile peut utiliser un format interne (.olt) jusqu'a 19 fois plus léger, 10 fois plus rapide à traiter.

Pour convertir simplement un fichier .osm en .olt utiliser la procedure OSMFileToOLT(const OSMFilename:string;const Notify:TNOtifyEvent=nil);

La conversion est effectuée dans un thread et Notify est appelé lorsque le travail est terminé.

rocedure TForm2.SaveOLTClick(Sender : TObject);
begin

// doEndSaveToOLT is call when file is saved
OSMFileToOLT(FOSMFile.filename, doEndSaveToOLT);

end;

procedure TForm2.doEndSaveToOLT(Sender : TObject);
begin
// here your osm file is savec in .olt

end;

Vous devez utiliser directement TOSMFile pour convertir des portions de fichiers OSM

70

TOMSFile

function LoadFromFile(const sFilename : string) : boolean;
function LoadFromStream(const OSMStream : TStream) : boolean;
function LoadFromString(const OSMData : string) : boolean;

Charge un fichier OSM ou OLT, le traitement a lieu dans un Thread donc il ne bloque pas votre programme

property FilterPrimitive : TSetPrimitiveOSM ;

Il y a 3 primitives, les nodes, les ways et les relations.

// handle all primitive
FOSMFile.FilterPrimitive := [poNode,poWay,poRelation];

Si vous souhaitez connaitre simplement la zone geographique couverte par le fichier sans charger les données, filtrez tout !

20
FOSMFile.FilterPrimitive := [];

property FilterBounds : TFilterBounds;

Détermine les zones géographiques qui nous intéressent, les données situées en dehors sont ignorées.

FOSMFile.FilterBounds.Clear;
FOSMFile.FilterBounds.Add(Area1_NorthEastLat, Area1_NorthEastLng, Area1_SouthWestLat, Area1_SouthWestLng);
FOSMFile.FilterBounds.Add(Area2_NorthEastLat, Area2_NorthEastLng, Area2_SouthWestLat, Area2_SouthWestLng);

property FilterNode : TListFilterOSM;
property FilterWay : TListFilterOSM;
property FilterRelation : TListFilterOSM;

Filtre les éléments en fonction de leur clefs et valeurs, les filtres descendent de la classe TFilterOSM

ExcludeKeyValue(const Key, Value : string), OnlyKeyValue(const Key, Value : string), ExcludeIfKeyExist(const Key:string) et OnlyIfKeyExist(const Key:string) vous simplifie la création de filtres.

71
FOSMFile.FilterWay.clear;
FOSMFile.FilterWay.ExcludeIfKeyExist('building');
FOSMFile.FilterWay.ExcludeKeyValue('leisure','park');
FOSMFile.FilterWay.ExcludeKeyValue('natural','coastline');
function ReLoad : boolean;
Retraite un fichier après avoir modifié les divers filtres, les clefs et les valeurs ne sont pas rechargées cela permet de gagnez quelques secondes.

procedure saveToFile(const Filename : string; NotifyEvent : TNotifyEvent = nil);
Vous pouvez sauvegarder dans le format propriétaire .olt ou au format GeoJSON
// save in geojson
FOSMFile.SaveToFile('path_myfile.geojson');
// save in olt
FOSMFile.SaveToFile('path_myfile.olt');

Pour sauvegarder dans un thread indiquez un NotifyEvent

72
procedure TForm2.SaveOLTClick(Sender : TObject);
begin
// doEndSaveToOLT is call when file is saved
FOSMFile.SaveToFile('path_myfile.olt',doEndSaveToOLT);
end;

procedure TForm2.doEndSaveToOLT(Sender : TObject);
begin
// here your osm file is savec in .olt
end;
property Nodes : TNodeList read FNodeList;
property Ways : TWayList read FWayList;
property Relations : TRelationList read FRelationList;

Listes des éléments contenu dans le fichier après filtrage.

Chaque liste dispose de fonctions permettant d'effectuer des recherches sur ces éléments.

Find(idElement) retourne un élément en fonction de son id

Les diverses fonctions Search remplisse la liste SearchResult avec les éléments remplissant les conditions

function Search(const Lat, Lng, radiusKM : double) : integer; overload;
Trouve tous les éléments situés dans une zone centrée sur le point Lat,Lng et de rayon radiusKM

function Search(const SWLat, SWLng, NELat, NELng : double) : integer; overload;
Trouve tous les éléments de la zone.

function Search(const SWLat, SWLng, NELat, NELng : double; const Key, Values : string) : integer; overload;
Trouve tous les éléments de la zone avec une Clef contenant les valeurs spécifiées.

function Search(const Key, Values : string) : integer; overload;
Trouve tous les éléments dont la clef contient les valeurs indiquées.

// search all nodes with amenity=car or amenity=bar or amenity=restaurant
FOSMFile.Nodes.Search('amenity','cafe|bar|restaurant');

// search all ways with highway=residential or highway=secondary
FOSMFile.Ways.Search('highway','residential|secondary');

function Search(const Key : string) : integer; overload;
Trouve tous les éléments possédant cette clef, quelque soit la valeur.



procedure Clear;

procedure Abort;
Abandonne un chargement

procedure ToShapes(Shapes:TECShapes;NotifyEvent:TNotifyEvent=nil);

Charge les données dans un groupe.

// load in default group
FOSMFile.ToShapes(map.Shapes);
procedure FindToShapes(Shapes:TECShapes;NotifyEvent:TNotifyEvent=nil);

Charge les données recherchées dans un groupe.

// search all nodes with amenity=car or amenity=bar or amenity=restaurant
FOSMFile.Nodes.Search('amenity','cafe|bar|restaurant');

// search all ways with highway=residential or highway=secondary
FOSMFile.Ways.Search('highway','residential|secondary');

// load in default group
FOSMFile.FindToShapes(map.Shapes);


function CountKey(Node: TBaseOSM):integer;
Retourne le nombre de tag pour un élément

function getKey(Node:TBaseOSM;const index:integer):string;
Retourne la key dont on passe l'index

function ReadKey(Node : TBaseOSM; const KeyName : string) : string; overload;
Retourne la valeur de la Key

function ReadKey(Node : TBaseOSM) : string; overload;
Retourne l'ensemble des paires key/value sous la forme : Key1=value1#13#10Key2=value2#13#10Keyx=ValueX

function ReadValuesForKey(const KeyName : string; valuesList : TStringList): integer;
Rempli ValuesList avec l'ensemble des valeurs pour une Key


property Aborted : boolean;
Indique si le chargement a été interrompu par Abort

property Bounds : TBoundsLatLng ;
Contient la zone géographique décrite par le fichier


property FileFormat: TFileTypeOSM;
Retourne le type de fichier (ftOSM ou ftOLT)

property Filename : string ;
property FileSize : int64;

property Keys : TUniqueStringList;
Liste de la totalité des Key du fichier

property Values : TUniqueStringList;
Liste de la totalité des Value du fichier

property Role[Member : TMemberOSM]:string;
Retourne le role d'un membre d'une relation

property Timestamp : string ;
Retourne la date de la dernière mise à jour du fichier



property OnRead : TOnOSMBlockRead;
Pour pouvoir traiter des fichiers de plusieurs Giga la lecture est faite par bloc, cet événement est déclenché à chaque chargement d'un bloc.

property OnLoaded : TNotifyEvent;
Déclenché lorsque la totalité du fichier a été traité.

Consultez DemoOSMViewer pour voir une utilisation réelle de TOSMFile

8

OSMViewer

Fig. 83 Demo OSMViewer

Convertir un fichier OSM en OLT

Ouvrez le fichier OSM dans OSMviewer, la zone couverte s'affiche sur la carte

Cochez les primitives que vous souhaitez exporter (nodes, ways et relation) puis cliquez sur Save OLT pour lancer la conversion


Fig. 84 Select nodes

Suivant la taille du fichier OSM le travail peut durer quelques minutes.

73

Pour exporter les ways toutes les nodes sont conservée en mémoire il faut avoir 1Mo de mémoire par Go de fichier.

Si vous ne convertissez que les nodes vous pourrez travailler avec des fichiers de 100 Go même si vous n'avez que 8Mo de mémoire.

27
Faites un clic droit et tout en maintenant le bouton enfoncé déplacez la souris pour définir une zone à explorer.

Fig. 85 Sélection d'une zone

Une fois la zone chargée vous aurez le choix entre affichée les données sur la carte ou les sauvegarder en .olt

En chargeant les données vous pouvez effectuer des recherches en fonction des paires key/value

Fig. 86 search highway=residential

Télécharger OSMViewer

Vous pouvez télécharger un apk pour android d'une mini demo qui affiche les données OSM d'une petite zone.

Fig. 87 Android Test OLT

Capture Image

Vous pouvez enregistrer la zone visible de l'écran avec la propriété ScreenShot qui est un TBitmap

// Delphi map component TECNativeMap

// save map to bmp file
map.Screenshot('c:\mymap.bmp');

Vous pouvez aussi capturer n'importe quelle zone géographique, même hors-écran, avec la propriété ScreenShots

21

// procedure call when bitmap ready
map.ScreenShots.OnScreenShot := doScreenShot ;

// you can change the size of the bitmap between each capture (default 800x600)
map.ScreenShots.Width := 2000;
map.ScreenShots.Height:= 2000;

// capture area centered on a point with a specified zoom
map.ScreenShots.ScreenShot(latitude,longiture, 16,'optional_name_of_capture');

// you can take screenshots even if the previous is not over yet

// Take the best zoom to a specific area
map.ScreenShots.ScreenShot(NorthEastLat, NorthEastELng, SouthWestWLat, SouthWestLng,'optional_name_of_capture');

// Take the best zoom to an area defined by its center and radius in km
// CAUTION use double for the radius, here 1.0 km, otherwise it will be mistaken for a simple zoom

map.ScreenShots.ScreenShot(Latitude, Longitude, 1.0 ,'optional_name_of_capture');


// when capture is ready, you go here
procedure TForm.doScreenShot(const name:string;const Screenshot:TBitmap);
begin
// don't free ScreenShot !
screenshot.SaveToFile(YourPath+name+'.bmp');
end;

La demo Photographer pour Firemonkey vous montre un exemple d'utilisation, vous lancez 8 "drones" pour photographier le terrain tous les x mètres.

Fig. 88 Photographer

Aller à la page
Composant Delphi / Google Maps / OpenStreetMap / Leaflet  / Mappilary© 2016 ESCOT-SEP Christophe - Réalisé avec Help&Web - RSS - RSS - Google+