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!