jueves, 9 de mayo de 2013

Biblioteca de clases .NET para API Google Maps. Parte IX.

Hoy os voy a mostrar una biblioteca de clases que he desarrollado para utilizar algunas utilidades del API Google Maps de forma muy sencilla. Ha sido desarrollada con Visual Basic, es compatible con Framework 4 y la podéis descargar desde aquí.
Una vez que la hayáis descargado, podéis empezar a crear un nuevo proyecto (en este ejemplo como Windows Forms), y para agregar la biblioteca basta con buscar la opción de Agregar referencia. En la siguiente imagen vemos cómo hacerlo.

Agregar referencia

A continuación, buscamos la biblioteca de clases (que previamente la hemos descargado y se llama MapsNET.dll) y la seleccionamos.

Agregando referencia

Ahora ya tenemos todo preparado para empezar a utilizarla.
La biblioteca de clases se llama MapsNET.dll, y está contenida en el espacio de nombres APIGoogleMaps. Ahora vamos a ver cómo crear un objeto de la clase base (denominada MapsBase).
'Instanciamos a la clase base
Dim objetoMaps As New MapsNET.APIGoogleMaps.MapsBase
La estructura de la clase MapsNET es la siguiente:
  • CLASE BASE --> MapsBase
  • CLASES HEREDADAS --> CodificacionGeografica, Elevacion, FuncionesExtra, MapasEstaticos, Places, Ruta, SituacionMapa, StreetView.
Las clase base (MapsBase) contiene casi exclusivamente las propiedades comunes a toda la biblioteca. Las propiedades son las siguientes:
PROPIEDADES COMUNES A TODAS LAS CLASES
  • ClaveApi: indica la clave de desarrollador del API de Google Maps. Únicamente las funciones de la clase Places requieren clave API.
  • RegionRes: indica la preferencia de región en la que se quiere buscar los resultados. De forma predeterminada es España (“es”). http://es.wikipedia.org/wiki/CcTLD.
  • Sensor: indica si hay algún sensor (por ejemplo receptores GNSS (GPS)). De forma predeterminada es False.
  • IdiomaRes: indica el idioma de los resultados devueltos. De forma predeterminada es español (“es”). https://spreadsheets.google.com/pub?key=p9pdwsai2hDMsLkXsoM05KQ&gid=1.
  • TimeOut: indica el tiempo (en milisegundos) de espera en las solicitudes HTTP.
PROPIEDADES PROPIAS DE LA CLASE
  • Status: indica el estado de la última petición realizada.
  • Excepción: indica la última excepción producida en las peticiones.
  • HoraPeticion: hora de la última petición realizada.
  • NumeroPeticion: indica el número de la última petición realizada.
  • peticionHTTP: es la URL de la última petición realizada.
  • InformacionPeticion: indica qué función ha llevado a cabo la última petición.
  • AlmacenPeticiones: almacena los 6 parámetros anteriores en forma de arraylist, pero no sólo la última petición, sino todas.
Ahora vamos a explicar un poco el resto de clases, qué son y para qué sirven.
URL DE MAPA
La clase se llama SituacionMapa, y devuelve en sus dos funciones la URL de un mapa (para visualizar, por ejemplo, en un WebBrowser). Las 2 funciones que tiene son:
  • URLmapa (sobrecargada): se le envía una dirección postal (Puerta del Sol, Madrid, España), y devuelve la URL asociada al mapa de Google Maps.
  • URLmapa: se le envían dos parámetros, uno la latitud y otro la longitud, y devuelve la URL asociada al mapa de Google Maps.
MAPAS ESTÁTICOS
La clase se denomida MapasEstaticos, y devuelve la url o la imagen asociada a un mapa estático de Google Maps. Tiene una única función:
  • MapasEstaticos: se le envían parámetros del centro del mapa, zoom, formato de mapa (png, jpg, etc.), tipo de mapa (road, terrain, etc.), y devuelve un string con la URL del mapa creado.
CODIFICACION GEOGRÁFICA
La clase se llama CodificacionGeografica. Y tiene 3 funciones:
  • CodificacionGeografica: se le envía una dirección postal y devuelve un arraylist con Latitud/Longitud/Dirección encontrada.
  • CodificacionGeograficaInversa: se le envían dos parámetros (la latitud y longitud), y devuelve un arraylist con las direcciones encontradas.
  • CodigoPostal: se le envía una dirección postal y devuelve un string con el código postal.
ELEVACIÓN
La clase se denomina Elevación y consta únicamente de una función, que es la siguiente:
  • Elevación: se le envían dos parámetros (latitud y longitud) y devuelve un arraylist que en la primera posición contiene la elevación (en metros) y en segunda la resolución (en metros) de dicha elevación.
STREET VIEW
La clase se denomida StreetView y devuelve imágenes estáticas de Google Street View. La clase consta de dos funciones:
  • StreetView_BitmapL: se le envían datos de localización, giro horizontal de la cámara, giro vertical de la cámara y zoom, y devuelve la imagen correspondiente de Street View en formato Bitmap.
  • StreetView_URL: se le envían datos de localización, giro horizontal de la cámara, giro vertical de la cámara y zoom, y devuelve la URL correspondiente de Street View en formato string.
