Bing Maps: Servicios SOAP

Este post mostrará ejemplos de uso de los servicios SOAP ofrecidos por Bing Maps. Cómo ya comenté en el post “Google Maps vs Bing Maps. Parte 2.” existen los siguientes servicios:

Estos servicios están contruidos usando WCF (Windows Communication Fundation). Este post incluirá una función ejemplo por cada uno de ellos. Pero antes analizaremos qué necesitamos para poder utilizarlos ¡EMPECEMOS!

¿Que necesitamos?

Para poder utilizar estos servicios necesitaremos:

  • Credenciales: Una clave de Bing Maps que nos permitirá acceder a los servicios y se puede conseguir aquí.
  • Un entorno de desarrollo en .NET, pues es el único probado completamente. De todos formas se supone que con ser capaces de enviar peticiones y recibir respuestas vía  Basic Security Profile Version 1.1 (SOAP 1.1 and WSDL 1.1 protocols) es suficiente.

En este tutorial crearemos una solución en Visual Studio 2010 que contendrá una aplicación de tipo “Windows Forms”:

Geocode SOAP Service

¿Para qué sirve?

Este servicio nos permitirá realizar dos operaciones:

  • Geocoding: nos devuelve la posición (latitud y longitud) dada una dirección o lugar.
  • Geocoding Inverso: nos devuelve una dirección o lugar para una ubicación dada.

¿Cómo lo usamos?

Lo primero es añadir la referencia al servicio:

  1. Botón derecho sobre “Service References” en el proyecto
  2. Pinchar “Add Service Reference…”
  3. Añadir la dirección correspondiente: http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc?wsdl
Referencia al servicio de Geocoding

Referencia al servicio de Geocoding

Sólo queda añadir la lógica a los botones:

        private void geocodingBtn_Click(object sender, EventArgs e)
        {
            string results = "";
            string key = "PON AQUÍ TU CLAVE DE BING MAPS";
            GeocodeRequest geocodeRequest = new GeocodeRequest();

            // Asignamos los credenciales en base a la clave de Bing Maps
            geocodeRequest.Credentials = new GeocodeService.Credentials();
            geocodeRequest.Credentials.ApplicationId = key;

            // Asignamos la dirección
            geocodeRequest.Query = consultaTxt.Text;

            // Asignamos las opciones
            ConfidenceFilter[] filters = new ConfidenceFilter[1];
            filters[0] = new ConfidenceFilter();
            filters[0].MinimumConfidence = GeocodeService.Confidence.High;

            // Añadimos los filtros
            GeocodeOptions geocodeOptions = new GeocodeOptions();
            geocodeOptions.Filters = filters;
            geocodeRequest.Options = geocodeOptions;

            // Realizamos la petición
            GeocodeServiceClient geocodeService = new GeocodeServiceClient("BasicHttpBinding_IGeocodeService");
            GeocodeResponse geocodeResponse = geocodeService.Geocode(geocodeRequest);

            if (geocodeResponse.Results.Length > 0)
                results = String.Format("Latitud: {0}\nLongitud: {1}",
                  geocodeResponse.Results[0].Locations[0].Latitude,
                  geocodeResponse.Results[0].Locations[0].Longitude);
            else
                results = "No Results Found";

            // Mostramos los resultados
            resultsPnl.Controls.Clear();
            Label lbl = new Label();
            lbl.Width = 720;
            lbl.Height = 280;
            lbl.Text = results;
            resultsPnl.Controls.Add(lbl);
        }

        private void reverseGeocodingBtn_Click(object sender, EventArgs e)
        {
            string results = "";
            string key = "PON AQUÍ TU CLAVE DE BING MAPS";
            ReverseGeocodeRequest reverseGeocodeRequest = new ReverseGeocodeRequest();

            // Asignamos los credenciales en base a la clave de Bing Maps
            reverseGeocodeRequest.Credentials = new GeocodeService.Credentials();
            reverseGeocodeRequest.Credentials.ApplicationId = key;

            // Asignamos la latitud y la longitud
            GeocodeService.Location point = new GeocodeService.Location();
            string[] digits = consultaTxt.Text.Split(';');

            point.Latitude = double.Parse(digits[0].Trim());
            point.Longitude = double.Parse(digits[1].Trim());

            reverseGeocodeRequest.Location = point;

            // Realizamos la petición
            GeocodeServiceClient geocodeService = new GeocodeServiceClient("BasicHttpBinding_IGeocodeService");
            GeocodeResponse geocodeResponse = geocodeService.ReverseGeocode(reverseGeocodeRequest);

            if (geocodeResponse.Results.Length > 0)
                results = geocodeResponse.Results[0].DisplayName;
            else
                results = "No hay resultados";

            // Mostramos los resultados
            resultsPnl.Controls.Clear();
            Label lbl = new Label();
            lbl.Text = results;
            lbl.Width = 720;
            resultsPnl.Controls.Add(lbl);
        }

