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;