Astuces DotNet (Sébastien Courtois)

01/02/2010

[Bing Maps] Développement Microsoft Bing Maps Web Services – Part 5 : Search Service

Filed under: .NET, Bing Maps, Débutant, Intermediaire, Virtual Earth — Étiquettes : , , , — sebastiencourtois @ 21:22

Cet article est une suite de l’article se trouvant ici. Il était question de créer un compte Bing Maps et se connecter en C# aux différents services Web de Virtual Earth.

Liens des posts sur le sujet sur ce blog :

  1. Introduction à Microsoft Virtual Earth (Part 1)
  2. Géocoding / Géocoding Inverse (Part 2)
  3. Récupération des images satellites (Part 3)
  4. Calcul d’itinéraires (Part 4)
  5. Search Service (Part 5)

Bing Maps intègre un système de recherche permettant de trouver des entités géographiques afin de les afficher sur une carte.).

  • Configuration préliminaire

Afin de pouvoir utiliser le service de recherche, il est nécessaire d’avoir rajouté les références aux services Common et Search (http://staging.dev.virtualearth.net/webservices/v1/searchservice/searchservice.svc) et d’avoir récupérer un ticket de session valide.

L’accès au service se fera par l’intermédiaire de la classe proxy généré lors de l’ajout du Service Reference.

SearchServiceClient svc = new SearchServiceClient();

  • Requêtage du service de recherche

La définition de la requête à effectuer se réalise grâce à l’objet SearchRequest. Celui-ci contient une propriété StructuredQuery de type StructuredSearchQuery. Cette propriété contient deux champs textes :

    • Keywords : Liste des mots clés liés à la recherche
    • Location : Lieu autour duquel on veut trouver les entités

Ainsi la requête suivante ramène l’ensemble des pizzerias près des locaux de Microsoft.

SearchServiceClient svc = new SearchServiceClient();

SearchRequest sq = new SearchRequest();

sq.Culture = "fr-fr";

sq.Credentials = new Credentials();

sq.Credentials.Token = token;

sq.StructuredQuery = new StructuredSearchQuery()

{

Keyword = "Pizzeria",

Location = "Issy Les Moulineaux",

};

SearchResponse response = svc.Search(sq);

Une autre façon de réaliser cette requête est d’utiliser la propriété Query de la classe SearchRequest à la place de StructuredQuery. Vous pouvez ajouter des délimiteurs tels que le ‘;’ pour indiquer les différents paramètres.

SearchServiceClient svc = new SearchServiceClient();

SearchRequest sq = new SearchRequest();

sq.Credentials = new Credentials();

sq.Credentials.Token = token;

sq.Query = "Resturant; Issy-Les-Moulineaux";

  • Configuration supplémentaires

Il est possible de paramétrer cette requête afin que les résultats soient en correspondance avec ce que l’on souhaite afficher. Pour cela, on utilise la propriété SearchOptions de la classe SearchRequest.

Cette classe contient une propriété Count permettant de demander la récupération d’un nombre défini de résultat (par défaut 10) et une propriété StartingIndex (par défaut 0). Ces deux propriétés permettent la réalisation de grille avec gestion de pages lorsque le nombre de résultat est trop grand.

La propriété SortOrder permet de définir dans quel ordre doivent être envoyé. Cette propriété est une énumération de type SortOrder comprenant les quatres valeurs suivants :

    • Distance : Du plus proche au plus loin
    • Popularity : Du plus populaire au moins populaire
    • Rating : du mieux noté au moins bien noté
    • Relevance : du plus correspondant aux critères de recherche au moins correspondant.

La propriété ListingType permet de définir la base de données depuis laquelle va être effectué la recherche. Cette propriété est une énumération de type ListingType ayant les choix suivants :

    • Business : Entreprises,Commerces (valeur par défaut)
    • CommunityContent : Contenu fourni par la communauté (non disponible pour la France)
    • Person : Personne (non disponible pour la France)
    • Unknown : Entité dont le type est inconnu

Afin de filtrer encore plus spécifiquement les données, la propriété Filters permet de réaliser des recherches spécifiques à un domaine d’activité. Les filtres disponibles et les valeurs possibles sont disponibles sur le site MSDN (http://msdn.microsoft.com/en-us/library/cc966911.aspx).

La propriété AutocorrectQuery permet de demander à Bing Maps de corriger les mots mal orthographiés dans la requête avant de l’exécuter. Cette correction est effectuée en fonction d’un dictionnaire dont la langue dépend de la propriété Culture de la requête. Cette propriété est à true par défaut. En cas de correction sur la requête, les corrections apportées seront indiqué dans la propriété QuerySuggestion de la réponse.

La propriété ParseOnly permet d’indiquer si l’on souhaite que la requête soit uniquement analysé sans renvoyé les résultats de la recherche en elle-même. Cela permet notamment de vérifier les suggestions ou les corrections faites par Bing Maps sur la requête sans récupérer une série de résultats qui pourrait être lourde en termes de bande passante.

SearchServiceClient svc = new SearchServiceClient();
SearchRequest sq = new SearchRequest();
sq.Credentials = new Credentials();
sq.Credentials.Token = token;
sq.Query = "Resturant Issy-Les-Moulineaux";
sq.SearchOptions = new SearchOptions()
{
    StartingIndex = 0,
    Count = 20,
    SortOrder = SortOrder.Rating,
    ListingType = ListingType.Business,
    AutocorrectQuery = true
};
SearchResponse response = svc.Search(sq);

  • Analyse des résultats

La classe résultat récupéré suite à l’appel à la méthode Search est de type SearchResponse. Cette classe contient de nombreux champs que nous avons déjà vu précédement comme ExtensionData et ResponseSummary.

L’une des propriétés spécifiques est QuerySuggestion. Cette propriété n’est remplie que si la propriété AutoCorrectQuery de la requête est à true. Au sein de QuerySuggestion, on trouve la propriété Query qui contient la requête corrigé sous forme d’une chaine de caractères. La propriété StructuredQuery contient la requête corrigé sous forme plus structure : Le lieu recherché (dans la propriété Location) et l’objet de la recherche (la propriété Keyword). Dans notre exemple (‘Restaurant Issy-Les-Moulineaux’), on aura pour ‘Restaurant’ dans la propriété Keyword et ‘Issy-Les-Moulineaux’ dans la propriété Location.

SearchResponse response = svc.Search(sq);
Console.WriteLine("Nombre de résultats :" + response.ResultSets[0].EstimatedMatches);
foreach(SearchResultBase srs in response.ResultSets[0].Results)
{
   Console.WriteLine("----------------------------------");
   Console.WriteLine("Id : "+ srs.Id);
   Console.WriteLine("Nom : "+ srs.Name);
   Console.WriteLine("Distance : "+ srs.Distance);
   Console.WriteLine("Position : (" + srs.LocationData.Locations[0].Longitude + ";" + srs.LocationData.Locations[0].Latitude+")");
   Console.WriteLine("----------------------------------");
}
Console.ReadLine();

  • Affichage des résultats suite à la requête

L’autre propriété spécifique est ResultSet qui est le tableau des résultats des requêtes (type ResultSet[]). Chaque ResultSet contient une tableau de SearchResultBase[] contenu dans la propriété Result.

Le type SearchResultBase contient les propriétés suivantes :

    • Id : Identifiant Bing Maps de l’entité
    • Name : Nom de l’entité
    • Distance : Distance entre le lieu cible et ce que l’on recherche (dans notre exemple, distance entre le centre d’Issy Les Moulineaux et le restaurant).
    • LocationData : Informations plus précise sur le lieu de l’entité (Position géographique, Niveau de confiance …)

Voici l’article qui termine ma série sur le WebService Bing Maps. Vous retrouverez l’ensemble des liens vers ces articles au début de ce post.

3 commentaires »

  1. Bonjour,

    Merci pour ton article fort utile, a noter que l’utilisation du token est maintenant deprecated et ne fonctionnera plus à partir de mars 2012.

    Imaginons que je veuille avoir des informations supplémentaires sur chaque SearchResultBase, comme par l’exemple l’url du site, le numéro de téléphone, connais-tu un moyen facile d’obtenir ce genre d’information?

    Commentaire par ranouf — 22/11/2011 @ 11:21

    • Il est possible que les API Bing Map decrit dans l article soient maintenant deprecated car cet article commence un peu a dater🙂.

      Pour ta question, je n’ai pas touche a Bing Maps recement (depuis plus d’un an environ) et je n’ai pas d’idees qui me vienne directement. Je te conseille donc de voir sur la MSDN.

      Commentaire par sebastiencourtois — 22/11/2011 @ 17:57

      • Ok merci😉

        Commentaire par ranouf — 22/11/2011 @ 19:36


RSS feed for comments on this post. TrackBack URI

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Créez un site Web ou un blog gratuitement sur WordPress.com.

%d blogueurs aiment cette page :