sábado, 2 de febrero de 2013

API Google Maps y Visual Basic.NET. Parte IV. Aplicación completa

Retomando el API de Google Maps, hoy voy a subir una aplicación con muchas funciones para utilizar desde Visual Basic .NET.
Lo interesante de la aplicación en sí, y dejando de lado la interfaz (y el código un tanto confuso…), es la clase que incluye (Maps.NET). Se crea un objeto de la clase y se llama a sus funciones que nos devuelven información, por ejemplo:

Dim objetoMaps As New MapsNet‘Creamos un objeto de la clase MapsNet
Dim CP as string ‘Variable que contendrá el código postal
CP=objetoMaps.CodigoPostal(“Puerta del Sol, Madrid, España”) ‘Llamada a la función

Este fragmento de código asignará a la variable CP, el código postal de “Puerta del Sol, Madrid, España”. Como vemos es muy sencillo. Este es un pequeño ejemplo de lo fácil de utilizar la clase.

CLAVE API GOOGLE MAPS

Algo que se debe tener muy en cuenta, es que para algunas funciones se necesita tener una clave para usar el API de Google Maps. Esta clave se puede obtener en el siguiente enlace (https://developers.google.com/console/help/?hl=es#generatingdevkeys). En el caso de querer obtener información de locales como restaurantes o cines, se requiere el acceso mediante dicha clave. Para las funciones de la clase MapsNET, la clave es gratuita, únicamente que estamos limitados a un número de peticiones al día, por ejemplo, para la petición de lugares (Google Places), el número máximo de peticiones cada 24 horas son 100000. Para establecer la clave en la clase, se hace de la siguiente manera:

Dim objetoMaps As New MapsNet  ‘Creamos un objeto de la clase MapsNet 
objetoMaps.ClaveMaps = “Nuestra clave”  ‘En la cadena “Nuestra clave”, introduciremos la clave que nos proporcione Google 

A la hora de abrir la aplicación, nos aparecerá una ventana con la opción de introducir nuestra clave que, como decía, no es obligatoria, pero sin ella habrá opciones que no funcionarán.

Introducción de clave API
Funciones restringidas (necesaria clave API):
- Información de lugares (restaurantes, cajeros, etc.).
- Places Autocomplete.


APLICACIÓN

Ahora voy a enumerar las opciones que tiene, a grandes rasgos, el programa.
  • Archivo:
    •  Ver seguimiento de peticiones HTTP: muestra todas las peticiones http que se han creado, es decir, todas las URL que hemos generado, por ejemplo: http://maps.google.es/maps?q=España&output=embed. Estas peticiones se registran con la hora, número de petición, estatus y si se producen excepciones.
    • URL actual del mapa mostrado.
    • Clave API de Google Maps.
  • Editar:
    • Funciones comunes para los navegadores (abrir pestaña, cerrar pestaña, siguiente, etc.).

    Imagen general del programa
  • Buscar:
  • Codificación geográfica:
    • Codificación geográfica.
    • Codificación geográfica inversa.
    • Buscar código postal por dirección.
  • Elevación:
    • Calcular la altitud de un punto en función de su latitud/longitud o dirección, mostrando además la resolución.
  • Street View:
    • Mostrar imágenes de Street View, pudiéndolas buscar por latitud/longitud o dirección. Opción de rotar en horizontal/vertical y hacer zoom en las imágenes.
    Función para ver imágenes de Street View
  • Buscar locales (necesaria clave API):
    • Busca locales y lugares filtrando los resultados por: dirección (o latitud/longitud), radio de búsqueda a partir de la dirección, tipo de establecimiento (cine, bar, cajero automático).
    • Detalles del establecimiento seleccionado. Se puede ver la valoración y comentarios de los usuarios.
    • Información del establecimiento. Número de teléfono, página web, página de Google+,  dirección, etc.
    Búsqueda y detalles del Museo Nacional del Prado
  • Calcular ruta:
    • Calcula la ruta marcando un origen, destino e hitos intermedios. Pudiendo seleccionar el tipo de carretera (sin restricciones, evitar peajes en puentes y carreteras, evitar autopista y autovías), viaje a pie, en bicicleta o en coche.
    • Muestra la ruta con sus indicaciones.
Detalle de ruta entre Ponferrada y Madrid (pasando por Benavente y Zamora)
    • Ver todos los mapas de la ruta.
    • Ver los mapas tramo a tramo.
    Detalle de tramo y mapa general
    • Ver todas las imágenes street View de la ruta.
    • Ver las imágenes Street View tramo a tramo.
  • Mapas:
    • Generador de mapas básico. Incluye la posibildad de crear un mapa en función de una dirección, zoom, formato (jpg, png, etc.), tamaño y tipo (satélite, híbrido, etc.).
    • Generador de mapas completo. Incluye las funcionalidades anteriores además de poder incluir marcadores, crear una ruta para unir puntos, y múltiples estilos personalizables.
Generador de mapas completo
  • Configuración/Ayuda:
    • Opciones para configurar el programa. Activar autocompletado. Guardar todas las peticiones, etc.
    • Acerca de. Notificar un error. Liberador de recursos. Feedback.

CONCLUSIONES

La utilización del API de Google Maps es una sencilla forma de obtener información geográfica, además de proporcionarla de forma muy rápida e intuitiva. No obstante, el mayor inconveniente es que si Google cambia sus términos puede dejar de funcionar la aplicación o limitar el número de peticiones.
Cualquier duda del código (como dije al principio, está un poco desordenado), escribidlo en los comentarios, por favor.
Para descargar la aplicación:

47 comentarios:

  1. buenas,
    tu aplicacion esta muy buena y me ha servido para trastear con el API de google maps. Gracias.
    Uno de las funciones que me interesan es la Codificacion Geografica Inversa.

    He visto que tu funcion "CodificacionGeograficaInversa" nunca genera un resultado pues al passar el valor del campo latitud o longitud a Double el valor es convertido de: -3.7721971 a -37721971.0 (por ejemplo).

    Cambiando en la funcion el tipo de parametros formales a String ha funcionando correctamente.

    Gracias una vez mas por tu trabajo.
    Un saludo,

    Paulo

    ResponderEliminar
  2. Gracias por tu comentario. Se agradece ;)
    Con respecto a pasar el valor latitud/longitud como Double a mí sí me funciona, quizá no he entendido bien lo que me querías decir.
    Si en el formulario de codificación geográfica inversa pasamos los campos a Double, funciona bien:
    direccionString = objetoMaps.CodificacionGeograficaInversa(CDbl(txtlatitud.Text), CDbl(txtlongitud.Text))
    Un saludo

    ResponderEliminar
  3. Hola, felicidades por tu aplicación. Me podrías decir que llamada a la API utilizas para crear una ruta limitando el tipo de carreteras por los que se puede transitar?

    ResponderEliminar
  4. Hola Aritz, gracias ;)
    Pues la petición para una ruta, por ejemplo, Madrid-Barcelona (evitando peajes en puentes y carreteras), sería la siguiente:
    https://maps.googleapis.com/maps/api/directions/xml?&origin=madrid&destination=barcelona&waypoints=&mode=driving&avoid=tolls&region=es&language=es&sensor=false
    Para cambiar el tipo de carretera se utiliza el parámetro "avoid" que puede tomar 3 valores (realmente 2):
    *Si no quiere ponerse ninguna restricción este parámetro no se pone.
    *Ruta sin peajes en puentes y carreteras --> avoid=tolls
    *Ruta sin autopistas y autovías --> avoid=highways
    Ten en cuenta que (y cito textualmente de la documentación del API), "añadir restricciones, no se impide que las rutas devueltas incluyan los elementos restringidos, sino que se modifica el resultado para mostrar rutas más favorables."
    Dentro de la aplicación, si quieres ver todas estas peticiones, hay una sección en Archivo/Seguimiento peticiones HTTP, que almacena todas las peticiones que se realizan.
    Un saludo

    ResponderEliminar
    Respuestas
    1. Lo que me interesaria es disringuir entre carreteras asfaltadas y caminos pero supongo que eso no se puede hacer.

      Eliminar
    2. Eso por ahora no se puede hacer...
      Para ver lo que se puede modificar en las rutas echa un vistazo a esto --> https://developers.google.com/maps/documentation/directions/?hl=es

      Eliminar
  5. Felicitaciones por la aplicación!! La encuentro super completa, intuitiva y robusta...voy a seguir probando las funcionalidades!

    Saludos desde Buenos Aires

    ResponderEliminar
    Respuestas
    1. ¡Gracias! A nivel de programación hay cosas un tanto confusas... si tenéis alguna duda lo podéis comentar.

      Eliminar
  6. consulta en que versión de básica esta desarrollada ya que el ejemplo al intentar abrirlo en visual basic 2010 y 2012 me dice que no reconoce la versión.
    gracias, el ejemplo es impresionante muy bueno....

    ResponderEliminar
    Respuestas
    1. Hola.
      A mí en Visual Studio 2012 Express me abre sin problemas. Eso sí, antes de abrirlo descomprime la carpeta..
      Un saludo

      Eliminar
    2. gracias luis m por tan rápida respuesta, como siempre, será que uso la vesion express y por ende no me permite abrirlo, muchas gracias nuevamente.
      ariel

      Eliminar
  7. HOla.
    La versión Express es la que estoy utilizando yo, como te decía..

    ResponderEliminar
  8. Excelente trabajo Luis M
    saludos desde México,Poza Rica

    ResponderEliminar
  9. Hola Luis muchas gracias por compartir una aplicaion tan complete. Me ha dado mucho conocimiento al lo que es trabajar con los APis google.
    Saludos desde Accra Ghana. perdoname por los errors que aqui solamente hablamos ingles.

    ResponderEliminar
  10. Exceltente Trabajo Luis, me ha servido de mucha ayuda.
    Pero tengo una duda, se puede hacer que al abrir el mapa no salga el bocadillo con la dirección y comentarios?
    Tengo un aplicativo que guarda las direciones de los clientes en una BDB para que al imprimir el albaran, el transportista en el albaran de entrega tenga un pequeño mapa con las 4 calles más cercanas. Pero el bocadillo tapa 3 :(
    De nuevo muchas gracias!!
    Un Saludo
    Pau

    ResponderEliminar
    Respuestas
    1. Pues así de primeras, abriendo el mapa directamente desde URL, aparece el bocadillo.
      Lo que puede hacer es usar imágenes estáticas
      https://developers.google.com/maps/documentation/staticmaps/?hl=es

      Eliminar
    2. Con la biblioteca de clases que subí en esta entrada (http://algoimagen.blogspot.com.es/2013/05/biblioteca-de-clases-net-para-api.html), sería algo así.
      'Instanciamos clases para crear mapa estático
      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"))

      Eliminar
  11. Saludos Luis,

    Ante todo gracias por el aporte. Muy buena explicación.

    Una duda. Hice todo tal cual, y hasta vejé el programa Maps.Net, pero no me reconoce la clave API, y me sale error de Script
    Línea: 720
    Carácter:172
    Error: InvaladCharacter
    Código: 0
    Url: https://maps.gstatic.com/cat_js/intl/es-419_es/mapfiles/466g/maps2/%7Bmain,mod_util,mod_act,mod_act_s,mod_pphover,mod_rst%

    Esto desde el 8/Oct/13. No se si es que me bloquearon desde Google Maps. Solo sale como una foto, y no puedo navegar en el mapa, queda buscando. Si conoce el error y me puede explicar se lo agradecería en el alma. Gracias desde Venezuela.

    ResponderEliminar
    Respuestas
    1. Puedes echar un vistazo a tu consola del API:
      https://code.google.com/apis/console

      Eliminar
    2. Gracias por responder, pero ya active todas las apis Google Maps y no me la valida. No se si hay que habilitar una en especial. Saludos...

      Eliminar
  12. Hola, tengo una aplicación similar en vb 2010 express con un control web browser, especificamente utilizo google maps para ubicar mediante datos de latitud y longitud posiciones específicas en el mapa, el hecho es que funcionaba bien hasta que desde hace unos días dejo de funcionar y me escupe igualmente el mensaje:
    error de script en esta página
    linea 720
    caracter 172
    código 0
    URL: https://maps.google.com.py/mapfiles/home3.html
    He googleado probando posibles soluciones y ninguna me ha funcionado hasta ahora, lo que he podido comprobar es que se trata de un error reciente que algunos han comenzado a tener utilizando google maps en sus aplicaciones. Gracias.

    ResponderEliminar
    Respuestas
    1. Sin ver código ni nada, difícilmente te podremos ayudar...
      Un saludo

      Eliminar
    2. Saludos. Tenemos el mismo problema. A mi me dio desde el 8/Oct/13. A mi parecer bloquearon la navegación, y solo tenemos disponible de forma gratuita la Google Estática V3, pero me gustaría saber como navegar a si sea pagando. Bueno es mi suposición. Si colocas el evento WebBrowser1.ScriptErrorsSuppressed=True te deja de salir el error, pero no navegas.

      Eliminar
    3. Hola Miguel.. mira este link, ahí tenes la ansiada respuesta a nuestro problema!!
      http://www.devhut.net/2013/10/18/webbrowser-activex-control-google-maps-invalid-character-scripting-error/
      Es algo relativamente simple de hacer y funciona. Si tenes IE10 el número que tenes que introducir es el 10000, eso lo averigue en el soporte de microsoft.
      Saludos.

      Eliminar
    4. Pero que nombre se le da al Valor DWORD, para que corran los programas de visual estudio 2012'??

      Eliminar
    5. ahí dice q el del ejecutable

      Eliminar
  13. me gustaria hacer un mapa y que este contenga varios semaforos. que puedan prender y apagar localizados con latitud y longitud.. alguien me puede ayudar janero89@hotmail.com

    ResponderEliminar
  14. Hola. yo tengo una lista de direcciones quisiera poder pintarlas en un mapa podrias darme un pista de como hacerlo ?

    ResponderEliminar
    Respuestas
    1. Lo podrías hacer con marcadores en un mapa estático..
      https://developers.google.com/maps/documentation/staticmaps/?hl=es
      http://algoimagen.blogspot.com.es/2013/05/biblioteca-de-clases-net-para-api.html
      Un saludo!

      Eliminar
  15. que tal buenos dias, solo para preguntar si alguien de casualidad sabe el por que de que algunas consultas se queden estaticas,por ejemplo deseo buscar una direccion, y si la busca, el problema es que no permite la navegacion o aumentar o reducir zoom de este mapa que muestra, no lo hace ya que aparece una etiqueta en la parte superior izquierda del webbrowser que dice cargando... me podrian ayudar por favor?

    ResponderEliminar
  16. Buen 2014 para todos!! Te hago una consulta, hay alguna forma de marcar sitios y que después los pueda ver desde google maps, es decir que queden marcados pero no para e publico en general, sino en forma privada? Saludos y excelente el manejo de las API

    ResponderEliminar
    Respuestas
    1. Pues seguramente se pueda, pero no sabría decirte :(

      Eliminar
    2. Gracias. Yo necesito marcar las direcciones de gente que trabaja en un cliente, por eso no necesito que las vean otras personas. Utilizando como base tu App me sirve para que lo vean en un mapa estatico pero quería ver como hacerlo que lo vean desde google maps. Gracias igualmente y muy bueno el trabajo. Saludos

      Eliminar
  17. hola muy bueno. yo necesito tener el mapa de google en vb.net y en modo de ejecución agregar marcadores personalizados que esten enciendo y apagando estilo semaforo. algun aporte. janero89@hotmail.com

    ResponderEliminar
  18. Luis, la aplicacion esta genial, lo que no logro ver es el punto exacto de la direccion que busque, sabes a que se puede deber este inconveniente? saludos

    ResponderEliminar
    Respuestas
    1. Hola abismo. Gracias !
      a qué función te refieres en,concreto??? Mapa estático? O directamente en browser???
      Un saludo!

      Eliminar
  19. Hola alguien pudo solucionar el error de scripts con control webBrowser sin cambiar u obligar a cambiar el registro. He bajado tu ejemplo y me da el siguiente error.
    error de script en esta página

    linea 720
    caracter 172
    Error: IvalidCharacterError
    código 0
    URl: https://maps.gstatic.com/cat_js/intl/es-419_es/mapfiles/476a/maps2/%7Bmain,mod_util,mod_act,mod_act_s,mod_pphover,mod_rst%7D.js

    He buscado en miles de foro y al parecer no hay solucion más facil.
    No quiero utilizar mi aplicación y estar cambiando el registro en cada PC.

    Por favor que alguien envie la solución.

    Y si alguien desea un codigo simple, sucede el mismo problema ahi va:

    Agregar un boton y un control webBrowser y aparecera el error que planteo.

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    WebBrowser1.Url = New Uri("https://maps.google.cl")
    End Sub

    ResponderEliminar
  20. hola luis veo que tienes muchisima experiencia en esto de mapas solo queria prguntarte si no afecta esto con los terminos de uso con google ya que quiero hacer un sistema con fines comerciales y aprovechar tus aplicaciones que estan geniales, gracias

    ResponderEliminar
  21. Creo recordar que, teniendo en cuenta las limitaciones que tienes en las peticiones, se puede usar con fines comerciales sin tener que hacer nada.
    De todas maneras, te recomiendo leer la documentación: https://developers.google.com/maps/documentation/?hl=es-AR

    ResponderEliminar
  22. Ejemplos basicos:
    http://tupagina.comuf.com/

    ResponderEliminar
  23. Hola, esta genial! gracias por compartir. Los hitos son los puntos que puedes poner en medio de tu ruta, no? Solo 8 es porque hay alguna limitacion? Tengo muchos puntos de geolocalizacion tomados por un programa y quisiera poder representarlos unidos del que tiene la fecha mas antigua hacia la que lo tiene mas actual. Tengo los datos en una tabla y recojo las coordenadas y la fecha en qeu se produjeron.... Pero solo podria hacerlo para 8?

    ResponderEliminar
  24. ya no funciona. ahora el api de google debe ser ejecutado dentro de un iframe

    ResponderEliminar
  25. Hola, al darle en mostrar mapa de ruta me sale un error "
    El sitio web rechazó mostrar esta página web

    HTTP 403


    Causas más probables:
    •Este sitio web requiere un inicio de sesión en él.


    Puede intentar lo siguiente:



    Regresar a la página anterior.

    Sabes cómo se podría solucionar?
    Muchas gracias

    ResponderEliminar
  26. Lo he ido haciendo paso a paso tal y como indicas y al fin he logrado crear el perfil en Google Maps, muchas gracias por tu dedicación y ayuda Luis

    ResponderEliminar
  27. Buen día Luis

    Necesito hacer un desarrollo en Visual Basic.NET en el que tengo que presentar el mapa de google maps cargado con el puntero del mapa con una dirección ingresada previamente por el cliente, una vez que el cliente establezca de forma precisa su dirección en el mapa se tiene que capturar la información de las coordenadas de latitud y longitud, tiene alguna información que me pueda ayudar sobre este tema porque veo que en su aplicación se trabajan con mapas estáticos y yo necesito interactuar con el mapa en linea.

    ResponderEliminar
  28. Ejemplos de autocompletar? que devuelva la dirección completa incluyendo, colonia, codigo postal estado pais, etc en VBnet

    ResponderEliminar