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

Shapes

Vous êtes ici :TECNativeMap

Pour utiliser les formes vous devez rajouter l'unité uecNativeShape

Tous les éléments positionnés sur la carte sont accessibles au travers de la propriété Shapes de type TECShapes ou des autres groupes via Group['name'], ils descendent tous de la classe TECShape

Vous pouvez stockers dans vos éléments (marker, poi, line ou polygone) les données textuelles que souhaitez au travers de la propriété PropertyValue ses valeurs pourront être associées à un style

var M:TECShapeMarker;
...
M := Map.addMarker(map.latitude,map.Longitude);
M.PropertyValue['my_tag']:='value_tag';
// you can also use
M['my_tag']:='value_tag';
// groups can also have them
map.shapes['tag']:='value';
map['group']['tag']:='value';

Lorsque vous ajoutez plusieurs éléments à la suite encadrez-les par le couple BeginUpdate / EndUpdate

14

// for optimisation
map.shapes.BeginUpdate;

map.Shapes.Markers.add(lat1,lng1);
map.shapes.Markers.add(lat2,lng2);
...
map.shapes.EndUpdate;

var G:TECShapes;
...
G := map.Groups['group_name'];
G.BeginUpdate;

G.Markers.add(lat1,lng1);
G.Markers.add(lat2,lng2);
...
G.EndUpdate;

Styles

Au lieu de décorer manuellement chaque élément vous pouvez définir des régles pour leur appliquer un style

Groupes ( TECShapes )

Un groupe gère un ensemble d'éléments, en fait la propriété Shapes est le groupe par défaut, vous accédez à un groupe par la propriété Group['name']

Vous pouvez aussi y accéder par un index au travers de la propriété Groups

16

for i:=0 to map.groups.count-1 do
map.groups[i].Clear;

// or by iterator

Group : TECShapes;

for Group in map.Groups do
Group.Clear;


property CSV: TecCSV
Gestionnaire de chargement des fichiers csv
procedure Clear
vide le groupe
procedure BeginUpdate
Ne pas répercuter immédiatement les ajouts d'éléments dans le groupe, assure une meilleur performance
procedure EndUpdate
Répercuter les ajouts au groupe

var my_group:TECShapes;
// for optimisation
my_group := map.Group['group1'];
my_group.BeginUpdate;

my_group.Markers.add(lat1,lng1);
my_group.Markers.add(lat2,lng2);
...
my_group.EndUpdate;

procedure fitBounds
Affiche la carte de manière a ce que tous les éléments du groupe soient visible dans le meilleur zoom

Les propriétés Pois, markers, lines et Polygones disposent aussi d'une procedure fitBounds

17
procedure SaveToFile(const Filename: string)
Enregistre le groupe dans un fichier, le format est déterminé par l'extension .gpx, .kml ou format texte propre à TECNativeMap
function LoadFromFile(const Filename: string): boolean
Charge le groupe avec le contenu d'un fichier, le format est déterminé par l'extension .osm, .olt .gpx, .kml, .csv ou format texte propre à TECNativeMap

L'événement OnLoad est déclenché lorsque le contenu est totalement disponible

18
function LoadFromOSMStream(const Stream: TStream): boolean;

Charge le groupe avec un stream contenant des données au format OSM XML ou olt

function LoadFromOSMString(const data: string): boolean;

Charge le groupe avec une chaine contenant des données au format OSM XML ou olt

property Clusterable : boolean

Active les support des Clusters, cela permet de regrouper des markers ou des pois proches pour une meilleure visibilité

Fig. 42 Clustering

property ClusterManager : TECClusterManager
property Pois: TECShapePOIList
Liste des éléments de type TECShapePOI
property Markers: TECShapeMarkerList
Liste des éléments de type TECShapeMarker
property Lines: TECShapeLineList
Liste des éléments de type TECShapeLine
property Polygones: TECShapePolygoneList
Liste des éléments de type TECShapePolygone
property InfoWindows: TECShapeInfoWindowList
Liste des éléments de type TECShapeInfoWindow

Les listes d'éléments disposent d'un itérateur comme les groupes

15

// Iterator for all list of shapes (markers, pois, lines, polygones and infowindows )

var poly : TECShapePolygone;

