Après avoir présenté l’utilisation des services de géocodage et de calcul d’itinéraire dans le détail, nous nous intéressons au service de recherche permettant d’explorer les points d’intérêts et les contenus de Bing Maps.

Développement Microsoft Bing Maps Web Services SOAP de recherche (search)

Les précédents articles de cette série :

 

Présentation du service

Ce Web Service de recherche permet d’effectuer, comme son nom l’indique, des recherches à proximité d’un point géographique défini, en se basant sur un mot ou une catégorie d’élément à rechercher.

La base de données de la plateforme Bing Maps utilisée pour effectuer cette recherche inclut de nombreux résultats grâce notamment à des partenariats intéressant nous permettant de récupérer les données des Yellow Pages aux USA (équivalent Pages Jaunes) et bien d’autres sources de données.

Ce service peut facilement être utilisé pour récupérer les informations de points d’intérêt à proximité de coordonnées connues.

 

Description des méthodes

Pour réaliser les recherches dans la base de POI, le Web Service de recherche expose une simple méthode Search() prenant en paramètre un objet de type SearchRequest.

Cet objet de type SearchRequest permet de définir la requête de recherche mais également des options pour les informations retournées ou pour appliquer des filtres spécifiques dans le cas de requêtes structurées.

Les résultats de l’appel à ce service utilisant cette méthode permettent de situer les points sur la carte en récupérant les résultats dans un objet de type SearchResponse.

 

Utilisation de la méthode de recherche de proximité

Dans un premier temps, dans le scénario ici choisi, on souhaite effectuer une recherche à proximité du point cliqué.

On associe tout d’abord l’événement de clic :

this.map.MouseClick += 
    new EventHandler<MapMouseEventArgs>(map_MouseClick);

Initialisation de la requête :

L’événement va transformer le point cliqué sur le contrôle en coordonnées géographiques qui seront utilisé au moment de la requête :

Location locTemp = null;
this.map.TryViewportPointToLocation(e.ViewportPoint, out locTemp);

Pour spécifier cette position, on utilise la propriété UserProfile de la requête de type SearchRequest :

// Set the User profile information
request.UserProfile = new UserProfile();
request.UserProfile.CurrentLocation = new UserLocation() { 
    Latitude = locTemp.Latitude, 
    Longitude = locTemp.Longitude 
};
request.UserProfile.DistanceUnit = DistanceUnit.Kilometer;

Au final, la requête est créée et initialisée en utilisant ce code, ici nous souhaitons rechercher les pizzerias situées dans un rayon de 20km autour du point cliqué sur le contrôle :

void map_MouseClick(object sender, MapMouseEventArgs e)
{
    Location locTemp = null;
    this.map.TryViewportPointToLocation(e.ViewportPoint, out locTemp);

    if (locTemp != null)
    {
        this.searchLocation = locTemp;

        SearchRequest request = new SearchRequest();

        // Set the culture
        request.Culture = this.map.Culture;

        // Set the query
        request.Query = c_SearchQuery; // Search for Pizza - cowabunga!

        // Set the query options
        request.SearchOptions = new SearchOptions();
        request.SearchOptions.Radius = 20; // 20km

        // Set the User profile information
        request.UserProfile = new UserProfile();
        request.UserProfile.CurrentLocation = new UserLocation() { 
            Latitude = locTemp.Latitude, 
            Longitude = locTemp.Longitude 
        };
        request.UserProfile.DistanceUnit = DistanceUnit.Kilometer;

        // Suppress faults
        request.ExecutionOptions = new ExecutionOptions();
        request.ExecutionOptions.SuppressFaults = true;

        // Set credentials
        request.Credentials = new Credentials();
        request.Credentials.ApplicationId = c_AppKey;


        this.searchClient.SearchAsync(request);
    }
}

Récupération des résultats :

L’événement de réception de la réponse à l’appel au Web Service de recherche est préalablement associé :

// Associate WS client async event
this.searchClient.SearchCompleted += 
    new EventHandler<SearchCompletedEventArgs>(searchClient_SearchCompleted);

Voici le code qui permet d’afficher les points sur la carte et de positionner la vue de façon à couvrir l’ensemble des points retournés :

void searchClient_SearchCompleted(object sender, SearchCompletedEventArgs e)
{
    if (e.Result.ResponseSummary.StatusCode == ResponseStatusCode.Success)
    {
        IList<Location> locations = new List<Location>();

        if ((e.Result != null) && (e.Result.ResultSets.Count > 0))
        {
            foreach (SearchResultBase result in e.Result.ResultSets[0].Results)
            {
                if (result.LocationData.Locations.Count > 0)
                {
                    Location location =
                        new Location(result.LocationData.Locations[0]);

                    // Create a pushpin
                    Image pin = new Image();
                    pin.Width = 60;
                    pin.Height = 39;
                    pin.Source = new BitmapImage(new Uri(c_PinUrl));

                    // Position origin option
                    PositionOrigin positionOrigin = PositionOrigin.BottomCenter;

                    // Add information on specific layer
                    MapLayer layerSearch = this.FindName("layerSearch") as MapLayer;
                    layerSearch.AddChild(pin, location, positionOrigin);
                    locations.Add(location);
                }
            }

            if (locations.Count > 0)
            {
                // Set view on locations
                this.map.SetView(new LocationRect(locations));
            }
        }
    }
}

Voici le résultat en exécution :

Bing Maps Search Web Service recherche de proximité 

Considérations et conclusions

Ce Web Service permet sans souci d’ajouter des fonctionnalités utilisant les données issues de la base de Bing maps.

Il est possible d’aller plus loin dans le paramétrage et les filtres pour les résultats en utilisant la propriété StructuredQuery de type StructuredSearchQuery de la classe SearchRequest.

Il devient alors relativement simple de proposer l’affichage des hôtels, musées ou restaurants à proximité d’un point connu ce qui dans certains scénarii peut se révéler une réelle plus value pour l’utilisateur final.

A vous d’inclure ce service et cette fonctionnalité dans vos applications très simplement comme vous avez pu le voir à travers cet article.

 

Le prochain article concernera le service d’imagerie en utilisation simple car je vous réserve une présentation plus complète et une extension de ce service d’imagerie afin de repousser les limites fixées pour ce dernier.