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

TECShapeLine

Vous êtes ici :TECNativeMap > Shapes

TECShapeLine vous permet de tracer une ligne constituée d'un ensemble de points sur votre carte.

Les lignes sont gérés par une liste de type TECShapeLines accessible au travers de la propriété Lines des groupes TECShapes

Fig. 105 Une ligne en mode édition

TECShapeline

Cette classe descend de TECShape

Elle possède en plus les propriétés suivantes


function Add(const Lat, Lng: double; const Alt: double = _ErrorAltitude): integer;
Ajoute un point avec éventuellement son altitude
function Add(const dLatLngs: array of double): integer;
Ajoute un tableau de points, constitué d'une suite de latitudes et de longitudes
line.add([lat1,lng1,lat2,lng2,...,latx,lngx]);

Contrairement à l'ajout d'un simple point, vous n'avez pas besoin d'encadrer l'ajout de votre tableau par BeginUpdate / EndUpdate, cela est fait automatiquement.

9
procedure Insert(const index: integer; const Lat, Lng : double; const Alt: double = _ErrorAltitude);
Insère un point avec éventuellement son altitude
procedure Reverse
Inverse le sens de la ligne

property ShowDirection : boolean
Ajoute des flêches à chaque segment pour montrer la direction

Fig. 106 ShowDirection


procedure Slice(const StartIndex,EndIndex : integer;Line : TECShapeLine); overload;
Copier dans Line la partie délimité par les segments StartIndex et EndIndex

function Slice(const StartIndex,EndIndex:integer;GroupName:string=''):TECShapeLine; overload;
Retourne une ligne composée de la portion délimité par les segments StartIndex et EndIndex

procedure Slice(const StartKm,EndKm : double;Line : TECShapeLine); overload;
Copier dans Line la partie débutant au kilomètre StartKM et finissant au kilomètre EndKM

function Slice(const StartKm,EndKm : double;GroupName:string=''):TECShapeLine; overload;
Retourne une ligne composée de la portion débutant au kilomètre StartKM et finissant au kilomètre EndKM

Fig. 107 slice - red color between 1.2 km and 3.8 kilometer

// red color between 1.2 km and 3.8 kilometer
line := map.shapes.lines[0].Slice(1.2,3.8);
line.Color := claRed;

procedure Clear;
Efface les points

property Encoded: string ;

Encode / Decode le polyline en utilisant l'algorithme de google ( developers.google.com/maps/documentation/utilities/polylinealgorithm )
line.add([lat1,lng1,lat2,lng2,...,latx,lngx]);

property EncodePrecision: byte;

Précision d'encodage, par défaut 5 décimales (180.00000 to -180.00000)

procedure Delete(index: integer);

Supprime un segment de la ligne
function Count: integer;
Indique le nombre de segment
property Weight: byte
Épaisseur de la ligne
property BorderSize : integer
Épaisseur de la bordure
property BorderColor : TColor
Couleur de la bordure
property HoverBorderColor : TColor
Couleur de la bordure au survol de la souris

Fig. 108 Bordure noire de 2 pixels

property PenStyle : TPenStyle
type de trait psSolid, psDash, psDot et psDashDot sont disponibles
property LineType : TECLineType
Type de ligne : ltStraight ligne droite entre chaque point, ltBezier pour tracer des courbes de bézier

Fig. 109 Penstyle := psDashDot - LineType := ltBezier

procedure getAltitudes(Event: TOnGetAltitude = nil);

Calcule les altitudes des points, vous pouvez lui passer une procédure de type TOnGetAltitude pour pouvoir afficher une barre de progression (voir DemoNativeRoute)

// Delphi map component ECMap

// calcul altitude for all point of polyline 0
// you can pass nil if you don't show a progressbar
map.Shapes.Lines[0].GetAltitudes(doGetAltitude);
...
{*
event fired by getAltitudes

@param Sender TECShapeLine
@param Total number of altitude's point calculated
@cancel flag for abort calcul
}
procedure TFDemoRoute.doOnGetAltitude(Sender: TECShapeLine;const Total:integer;var cancel:boolean);
begin
ProgressAltitude.Position := total;
// cancel if press button
cancel := btAbortAlt.tag = -1;
end;

function getLatLngFromMeter(const SensStartEnd: boolean;
const lMeter: longint; var dLatitude, dLongitude: double;
var idPoint: integer; var Heading: integer; var bEnd: boolean): boolean;

Calcule la latitude et la longitude d'un point sur la line/polygone en fonction de sa distance en mètres, retourne True si on a trouvé un point

SensStartEnd sens du parcours, true pour départ -> arrivée

lMeter la distance en mètre

dLatitude,dLongitude des variables de type double qui recevront la latitude et la longitude

idPoint une variable qui contiendra l'indice dans le tableau Path où se situe le point, le calcul retourne une approximation car votre polyline/polygone ne comporte par l'ensemble des points réels

Heading une variable qui contiendra l'angle du point par rapport au nord (de 0 à 360°)

bEnd indique si l'on a atteind ou dépassé la fin du polyline/polygone(ou le début suivant le sens)

property HoverPoint: integer read FHOverSeg;
Index du segment pointé par la souris
property Path[index: integer]: TECPointLine
Tableau contenant l'ensemble des points de la ligne
function Distance : double;
Indique la distance totale de la ligne en km
property Duration : integer;
Si la ligne représente un itinéraire (route) indique la durée du trajet.
property NorthEastLatitude: double
Latitude du coin supérieur droit de la boite englobant la ligne
property NorthEastLongitude: double
Longitude du coin supérieur droit de la boite englobant la ligne
property SouthWestLatitude: double
Latitude du coin inférieur gauche de la boite englobant la ligne
property SouthWestLongitude: double
Longitude Latitude du coin inférieur gauche de la boite englobant la ligne

