Astuces DotNet (Sébastien Courtois)

08/04/2009

[Virtual Earth] Développement Microsoft Virtual Earth Web Services – Part 3 : Imagery Service

Filed under: Débutant, Virtual Earth — Étiquettes : , , , , , , — sebastiencourtois @ 16:00

Liens des posts sur le sujet sur ce blog :

  1. Introduction à Microsoft Virtual Earth (Part 1)
  2. Géocoding / Géocoding Inverse (Part 2)
  3. Récupération des images satellites (Part 3)
  4. Calcul d’itinéraires (Part 4)

Dans ce post, nous allons parler la partie la plus intéressante de Virtual Earth : La récupération des images satellites.

Tout d’abord, il est nécessaire d’ajouter une référence vers le service d’imagerie de Virtual Earth : http://staging.dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc. On instancie ensuite une classe proxy nommée ImageryServiceClient afin d’avoir accès au service.

ImageryServiceClient imagerySvc = new ImageryServiceClient();

On peut utiliser ce service pour récupérer les images de deux manières : Récupération des images à la demande et Récupération des images à la volée (Tiles).

  • Récupération des images à la demande : MapUriRequest

Il est possible de récupérer des images satellites en fournissant des coordonnées géographiques puis de spécifier des informations supplémentaires pour avoir l’image souhaitée.

On utilise pour cela la classe MapUriRequest que l’on va fournir en paramètre de la méthode GetMapUri de la classe ImageryServiceClient.

Cette classe MapUriRequest est composée des propriétés spécifiques suivantes : (je ne mets que les propriétés spécifiques aux requêtes MapUri. Pour les autres paramètres, voir les posts précédents).

Nom de la propriété Description
Center Coordonnées géographiques du point central de l’image (classe Location avec des propriétés Latitude/Longitude/Altitude)
MajorRoutesDestination Paramètre ne fonctionnant pas chez moi et dont je ne comprends pas l’intérêt. Voir la documentation MSDN.
Options Options de paramétrage de l’image sous la forme d’une classe MapUriOptions. Cette classe est décrite par la suite.
Pushpins Ajout de puce pour indiquer les emplacements importants. Il s’agit d’un tableau de Pushpin. Il est possible de définir, pour chaque puce, sa position, son nom ainsi que l’icône à utiliser parmi une liste prédéfini par Microsoft (Liste des icones disponible par défaut). Le nombre maximum d’icones est de 10 par image.
    • MapUriOptions

La classe MapUriOptions permet de définir un certain nombre de paramètres sur l’image que l’on souhaite obtenir.

Nom de la propriété Description
DisplayLayers Il est possible de superposer sur l’image des calques d’informations. Pour cela, il suffit de fournir une chaine de caractères contenant la liste des calques disponibles.
ImageSize Taille de l’image souhaitée (valeurs entre 80 et 830 pixels sur les deux dimensions)
ImageType Format de l’image (GIF, JPEG, PNG). Par défaut, cela dépend du style de carte voulue. (voir la documentation MSDN)
PreventIconCollision Valeur booléen pour indiquer si l’on souhaite que les icones (pushpins) se superposent lorsqu’ils sont proche.
Style Type de carte parmi les suivantes : Route (Road), Aérien (Aerial), Aérien avec titre (AerialWithLabels).

Les images de type  Birdseye et BirdseyeWithLabel ne sont pas disponible sur le Web Service.
UriScheme Type d’URL : HTTP ou HTTPS
ZoomLevel Niveau de zoom compris entre 1 et 21. (1 étant le plus éloigné et 21 étant le plus proche de la cible).
    • Un exemple d’utilisation

N.B : Les variables positions et token sont reprises des exemples précédents.

MapUriRequest mapUriRequest = new MapUriRequest();
mapUriRequest.Credentials = new VETutorial.ImageryService.Credentials();
mapUriRequest.Credentials.Token = token;

mapUriRequest.Center  = new VETutorial.ImageryService.Location() { Latitude = position.Latitude, Longitude = position.Longitude };
mapUriRequest.Options = new MapUriOptions() 
{
	ImageSize = new VETutorial.ImageryService.SizeOfint() {  Width=800, Height = 600},
	ImageType = ImageType.Jpeg,
	Style = MapStyle.AerialWithLabels,
	UriScheme = UriScheme.Https,
	ZoomLevel = 18
};
mapUriRequest.Pushpins = new Pushpin[] { new Pushpin() { Location = new VETutorial.ImageryService.Location() { Latitude = position.Latitude, Longitude = position.Longitude } } };

