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

1

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

1
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

2
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

3
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. 1 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

2

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;

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

3

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 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';

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 Opacity : byte;
Défini une opacité (opacity et FillOpacity) pour tous les éléments du groupe.
L'opacité varie de 0 à 100, une valeur >100 indique que l'opacité du groupe n'est pas prise en compte et que seule celle des éléménts est utilisée.

Dans le cas d'une valeur > 100, l'opacité originelle des éléments n'est pas restaurée

1
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

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

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

5
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

6

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;

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. 2 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

7
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';

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é

8

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
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';

property FieldNameWKT: string;

Permet d'importer ou exporter des fichiers CSV contenant la géométries des éléments au format WKT, indispensable pour les lignes et les polygones.
//save group in csv format
// save the geometry of elements in WKT format, essential for lines and polygons.
// for this you must fill in the field FieldNameWKT

map.shapes.csv.FieldNameWKT := 'WKT';
map['group'].csv.FieldNameWKT := 'WKT';

map.shapes.savetofile('filename.csv');
map['group'].savetofile('filename.csv');

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.

4
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 OnFilterCSV : TOnFilterCSV
Permet de refuser une ligne du fichier CSV en fonction de critères particuliers
// filter csv data
map.shapes.CSV.OnFilterCSV := doOnFilterCSV;
...
// valid csv data , default true
procedure TForm.doOnFilterCSV(const Data: TStringList;var validCSV:boolean);
begin
if (data.Count>2) and (pos('POLYGON',data[7])< 1) then
validCSV := (data[2]<>'relation');
end;

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.
// take over the creation of the points
map.shapes.CSV.OnCreateCSVPoint := doOnCreateCSVPoint;
...

// Manual creation of each point
// Data contains the CSV values for the point
procedure TForm.doOnCreateCSVPoint(const Group: TECShapes; var CSVPoint: TECShape; const Lat, Lng: double; const Data:TStringList) ;
var M:TECShapeMarker;
begin

// create new marker
M := Group.addMarker(lat,lng);;
CSVPoint := M ;

// marker design
M.Width := 12;
M.StyleIcon := siFlat;

// we calculate its color according to its index number
M.Color := GetHashColor(inttostr(M.IndexOf));

end;

property OnCreateWKTObject : TOnCreateWKTObject

En vous branchant sur cet événément vous pourrez modifier les propriétés des éléments importés au format WKT
// react after creation wkt object
map.shapes.CSV.OnCreateWKTObject := doOnCreateWKTObject;
map['group'].CSV.OnCreateWKTObject := doOnCreateWKTObject;

// fired after creation wkt object
procedure TForm.doOnCreateWKTObject(const Group: TECShapes;
const WKTObject: TECShape; const Lat, Lng: double; const Data: TStringList);
begin
// we calculate its color according to its index number

if WKTObject is TECShapePolygone then
TECShapePolygone(WKTObject).FillColor := GetHashColor(inttostr(WKTObject.IndexOf))
else
WKTObject.Color := GetHashColor(inttostr(WKTObject.IndexOf));
end;

La géométrie doit être exprimée en degrès décimal, si besoin vous pouvez vous brancher sur OnConvertLatLng pour définir une procédure de conversion

1
// The expected coordinates are in decimal degrees
// you can connect to OnConvertLatLng to convert

// sample
procedure ConvertLatLng(var lat,lng:double);
begin
Lat := Lat / 1000000;
Lng := Lng / 1000000;
end;

procedure TForm.FormCreate(Sender: TObject);
begin
map.shapes.CSV.OnConvertLatLng := ConvertLatLng;
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. 3 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) ,ltPosition (affichage latitude et longitude) ou ltProperty
property PositionPrecision:byte

nombre de décimales utilisées pour l'affichage des latitude et longitude, par défaut 3

map.shapes.labels.PositionPrecision := 2;
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

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';

sur mobile lsoHover est identique à lsoPressed

9
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é
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';

Fig. 4 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 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';

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


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';

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

2

TECClusterManager

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

property Color : TColor
property Style : TClusterStyle (csEllipse, csStar, csRect, csTriangle, csHexagon, csDiamond)

Fig. 5 Cluster style

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;var CStyle:TClusterStyle)

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;
// if you need to manipulate the elements contained in the cluster set FillClusterList a true
map.Shapes.ClusterManager.FillClusterList := 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;
var CCluster : TClusterStyle
);
//var i, nbrSelected: integer;
begin
// sample code if you need to manipulate the elements contained in the cluster
(*
nbrSelected := 0;
for i := 0 to Cluster.shapes.count - 1 do
begin
if Cluster.shapes[i].selected then
inc(nbrSelected);
end;
*
)

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.

// you can use Iterator

var shape:TECShape

for shape in map.Selected do
begin
..
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. 6 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 !

10
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

11
SendToBack
Retour à l'ordre normal d'affichage
property Draggable
Rend un élément déplaçable à la souris