for poly in map.shapes.polygones do
begin
poly.color := clRed;
end;

Vous avez aussi des raccourcis pour créer vos éléments

16

function addMarker(const Lat, Lng: double) : TECShapeMarker;

function AddPOI(const Lat, Lng: double) : TECShapePOI;

function AddLine: TECShapeLine;

function AddEncodedLine(const EncodedLine: string; const precision: byte = 5): TECShapeLine;

function AddLine(const dLatLngs: array of double): TECShapeLine;

function AddLine(const dLine: TECShapeLine) : TECShapeLine;

function AddPolygone : TECShapePolygone;

function AddPolygone(const dLine: TECShapeLine): TECShapePolygone;

function AddEncodedPolygone(const EncodedLine: string; const precision: byte = 5): TECShapePolygone;

function AddPolygone(const dLatLngs: array of double): TECShapePolygone;

var my_maker : TECShapeMarker;
my_line : TECShapeLine;
my_poly : TECShapePolygone;
my_group : TECShapes;
...

my_group := map['my_group'];
my_marker := my_group.addMarker(lat,lng);
my_line := my_group.addLine([lat1,lng1,...,latx,lngx]);
my_poly := my_group.addPolygone(my_line);

property MaxZoom: byte

Niveau maximal de zoom pour lequel les éléments sont affichés, au-dessus le groupe ne s'affiche pas
property MinZoom: byte
Niveau minimal de zoom pour lequel les éléments sont affichés, en dessous le groupe ne s'affiche pas
property Zindex : longint
Les groupes s'affichent dans l'ordre croissant de leur ZIndex
function TopZindex : longint;
Retourne le ZIndex le plus élevé de l'ensemble des éléments du groupe

TECNativeMap.TopGroupZindex retourne le ZIndex le plus élevé de tous les groupes

19
property Clickable : boolean
Indique si l'ensemble des éléments sont clickables

Les éléments ont eux aussi une propriété clickable

20
property Serialize : boolean
Indique si le groupe doit être sauvegardé lorsque l'on enregistre l'ensemble de la carte

Ne s'applique pas si l'on sauvegarde directement le groupe

21


map.Group['group1'].Serialize := true;
map.Group['group2'].Serialize := false;

map.SaveToFile(filename); // group2 not save

property Visible: boolean
Affiche/Cache le groupe
property Show: boolean
Affiche/Cache le groupe mais contrairement à visible les éléments restent accessible à la souris

Fig. 43 TECShapes.Show

property ShowHint: boolean
Autorise l'affichage de la propriété Hint des éléments sous la forme d'une bulle lors du survol de la souris
property Selected : boolean
Sélectionne / Déselectionne l'ensemble des éléments du groupe
Retourne true si au moins un des éléments du groupe est sélectionné.

Les listes d'éléments ont aussi une propriété Selected

22
// selects all markers of test group
map['test'].markers.Selected := true;
// selects all pois of test group
map['test'].pois.Selected := true;
// selects all lines of test group
map['test'].lines.Selected := true;
// selects all polygones of test group
map['test'].polygones.Selected := true;

property Name: string

nom du groupe en lecture seule
property ToTxt: string;
Import/Export au format natif
property ToGpx: string;
Import/Export au format Gpx
property ToKml: string;
Import/Export au format Kml

CSV

Le gestionnaire de fichiers CSV est accessible au travers de la propriété CSV des groupes

function LoadFromFile(const filename: string):boolean;
Charge les données du fichier CSV dans le groupe et retourne true si c'est ok.
function LoadFromStream(const stream: TStream):boolean;
Charge les données du stream CSV dans le groupe et retourne true si c'est ok.
function ASyncLoadFromFile(const filename: string):boolean;
Charge les données du fichier CSV dans le groupe de manière asynchrone (dans un thread) et retourne true si c'est ok.
function ASyncLoadFromStream(const stream: TStream):boolean;
Charge les données du stream CSV dans le groupe de manière asynchrone (dans un thread) et retourne true si c'est ok.

Lorsque les données sont chargées l'événement OnLoad de la carte est déclenché

23

procedure SaveToFile(const filename: string;const ShapeList:TECShapeList);

Enregistre la liste d'éléments (markers ou Pois) dans un fichier csv