MapUriResponse reponseMapUrl = imagerySvc.GetMapUri(mapUriRequest);
string finalUrl = reponseMapUrl.Uri.Replace("{token}",token);

L’exemple ci-dessus, crée une requête MapUri et lui indique le token d’authentification à utiliser (ne pas oublier cette étape). On définit ensuite les différents paramètres comme la position centrale, taille et format de l’image et niveau de zoom. Après l’appel de la méthode GetMapUri, on obtient un objet MapUriResponse contenant une propriété Uri contenant un modèle d’URL pour récupérer l’image. Ce modèle permet de construire soit même l’url pour récupérer l’image.

Dans mon cas, je reçois l’url suivant : https://staging.tiles.virtualearth.net/api/GetMap.ashx?c=48.868681,2.334231&ppl=48.868681,2.334231&w=800&h=600&o=jpeg&b=h,mkt.en-US&z=18&token={token}

Sans rentrer dans les détails des différentes paramètres contenues dans cette url, nous nous intéresserons sur le dernier paramètre : &token={token}. Au sein des services Virtual Earth, le modèle URL contiennent des zones “à remplacer” toujours représenté par des {}. Dans ce cas précis, il faut remplacer le {token} par la valeur de notre token. La façon la plus simple pour remplacer ces zones est d’utiliser la méthode Replace de la classe String. On arrive finalement à une adresse finale qui pourra être utilisé dans un navigateur, WebClient ou autres pour récupérer l’image.

L’image obtenue est la suivante : GetMap

  Un des trucs sympas est que l’on peut mettre cet adresse sur la propriété Source des contrôles d’images (Winforms,ASP.NET …) et l’image est téléchargée directement et affichée.

  • Récupération des images à la volée (Tiles)

Demander à Virtual Earth de générer une image pour nous est pratique. Toutefois, il y a un certain cout en termes de performance qui fait que cela n’est utilisable que pour afficher des images ponctuellement. Un déplacement fluide sur une carte avec l’API MapURI n’est pas envisageable. C’est pourquoi Virtual Earth fournit une autre façon de récupérer des images : Le Tile System.

    • Qu’est ce que le Tile System ?

Un Tile est une image d’une taille fixe représentant une partie d’une image plus grande. Dans le cas de la cartographie, ces images représentent un morceau du monde et, une fois l’ensemble de ces Tiles assemblés, on obtient une image du monde. Au sein de Virtual Earth, ces Tiles font 256×256 pixels. Le nombre de Tiles représentant le monde dépend du zoom. Au zoom le plus haut, on a 4 Tiles. Au zoom suivant on a 16 Tiles et ainsi de suite. Chaque Tile est numéroté en fonction de son emplacement et son zoom. Ce concept est décrit par le schéma suivant :

tilesystem

Afin d’obtenir chacune des images, il est nécessaire de construire l’url vers l’image. On obtient l’url d’un Tile de la façon suivante :

https://staging.tiles.virtualearth.net/tiles/{type}{code}.jpeg?g={version}&mkt={culture}&token={token}

Nom Description
{type} Type de carte représenté par un caractère : h pour Hybrid (Aérien avec textes), a pour Aerial (Aérien), r pour Road (Carte routière)
{code} Identifiant du tile comme décrit dans le schéma ci-dessus
{version} Numéro de version de Virtual Earth (275 au moment de l’écriture de ce tutorial)
{culture} Culture à utiliser dans l’affichage du texte (‘en-US’, ‘fr-FR’ …)
{token} Token d’authentification

Exemple : https://staging.tiles.virtualearth.net/tiles/h0331.jpeg?g=275&mkt=fr-FR&token=12345  

h0331

    • Informations sur les Tiles

Il est possible d’avoir des informations d’un Tile en fonction de son emplacement (coordonnées géographiques). Pour cela, on utilise la classe ImageryMetadataRequest. Cette classe contient les  mêmes propriétés que la classe MapUriRequest décrit plus haut. La seule différence se trouve dans la propriété Options qui est une classe ImageryMetadataOptions. Elle contient les propriétés suivantes :

Nom de la propriété Description
Heading Orientation de la carte ( 0° = Nord en haut)
Location Centre de la carte (coordonnées géographiques)
ReturnImageryProviders Booléen indiquant si l’on souhaite récupérer les données sur les fournisseurs des cartes (copyrights …)
UriScheme Type d’URL : HTTP ou HTTPS
ZoomLevel Niveau de zoom
ImageryMetadataRequest metadataRequest = new ImageryMetadataRequest();
metadataRequest.Credentials = new VETutorial.ImageryService.Credentials();
metadataRequest.Credentials.Token = token;