Resultado obtenido

Resultado Geocoding

Resultado Geocoding

Resultado Geocoding Inverso

Resultado Geocoding Inverso

Imagery SOAP Service

¿Para qué sirve?

Nos permite obtener la URI a una imágen de mapa o los metadatos de la imágen obtenida.

¿Cómo lo usamos?

Referenciamos el servicio web cómo en el servicio de Geocode. En este caso la dirección es: http://dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc?wsdl

Añadimos el código a los botones:

private void imageryBtn_Click(object sender, EventArgs e)
        {
            string key = "PON AQUÍ TU CLAVE DE BING MAPS";
            MapUriRequest mapUriRequest = new MapUriRequest();

            // Asignamos los credenciales en base a la clave de Bing Maps
            mapUriRequest.Credentials = new ImageryService.Credentials();
            mapUriRequest.Credentials.ApplicationId = key;

            // Asignamos la latitud y la longitud
            mapUriRequest.Center = new ImageryService.Location();
            string[] digits = consultaTxt.Text.Split(';');
            mapUriRequest.Center.Latitude = double.Parse(digits[0].Trim());
            mapUriRequest.Center.Longitude = double.Parse(digits[1].Trim());

            // Asignamos el estilo y zoom al mapa
            MapUriOptions mapUriOptions = new MapUriOptions();
            mapUriOptions.Style = MapStyle.AerialWithLabels;
            mapUriOptions.ZoomLevel = 17;

            // Asignamos el tamaño de la imágen
            mapUriOptions.ImageSize = new ImageryService.SizeOfint();
            mapUriOptions.ImageSize.Height = 260;
            mapUriOptions.ImageSize.Width = 700;

            mapUriRequest.Options = mapUriOptions;

            // Realizamos la petición
            ImageryServiceClient imageryService = new ImageryServiceClient("BasicHttpBinding_IImageryService");
            MapUriResponse mapUriResponse = imageryService.GetMapUri(mapUriRequest);

            // Mostramos los resultados
            resultsPnl.Controls.Clear();
            WebBrowser webBrowser = new WebBrowser();
            webBrowser.Width = 720;
            webBrowser.Height = 280;
            webBrowser.Url = new Uri(mapUriResponse.Uri);
            resultsPnl.Controls.Add(webBrowser);
        }

        private void imageryMetadataBtn_Click(object sender, EventArgs e)
        {
            string results = "";
            string key = "PON AQUÍ TU CLAVE DE BING MAPS";

            ImageryMetadataRequest metadataRequest = new ImageryMetadataRequest();

            // Asignamos los credenciales en base a la clave de Bing Maps
            metadataRequest.Credentials = new ImageryService.Credentials();
            metadataRequest.Credentials.ApplicationId = key;

            // Asignamos la latitud y la longitud
            ImageryService.Location centerLocation = new ImageryService.Location();
            string[] digits = consultaTxt.Text.Split(';');
            centerLocation.Latitude = double.Parse(digits[0].Trim());
            centerLocation.Longitude = double.Parse(digits[1].Trim());

            metadataRequest.Options = new ImageryMetadataOptions();
            metadataRequest.Options.Location = centerLocation;
            metadataRequest.Options.ZoomLevel = 10;
            metadataRequest.Style = MapStyle.AerialWithLabels;

            // Realizamos la petición
            ImageryServiceClient imageryService = new ImageryServiceClient("BasicHttpBinding_IImageryService");
            ImageryMetadataResponse metadataResponse =
              imageryService.GetImageryMetadata(metadataRequest);

            ImageryMetadataResult result = metadataResponse.Results[0];
            if (metadataResponse.Results.Length > 0)
                results = String.Format("Uri: {0}\nVintage: {1} to {2}\nNiveles de Zoom: {3} to {4}",
                    result.ImageUri,
                    result.Vintage.From.ToString(),
                    result.Vintage.To.ToString(),
                    result.ZoomRange.From.ToString(),
                    result.ZoomRange.To.ToString());
            else
                results = "Metadatos no disponibles";

            // Mostramos los resultados
            resultsPnl.Controls.Clear();
            Label lbl = new Label();
            lbl.Text = results;
            lbl.Width = 720;
            lbl.Height = 280;
            resultsPnl.Controls.Add(lbl);
        }