Utilisez la liste Fields pour sélectionner les PropertyValue a enregistrer.
Fields contient les champs du dernier fichier CSV chargé donc au besoin videz la avant de la remplir avec votre sélection.
Pas besoin d'y rajouter les champs pour la Latitude et Longitude, FieldNameLatitude et FieldNameLongitude seront utilisées
map.Shapes.CSV.Fields.clear;
map.Shapes.CSV.Fields.add('street');
map.Shapes.CSV.Fields.add('zip');
map.Shapes.CSV.SaveToFile(filename,map.shapes.Markers);

property FieldNameLatitude: string;

Nom du champ qui contient la latitude, par défaut "latitude"
property FieldNameLongitude: string;
Nom du champ qui contient la longitude, par défaut "longitude"

Si la position géographique est regroupée dans un seul champ, indiquez le dans FieldNameLatitude, laissez FieldNameLongitude vide, utilisez DelimiterLatLng pour définir le séparateur entre la latitude et la longitude.

17
map.Shapes.CSV.FieldNameLatitude := 'centroide';
map.Shapes.CSV.FieldNameLongitude := '';
map.Shapes.CSV.DelimiterLatLng := ',';

property idxLatitude: integer

si la première ligne du fichier csv ne contient pas l'intitulé des champs, vous devrez indiquer l'index du champ latitude

property idxLongitude: integer

si la première ligne du fichier csv ne contient pas l'intitulé des champs, vous devrez indiquer l'index du champ longitude
// if the first line of the csv file does not indicate the names of the fields,
// you can indicate directly the index of the fields containing the latitude and longitude
// You must also empty FieldNameLatitude and FieldNameLongitude

map.Shapes.CSV.FieldNameLatitude := '';
map.Shapes.CSV.FieldNameLongitude := '';
map.Shapes.CSV.idxLatitude := 10;
map.Shapes.CSV.idxLongitude := 11;

property Delimiter : char

Délimitateur des champs, par défaut ","
property OnCreateCSVPoint: TOnCreateCSVPoint
Par défaut les éléments sont importés sous la forme de Markers de style siFlat
En vous branchant sur cet événement vous pourrez définir vous même le type d'élément Marker ou Poi et ses diverses caractéristiques.
map.Shapes.CSV.OnCreateCSVPoint := doCSVPoint;

// Data contains the values of each field, you can use it to define your element
procedure TForm.doCSVPoint(const Group: TECShapes; var CSVPoint: TECShape; const Lat, Lng: double; const Data:TStringList) ;
var i:integer;
begin
// if you don't want to import this element return CSVPoint := nil

// The elements will be pois stars
i := Group.Pois.Add(lat,lng);
CSVPoint := Group.Pois[i];
TECShapePOI(CSVPoint).POIShape := poiStar;
end;

Les autres champs du fichier CSV sont importés dans les éléments au travers de leur propriété PropertyValue[field_name] := field_value
Si le fichier CSV ne nomme pas ses champs, ils seront dénommés en concatant le nom du fichier sans l'extension + l'index du champ

Fig. 44 DemoCSV

Labels

Les listes de Polygones, de Markers et de Pois permettent d'associer des labels à leurs éléments, vous y accédez au travers de la propriétés Labels

property Align: TLabelShapeAlign
Choix de la position du label : laTop (défaut) ou laBottom, laright, laLeft, laCenter
property BorderSize: integer
property BorderColor: TColor

property ColorType: TLabelShapeColorType
Fixation de la couleur, par défaut lcShape la couleur de l'item sera utilisé, ou lcColor la couleur sera fixé par la propriété Color
property Color: TColor

property FontColor: TColor

property FontBold: boolean

property FontItalic: boolean

property FontSize: integer

property FontFamily: string

property LabelType: TLabelShapeType
Choix du champ dont le texte servira de label : ltHint, ltDescription (défaut) ou ltProperty
property LabelProperty: string
Définition de la propriété utilisée si LabelType=ltProperty
property MaxWidth : integer
Largeur maximale pour les labels mono-ligne, au-delà le texte est coupé et est remplacé par "..."
Mettre 0 (valeur par défaut) pour que tout le texte s'affiche
property Margin: integer
Marge entre l'élément et son label (défaut 8 pixels)
property MaxShow: integer
Nombre maximal de labels affichés (défaut 1000)
property Style: TLabelShapeStyle
Style du fond : lsRectangle (défaut), lsRoundRect ou lsTransparent
property Visible: boolean

