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

Localisation

Vous êtes ici :TECMap

Clefs pour les API

Par défaut TECNativeMap utilise les services d'OpenStreetMap.

Si vous souhaitez utiliser MapQuest vous devez obtenir une clef auprès de MapQuest

Faites de même pour utiliser les services de MapZen et MapBox.

La propriété Address vous donne l'adresse du centre de la carte, elle est de type string et est accessible en lecture/écriture

Format de l'adresse

Pour rechercher une adresse vous pouvez utiliser un format libre du genre "adresse,ville, code postal".

l'API CloudMade et OpenMapQuest utilisent Nominatim Search Service

Limitation des geolocalisations

La conversion coordonnées/adress ouvre une connexion vers le serveur du fournisseur de votre carte, Google met en place un système de quota pour éviter trop de demande en un minimum de temps.

Si vous dépassez cette limite l'évènement OnJavascriptError(sender: Tobject;const sError:string) est déclenché avec sError = 'OVER_QUERY_LIMIT'

ECMap met en place un système de cache qui fait que tant que les coordonnées ne changent pas la connexion sur le serveur n'a lieu que pour la première consultation, vous pourrez donc effectuer plusieurs lecture sans vous soucier du quota.

Ce système de cache est valable pour tous les objets permettant leur geolocalisation, par exemple les Markers

14

Vous pouvez ne pas passer par Google pour vos recherches

1

Geolocalisation

Pour obtenir l'adresse d'un point précis vous avez la fonction GetAddressFromLatLng(const dLatitude,dLongitude:double):string;

Vous pouvez obtenir les coordonnées d'une adresse avec la fonction GetLatLngFromAddress(const sAdress:string;var dLatitude,dLongitude:double):boolean;

En attribuant une valeur à la propriété Address vous allez changer la position du centre de votre carte pour la faire correspondre à l'adresse indiquée

// Delphi map component ECMap
// move center of map
map.Address := 'Tarbes';


Cela va déclencher l'évènement OnAddress(sender: Tobject;const sAdresses:string;var Index:integer)

GetLatLngFromAdress déclenche aussi OnAdress

2

sAdresses contiendra toutes les adresses, séparé par #13#10 pouvant correspondre avec votre requête.

Index contiendra l'index de l'adresse retenue, par défaut 0, vous pourrez le modifier dans cet évènement.

En sortie de cet évènement le centre de la carte correspond avec l'adresse retenue

La propriété Adresses de type TGeoCoderReponses contient l'ensemble des réponses retournées par le serveur.

Exemple d'utilisation

// Delphi map component ECMap
// move center of map with response 2
if map.Addresses.count>1 then
map.setCenter(map.Adresses[1].Latitude,map.Adresses[1].Longitude);


Geolocalisation asynchrone

GetAdressFromLatLng, GetLatLngFromAdress et Adress := 'paris' attendent le résultat de la requète, vous avez à votre disposition deux procédure asynchrones (non bloquantes) équivalentes.

procedure GeoLocationFromLatLng(const dLatitude,dLongitude:double);

Sous CloudMade cette procedure est aussi bloquante mais pas GeoLocation

2

procedure GeoLocation(const sAdress:string);

Ces deux procédures déclenchent l'évènement OnGeoLocation (sender:Tobject;const dLatitude,dLongitude:double;const sAdresse:string);

dLatitude,dLongitude et sAdresse correspondent à la première réponse disponible, comme pour les fonctions synchrones la propriété Adresses contient l'ensemble des résultats.

Vous pouvez utiliser le composant TComboBox pour à la fois contenir la requête et le résultat de celle-ci, la démo DemoLocalise vous montre comment faire

2

Fig. 33 Utilisation d'un TComboBox pour gérer la geolocalisation

Propriétés de TGeoCoderReponses

property Addresses:string
La liste de toute les adresses séparées par #13#10

property Addresse[index:integer] : string
L'adresse numéro Index

property Error [index:integer] : string
L'eventuelle erreur

property Latitude[index:integer] : double
La latitude correspondante à l'adresse Index

