Cet article fait partie d'une série de 3: La Boite à Outils de l'Application Géolocalisée

Il existe un moyen précis d’obtenir une localisation, il s’agit tout simplement de l’adresse à laquelle on se trouve J. Des services en ligne permettent d’obtenir une localisation précise à partir d’une adresse donnée. Encore une fois, nous avons le choix entre plusieurs services :

Google Geocoding services

Le service de geocoding Google fonctionne très simplement en REST. L’API est décrite en ligne ici : http://code.google.com/apis/maps/documentation/geocoding/index.html

Il suffit de construire une URL particulière et les coordonnées sont renvoyées en XML : voici un bout de code simple qui permet de traiter une adresse :

static public string GeoCodeAddress(string street, string town, string zipcode, string country)

{

    XNamespace ns1 = "http://earth.google.com/kml/2.0";

    string BaseUrl = "http://maps.google.com/maps/geo?";

    string GoogleMapApiKey = "<INSERT_API_KEY_HERE>";

    string result;

    string[] splittedResult;

    StringBuilder args = new StringBuilder();

    args.Append("q=" + street.Replace(' ', '+') + "+" + town.Replace(' ', '+') + "+" + zipcode.Replace(' ', '+') + "+" + country.Replace(' ', '+'));

    args.Append("&key=" + GoogleMapApiKey);

    args.Append("&sensor=false");

    args.Append("&output=xml");

    args.Append("&oe=utf8");

    //args.Append("&ll=");

    //args.Append("&spn=");

    //args.Append("&gl=");

    try

    {

        string url = BaseUrl + args.ToString();

        WebRequest myRequest = WebRequest.Create(new Uri(url));

        WebResponse myResponse = myRequest.GetResponse();

        XmlReader sr = XmlReader.Create(myResponse.GetResponseStream());

        try

        {

            result = (from el in XElement.Load(sr).Descendants(ns1 + "Point")

                     select el.Element(ns1 + "coordinates").Value).Single();

        }

        finally

        {

            sr.Close();

            myResponse.Close();

        }

        

    }

    catch (WebException webex)

    {

        return webex.Message;

    }

    splittedResult = result.Split(',');

    return splittedResult[1] + "|" + splittedResult[0] ;

}

Encore une fois je retourne latitude et longitude dans une string séparées par un ‘| ‘ pour être consistant entre mes différentes manières de récupérer la localisation.

Bing Maps geocoding services

Contrairement à l’approche Google qui utilise REST, Bing Maps propose des services similaires en SOAP. Personnellement je préfère cette approche, qui est beaucoup plus lisible et maintenable au fur et à mesure de l’enrichissement et de l’évolution des API.

La première chose à faire est de demander un compte de développeur sur la plateforme : https://mappoint-css.live.com/mwssignup/Default.aspx?wa=wsignin1.0. Ensuite, depuis un projet mobile, on peut cliquer sur « Add Web Reference » : un petit wizard s’ouvre et nous demande l’url du webservice : il faut rajouter : http://staging.mappoint.net/standard-30/ puis cliquer sur la version « staging ». Ensuite il est conseillé de enommer le service : je l’appelle MapPoint. Ceci étant fait, le proxy vers le service est généré, et à partir de là on peut utiliser dans l’application le service.

Je vais donc commencer par créer un nouveau service, auprès duquel je vais m’authentifier :

FindServiceSoap myService = new FindServiceSoap();

myService.Credentials = new NetworkCredential(Properties.Resources.MapPointUserName, Properties.Resources.MapPointPassword);

myService.PreAuthenticate = true;

Ensuite il me faut formater l’adresse : rien de compliqué, j’utilise les mêmes champs qu’avec l’API Google, mais le format est légèrement différent : j’utilise un objet Address :

Address myAddress = new Address();

myAddress.FormattedAddress = street + ", " + zipcode + " " + town + ", " + country;

J’en profite pour configurer quelques options, notamment le fait de pouvoir utiliser l’algorithme « Rooftop » qui me donne des résultats très précis :

FindOptions myOptions = new FindOptions();

myOptions.ResultMask = FindResultMask.RooftopFlag |

                       FindResultMask.LatLongFlag |

                       FindResultMask.EntityFlag |

                       FindResultMask.MatchDetailsFlag |

                       FindResultMask.AddressFlag;

Enfin, il ne reste plus qu’à packager tout ça pour l’envoyer au service : c’est le but de la classe FindAddressSpecification :

FindAddressSpecification fas = new FindAddressSpecification();

fas.InputAddress = myAddress;

fas.Options = myOptions;

fas.DataSourceName = "MapPoint.EU";

Dernière étape : récupérer les coordonnées à partir de l’adresse et le renvoyer au format habituel : latitude|longitude :

FindResults results = myService.FindAddress(fas);

FindResult bestResult = results.Results[0];

 

return bestResult.BestViewableLocation.LatLong.Latitude.ToString() + "|" + bestResult.BestViewableLocation.LatLong.Longitude.ToString();

Un bon article sur le geocoding avec les services Bing: http://msdn.microsoft.com/en-us/library/bb545004.aspx.

Nous voila donc avec 2 options pour une manière de plus de retrouver des coordonnées GPS précises : à partir d’une adresse.

Prochaine étape: Afficher une carte!