property ShowOnlyIf : TLabelShowOnly (default lsoAll)

Filtrer l'affichage des labels

Possibilités : lsoAll,lsoSelected,lsoPressed,lsoHover,lsoFocused

// display the label only when you press the marker
map.shapes.markers.labels.ShowOnlyIf := lsoPressed;

sur mobile lsoHover est identique à lsoPressed

24
property Rotation: boolean
Si True si la carte subit une rotation les labels restent à l'horizontale mais n'ont plus de fond.
property Transparent: boolean
Si True les labels ont la même opacité que leur élément associé
property Scale: boolean
Si True les labels utilisent celui de leur élément associé
map.Shapes.Markers.Labels.Visible := true;
map.group['groupX'].Pois.Labels.Visible := true;

map.Shapes.Markers.Labels.LabelType := ltHint;
// the text can be multi-line
map.Shapes.Markers[0].hint := 'Text label'+#13# 10+'line 2';

map.group['groupX'].Pois.Labels.LabelType := ltProperty;
map.group['groupX'].Pois.Labels.LabelProperty := 'lb_voie_ext';
map.group['groupX'].Pois[0].PropertyValue['lb_voie_ext'] := 'text label';

// By default the background color is the color of the element, use ColorType to set another color.

map.shapes.Markers.Labels.ColorType := lcColor; // default lcShape
map.shapes.Markers.Labels.Color := clRed;

Fig. 45 Affichages des labels

Ajouter des Shapes

Vous pouvez utiliser les raccourcis suivant pour ajouter vos éléments

function TNativeMapControl.AddPOI(const Lat, Lng: double; const GroupName: string = ''): TECShapePOI;


function TNativeMapControl.AddMarker(const Lat, Lng: double; const GroupName: string = ''): TECShapeMarker;


function TNativeMapControl.AddLine(const Lat, Lng: double; const GroupName: string = ''): TECShapeLine;


var line : TECShapeLine;
...
// create line
line := map.addLine(lat,lng);
// use this syntax for add line in group
// line := map.addLine(lat,lng,'your group');

// don't free ! or use remove
// line.remove

// to find your item in the list use indexof
// map.shapes.lines[line.indexof]
// map.group['your group'].lines[line.indexof]

// block repaint
line.beginupdate;
// add more points in line
line.add(lat2,lng2);
line.add(lat3,lng3);
// now of for repaint
line.endupdate;

function TNativeMapControl.AddLine(const dLatLngs: array of double; const GroupName: string = ''): TECShapeLine;


var line : TECShapeLine;
...
// create line
line := map.addLine([lat,lng,lat2,lng2,lat3,lng3]);
// use this syntax for add line in group
// line := map.addLine([lat,lng,lat2,lng2],'your group');

// block repaint, no need with addline but now yes
line.beginupdate;
// add more points in line
line.add(lat4,lng4);
line.add(lat5,lng5);
// now of for repaint
line.endupdate;

function TNativeMapControl.AddPolygone(const Lat, Lng: double; const GroupName: string = ''): TECShapePolygone;


function TNativeMapControl.AddPolygone(const dLatLngs: array of double; const GroupName: string = ''): TECShapePolygone;


function TNativeMapControl.AddInfoWindow(const Lat, Lng: double; const GroupName: string = ''): TECShapeInfoWindow;

Vous ne devez pas détruire manuellement les éléments ainsi créé si besoin utilisez remove, ils sont maintenu dans les listes de leur groupe respectif

10

TECClusterManager

Les propriétés suivantes vous permettent de modifier l'affichage des clusters

property Color : TColor
property TextColor : TColor
property BorderColor : TColor
property BorderSize : integer
property FontSize : integer
property Opacity : byte
property WidthHeight : integer
property FillClusterList : boolean
Conserve la liste des éléments contenu dans le cluster, par défaut false
Vous pourrez y avoir accès dans l'événement OnMouseOverCluster ( Cluster.shapes )
property MaxPixelDistance : integer

Les éléments qui sont à moins de MaxPixelDistance d'un cluster y sont regroupés, 60 pixels par défaut

