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

Places

Vous êtes ici :TECMap

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

3

La propriété XapiServer vous permet d'utiliser un autre serveur Xapi que celui de MapQuest

// Delphi map component ECMap
// 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

3

TECPlaces

procedure Search( Tags:string);

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

Documentation Xapi

// 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

4
procedure TextSearch(const TextQuery: string);

Lancement 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é

property AutoComplete : boolean

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é

Fig. 34 Place AutoComplete

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

map.Javascript('input_autocomplete.style.width="'+inttostr(map.Width-160)+'px"');
property Adress : string read FAdress write FAdress;
Propriété en lecture/écriture qui indique le point central de la zone de recherche, elle a la priorité sur les propriétés Latitude et Longitude
property Status : string;

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

property ItemDetail : integer;
Propriété en lecture seule qui contient l'index du résultat dont on cherche les détails supplémentaires
property Latitude : double;
Propriété en lecture/écriture qui indique la latitude du point central de la zone de recherche, cela invalide le contenu de la propriété Adress
property Longitude: double;
Propriété en lecture/écriture qui indique la longitude du point central de la zone de recherche, cela invalide le contenu de la propriété Adress
property Radius : integer;
Propriété en lecture/écriture qui indique le rayon de recherche en mètres
property useOSM : boolean;
Permet d'utiliser les données d'OpenStreetMap avec l'api Google
property maxResult : integer;
limite le nombre de résultat pour une recherche dans les données d'OpenStreetMap, ignoré avec Google Places
property Searching: boolean;
Propriété en lecture seule qui indique si une recherche est en cours
property Results:TECPlaceResults;
Liste des resultats, l'événement OnPlacesSearch est déclenché lorsque les résultats sont disponibles

TECPlacesResults

Cette classe gère la liste des resultats retournés par Search

procedure Clear;
Efface l'ensemble des résultats
function Count:integer;
Retourne le nombre de résultat correspondant à la requête
procedure Delete(const index:integer);
Efface le résultat dont on passe l'index
property Result[index:integer]:TECPlaceResult
Tableau permettant l'accès aux résultats, c'est la propriété par défaut donc vous pouvez y accéder directement par map.Places.Results[index] au lieu de map.Places.Results.Result[index]

TECPlaceResult

Classe gérant un résultat correspondant à une recherche

procedure getDetails;

Effectue une requête supplémentaire sur le résultat pour obtenir des détails

Non disponible sous CloudMade

3

Lorsque les détails sont disponibles l'évènement OnPlacesDetail est déclenché.

property Result[const key:string]:string;
Retourne la valeur de la clef que l'on passe en paramètre
property Detail[const Key:string]:string;
Retourne la valeur de la clef que l'on passe en paramètre pour les détails
property NameResult[const index:integer]:string;
Retourne la clef d'un résultat en fonction de son index
property NameDetail[const index:integer]:string;
Retourne la clef d'un détail en fonction de son index
property CountResult:integer;
Retourne le nombre d'élément (clef=valeur) d'un résultat
property CountDetail:integer read getCountDetail;
Retourne le nombre d'élément (clef=valeur) d'un détail
property Latitude : double;
Latitude du résultat
property Longitude: double;
Longitude du résultat
property RawResult : string;
Retourne l'ensemble des éléments du resultat sous la forme d'une chaîne constituée de lignes clef=valeur
property RawDetail : string;
Retourne l'ensemble des éléments du détail sous la forme d'une chaîne constituée de lignes clef=valeur

// 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

4

Démonstration

le programme DemoLocalise vous montre comment gérer Places

Fig. 35 DemoLocalise
Fig. 35 DemoLocalise
Aller à la page
Composant Delphi / Google Maps / OpenStreetMap / Leaflet  / Mappilary© 2016 ESCOT-SEP Christophe - Réalisé avec Help&Web - RSS - RSS - Google+