metadataRequest.Style = MapStyle.AerialWithLabels;
metadataRequest.Options = new ImageryMetadataOptions() 
{
	Heading = new VETutorial.ImageryService.Heading() { Orientation = 0 } ,
	Location = new VETutorial.ImageryService.Location() { Latitude = position.Latitude, Longitude = position.Longitude },  
	ZoomLevel = 8,		 
	ReturnImageryProviders = true,	
	UriScheme = UriScheme.Https   
};

ImageryMetadataResponse resultImageMetadata = imagerySvc.GetImageryMetadata(metadataRequest);

En réponse de la méthode GetImageryMetadata, on récupère une classe  ImageryMetadataResponse  contenant une propriété Result étant représenté par un tableau de ImageryMetadataResult celui-ci contient les informations suivantes :

Nom de la propriété Description
ImageryProvider Liste des fournisseurs de données
ImageSize Taille de l’image (normalement 256×256 pixels)
ImageUri Schéma de l’URL pour récupérer l’image (voir plus loin dans ce post)
ImageUriSubDomains Liste des sous domaines disponible pour cette image
Vintage Date de validité des images
ZoomRange Zoom lié à l’image

L’une des informations importantes de cette structure de données est ImageUri. Il est nécessaire de la modifier comme décrit ci-dessus. Ainsi, dans mon exemple, on obtient : https://t1.staging.tiles.virtualearth.net/tiles/h12022001.jpeg?g=275&mkt={culture}&token={token}. Il suffit de remplacer {culture} et {token} pour avoir accès à l’image centrée sur la propriété Location définie dans la requête.

Ainsi se conclut la description du service d’imagerie de Virtual Earth. Comme certains d’entre vous l’auront remarqué, il manque de nombreuses fonctionnalités comme le BirdEye ou la 3D. Cela est du au fait que les services Web Virtual Earth ne sont pas aussi complète que le contrôle ASP.NET. Ces fonctionnalités arriveront par la suite.

Dans les prochains posts nous parlerons du service de calcul d’itinéraire ainsi que du moteur de recherche d’entités (magasins, écoles, points d’intérêt …) de Virtual Earth. Je vais aussi faire une démo intégrant l’ensemble des services décrit afin de montrer les possibilités de Virtual Earth de façon plus parlante. Cette démo sera surement en WPF ou en Silverlight (selon mes envies du moment).

N’hésitez pas à me faire des retours sur ces posts. Si vous avez des idées de sujets à traiter pour ce blog, merci de les indiquer dans les commentaires ci-dessous.