property DrawWhenMoving : boolean

Permet d'afficher les clusters pendant que l'on déplace la carte, par défaut true

property MaxZoom : byte

Si le zoom est superieur à MaxZoom on ne regroupe pas les éléments, defaut 18

property OnAddShapeToCluster : TOnAddShapeToCluster (sender : TECCluster; const Shape:TECShape;var cancel:boolean)

Déclenché lors de l'ajout d'un élément dans un cluster, vous pouvez refuser en basculant cancel à true, défaut false

property OnColorSizeCluster : TOnColorSizeCluster (const Cluster : TECCluster;
var Color:TColor;var BorderColor:TColor;var TextColor:TColor,
var WidthHeight,FontSize:integer)

Déclenché avant l'affichage pour vous permettre d'ajuster les propriétés

property OnDrawCluster : TOnDrawCluster (const Canvas : TECCanvas; var rect : TRect; Cluster : TECCluster)

Si vous vous branchez sur cet évenement vous prenez en charge intégralement le dessin du cluster

property OnMouseOverCluster : TOnNotifyEventCluster (const Cluster : TECCluster)

Déclenché par l'entrée de la souris sur le cluster

property OnMouseOutCluster : TOnNotifyEventCluster (const Cluster : TECCluster)

Déclenché par la sortie de la souris du cluster

exemple, changer la couleur en fonction du nombre d'éléments contenu par le cluster

map.Shapes.Clusterable := true;
map.Shapes.ClusterManager.OnColorSizeCluster := doOnColorSizeCluster;

procedure TForm.doOnColorSizeCluster(const Cluster : TECCluster;
var Color:TColor;var BorderColor:TColor;var TextColor:TColor;
var WidthHeight,FontSize:integer
);
begin

if Cluster.Count< 10 then
begin
Color := clGreen;
end

else

if Cluster.Count< 100 then
begin
Color := clBlue;
end

else

Color := clRed;

end;

Élément TECShape

Tous les éléments affichable descendent de TECShape, ils partagent les propriétés suivantes

property Clusterable : boolean

Permet d'exclure l'élement des clusters, par défaut true

map.shapes.markers[10].Clusterable := false;
property Address: string
Retourne l'adresse de l'élément, la recherche est bloquante
procedure Location

Geolocalise l'élément, équivalent Address mais n'est pas bloquante

Déclenche OnShapeLocation(item:TECShape,GeoResult:TECGeoResult;const Valid:boolean);

Si le TECShape n'a pas d'événement OnShapeLocation c'est le OnShapeLocation de son groupe qui est déclenché.

Valid est a true si la position actuelle de l'élément est la même que celle lors du déclenchement de la recherche.

map.shapes.OnShapeLocation := doShapeLocation;
// Asynchronous search address for Markers[0],
// when it is found map.shapes.OnShapeLocation is triggered
map.shapes.Markers[0].Location;
//
procedure TForm1.doShapeLocation(item:TECShape;const GeoResult:TECGeoResult;const Valid:boolean);
begin

if assigned(item) and Valid then
begin
// address
GeoResult.address;
end;

end;




function DistanceTo(Shape:TECShape)

Retourne la distance en kilomètres entre les deux éléments
property Tag: longint
Vous pouvez l'utiliser librement
property Visible : boolean
Affiche ou cache l'élément
property TrackLine : TECShapeLine

Si TrackLine est définie la trace du déplacement de l'élément sera automatique gérée

Pour l'activer il suffit simplement d'y accéder, vous pouvez aussi directement assigner une ligne

FTracker := map.AddMarker(Latitude,Longitude) ;
// To activate the trace just access TrackLine
// line is created in the same group as FTracker
FTracker.TrackLine.visible := true;

// You can also pass a line
FTracker.TrackLine := your_line;

// for stop tracking set to nil , the line is free
FTracker.TrackLine := nil

Fig. 46 Trackline

property isTrackLineActive : boolean
Permet de savoir si une TrackLine est activée.

Si vous testez directement TrackLine elle est automatiquement créé si elle n'existe pas !

25
property Serialize : boolean
Permet d'indiquer si l'élément peut être enregistré dans un fichier (oui par défaut)
property Clickable
Rend l'élément réactif à la souris
property ZIndex
Les éléments s'affichent dans l'ordre croissant de leur ZIndex
BringToFront

