Geocoding en Silverlight avec Bing Map

Le geocoding permet de transformer une adresse en coordonnée (latitude, longitude). Au contraire, le reverse geocoding permet de récupérer une adresse à partir de coordonnées.

Nombreuses sont les ressources autour de ce sujet en utilisant les services Bing Map. Que ce soit par une référence web ou en REST en requêtant depuis notre application.
Mais l’utilisation en silverlight est moins documentée. Le développeur se retrouvant dans l’impossibilité d’ajouter une web reference, avec des noms des classes différents, et une utilisation asynchrone…

Dans cet article nous allons donc présenter les prérequis et dégrossir le fonctionnement du geocoding par le code.

Créer un compte bing map

Première étape, créez votre compte Bing Map sur https://www.bingmapsportal.com/.

Une fois votre compte créez cliquez sur “Create or view keys” :

ScreenBingMapPortal

Dans “Application name” entrez le nom de votre application.
Pour “Application URL” donnez l’adresse de la page de votre application ou une adresse quelconque.
Le champ “Application Type” est important, n’hésitez pas à cliquer sur le bouton “What’s this ?” pour plus d’explications. En effet, cela concerne la licence et l’utilisation du service Bing Map par votre application.
Pour cette démo nous utiliserons le type “Developer”.

Une fois la clef générée, gardez-la sous la main nous allons bientôt l’utiliser.

Au sein du projet Silverlight (ou WP7)

Créez donc votre projet silverlight ou Windows Phone 7.
Ajoutez une référence de service à l’adresse : http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc/mex
Pour cet article nous nommerons la référence “GeocodeService”.

Déclarons un objet de type Credentials qui permettra de nous authentifier au service.
Déclarons aussi un objet de type GeocodeRequest pour formuler notre requête.

private GeocodeRequest GeocodeRequest;
private Credentials myCredentials;

Créons ensuite une méthode InitGeocode() dans laquelle nous préparerons l’authentification au service.

private void InitGeoCodeRequest()
{
myCredentials = new Credentials();
myCredentials.ApplicationId = VOTRE_CLEF_GENEREE_DANS_LA_PARTIE_PRECEDENTE;
GeocodeRequest = new GeocodeRequest();
GeocodeRequest.Credentials = myCredentials;
}

Il ne nous reste plus qu’à faire une méthode qui recevra en paramètre un lieu et qui le geocodera.

private void MakeGeocodeRequest(string query)
{
    try
    {
        GeocodeRequest.Query = query;
        var geocodeService = new GeocodeService.GeocodeServiceClient(« BasicHttpBinding_IGeocodeService »);
geocodeService.GeocodeCompleted += delegate(object sender, GeocodeService.GeocodeCompletedEventArgs e)
{
if (sender != null)
{
//Location est une variable que j’utilise pour stocker le résultat de la méthode. A vous de voir comment vous souhaiter le traiter.
Location = e.Result.Results[0].Locations[0];
}
};
geocodeService.GeocodeAsync(GeocodeRequest);
}
   catch(Exception ex)
{
MessageBox.Show(« An exception occurred: «  + ex.Message);
}
}

De la même manière, pour récupérer une adresse depuis des coordonnées, il vous suffit de passer en paramètre un objet de type GeocodeLocation et d’utiliser l’event handler ReverseGeocodeCompleted à la place de GeocodeCompleted.
Bien évidemment, le delegate prendra un ReverseGeocodeCompletedEventArgs à la place du GeocodeCompletedEventArgs.
Ensuite faites l’appel asynchrone avec la méthode ReverseGeocodeAsync (et non plus GeocodeAsync) sur un objet de type ReverseGeocodeRequest initalisé de la même manière que le GeocodeRequest.
L’objet retourné sera de type Address.

Pour aller plus loin :
http://msdn.microsoft.com/en-us/library/cc966793.aspx
qui vous expliquera ce que retourne le  service : un GeocodeResponse. Il contient un GeocodeResult et la doc est intéressante au niveau de cet élément (plusieurs attributs peuvent vous intéresser comme le type Address introduit plus haut).

Par JC VASSELON

7 réponses à “Geocoding en Silverlight avec Bing Map

  1. Pingback: [WP7] Trouver son chemin avec Bing Map | Onefor4

  2. El garch Hicham

    salut je comprends pas « Créez donc votre projet silverlight ou Windows Phone 7. » est ce qu’il impératif de travailler avec asp pour pouvoir utiliser le map bing??
    merci de me répondre car y a pas de tuto sur Internet qui traite ça, j’ai cherché mais j’ai rien trouvé.

  3. Bonjour,
    Je ne comprends pas très bien votre question.
    Cet article traite de l’utilisation de bing map sur Windows Phone 7. Un contrôle Bing map existe aussi en Silverlight et ASP.Net. Il n’est donc pas impératif de travailler avec ASP.

  4. Merci pour ce tuto,
    Pour le variable Location que vous utiliser dans l’exemple de Geocoding je déclarer comment variable global afin de récupérer latitude et longitude mais il ya un problem que cette variable ne modifier que a l’interieur de delegate et a l’exterieur rest null, j’attend une réponse

  5. simplement : public GeocodeLocation Location {get ; set ; }
    Après, vu que c’est de l’asynchrone, la valeur change peut-être que plus tard.

  6. Merci pour votre réponse🙂
    mais on ne peut pas travailler avec des méthodes qui tenue compt de la synchronisation,mon probleme c’est que je suis besoin de variable Location pour l’exécution de la suit de l’application j’essaie avec une variable boolean a fin de planter le system pendant la récupération de résultat mais toujours les même problem.

  7. Pingback: [WP7] GPS Helper | Onefor4

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