17 commentaires »

  1. Salut ,
    D’abord , je vous remercie pour ce travail magnifique , j’ai chercher trop pour trouver des ressource en français sur VirtualEarth , et vos postes sont les seuls ressource disponibles .
    Je vous attends pour vos prochains postes parce que je suis entrain de faire mon projet de fin d’étude sur le service web VirtualEarth .

    Commentaire par Nasredine — 23/04/2009 @ 23:32

    • Merci pour le commentaire. J’ai écrit un post sur le calcul d’itinéraire en utilisant Virtual Earth si ça t’interesse pour ton projet.

      Commentaire par sebastiencourtois — 25/04/2009 @ 12:25

  2. […] par [Virtual Earth] Développement Microsoft Virtual Earth Web Services – Part 3 : Imagery S… | 08/04/2009 | […]

    Ping par [Virtual Earth] Développement Microsoft Virtual Earth Web Services – Part 1 « Astuces DotNet (Sébastien Courtois) — 24/04/2009 @ 15:59

  3. […] par [Virtual Earth] Développement Microsoft Virtual Earth Web Services – Part 3 : Imagery S… | 08/04/2009 | […]

    Ping par [Virtual Earth] Développement Microsoft Virtual Earth Web Services – Part 2 : Géocoding Service « Astuces DotNet (Sébastien Courtois) — 24/04/2009 @ 16:00

  4. Le style de map « Birds eye » n’est pas disponible pour le moment , est ce que Microsoft vas supporter cet style dans l’avenir ?
    et pourquoi le service Web est moins développé que les contrôles Asp.Net ?

    Commentaire par Nasredine — 09/05/2009 @ 14:50

  5. Le « Bird Eye » sera supporté à l’avenir mais pour l’instant pas dates officielles.

    Concernant la différences entre ASP.NET Ajax controle et le Web service, le contrôle ASP est le composant « historique » de VE. Le web service a été créé plus tard et rattrape petit à petit les fonctionnalités du contrôle ASP.NET.

    Je te conseille quelques vidéos si vous souhaitez en savoir plus sur Virtual Earth en général avec des morceaux de Webservices dedans:
    PDC 2008 : http://mschnlnine.vo.llnwd.net/d1/pdc08/WMV/BB10.wmv
    Tech Days 2009 : http://www.microsoft.com/france/vision/mstechdays09/Webcast.aspx?EID=d394295b-77c8-416a-9df3-c7fc6e0ba970
    http://www.microsoft.com/france/vision/mstechdays09/Webcast.aspx?EID=d69e3a32-dd56-4bed-9600-3e4843e4eb63

    Commentaire par sebastiencourtois — 09/05/2009 @ 15:37

  6. Merci beaucoup , pour les vidéos . Désolé pour le retard , j’ai consulté votre blog aujourd’hui pour chercher le reste des cours , et j’ai remarqué votre réponse .
    Quand , vous allez poser les autres cous ?

    Commentaire par Nasredine — 15/05/2009 @ 07:52

  7. En fait j’étais en préparation de certifications + mise en production pour une mission (jusqu’à la semaine prochaine), donc je n’ai rien écrit ces derniers temps. Probablement dans le courant de la semaine du 25 mai.

    J’étais aussi en dialogue avec Microsoft afin de publier une partie de ces articles (et d’autres articles) sur la MSDN.Pour l’instant c’est en négociation.

    Merci pour l’intérêt que vous portez à mon blog et à bientôt.

    Commentaire par sebastiencourtois — 15/05/2009 @ 08:43

  8. C’est bien , je vous attends .

    Commentaire par Nasredine — 15/05/2009 @ 20:32

  9. Bounjour ,
    S’il vous plait , il y a-t-il de neuf ?

    Commentaire par Nasredine — 27/05/2009 @ 09:28

  10. Bonjour,

    Je n’ai pas écrit de nouveau post concernant Virutal Earth pour le moment. Je suis en train de commencer l’écriture d’un dossier sur Virtual Earth pour la MSDN France.

    Je vous tiendrais au courant.

    Si vous avez un besoin spécifique, merci de le laisser en commentaire et je verrais si je peux vous aider.

    Commentaire par sebastiencourtois — 27/05/2009 @ 09:32

  11. S’il vous plais , si tu as quelque chose sur le service « search » , posez nous le ?

    Commentaire par Nasredine — 31/05/2009 @ 08:16

  12. Même problème que dans le post précédent, il faut changer cette ligne :

    Location = new VETutorial.ImageryService.Location() { Latitude = position.Latitude, Longitude = position.Longitude },

    et ajouter HeightSpecified = true, WidthSpecified = true sinon le webservice indique de spécifier la taille !

    Commentaire par Ludovic BONNET — 19/06/2009 @ 12:45

  13. Bonjour Mr, votre site est ce que j’ai trouvé de meilleurs dans la catégorie utilisation des web services bing maps, félicitations. J’ai une question pour vous, j’aimerais savoir s’il est possible d’obtenir un itinéraire entre deux points (A et C par exemple) tel que l’itinéraire ne passe pas par un autre point (B par exemple). J’ai vu qu’on pouvait demander à ce que l’itinéraire passe par par des points (waypoints de la classe routerequest) je me demandais donc si l’inverse était possible. J’ai besoin d’une réponse urgente s’il vous plaît, c pour finaliser un projet pour le 30 Avril. Merci beaucoup encore et à bientôt. Cordialement

    Commentaire par franjo — 28/04/2011 @ 13:09

    • Bonjour,

      Je n’ai pas retoucher a l’API Bing Maps depuis un moment mais je ne crois pas que l’on puisse exclure interdire des lieux/zones lors d’un calcul d’itinéraire.
      Si vous voulez une reponse plus rapide et a jour (car mes articles commencent a dater et je pense qu’il y a eu des mises a jour de l’API, je vous conseille de poser vos questions sur les forums Microsoft dedies : http://www.bing.com/community/maps/default.aspx

      Commentaire par sebastiencourtois — 28/04/2011 @ 17:10


RSS feed for comments on this post. TrackBack URI

Répondre à sebastiencourtois Annuler la réponse.

Créez un site Web ou un blog gratuitement sur WordPress.com.