Dopo un po di vicissitudini sono riuscito finalmente a provare un po i webservices di Virtual Earth all'interno di una mia windows form.

04-10-2008 22.56

La documentazione è abbastanza esauriente, ma io un po di casino sono riuscito a farlo ugualmente :).... il problema è attivare un account di test e configurare l'ambiente.

Ecco i passi che ho seguito:

  1. con il mio account live mi sono attivato un "Developer account" a questo indirizzo.
  2. dopo aver attivato l'account (vi verrà inviata una mail di attivazione) bisogna testare se è tutto a posto sulla vs pagina di virtual earth (cliccate su "Verify credentials" e controllate che veniate autorizzati correttamente).
  3. a questo punto aggiungete i references ai web services... ce ne sono 4 (Geocode, Imagery, Route e Search) e 1 Common che convalida le vostre credenziali.

 

A questo punto siamo pronti per scrivere un po di codice... ad esempio io ho creato una form che fa vedere una immagine in una picturebox prendendola dalle coordinate che passo.

Ecco le references che ho fatto (in produzione i link sono diversi, in fase di test si usano i 'staging') :
VETest.TokenStage = https://staging.common.virtualearth.net/find-30/common.asmx
VETest.Imagery = http://staging.dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc

 04-10-2008 23.23

 

Per prima cosa è importante prendersi e memorizzasi da parte il proprio token da utilizzare per le richieste che passeremo ai WebServices).

   1:  private string GetToken()
   2:  {
   3:      VETest.Imagery.Credentials c = new Babba.VirtualEarthWStest.VETest.Imagery.Credentials();
   4:   
   5:      // Set Virtual Earth Platform Developer Account credentials to access the Token Service
   6:      VETest.TokenStage.CommonService commonService = new VETest.TokenStage.CommonService();
   7:      commonService.Credentials = new System.Net.NetworkCredential("123456", "miapassword");
   8:   
   9:      // Set the token specification properties
  10:      VETest.TokenStage.TokenSpecification tokenSpec = new VETest.TokenStage.TokenSpecification();
  11:      tokenSpec.ClientIPAddress = "mioip";
  12:      tokenSpec.TokenValidityDurationMinutes = 60;
  13:   
  14:      string token = "";
  15:   
  16:      // Get a token
  17:      try
  18:      {
  19:          token = commonService.GetClientToken(tokenSpec);
  20:      }
  21:      catch (Exception ex)
  22:      {
  23:          throw ex;
  24:      }
  25:   
  26:      return token;
  27:  }

 

Adesso possiamo richiamare il webservices Imagery per farci dare una immagine della mappa da visualizzare in base alle coordinate passate:

   1:  private void RequestImage(double latitude, double longitude)
   2:  {
   3:      try
   4:      {
   5:          // Get a Virtual Earth token before making a request
   6:          string token = GetToken();
   7:   
   8:          VETest.Imagery.MapUriRequest mapUriRequest = new VETest.Imagery.MapUriRequest();
   9:   
  10:          // Set credentials using a valid Virtual Earth Token
  11:          mapUriRequest.Credentials = new VETest.Imagery.Credentials();
  12:          mapUriRequest.Credentials.Token = token;
  13:   
  14:          // Set the location of the requested image
  15:          mapUriRequest.Center = new VETest.Imagery.Location();
  16:          mapUriRequest.Center.Latitude = latitude;
  17:          mapUriRequest.Center.Longitude = longitude;
  18:   
  19:          // Set the map style and zoom level
  20:          VETest.Imagery.MapUriOptions mapUriOptions = new VETest.Imagery.MapUriOptions();
  21:          mapUriOptions.Style = VETest.Imagery.MapStyle.AerialWithLabels;
  22:          mapUriOptions.ZoomLevel = 10;
  23:   
  24:          // Set the size of the requested image to match the size of the image control
  25:          mapUriOptions.ImageSize = new VETest.Imagery.SizeOfint();
  26:          mapUriOptions.ImageSize.Height = picMap.Height;
  27:          mapUriOptions.ImageSize.Width = picMap.Width;
  28:          mapUriRequest.Options = mapUriOptions;
  29:          VETest.Imagery.ImageryServiceClient imageryService = new VETest.Imagery.ImageryServiceClient();
  30:          
  31:          // Make the image request 
  32:          VETest.Imagery.MapUriResponse mapUriResponse = imageryService.GetMapUri(mapUriRequest);
  33:   
  34:          // Set the picturebox image property
  35:          picMap.Image = GetImageFromWeb(mapUriResponse.Uri);
  36:      }
  37:      catch (Exception ex)
  38:      {
  39:          lblMessage.Text = "An exception occurred: " + ex.Message;
  40:      }
  41:  }

 

La funzioncina che ritorna una immagine a partire da un url:

   1:  private Image GetImageFromWeb(string imageUrl)
   2:  { 
   3:      Image retVal = null;
   4:      HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(imageUrl);
   5:      WebResponse myResp = myReq.GetResponse();
   6:      Stream stream = myResp.GetResponseStream();
   7:      retVal = Image.FromStream(stream);
   8:      myResp.Close();
   9:      return retVal;
  10:  }

 

Un po di link utili:

 

Spero torni utile a qualcuno per iniziare.... buon lavoro!