RUTA
La clase se denomina Ruta y devuelve las indicaciones asociadas a una ruta. Tiene una única función y varias propiedades. Primeramente vamos a ver la función:
  • CalcularRuta: se le envían datos de dirección de origen, dirección de destino y otros opcionales como, tipo de transporte, restricciones en carreteras, hitos… y devuelve un arraylist con de la ruta (latitud1/longitud1/tiempo1/distancia1/indicaciones1/latitud2/longitud2...), ordenados por tramos.
Las propiedades de la clase Ruta son:
  • Copyright: string con el Copyright de los datos obtenidos para calcular la ruta.
  • DistanciaTotal: arraylist con la distancia total recorrida.
  • DuracionTotal: arraylist con la duración total recorrida.
  • IDruta: ID de la ruta (string).
  • OrdenHitos: indica el orden de los hitos (en caso de haberlos).
  • Polilineas: arraylist con todas las polilineas (pueden ser utilizadas para crear mapas).
PLACES
La clase se denomina Places y contiene 4 funciones para obtener datos de establecimientos. Las funciones son las siguientes:
  • Places (sobrecargado): se le envía la dirección postal de un lugar (junto con otros parámetros como radio de búsqueda, tipo de local (https://developers.google.com/places/documentation/supported_types?hl=es), nombre del local) y devuelve un arraylist en el que se encuentra la lista con todos los locales encontrados y sus datos. Se ordena de la siguiente forma; Nombre/Direccion/Latitud/Longitud/Icono(URL)/Referencia/Nombre2/Direccion2/Latitud2...
  • DatosPlaces: se le envía la referencia de un establecimiento (que previamente ha sido adquirido gracias a la función Places), y devuelve un arraylist con los siguiente datos ordenados: Nombre del local/Dirección/Teléfono/Dirección 2/URL de página Google Maps/Puntuación/Dirección web establecimiento.
  • DatosPlacesUsuarios: se le envía la referencia de un establecimiento (que previamente ha sido adquirido gracias a la función Places), y devuelve un arraylist con las diferentes opciones de los usuarios ordenados así: Fecha(Unix)/autor/Texto de la review/Página Google + del autor/Fecha2(unix)/autor2...
EXTRA
La clase se denomina FuncionesExtra y contiene una serie de funciones adicionales. En concreto 7 funciones:
  • Autocompletado: proporciona funciones de autocompletado para locales (places) basadas en zonas geográficas concretas. Se le envía un parámetro input que es el fragmento de la palabra original, además de la latitud/longitd, radio de búsqueda y el número de caracteres que se extraen del input. Devuelve un arraylist con los nombres de los locales que coinciden con el input.
  • DiasTranscurridos: indica los años/meses/días transcurridos entre la fecha enviada y la fecha actual. El parámetro que se le envía es el tiempo en formato Unix.
  • ImagenDesdeURL: transforma una URL que enlace a una imagen en un Bitmap.
  • QuitarEtiquetasHTML: función que elimina algunas etiquetas HTML a partir de una cadena de texto (string) que las contenga.
  • Segundos_a_DiasHorMinSeg: función que transforma segundos en días/horas/minutos/segundos. Se le envía como parámetro el tiempo en segundos y devuelve una cadena de texto con los días/horas/minutos/segundos.
  • TimeToUnix: transforma un tipo de fecha Date en tiempo Unix. http://stackoverflow.com/questions/1942519/datetime-to-unixtime-stamp-in-net
  • UnixToTime: transforma tiempo Unix a fecha en formato #día/mes/año horas:minutos:segundos PM/AM#.
Esto es el resumen de la clase. Además, para que quede todo más claro, toda la clase se ha documentado con comentarios XML y por lo tanto desde el Examinador de objetos (Ver/Examinador de objetos) y desde IntelliSense se pueden ver todos los miembros, parámetros de funciones, etc., explicado.

Examinador de objetos
IntelliSense

Ahora vamos a ver un poco cómo funciona todo. Por ejemplo, vamos a mostrar un MessageBox mostrando el código postal de una dirección.
Dim objetoCod As New MapsNET.APIGoogleMaps.CodificacionGeografica
MessageBox.Show(objetoCod.CodigoPostal("Puerta del Sol, Madrid, España"))
Y el resultado sería:

Código postal

Ahora vamos a ver cómo mostrar un mapa en un WebBrowser. El código sería el siguiente:
Dim objetoMapa As New MapsNET.APIGoogleMaps.MapasEstaticos
WebBrowser1.Url = New Uri(objetoMapa.MapasEstaticos("La Rambla, Barcelona, España", 14,
                                                            New Size(500, 500), MapsNET.APIGoogleMaps.MapasEstaticos.FormatoImagen.JPG,
                                                            MapsNET.APIGoogleMaps.MapasEstaticos.TipoMapa.ROADMAP, "Barcelona"))

Y el resultado sería:

Mapa estático

Como vemos es todo bastante sencillo e intuitivo. Además también os dejo un pequeño y sencillo ejemplo de cómo utilizar casi todas las funcionalidades de la biblioteca de clases.

Aplicación de ejemplo

¡Espero que os sirva de ayuda!
Descarga biblioteca de clases aquí:
Descarga aplicación de ejemplo aquí:

12 comentarios:

  1. Hola! me encantan tus tutoriales! Son los mejores de la web. Te queria preguntar algo.
    En primer lugar, cómo es posible conectar dos puntos utilizando google maps..
    Es decir, por ejemplo, si quiero indicar que una calle está cortada, y marcar una línea roja sobre esa calle. Marco un punto sobre la línea de partida (dónde comienza la calle de la que hablo) y una línea de llegada (que es donde termina el corte).
    Marco los dos puntos, pero como trazar la línea? Estuve viendo que hiciste un proyecto para marcar ruta, pero no puedo verlo porque utilizo visual studio 2010, y me salta un mensaje diciendo que en tu aplicación utilizas una versión más nueva..

    Por otra parte, quería saber si es posible que en google maps te salga un punto que diga "usted está aqui" y la direccion en la que te encuentras en ese momento. Gracias! Mi correo es manu_three@hotmail.com

    ResponderEliminar
    Respuestas
    1. Hola Manu, disculpa la tardanza.
      1- para unir dos puntos cro que es necesario utilizar el api de google maps pero para javascript.
      2- lo que puedes hacer es, a partir de los dos puntos que tienes, calcular la ruta (hay una entrada en el blog) y uno de los datos que devuelve (XML) es un campo denominado polyline. Ese dato llamado polyline, se puede utilizar como parámetro en la creación de un mapa estático. No obstante es un poco enrevesado y a lo mejor la ruta.no te la calcula como tú quieres... lo ideal es usar el api de javascript para crear el mapa estático que una los puntos.
      3- Para saber la ubicación hay varias formas. Puedes obtener el ISP del usuario (precisón de la ubicación del usuario más bien poca) o utilizar HTML5 y con alguna función de javascript (no recuerdo el.nombre), obtener la ubicación. Eso sí, el webbrowser de Visual Studio no soporta esta función..
      un saludo ;)

      Eliminar
  2. Hola muy bueno el aporte, una consulta. La parte de coordenadas puede ser que no funcione bien?? Cargo la latitud y la longitud y siempre me muestra España, estoy haciendo algo mal?? Mil Gracias, estoy trancado y si puedo solucionar esto, es un alivio.

    ResponderEliminar
    Respuestas
    1. Hola!
      ¿¿Qué código utilizas para obtener la latitud/longitud?? Usas la clase Maps, la aplicación que de la entrada del.blog???
      Sería interesante que pusieses la petición http (la url) que creas.
      Un saludo

      Eliminar
  3. Hola muchas gracias por tu rápida respuesta. Te cuento mi aplicación lee las coordenadas desde una base de datos (Longitud y Latitud) las coordenadas son en grados y minutos decimales (DMM).
    Lo llamo de esta manera:

    Dim Objeto As New MapsNET.APIGoogleMaps.SituacionMapa
    WebBrowser1.Url = New Uri(Objeto.URLmapa(-34.8761277, -54.9841293))


    No sé qué pueda estar haciendo mal, siempre me carga España. En cambio cuando busco por dirección si me funciona.

    Mill Gracias.

    ResponderEliminar
    Respuestas
    1. Hola!
      Ahora mismo no puedo probar el código, pero inténtalo pasando la latitud/longitud como string.
      Un saludo!

      Eliminar
  4. Buenos días
    Consultar si existe alguna función teniendo habilitado el sensor y ejecutando las apis en una
    tablet con gps /gnss para obtener la posición actual.
    He visto que en google maps parece que existe un getcurrentposition, pero no se si en esta dll existe alguna función que lo permita.

    Muchas gracias, y felicitarte por tu gran trabajo

    ResponderEliminar
  5. Hola Luis. No acabo de entender la pregunta. ¿La tablet qué SO tiene? Porque las tablets con Android, Windows RT, etc., suelen tener en el sdk herramientas para obtener la posición de forma simple.
    Un saludo

    ResponderEliminar
    Respuestas
    1. La tablet tiene windows 8 desktop

      Eliminar
    2. ¿La aplicación que vas a hacer es una aplicación Desktop o Windows 8?
      Entiendo que es una aplicación Desktop, y en ese caso para poder saber la ubicación creo que, por lo menos de forma trivial, no se puede saber la ubicación (por lo menos de forma tan fácil como para aplicaciones WinRT). Las opciones son, o a través de navegador (si soporta HTML 5) o a través de IP (no es preciso).
      Seguramente se puede hacer de alguna otra forma, pero no sabría decirte.
      Un saludo

      Eliminar
  6. Al parecer bota un error parace que Google ah actualizado el API el error que me bota es=
    The Google Maps Embed API must be used in an iframe.

    ResponderEliminar