property Longitude[index:integer] : double
La longitude correspondante à l'adresse Index

property LocationType[index:integer]: string
La précision de la réponse (uniquement pour google)

Historique des réponses

Chaque geolocalisation va changer le contenu de la propriété Addresses, vous pouvez la stocker dans une liste spécilisée, accessible depuis la propriété ListAdresses de type TListGeoCoderReponses, en vue d'une utilisation ultérieure, le bon moment est dans l'évènement OnAdress

Propriétés de TListGeoCoderReponses

function Add(const geoCode:TGeoCoderReponses):integer;

Ajoute une valeur TGeoCoderReponses dans la liste

function count:integer;

Nombre de TGeoCoderReponses stockées

procedure clear;

Efface toutes les valeurs

procedure Delete(const index:integer);

Supprime la valeur d'indice index

property GeoCoderReponses[index:integer]:TGeoCoderReponses;

Accès en lecture/écriture aux valeurs par leur indice

Utilisation de ListAddresses

Le cas typique d'utilisation de cette liste est celui où vous devez gérer une adresse de départ et une d'arrivée, les demos DemoMobiles et DemoRoutes vous montre une façon de faire.

Une ComboBox est utilisée pour le départ et une pour l'arrivée, lors de la validation d'une adresse par ENTREE une demande de géolocalisation est faite.

Dans l'évènement OnAddress on stocke dans la ComboBox les adresses en clairs, on place dans ListAddresses les données intégrales retournées par la requète, et on stocke l'indice dans le tag de du Combobox.

On pourra alors obtenir les coordonnées de n'importe quelle adresse placée dans la ComboBox.


 

// Delphi map component ECMap

// sample for DemoMobile

{*
press RETURN key on combobox start and destination for Geolocalize adress

fired event OnAdress
}
procedure TFDemoMobile.cbStartKeyPress(Sender: TObject; var Key: Char);
var lat,lng : double;
begin
if Key=#13 then
begin
FComboQueryAdress := Sender As TComboBox;
if assigned(FComboQueryAdress) then
map.GetLatLngFromAdress(FComboQueryAdress.text,lat,lng)
end;
end;


{*
event OnAdress

fired by map.GetLatLngFromAdress(...)

@param sender instance of component TECMap
@param sAdresses list of possible addresses (adr0#13#10adr1#13#10...)
@param index selected index adress

}
procedure TFDemoMobile.mapAdress(sender: TObject; const sAdresses: String;
var Index: Integer);
begin
if assigned(FComboQueryAdress) then
begin
FComboQueryAdress.Items.text := sAdresses;
FComboQueryAdress.ItemIndex := index;

// save actuel map.Adresses in map.ListAdresses
// Add value if necessary
if FComboQueryAdress.Tag>-1 then
map.ListAdresses[FComboQueryAdress.Tag] := map.Adresses
else
FComboQueryAdress.Tag := map.ListAdresses.Add(map.Adresses);

end;
end;

// Find Latitude, Longitude of ComboBox Itemindex
function TFDemoMobile.SelectLatLng(const cb : TComboBox;var Lat,Lng:double):boolean;
begin

result := false;

if not assigned(cb) then exit;

if cb.ItemIndex>-1 then
begin
if (cb.Tag>-1)and(cb.Tag<map.ListAdresses.count) then
begin
Lat := map.ListAdresses[cb.Tag].latitude[cb.ItemIndex];
Lng := map.ListAdresses[cb.Tag].longitude[cb.ItemIndex];

result := true;
end;

end;

end;


Utiliser les services d'OpenMapQuest avec Google Maps

En basculant la propriété UseOpenMapQuestServices à true vous utilisez OpenMapQuest pour tous ce qui touche à la geolocalisation, l'altitude et la recherche de lieux (Places)
Aller à la page
Composant Delphi / Google Maps / OpenStreetMap / Leaflet  / Mappilary© 2016 ESCOT-SEP Christophe - Réalisé avec Help&Web - RSS - RSS - Google+