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