Pierre's Embedded and Mobile Blog

Soulevons le capot des systèmes embarqués et mobiles

La Boite à Outils de l'Application Géolocalisée: Partie 3: Afficher une carte

La Boite à Outils de l'Application Géolocalisée: Partie 3: Afficher une carte

  • Comments 1

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

Une fois que la position est connue, reste à l’afficher sur une carte J. Pour cela les API en lignes de Bing Maps et Google Maps sont très faciles à utiliser dans leurs versions mobiles.

Bing Maps

Pour afficher la carte nous utilisons la même approche que pour le geocoding, mais le service utilisé change. Plutôt que d’utiliser un FindServiceSoap, j’utilise un RenderServiceSoap.

Dans mon formulaire, je rajoute la création du service Soap qui me servira à communiquer avec la plateforme MapPoint. J’en profite pour rajouter quelques propriétés qui me serviront plus tard :

private RenderServiceSoap renderService = new RenderServiceSoap();

private LatLong mapCenter = null;

private double mapScale = 50000;

public double Latitude { get; private set; }

public double Longitude { get; private set; }

 

Puis je m’occupe de l’authentification : je stocke mon compte utilisateur (sous la forme de 6 chiffres) et mon mot de passe dans les ressources, et je crée un méthode statique pour factoriser ce code :

private void SetMapPointCredentials()

{

    // You have to provide MapPoint credentials in order to call out to the MapPoint WS

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

 

    renderService.Credentials = myCredentials;

    renderService.PreAuthenticate = true;

}

 

Ensuite, il me suffira à l’initialisation du formulaire d’appeler cette méthode pour mettre en place les bonnes authentifications.

Ensuite, je vais utiliser un contrôle de type PictureBox pour afficher la carte. Pour peupler cette PictureBox, il faut une Image, que je vais créer à partir d’un objet de type MapImage que j’aurai fait généré par le service.

Une MapImage est générée par le service à partir d’une MapView, qui est la vue de la carte (quelle échelle, quel centre, etc).Par dessus, on peut rajouter une liste de PushPins, qui correspondent à des petits indicateurs (drapeaux, etc) sur la carte. Voici donc à quoi ressemble le code :

MapView[] myViews = new MapView[1];

ViewByScale myView = new ViewByScale();

 

mapCenter = new LatLong();

mapCenter.Latitude = this.Latitude;

mapCenter.Longitude = this.Longitude;

 

myView.CenterPoint = mapCenter;

myView.MapScale = mapScale;

 

myViews[0] = myView;

 

Pushpin[] myPushpins = new Pushpin[1];

myPushpins[0] = new Pushpin();

myPushpins[0].IconDataSource = "MapPoint.Icons";

myPushpins[0].IconName = "31";

//myPushpins[0].Label = "Location";

myPushpins[0].LatLong = new LatLong();

myPushpins[0].LatLong.Latitude = mapCenter.Latitude;

myPushpins[0].LatLong.Longitude = mapCenter.Longitude;

 

MapSpecification mapSpec = new MapSpecification();

mapSpec.DataSourceName = "MapPoint.EU";

mapSpec.Views = myViews;

mapSpec.Pushpins = myPushpins;

 

MapImage[] mapImages = renderService.GetMap(mapSpec);

if (mapImages[0] != null)

{

    pbMap.Image = new System.Drawing.Bitmap(new System.IO.MemoryStream(mapImages[0].MimeData.Bits));

    pbMap.Visible = true;

}

 

Google Maps

Pour Google Maps, le plus simple pour le mobile est d’utiliser l’API statique : http://code.google.com/apis/maps/documentation/staticmaps/

Ici aussi il faut une clef d’API, qu’on peut récupérer gratuitement ici : http://code.google.com/apis/maps/signup.html

Ensuite, il suffit d’envoyer les bons paramètres dans une URL pour récupérer une image, qu’on peut héberger dans une PictureBox. Voici une façon simple de construire la requête :

#region Construction des arguments de l'URL

StringBuilder args = new StringBuilder();

args.Append("center=" + this.Latitude.ToString() + "," + this.Longitude.ToString());

args.Append("&zoom=12");

args.Append("&size=" + pbMap.Width + "x" + pbMap.Height);

args.Append("&format=png");     // gif, png, jpg

args.Append("&maptype=mobile"); // satellite, terrain, hybrid, mobile

args.Append("&markers=" + this.Latitude + "," + this.Longitude + "," + "blue");

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

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

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

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

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

args.Append("&sensor=false");   // true if my app uses GPS sensor

#endregion

 

try

{

 

    WebRequest myRequest = WebRequest.Create(GoogleMapBaseUrl + args.ToString());

    WebResponse myResponse = myRequest.GetResponse();

 

    pbMap.Image = new Bitmap(myResponse.GetResponseStream());

    myResponse.Close();

}

catch (WebException ex)

{

    MessageBox.Show(ex.Message);

}

 

Si on résume ce qu’on vient de voir, vous êtes maintenant capables de récupérer une position que ce soit à partir du GPS ou avec l’identifiant de la cellule GSM, et de l’afficher sur une carte, que ce soit de chez Google ou de chez Bing. Vous avez donc toutes les cartes en mains pour proposer une application géolocalisée, il ne manque plus que l’idée « métier » derrière J

Si vous vous sentez l’âme d’un contributeur, il reste de nombreux services à utiliser : Yahoo Geocoding Services, Open Street Map, etc. N’hésitez pas !

  • Bonjour ,

    merci bien pour ces Tutorial . mais j'ai une question , si je veux récupérer les coordonnées GPS d'un autre portable et non pas du mien, comment faire?

    SVP c'est très urgent , je travaille sur un projet pareille et je dois l'achever avant jeudi :S.

    Merci d'avance .

Page 1 of 1 (1 items)
Leave a Comment
  • Please add 1 and 6 and type the answer here:
  • Post