La propriété Places de type TECPlaces vous permet d'effectuer des recherches sur des lieux spécifiques dans une zone données, par exemple trouver des restaurants dans un rayon de 500 mètres.
Avec l'api Google vous allez utiliser le service Places , avec les autres vous employez MapQuest Xapi API Service qui utilise les données d'OpenStreetMap, cela entraine une petite différence dans la syntaxe de la recherche que nous détaillerons par la suite.
Vous pouvez forcer l'utilisation de Xapi sous Google en fixant à true la propriété UseOpenMapQuestServices
3La propriété XapiServer vous permet d'utiliser un autre serveur Xapi que celui de MapQuest
// use overpass-api.de
map.XapiServer := 'http://www.overpass-api.de/api/xapi?';
Le servide Places de google est limité à 20 résultats par requête
3TECPlaces
Lancement d'une recherche, tags contient la requête, la syntaxe varie en fonction de l'api Google ou CloudMade
Liste des tags disponibles sous Google
//
              Delphi map component ECMap
              var Tags:string;
              begin
              map.Places.Latitude := map.latitude;
              map.Places.Longitude:= map.Longitude;
              // syntaxe change with
              api
              case map.MapAPI
              of
              apigoogle : begin
              if ckStore.checked
              then
              Tags := 'store'
              else
              if ckRestaurant.checked
              then
              Tags := 'restaurant'
              else
              if ckDoctor.checked
              then
              Tags := 'doctor';
              end;
              
              else begin
              
              if ckStore.checked
              then
              Tags := 'node[shop=*]'
              else
              if ckRestaurant.checked
              then
              Tags := 'node[amenity=restaurant]'
              else
              if ckDoctor.checked
              then
              Tags := 'node[amenity=doctors]';
              end;
              end;
              
              // 500 meters
              map.Places.Radius := 500;
              // run search
              map.Places.Search(Tags);
Lorsque la recherche est terminée, l'évènement OnPlacesSearch est déclenché
Chaque lancement de Search efface les résultats d'une précédente recherche
4Lancement d'une recherche en langage naturel, uniquement disponible avec l'api Google
Lorsque la recherche est terminée, l'évènement OnPlacesSearch est déclenché
Affiche ou non un champ de recherche auto complété, uniquement disponible avec l'api Google
Lorsque une sélection est terminée, l'évènement OnPlaceAutoComplete est déclenché
Si vous souhaitez adapter la taille du champ de recherche à la largeur de la carte, branchez vous sur l'événement OnResize et ajoutez cette ligne
Propriété en lecture seule qui retourne une string indiquant le status de la recherche, 'OK' si tout c'est bien passé
Le status est consultable dans l'évènement OnPlacesSearch
TECPlacesResults
Cette classe gère la liste des resultats retournés par Search
TECPlaceResult
Classe gérant un résultat correspondant à une recherche
Effectue une requête supplémentaire sur le résultat pour obtenir des détails
Non disponible sous CloudMade
3Lorsque les détails sont disponibles l'évènement OnPlacesDetail est déclenché.
// Delphi
            map component ECMap
            
            // Event
            OnPlacesSearch
            procedure
            TFDemoLocalise.mapPlacesSearch(Sender: TObject);
            var i:integer;
            iMarker : integer;
            s,icon,types,names: string;
            begin
            
            if
            map.Places.Status<>'OK' then
            exit;
            
            for i:=0 to
            map.Places.Results.count-1
            do
            begin
            
            
            types:= map.Places.Results[i].result['types'];
            names:= map.Places.Results[i].result['name'];
            
            // add a marker for all valid
            résult
            if
            (names<>'')
            then
            begin
            
            iMarker :=
            map.AddMarker(map.Places.Results[i].latitude,map.Places.Results[i].longitude);
            
            if
            iMarker>-1 then
            begin
            // select icon for
            types
            if pos('restaurant',types)>0 then
            icon := 'http://google-maps-icons.googlecode.com/files/restaurant.png'
            else
            if pos('doctor',types)>0 then
            icon := 'http://google-maps-icons.googlecode.com/files/doctor.png'
            else
            icon := 'http://google-maps-icons.googlecode.com/files/supermarket.png';
            
            map.Markers[iMarker].icon := icon;
            map.Markers[iMarker].tag := FStartPlace+i;
            map.Markers[iMarker].infoWindow :=
            map.InfoWindows.Add(names);
            map.InfoWindows[map.Markers[iMarker].infoWindow].Anchor
            := iMarker;
            
            end;
            
            end;
            
            end;
            
            
            end;
Les résultats ne sont pas conservés lors d'un rechargement de la carte (reLoad, changement d'api ou autre), ils ne sont pas non plus enregistrés lors de la sauvegarde
4Démonstration
le programme DemoLocalise vous montre comment gérer Places