Force l'élément a s'afficher au premier plan sans tenir compte des zindex

Un seul élément à la fois peut-être au premier plan, BringToFront ne change pas l'ordre d'affichage qui reste dépendant du ZIndex

26
SendToBack
Retour à l'ordre normal d'affichage
property Draggable
Rend un élément déplaçable à la souris
property Angle
Angle de rotation en degré (0-360)

Disponible pour les TECShapeMarker et TECShapePOI

11
property Hint: string
Texte affiché dans la bulle lorsque la souris survole l'élément, la propriété ShowHint du groupe parent doit avoir été basculé à true

Le texte peut être enrichi avec certains balises html voir TECShapeInfoWindow

18
property EnabledHint
Active/Désactive l'affichage de la bulle d'information de l'élément
property MaxShowHint
indique le nombre de fois que sera affichée la bulle d'information, vous pouvez la réactiver avec EnabledHint ou en rechargeant MaxShowHint
property PropertyValue[Name]
vous permet d'accéder à la valeur de la propriété Name

Vous pouvez utilisez PropertyValue pour stocker vos propres données, cette propriété est aussi utilisée par les tuiles vectorielles, les données OpenStreetMap y sont sauvegardées.

27
property Properties
Liste des Property/Value, au format "nom:valeur", chaque couple est séparé par un retour chariot.
property Group:TECShapes
Groupe auquel l'élément appartient
property Rotation:boolean;
compensation de la rotation de la carte, si true alors l'élément reste fixe même si la carte a tournée
property Selected

Sélectionne ou non un élément, un élément sélectionné s'affiche comme s'il était survolé

La propriété Selected de la carte contient tous les éléments sélectionnés

// you can use Iterator

var shape:TECShape

for shape in map.Selected do
begin
..
end;

TECSelectedShapesList

Type de la liste des éléments sélectionnés, vous donne accès à

function ByArea(const NEALat,NEALng,SWALat,SWALng :double):integer;
Sélectionne les élements se trouvant dans la zone délimitée par NEALat,NEALng (coin haut-droit) et SWALat,SWALng (coin bas-gauche)
function ByKMDistance(const FLat,FLng,FKMDistance :double):integer;
Sélectionne les éléments situés à moins de KMDistance (distance en km) du point FLat,FLng
procedure UnSelectedAll
Déselectionne tous les éléments sans les supprimer de la carte
procedure Clear
Efface de la carte tous les éléments sélectionnés

function count : integer;

procedure SaveToFile(const filename:string);

property Item[index: integer]: TECShape
Retourne l'élément dont on passe l'index
property ToTxt:string
Retourne les éléments sélectionnés dans le format texte interne de TECNativeMap (en lecture seulement)
property GroupFilter : TStringList
Permet de filtrer en fonction des groupes d'éléments, laissez vide pour pouvoir sélectionner les éléments sans tenir compte de son groupe
property OnChange:TNotifyEvent ;
Déclenché par l'ajout/suppression d'un élément à la liste des sélectionnés

Recherche

Vous avez plusieurs fonctions pour effectuer des recherches dans vos éléments


function FindShapeByArea(const SWALat, SWALng, NEALat, NEALng: double;
                        const ShapeList: TList<TECShape>;
                        const FilterShapes : TNativeShapes = [];
                        Filter:TOnShapeFilter=nil): integer;

Rempli ShapeList avec les éléments se trouvant dans une zone rectangulaire dont on indique les coins Sud-Ouest et Nord-Est

FilterShapes permet de filtrer les éléments recherchés, par défaut tous, exemple [nsMarker,nsPoi] pour ne rechercher que des TECShapeMarker et TECShapePOI

Filter permet d'ajouter une procedure pour filtrer la recherche

// find the cafes located less than 2km
map.FindShapeByKMDistance(map.Latitude,map.Longitude, 2.0,liste,[nsMarker,nsPoi],FilterCafe);
...

procedure FilterCafe(const Shape: TECShape; var cancel: boolean);
begin
cancel := shape.PropertyValue['kind']<>'cafe' ;
end;