// Delphi map component ECMap

line := map.Shapes.Lines[0];

// show the entire line
map.fitBounds(line.NorthEastLatitude,line.NorthEastLongitude,line.SouthWestLatitude,line.SouthWestLongitude);

property ShowText : boolean
Si la ligne représente une route permet d'afficher les diverses étapes
property Shapes : TECShapes

Si la ligne représente une route donne accès aux formes qui signalent les étapes

Les points de départ et d'arrivée sont représentés par des TECShapePOI, les autres points intermédiaires sont des TECShapeMarker

L'exemple ci-dessous permet de modifier l'affichage des points de départ et d'arrivée.

// Delphi map component ECMap
// change default poi start and finish of route
var line : TECShapeLine;
...
line := map.shapes.lines[0];

if line.shapes.Pois.count>1 then
begin
i := line.shapes.markers.add(line.shapes.pois[0].latitude,line.shapes.pois[ 0].longitude);
line.shapes.markers[i].filename := 'http://www.helpandweb.com/flag_blue.png';
line.shapes.markers[i].hint := line.shapes.pois[0].hint;

i := line.shapes.markers.add(line.shapes.pois[line.shapes.Pois.count- 1].latitude,line.shapes.pois[line.shapes.Pois.count- 1].longitude);
line.shapes.markers[i].XAnchor := 0;
line.shapes.markers[i].filename := 'http://www.helpandweb.com/checkered_flag.png';

line.shapes.markers[i].hint := line.shapes.pois[line.shapes.Pois.count-1].hint;

// hide default start and finish
line.shapes.pois[0].visible := false;
line.shapes.pois[line.shapes.Pois.count-1].visible := false;
end;

Fig. 110 Ajout de drapeaux pour le départ et l'arrivée

property Editable : boolean
Rend éditable la ligne, un double click sur un point le supprime, un double clic sur un segment ajoute un point, les points sont déplaçable à la souris

Cela ne permet que des tracés rectilignes, pour modifier une route cela demande juste 2-3 lignes de codes supplémentaires.

91

Par défaut les points de sélection sont représentés par un carré noir pour le point de départ, un carré blanc pour le point final et un rond blanc pour les points intermédiaires.

Fig. 111 Edit line

Utilisez les propriétés FilenameStartEditLine, FilenameEndEditLine, FilenamePointEditLine de votre carte pour changer les bitmaps

// Reverse the point of departure and arrival
s := map.FilenameStartEditLine;
map.FilenameStartEditLine := map.FilenameEndEditLine;
map.FilenameEndEditLine := s;

Vous pouvez prendre en charge la création des points de sélection en utilisant la propriété OnCreateShapeLinePoint

line := map.add(nsLine,Lat,Lng);

// change défault point
line.OnCreateShapeLinePoint := doCreateShapeLinePointEditable;


procedure TForm1.doCreateShapeLinePointEditable(sender: TObject; const Group:TECShapes;
var ShapeLinePoint: TECShape;
const Lat,Lng:double;const index:integer);
var i:integer;
poi:TECShapePOI;
begin

i := Group.Pois.add(lat,Lng);
Poi := Group.Pois[i];

ShapeLinePoint := poi;

poi.Width := 10;
poi.Height:= 10;

poi.POIShape := poiRect;

poi.Color := claWhite;
poi.HoverColor := claWhite;
poi.BorderColor := claBlack;
poi.HoverBorderColor:= claBlack;

end;



Fig. 112 Modification de l'apparence des points d'une TECShapeLine

property OnShapePathChange : TNotifyEvent
Permet d'être informé lorsque le tracé de la ligne change.

Enregistrer son déplacement

Le but de cet exemple est d'enregistrer son déplacement dans une TECShapeLine, un triangle pointant dans la direction du déplacement indiquera la position actuelle.

var MyLocationShape : TECShapePOI;
MyLocationLine : TECShapeLine;

procedure TForm1.FormCreate;
begin
// create triangle
MyLocationShape := map.AddPoi(0, 0);
MyLocationShape.POIShape := poiTriangle;
MyLocationShape.Width := 18;
MyLocationShape.height := 24;
MyLocationShape.YAnchor := 0 ;
MyLocationShape.visible := false;
end;

// Connect this to your TLocationSensor.OnLocationChanged
// save your location in a TECShapeLine
procedure TForm1.LocationSensorLocationChanged(Sender: TObject;
const OldLocation, NewLocation: TLocationCoord2D);

begin

map.beginupdate;

// create new line if not assigned
if not assigned(MyLocationLine) then
begin
MyLocationLine := map.AddLine(NewLocation.Latitude, NewLocation.Longitude,
'mylocations');
MyLocationLine.weight := 4;
MyLocationLine.Color := GetRandomColor;

// add border
MyLocationLine.BorderSize := 2;
MyLocationLine.BorderColor := GetShadowColorBy(MyLocationLine.Color, 32);

end

else

MyLocationLine.add(NewLocation.Latitude, NewLocation.Longitude);


MyLocationShape.SetDirection(NewLocation.Latitude, NewLocation.Longitude);

MyLocationShape.visible := true;

// center on your position
map.setCenter(NewLocation.Latitude, NewLocation.Longitude);

map.endupdate;

end;

Météo

En utilisant les services d'OpenWeatherMap.org vous pouvez afficher la météo le long de votre TECShapeLine.

Fig. 113 Weather on the road

Vous devez tout d'abord obtenir une clef pour utiliser l'api d'OpenWeatherMap

map.OpenWeather.Key := your_key;

// Get the weather along a TECShapeLine
Line.ShowWeather := true;

Consulter la demo RouteWeather pour plus d'informations sur la façon d'utiliser l'api d'OpenWeatherMap.

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