Resultado obtenido

Resultado Imagery

Resultado Imagery

Resultado Metadatos Imagery

Resultado Metadatos Imagery

Route SOAP Service

¿Para qué sirve?

Podemos obtener la ruta entre varios puntos o la ruta a un punto desde los accesos principales (no disponible en España).

¿Cómo lo usamos?

Referenciamos el servicio web cómo en el servicio de Geocode. En este caso la dirección es: http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc?wsdl

Añadimos el código a los botones:

        private void routeBtn_Click(object sender, EventArgs e)
        {
            string results = "";
            string key = "PON AQUÍ TU CLAVE DE BING MAPS";
            RouteRequest routeRequest = new RouteRequest();

            // Asignamos los credenciales en base a la clave de Bing Maps
            routeRequest.Credentials = new RouteService.Credentials();
            routeRequest.Credentials.ApplicationId = key;

            // Obtenemos los puntos de la ruta
            string[] points = consultaTxt.Text.Split('a');
            Waypoint[] waypoints = new Waypoint[points.Length];

            int pointIndex = -1;
            foreach (string point in points)
            {
                pointIndex++;
                waypoints[pointIndex] = new Waypoint();
                string[] digits = point.Split(';');
                waypoints[pointIndex].Location = new RouteService.Location();
                waypoints[pointIndex].Location.Latitude = double.Parse(digits[0].Trim());
                waypoints[pointIndex].Location.Longitude = double.Parse(digits[1].Trim());

                if (pointIndex == 0)
                    waypoints[pointIndex].Description = "Inicio";
                else if (pointIndex == points.Length)
                    waypoints[pointIndex].Description = "Fin";
                else
                    waypoints[pointIndex].Description = string.Format("Parada #{0}", pointIndex);
            }

            routeRequest.Waypoints = waypoints;
            routeRequest.Culture = "es-ES";

            // Realizamos la petición
            RouteServiceClient routeService = new RouteServiceClient("BasicHttpBinding_IRouteService");
            RouteResponse routeResponse = routeService.CalculateRoute(routeRequest);

            // Iteramos por los resultados
            StringBuilder directions = new StringBuilder("");

            if (routeResponse.Result.Legs.Length > 0)
            {
                int instructionCount = 0;
                int legCount = 0;

                foreach (RouteLeg leg in routeResponse.Result.Legs)
                {
                    legCount++;
                    directions.Append(string.Format("Trayecto #{0}\n", legCount));

                    foreach (ItineraryItem item in leg.Itinerary)
                    {
                        instructionCount++;
                        directions.Append(string.Format("{0}. {1}\n",
                            instructionCount, item.Text));
                    }
                }
                Regex regex = new Regex("<[/a-zA-Z:]*>",
                  RegexOptions.IgnoreCase | RegexOptions.Multiline);
                results = regex.Replace(directions.ToString(), string.Empty);
            }
            else
                results = "No se encontró la ruta";

            // Mostramos los resultados
            resultsPnl.Controls.Clear();
            Label lbl = new Label();
            lbl.Text = results;
            lbl.Width = 720;
            lbl.Height = 280;
            resultsPnl.Controls.Add(lbl);
        }

        private void majorRoutesBtn_Click(object sender, EventArgs e)
        {
            string results = "";
            MajorRoutesRequest majorRoutesRequest = new MajorRoutesRequest();

            // Asignamos los credenciales en base a la clave de Bing Maps
            majorRoutesRequest.Credentials = new RouteService.Credentials();
            majorRoutesRequest.Credentials.ApplicationId = "PON AQUÍ TU CLAVE DE BING MAPS";

            // Asignamos la descripcion
            Waypoint endPoint = new Waypoint();
            endPoint.Location = new RouteService.Location();
            string[] digits = consultaTxt.Text.Split(';');
            endPoint.Location.Latitude = double.Parse(digits[0].Trim());
            endPoint.Location.Longitude = double.Parse(digits[1].Trim());
            endPoint.Description = "Ubicación";

            // Asignamos las opciones
            MajorRoutesOptions options = new MajorRoutesOptions();
            options.ReturnRoutes = true;

            majorRoutesRequest.Destination = endPoint;
            majorRoutesRequest.Options = options;
            majorRoutesRequest.Culture = "es-ES";

            // Realizamos la petición
            RouteServiceClient routeService = new RouteServiceClient("BasicHttpBinding_IRouteService");

            // Formateamos el resultado
            MajorRoutesResponse majorRoutesResponse = routeService.CalculateRoutesFromMajorRoads(majorRoutesRequest);

            Regex regex = new Regex("<[/a-zA-Z:]*>",
              RegexOptions.IgnoreCase | RegexOptions.Multiline);

            if (majorRoutesResponse.StartingPoints.Length > 0)
            {
                StringBuilder directions = new StringBuilder();

                for (int i = 0; i < majorRoutesResponse.StartingPoints.Length; i++)
                {
                    directions.Append(String.Format("Desde {1}\n", i + 1,
                        majorRoutesResponse.StartingPoints[i].Description));

                    for (int j = 0;
                      j < majorRoutesResponse.Routes[i].Legs[0].Itinerary.Length; j++)
                    {
                        string step = regex.Replace(
                          majorRoutesResponse.Routes[i].Legs[0].Itinerary[j].Text, string.Empty);
                        directions.Append(String.Format("     {0}. {1}\n", j + 1, step));
                    }
                }

                results = directions.ToString();
            }
            else
                results = "No se encontraron rutas";

            // Mostramos los resultados
            resultsPnl.Controls.Clear();
            Label lbl = new Label();
            lbl.Text = results;
            lbl.Width = 720;
            lbl.Height = 280;
            resultsPnl.Controls.Add(lbl);
        }