function FindShapeByKMDistance(const FLat, FLng, FKMDistance: double;
                                const ShapeList: TList<TECShape>;
                                const FilterShapes : TNativeShapes = [];
                                Filter:TOnShapeFilter=nil): integer;
Rempli ShapeList avec les éléments qui se situent à moins de FKMDistance km du point FLat,FLng
function FindShapeByFilter(const ShapeList: TList<TECShape>;
                                const FilterShapes : TNativeShapes;
                                Filter:TOnShapeFilter): integer;

Toutes ces fonctions retournent le nombre d'éléments trouvé.

28

Pour les versions de Delphi qui ne supportent pas les génériques ShapeList est une simple TList

29

Événements

Les formes déclenchent les événements suivant :


property OnShapeMove : TOnShapeMove

property OnShapeDrag : TOnShapeMove

property OnShapeDragEnd : TNotifyEvent

property OnShapeMouseOver : TOnShapeMouseEvent

property OnShapeMouseOut : TOnShapeMouseEvent

property OnShapeMouseDown : TOnShapeMouseEvent

property OnShapeMouseup : TOnShapeMouseEvent

property OnShapeClick : TOnShapeMouseEvent

property OnShapeRightClick: TOnShapeMouseEvent

property OnShapeDblClick : TOnShapeMouseEvent

property OnShapePathChange : TNotifyEvent

property OnShapeLocation : TOnShapeLocation


Les événements peuvent être attribués individuellement à chaque élément, dans ce cas ils ne sont pas répercutés au niveau de TECNativeMap

19


map.shapes.Markers.add(lat1,lng1);
map.shapes.Markers.add(lat2,lng2);

// connect directly to the event
// OnshapeClick of TECNativeMap will not be triggered for marker 0
map.shapes.markers[0].OnShapeClick := MarkerShapeclick;


Aimanter des markers sur une ligne ou un polygone

Vous pouver définir des TECShapeMarker et des TECShapePOI qui seront automatiquement attirés vers une TECShapeLine ou un TECShapePolygone si vous les lachez a une certaine distance de ceux-ci.

Fig. 47 SnapDrag

Vous gérer cela au travers de la propriété SnapDrag de type TECSnapDrag du composant cartographique TECNativeMap.

procedure ClearMarker;
Supprime tous les markers aimantés
function AddMarker(const Marker: TECShape): boolean;
Ajoute un TECShapeMarker ou TECShapePOI dans la liste des markers aimantés.
retourne true si l'élément est bien ajouté.
procedure RemoveMarker(const Marker: TECShape);
supprime le marker de la liste des markers aimantés
procedure ClearGuide;
Supprime tous les TECShapeLine et TECShapePolygone de la liste des guides
function AddGuide(const Guide: TECShapeLine): boolean;
Ajoute un TECShapeLine ou un TECShapePolygone dans la liste des guides.
retourne true si l'élément est bien ajouté.
procedure RemoveGuide(const Guide: TECShapeLine);
Supprime l'élément de la liste des guides
procedure CancelSnap;
Annule le déplacement et remet le marker à son point d'origine
property MeterDistance: boolean ;
Sélectionne l'unité pour la distance déclenchant l'aimantation.
true pour des metres , false (defaut) pour des pixels.
property SnapDistance: integer ;
Distance d'attirance des markers vers un guide
property SnapShape: TECShape ;
Retourne le marker qui vient d'être attiré.
property SnapGuide: TECShape;
Retourne le guide qui vient d'attirer un marker
property TargetLine:boolean;
Si true dessine une ligne entre le marker et le point cible sur le guide
property OnSnap: TNotifyEvent;
L'événement est déclenché lorsq'un marker est attiré par un guide.
property OnNoSnap: TNotifyEvent;
L'événement est déclenché lorsq'un marker est laché en dehors de la zone d'attraction d'un guide.
map.SnapDrag.addMarker(mrk);

map.SnapDrag.AddGuide(poly);
map.SnapDrag.AddGuide(red_line);

map.SnapDrag.MeterDistance := true;
map.SnapDrag.SnapDistance := 50; // 50 meters

map.SnapDrag.MeterDistance := false;
map.SnapDrag.SnapDistance := 50; // 50 pixels

La propriété _snap_ des guides est mise à true lorsqu'elle attire un marker, vous pouvez vous en servir pour définir un style qui signalera visuellement cet état.

