Dans les articles précédents, nous nous sommes intéressés à ce que sont les Bing Maps Web Services ainsi que comment il est possible de gérer l’authentification nécessaire pour leur utilisation.

Nous allons maintenant nous intéresser aux Web Services en tant que tel et en commençant par celui de géocodage et de géocodage inverse permettant de résoudre une adresse en point géographique et inversement.

Bing Maps Web Services header

Je publierai les codes d’exemple en fin de semaine en même temps que la fin de la série sur les Web Services Bing Maps.
 

Un peu de vocabulaire

Afin de se comprendre correctement, il peut être utile de définir les termes utilisés :

  • Géocodage : geocoding en anglais
    Opération consistant à résoudre une adresse postale (ou lieu) en une position géographique (une latitude et une longitude)
     
  • Géocodage inverse : reverse-geocoding en anglais
    Opération consistant à résoudre une position géographique en adresse postale
     
  • Géocodage automatique : batch-geocoding en anglais
    Opération consistant à exécuter de multiples opérations de géocodage (ou reverse) en grand nombre, exécutées en une seul fois sur le serveur 

Ces termes définis même sommairement, nous permettront de nous entendre, je préfère utiliser, en tant que développeur qui se respecte (ou qui essaie :) ), les termes anglais pour qualifier les types d’opération.

 

Description des méthodes

Pour réaliser les opérations de geocoding ou de reverse-geocoding, le Web Service dédié expose 2 méthodes à travers le client qui sera généré :
Geocode() et ReverseGeocode().
http://msdn.microsoft.com/en-us/library/cc966913(v=MSDN.10).aspx

Ces méthodes prennent en paramètre un objet de type GeocodeRequest ou ReverseGeocodeRequest (selon l’appel) incluant toutes les options associées à ces requêtes.

Les résultats de ces requêtes sont récupérés à travers des événements associés et sous forme d’objet incluant l’ensemble des éléments de la réponse que ce soit concernant le résultat en lui même, comme l’état de la transaction ou bien même les erreurs qui auraient pu survenir lors du traitement.
Ces objets sont alors de type GeocodeResponse.

 

Utilisation de la méthode de geocoding

Je n’entre volontairement pas dans le détail du code de l’application (vous avez accès au code utilisé en téléchargement), mais uniquement sur la partie d’initialisation de la requête (réalisée à travers une méthode privée) et la récupération du résultat dans l’événement associé.

Initialisation de la requête :

private void getLocationFromAddress(string address)
{
    // Create the request
    GeocodeRequest request = new GeocodeRequest();

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

    // Set the query address to geocode
    request.Query = address;

    // Set filter (only good matching)
    request.Options = new GeocodeOptions();
    request.Options.Filters = new List<FilterBase>();
    request.Options.Filters.Add(
        new ConfidenceFilter() { 
            MinimumConfidence = Confidence.Medium 
        }
    );

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

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

    // Execute async
    this.geocodeClient.GeocodeAsync(request);
}

Récupération du résultat :

void geocodeClient_GeocodeCompleted(object sender, GeocodeCompletedEventArgs e)
{
    try
    {
        if (e.Result.ResponseSummary.StatusCode == ResponseStatusCode.Success)
        {
            if (e.Result.Results.Count > 0)
            {
                this.map.SetView(e.Result.Results[0].Locations.First(), 16);
                this.map.Children.Add(new Pushpin()
                {
                    Location = e.Result.Results[0].Locations.First()
                });
            }
        }
    }
    catch (Exception ex)
    {
        // TODO
    }
}

Voici le résultat en exécution :

Bing Maps Geocode request  

Utilisation de la méthode de reverse-geocoding

On associe le clic de la souris à l’événement déclenchant la requête, dès lors voici le code utilisé.

Récupération des coordonnées cliquées :

void map_MouseClick(object sender, Microsoft.Maps.MapControl.MapMouseEventArgs e)
{
    // Geocode adress of the clicked point
    Location location;
    if (this.map.TryViewportPointToLocation(e.ViewportPoint, out location))
    {
        this.getAddressFromLocation(location);
    }
}

Initialisation de la requête :

private void getAddressFromLocation(Location location)
{
    // Create the request
    BingMaps.GeocodeService.ReverseGeocodeRequest request 
        = new BingMaps.GeocodeService.ReverseGeocodeRequest();

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

    // Set Location
    request.Location = new Location();
    request.Location.Latitude = location.Latitude;
    request.Location.Longitude = location.Longitude;

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

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

    // Execute the request async
    this.geocodeClient.ReverseGeocodeAsync(request);
}

Récupération du résultat :

void geocodeClient_ReverseGeocodeCompleted(object sender, ReverseGeocodeCompletedEventArgs e)
{
    try
    {
        if (e.Result.ResponseSummary.StatusCode 
            == BingMaps.GeocodeService.ResponseStatusCode.Success)
        {
            if (0 == e.Result.Results.Count)
            {
                MessageBox.Show("No results");
            }
            else
            {
                MessageBox.Show("Corresponding address: " 
                                + e.Result.Results[0].DisplayName);
            }
        }
    }
    catch (Exception)
    {
    }

}

Voici le résultat en action :

Bing Maps Reverse Geocode request  

Considérations et conclusions

A l’aide de ce Web Service de géocodage, il devient tout à fait possible de récupérer l’adresse d’un point cliqué au sein d’une application ou tout simplement dont les coordonnées géographiques sont stockées en base.

Attention toutefois au nombre d’appels ainsi qu’aux appels successifs, Microsoft propose pour ce type d’utilisation, une possibilité de batch-geocoding permettant de traiter une quantité importante d’information en une seule transaction ce qui n’est pas à négliger dans le cadre d’utilisation commerciale.

 

Dans le prochain article, nous aborderons l’utilisation du service de calcul d’itinéraire permettant notamment de récupérer les points de parcours mais aussi les instructions et les directions précises.