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
14Vous pouvez ne pas passer par Google pour vos recherches
1Geolocalisation
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
2sAdresses 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
2procedure 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
2Proprié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 TListGeoCoderReponsesfunction Add(const geoCode:TGeoCoderReponses):integer;
function count:integer;
procedure clear;
procedure Delete(const index:integer);
property GeoCoderReponses[index:integer]:TGeoCoderReponses;
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;