20
// double the size of line when targeted
map.Styles.addRule('.line._snap_:true {scale:2}') ;
map.Styles.addRule('.polygone._snap_:true {scale:2}') ;
// default size
map.Styles.addRule('.line._snap_:false {scale:1}') ;
map.Styles.addRule('.polygone._snap_:false {scale:1}') ;
// doted target line
map.Styles.addRule('#TECSnapDrag.line{penStyle:Dot}');

Si vous souhaitez que des markers soient attirés par des lignes particulières, vous pouvez créer votre propre variable de type TECSnapeDrag

21
var MySnapDrag : TECSnapDrag;
...
MySnapDrag := TECSnapDrag.create;

MySnapDrag.addMarker(mrk);

MySnapDrag.AddGuide(poly);
MySnapDrag.AddGuide(red_line);
...
MySnapDrag.free

Dessin et sélection main libre

FreeHand vous permet de définir des lignes, qui pourront devenir des polygones, à main lever, pour cela il suffit d'activer FreeHand.Draw

Fig. 48 Dessiner des lignes et des polygones

// event triggered when the drawing is finished
map.FreeHand.OnDraw := doFreeHandDraw;
// activate the hands-free drawing
map.FreeHand.Draw := true;
...
procedure TForm.doFreeHandDraw(Sender: TObject);
begin
// save the line to your map
map.addLine(TECNativeFreeHand(sender).line)
// you can use also this syntax
map.FreeHand.addLine;
// convert the drawn line into a polygon and add it to the map
map.addPolygone(TECNativeFreeHand(sender).line);
// you can use also this syntax
map.freeHand.addPolygone;
end;

Vous pouvez aussi activer l'outil de sélection main libre, cela vous permet de choisir des éléments simplement en les entourant

Fig. 49 Sélection main libre

// trigger after selection
map.FreeHand.OnSelection := doOnSelection;
// start sélection mode
map.FreeHand.Selection := true;
...
procedure TForm21.doOnSelection(Sender: TObject);
begin
ShowMessage(inttostr(TECNativeFreeHand(sender).SelectionList.count)+ ' selected elements');
end;

property AutomaticMapMovement : boolean ;

Autorise le déplacement automatique de la carte lorsque le curseur de dessin approche d'un bord, défaut True.

property Draw: boolean ;

Active le mode dessin

property Selection: boolean ;

Active le mode Selection

Ne désactivez pas Draw après avoir activé Selection, Selection active aussi Draw !

12

property MouseButton: TMouseButton ;

Bouton de la souris utilisé pour dessiner, par defaut mbRight

Si vous utilisez le bouton gauche, il carte pourra être déplacée en maintenant la touche CTRL enfoncée.

22

property Cursor: TECShape ;

Curseur de dessin, par défaut un TECShapePOI en forme de croix

property Line: TECShapeLine;

La ligne qui représente votre dessin, vous pouvez ajuster ses propriétés soit directement soit par un style.

// style for draw line
map.Styles.addRule('#TECNativeFreeHand.Line {color : green;penStyle:Dash;weight:2}') ;

Fig. 50 Style FreeHand Line

property PolygoneSelection: TECShapePolygone ;

Accessible dans l'événenement OnSelection, il représente l'aire de votre sélection

property SelectionList: TECShapesList;

Accessible dans l'événement OnSelection, cette liste contient les éléments sélectionnés

property SelectionFilter: TOnShapeFilter

Permet de définir un filtre pour la sélection

map.FreeHand.SelectionFilter := FilterCafe;
...
// select only cafe
procedure FilterCafe(const Shape: TECShape; var cancel: boolean);
begin
cancel := shape.PropertyValue['kind']<>'cafe' ;
end;

function AddLine(const GroupName:string=''):TECShapeLine;

Ajouter définitivement votre tracé en tant que Line à votre carte

function AddPolygone(const GroupName:string=''):TECShapePolygone;

Ajouter définitivement votre tracé en tant que Polygone à votre carte
Aller à la page
Composant Delphi / Google Maps / OpenStreetMap / Leaflet  / Mappilary© 2016 ESCOT-SEP Christophe - Réalisé avec Help&Web - RSS - RSS - Google+