En basculant la propriété TNativeMapControl.ShapeDragMode sur sdmMultiShapes (défaut sdmShape) et si l'élément pointé par la souris est sélectionné vous pourrez déplacer simultanément tous les éléments draggable sélectionnés, ils garderont les mêmes distances entre eux.

Fig. 7 ShapeDragMode = sdmMultiShapes

property Angle
Angle de rotation en degré (0-360)

Disponible pour les TECShapeMarker et TECShapePOI

3
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

5
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.

12
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é.

13

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

14

É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

6

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. 8 SnapDrag

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

Supprime tous les markers aimantés
procedure ClearMarker;

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.

7
// 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

8
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. 9 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. 10 Sélection main libre

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 !

4

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.

9

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. 11 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 OnPermission : TOnFreeHandPermission
Controler l'autorisation de FreeHand
map.FreeHand.Selection := True;
map.FreeHand.OnPermission := doOnFreeHandPermission;
...
// selection with freeHand is only allowed if CTRL or SHIFT is pressed
procedure TForm1.doOnFreeHandPermission(sender : TObject;var valid:boolean);
begin
valid := (((GetKeyState(VK_CONTROL) and $8000) = $8000) or
((GetKeyState(VK_SHIFT) and $8000) = $8000)
);
end;

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

SelectArea

Cette propriété permet de sélectionner une zone rectangulaire ou circulaire.

Fig. 12 Demo SelectArea

property AreaType: TECAreaType ;

Type de sélection : atRectangle ou atCircle

property Area: double

Surface en Km² de la sélection

property Width: double

Largeur en Km de la sélection

property Height: double

Hauteur en Km de la sélection

property Color : TColor

Couleur de la sélection

procedure setPosition(const Lat,Lng:double)

Positionner le centre de la sélection

procedure Boundary(const dNELat, dNELng, dSWLat, dSWLng: double)

Définir le rectangle englobant la zone de sélection

procedure fitBounds

Zoomer sur la sélection

property Center : TLatLng

Centre de la sélection

property NELat: double

Latitude du coin haut droit de la zone de sélection

property NELng: double

Longitude du coin haut droit de la zone de sélection

property SWLat: double

Latitude du coin bas gauche de la zone de sélection

property SWLng: double

Latitude du coin bas gauche de la zone de sélection

property Visible: boolean

Afficher la zone de sélection

property ShowMetrics : boolean

Afficher ou pas les informations Width, Height et Area au centre de la zone de sélection

property OnChange: TNotifyEvent

Événement déclenché après un déplacement et à la fin d'un rédimensionnement de la zone de sélection

property OnClick: TNotifyEvent

Événement déclenché après un click dans la zone de sélection

property OnDblClick: TNotifyEvent

Événement déclenché après un double click dans la zone de sélection

property OnLongPress: TNotifyEvent

Événement déclenché après une pression longue dans la zone de sélectionÉvénement déclenché après un click dans la zone de sélection

property OnRightClick: TNotifyEvent

Événement déclenché après un click droit dans la zone de sélection

property OnUpdateMetric : TOnUpdateMetric

Événement déclenché avant l'affichage des métriques pour pouvoir les modifier
procedure TFSelectArea.FormCreate(Sender: TObject);
begin
map.SelectArea.OnChange := doOnChange;
map.SelectArea.OnUpdateMetric:= doUpdateMetric;
map.SelectArea.Visible := true;
end;

procedure TFSelectArea.doUpdateMetric(const sender: TECSelectArea; var Value: string);
begin
// display only area
value := 'Area : '+doubletostrdigit(map.SelectArea.Area, 3)+' Km²';
end;

procedure TFSelectArea.doOnChange(sender : TObject);
begin
case map.SelectArea.AreaType of
atRectangle: begin
info.Caption := 'NorthEst : '+ doubletostrdigit(map.SelectArea.NELat,3)+','+
doubletostrdigit(map.SelectArea.NELng,3)+' SouthWest : '+
doubletostrdigit(map.SelectArea.SWLat,3)+','+
doubletostrdigit(map.SelectArea.SWLng,3)+
' W : '+doubletostrdigit(map.SelectArea.Width, 2)+' Km '+
'H : '+doubletostrdigit(map.SelectArea.Height, 2)+' Km '+
'Area : '+doubletostrdigit(map.SelectArea.Area, 3)+' Km²';
end;
atCircle: begin
info.Caption := 'Lat : '+ doubletostrdigit(map.SelectArea.Center.lat,3)+','+
doubletostrdigit(map.SelectArea.Center.lng,3)+' Radius : '+
doubletostrdigit(map.SelectArea.Width / 2,2)+' Km Area : '+doubletostrdigit(map.SelectArea.Area, 3)+' Km²';
end;
end;
end;
Aller à la page
Réalisé avec la version gratuite pour les particuliers d'Help&Web