How to manage maps in Windows 8 without a native control

If you want to show a map with a pushpin in Metro app you need, up to now, to embed the Map into a WebView control to avoid the lack of a native Map Control in Windows 8.

To generate a valid URL from latitude and longitude parameters use this method in your code

public static string GetMapUri(double latitude, double longitude, int zoom, string mapStyle, int width, int height)
{
ObservableCollection pins = new ObservableCollection();

ImageryService.Pushpin pushpin = new ImageryService.Pushpin();
pushpin.Location = new ImageryService.Location();
pushpin.Location.Latitude = latitude;
pushpin.Location.Longitude = longitude;
pushpin.IconStyle = "2";

pins.Add(pushpin);

MapUriRequest mapUriRequest = new MapUriRequest();

// Set credentials using a valid Bing Maps Key
mapUriRequest.Credentials = new ImageryService.Credentials();
mapUriRequest.Credentials.ApplicationId = BingMapKey; // use your personal key

// Set the location of the requested image
mapUriRequest.Pushpins = pins;

// Set the map style and zoom level
MapUriOptions mapUriOptions = new MapUriOptions();

switch (mapStyle.ToUpper())
{
case "HYBRID":
mapUriOptions.Style = ImageryService.MapStyle.AerialWithLabels;
break;
case "ROAD":
mapUriOptions.Style = ImageryService.MapStyle.Road;
break;
case "AERIAL":
mapUriOptions.Style = ImageryService.MapStyle.Aerial;
break;
default:
mapUriOptions.Style = ImageryService.MapStyle.Road;
break;
}

mapUriOptions.ZoomLevel = zoom;

// Set the size of the requested image to match the size of the image control
mapUriOptions.ImageSize = new ImageryService.SizeOfint();
mapUriOptions.ImageSize.Height = height;
mapUriOptions.ImageSize.Width = width;

mapUriRequest.Options = mapUriOptions;

ImageryServiceClient imageryService = new ImageryServiceClient(ImageryServiceClient.EndpointConfiguration.BasicHttpBinding_IImageryService);
MapUriResponse mapUriResponse = null;
try
{
mapUriResponse = imageryService.GetMapUriAsync(mapUriRequest).Result;
}
catch (Exception ex)
{
Debug.WriteLine("GeoLocation: " + ex.Message);
}

return mapUriResponse.Uri;
}

You also need to reference the Bing Maps SOAP Services
GeocodeService
http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc?wsdl

SearchService
http://dev.virtualearth.net/webservices/v1/searchservice/searchservice.svc?wsdl

ImageryService
http://dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc?wsdl

RouteService
http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc?wsdl

Wrap the generated string in a URI and insert it into the WebView controller.

Advertisements