TECCesiumMap is a component that allows you to use Cesium in your Delphi developments, it is at the moment available for the VCL (Windows)
Internet Explorer 11 is the minimum required to use Cesium, TECCesiumMap does not work on XP !
40This component is integrated in full suite TECMap
112Installation
Default TECCesiumMap uses cesiumjs.org servers, but for the production of your developments I strongly advise you to install on your own webserver cesium.
Download the latest archive of Cesiumthen unzip on your server.
TECesiumMap has the property WebServer just set with the root directory of your installation.
Use CreateRuntimeCesiumMap to a dynamic creation
40cesium := CreateRuntimeCesiumMap(self,panel1);
You must
get a key to use the api of Cesium, connect you to
the OnInitialize event to connect your Token.
You must also copy the file cesium-app.html on your
server
...
procedure TForm.doInitialize(Sender: TObject);
begin
TECCesiumMap(sender).WebServer := 'http://www.your_serveur.com/cesium-app.html';
TECCesiumMap(sender).IonAccessToken := 'your cesium ion token';
end;
TCesiumControl
The structure is the same that for TECNativeMap, elements work in the same way and you find the concepts of groups, geolocation and the calculation of routes are identical
function Add(const shape: TNativeShape; const Lat, Lng: double; const GroupName: string = ''): TECCesiumShape;
function AddRoute(const routePath: TECroutepath; const GroupName: string = ''): TECCesiumShapeLine;
function AddPOI(const Lat, Lng: double; const GroupName: string = '') : TECCesiumShapePOI;
function AddPOIText(const Lat,Lng:Double;const Text:string='';const GroupName:string=''): TECCesiumShapePOI;
function AddMarker(const Lat, Lng: double; const GroupName: string = '') : TECCesiumShapeMarker;
function AddLine(const Lat, Lng: double; const GroupName: string = '') : TECCesiumShapeLine;
function AddPolygone(const Lat, Lng: double; const GroupName: string = '') : TECCesiumShapePolygone;
function AddInfoWindow(const X,Y: double; const GroupName: string = '') : TECCesiumShapeInfoWindow;
Unlike TECNativeMap in TECCesiumControl you specify the screen coordinates for positioning your information window
41procedure Remove(const shape: TECCesiumShape);
procedure Clear
procedure BeginUpdate
procedure EndUpdate
procedure SaveToFile(const Filename: string);
procedure LoadFromFile(const Filename: string)
procedure setCenter(const Lat, Lng: double);
procedure fitBounds(const NELat, NELng, SWLat, SWLng: double);
procedure fitBoundsRadius(const dLat, dLng, dRadiusKm: double);
procedure FlyTo(const Lat, Lng, alt: double);
procedure Jumpto(const Lat, Lng, alt: double);
procedure LookAt(const Lat, Lng, alt: double);
procedure GECamera(const Lat, Lng, alt, Tilt, Heading, roll: double);
procedure Javascript(const js:string);
function GetRoutePathByAdress(const StartAdress, EndAdress: string; const routeType: TMQRouteTyp = rtFastest; const params: string = ''): TECroutepath;
function GetRoutePathFrom(const dLatLngs: array of double; const routeType: TMQRouteType = rtFastest; const params: string = ''): TECroutepath;
function GetASyncRoutePathByAdress(const StartAdress, EndAdress: string; const routeType: TMQRouteTyp = rtFastest; const params: string = ''): TECroutepath;
function GetASyncRoutePathFrom(const dLatLngs: array of double; const routeType: TMQRouteType = rtFastest; const params: string = ''): TECroutepath;
property Address: string
property MouseLatLng: TLatLng
property MouseAlt: double
property ScreenShot: TBitmap
property ClickX : integer read FClickX;
property ClickY : integer read FClickY;
property MouseX : integer read FMouseX;
property MouseY : integer read FMouseY;
property Shapes: TECCesiumShapes read FShapes;
property HintInfoWindow : TECCesiumShapeInfoWindow read getHintInfoWindow;
property Group[value: string]: TECCesiumShapes read getShapesGroup;
property Groups:TECGroupShapesList read getShapesGroups;
property toKml: string read getToKml write setToKml;
property toGpx: string read getToGPX write setToGpx;
property toTxt: string read getToTxt write setToTxt;
property toGeoJSon: string read getToGeoJSon write setToGeoJSon;
property Url: string read getUrl write setUrl;
property WebServer : string read FWebServeur write setWebServeur;
property BingKey: string
property Latitude: double ;
property Longitude: double ;
property Altitude: double;
property Zoom: double;
property Draggable;
property TileServer: TTileServer
The following servers are available :
- tsOpenMapQuest
- tsOSM
- tsOpenCycleMap
- tsArcGisWorldTopoMap
- tsArcGisWorldStreetMap
- tsArcGisWorldImagery
- tsBingRoad
- tsBingAerial
- tsBingAerialLabels
It is advisable to fill the BingKey property with your key Bing to use Bing Maps tiles ( tsBingRoad, tsBingAerial, tsBingAerialLabels )
map.BingKey :=
YOUR_BING_KEY
map.TileServer := tsBingRoad;
property Terrain: boolean;
property SceneMode: TCesiumMode;
Selects the type of display, by default 3D
- cm2D
- cmColombus
- cm3D
Événements
property OnMapClick: TOnMapLatLng
property OnMapRightClick: TOnMapLatLng
property OnMapMove: TOnMapLatLng
property OnMapMouseMove: TOnMapLatLng
property OnMapMouseUp: TOnMapLatLng
property OnMapMouseDown: TOnMapLatLng
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 OnShapePathChange: TNotifyEvent
property OnCloseInfoWindow: TOnCloseInfoWindow
property OnRoutePath: TOnRoutePath
property OnLoad: TOnLoadGroup
property OnLoadShapes: TOnLoadShapes
property OnUrl: TOnUrl
property OnCZML : TOnCZML
TECCesiumShapeMarker
i :=
cmap.Shapes.Markers.Add(lat,lng) ;
// hint accept html
cmap.Shapes.Markers[i].Hint := 'marker n°
<b>'+inttostr(i)+'</b>';
uses
uecCesiumShape;
var marker :
TECCesiumShapeMarker;
// use the shortcut to create the
marker
marker := cmap.AddMarker(Lat,lng);
// you can find index with
marker.IndexOf
//
cmap.shapes.markers[marker.indexOf]
// add a text
marker.Description := 'Text';
// adapt width
marker.Width := 70;
// change color
marker.Color := clOlive;
// use the
shortcut to create the marker
marker := cmap.AddMarker(Lat,lng);
// use maki icon
marker.Description := 'maki:bicycle';
marker.Width := 64;
marker.Color := clBlue;
// set draggable
marker.Draggable := true;
// use the
shortcut to create the marker
marker := cmap.AddMarker(Lat,lng);
// use png file
marker.Filename := 'http://www.helpandweb.com/cake_32.png';;
TECCesiumShapeLine
var
line : TECCesiumShapeLine;
// create line and add first point
Latitude, Longitude
line := cmap.AddLine(48.8594069779731,2.34283447265625) ;
// better for
optimisation
line.BeginUpdate;
// change color
line.Color := clHotLight;
// change size
line.Weight := 10;
// add other points
line.Add(48.8638113489879,2.35519409179688);
line.Add(48.8608751447095,2.36532211303711);
line.Add(48.8543245298006,2.36360549926758);
// update
line.EndUpdate;
// zoom to line
line.fitBounds;
TECCesiumShapePolygone
var
polygone : TECCesiumShapePolygone;
// create polygone and add first
point Latitude, Longitude
polygone := cmap.AddPolygone(48.8594069779731,2.34283447265625) ;
// better for
optimisation
polygone.BeginUpdate;
// change color
polygone.fillColor := clYellow;
// change opacity
polygone.fillOpacity := 30;
// add other points
polygone.Add(48.8638113489879,2.35519409179688);
polygone.Add(48.8608751447095,2.36532211303711);
polygone.Add(48.8543245298006,2.36360549926758);
// update
polygone.EndUpdate;
// zoom to polygone
polygone.fitBounds;
TECCesiumShapePOI
Unlike TECNativeMap only poiEllipse and poiText types are supported at the moment
42var
Poi : TECCesiumShapePOI;
Poi := cmap.AddPOI(lat,lng) ;
Poi.BorderSize := 2;
Poi.Color := clBlue;
Poi.BorderColor := clWhite;
// 16 pixels
// for meters use Poi.POIUnit :=
puMeter;
Poi.Width := 16;
var
Poi : TECCesiumShapePOI;
Poi := cmap.AddPOIText(lat,lng,'my
label') ;
// use description for change
text
//Poi.Description := 'my new
label';
// font
Poi.CssFont := '14pt
monospace';
// color
Poi.Color := clWhite;
Material
You can use the material property for example to embed an image in a polygon.
You can directly use javascript to define a more complex material.
'image : "'+UrlImageToDataUri('d:\alert-weather.png')+'",'+
'transparent:true })';
TECCesiumShapeInfoWindow
Unlike TECNativeMap the position of the InfoWindows is shown in screen coordinates, you can use html for your content and use CSS to style your InfoWindows
var
wn:TECCesiumShapeInfoWindow;
Wn := cmap.AddInfoWindow(10,10)
;
Wn.content := 'You can enter
<b>html</b> content <br>text and
<i>image</i> <img
src="http://www.helpandweb.com/cake_32.png"/>';
;
// you can style with
css
Wn.Style := 'here css';
// use color for color
background
Wn.Color := clWhite;
Wn.CloseButton := true;
The OnCloseInfoWindow of the TECCEsiumMap component event is raised when closing by the cross and the InfoWindow coming to be closed is recovered.
If your window contains a link, the click triggers the event OnUrl
9TECCesiumShapeModel
This class manages the 3D models, Cesium uses the glTF format, a converter COLLADA-> gLTF is proposed
var
model : TECCesiumShapeModel;
// you can use url or local
filename for your .gltf
model := cmap.addModel(lat,lng,'http://cesiumjs.org/Cesium/Apps/SampleData/models/CesiumGround/Cesium_Ground.gltf')
;
// Values greater than 1.0 increase
the size of the model
// while values less than 1.0
decrease it.
model.Scale := 2.0;
// specifying the approximate
minimum pixel size of the model regardless of
zoom.
// This can be used to ensure that
a model is visible even when the viewer zooms
out
model.MinimumPixelSize := 64;
//
Orientation(heading,pitch,roll)
model.Orientation(90,model.Pitch,model.Roll);
CZML
CZML is the equivalent of KML but more powerful
procedure LoadCZML(const CZML:string;cosnt idCZML:string='';const Options:string='';const Promise:string='');
For options see //cesiumjs.org/Cesium/Build/Documentation/CzmlDataSource.html (Cesium.CzmlDataSource.load(czml, options))
Promise can execute javascript when the czml script is finished, LoadAndZoomToCZML use.
var promise:string;
begin
promise := 'viewer.zoomTo(datasourceczml);'
LoadCZML(CZML,idCZML,Options,promise);
end;
When the script is finished the event OnCZML of your component is triggered, it returns idCZML
procedure LoadAndZoomToCZML(const CZML:string;const idCZML:string='';const Options:string='');
'"name" : "CZML Point",' +
'"version" : "1.0"'+
'}, {'+
'"id" : "toto",'+
'"name": "pointx",'+
'"position" : {"cartographicDegrees" : [-111.0, 40.0, 0]'+
'},'+
'"point": {'+
' "color": {"rgba": [255, 255, 255, 255] },'+
' "outlineColor": {"rgba": [255, 0, 0, 255]'+
' },'+
' "outlineWidth" : 4,'+
' "pixelSize": 20'+
' }'+
'}]';
Cesium.LoadAndZoomToCZML(czml,'add_point');