Resultado obtenido

Resultado Route

Resultado Route

Resultado Route desde carreteras principales

Resultado Route desde carreteras principales

Search SOAP Service

¿Para qué sirve?

Útil para buscar lugares de interés en una dirección o ubicación: “sushi; Arvada, CO”. En España este servicio no devuelve resultados.

¿Cómo lo usamos?

Referenciamos el servicio web cómo en el servicio de Geocode. En este caso la dirección es: http://dev.virtualearth.net/webservices/v1/searchservice/searchservice.svc?wsdl

Añadimos el código a los botones:

 private void searchBtn_Click(object sender, EventArgs e)
        {
            String results = "";
            String key = "PON AQUÍ TU CLAVE DE BING MAPS";
            SearchRequest searchRequest = new SearchRequest();

            // Asignamos los credenciales en base a la clave de Bing Maps
            searchRequest.Credentials = new SearchService.Credentials();
            searchRequest.Credentials.ApplicationId = key;

            // Creamos la query de búsqueda
            StructuredSearchQuery ssQuery = new StructuredSearchQuery();
            string[] parts = consultaTxt.Text.Split(';');
            ssQuery.Keyword = parts[0];
            ssQuery.Location = parts[1];
            searchRequest.StructuredQuery = ssQuery;

            // Definimos opciones de búsqueda
            searchRequest.SearchOptions = new SearchOptions();
            searchRequest.SearchOptions.Filters =
                new FilterExpression()
                {
                    PropertyId = 3,
                    CompareOperator = CompareOperator.GreaterThanOrEquals,
                    FilterValue = 8.16
                };

            // Realizamos la petición
            SearchServiceClient searchService = new SearchServiceClient("BasicHttpBinding_ISearchService");
            SearchResponse searchResponse = searchService.Search(searchRequest);

            // Formateamos resultados
            if (searchResponse.ResultSets[0].Results.Length > 0)
            {
                StringBuilder resultList = new StringBuilder("");
                for (int i = 0; i < searchResponse.ResultSets[0].Results.Length; i++)
                {
                    resultList.Append(String.Format("{0}. {1}\n", i + 1,
                        searchResponse.ResultSets[0].Results[i].Name));
                }

                results = resultList.ToString();
            }
            else
                results = "No se encontraron resutados";

            // Mostramos los resultados
            resultsPnl.Controls.Clear();
            Label lbl = new Label();
            lbl.Text = results;
            lbl.Width = 720;
            lbl.Height = 280;
            resultsPnl.Controls.Add(lbl);
        }

Resultado obtenido

Resultado Search

Resultado Search

Más información

Para ampliar la información lo mejor es acudir a MSDN, aunque está sólo en inglés.

  • API en msdn
  • Tutorial de msdn en el que me he basado para realizar el post
Anuncios
  1. Deja un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: