La Boite à Outils de l’Application Géolocalisée: Partie 2: Geocoding d’adresse



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!

Comments (0)