Android-maps-utils




Estaba necesitando hacer marker con los mapas de googles, pero las herramientas que encontré me sentí muy limitado o redudante con las aplicaciones que ya existe
Entonces hallé una fantástica librería de los desarrolladores de google  android-maps-utils
Donde la explicación va encontrar en  https://www.youtube.com/watch?v=LCJAgPkpmR0
documentation/android/utility/ (ver este link)

La explicación de la instalación es setup en eclipse
Yo por supuesto utilice Android Studio
Recomiendo estos dos videos hasta que yo haga el mio propio Video1 y Video2

Al terminar cualquier de ellos me encontre con un error
Error(64,0) No such property: sonatypeUsername for class: org.gradle.api.internal.project.DefaultProject_Decorated

Las dos páginas que me ayudaron a corregirla fueron codeitive y kalkanotel

Lo que me estaba era agregar esto en el gradle.properties para poder terminar de vincular la librería.
version=0.4-SNAPSHOT

# variables required to allow build.gradle to parse,
# override in ~/.gradle/gradle.properties
signing.keyId=
signing.password=
signing.secretKeyRingFile=

sonatypeUsername=
sonatypePassword=

Otro item interesante para hablar es el codificador utilities/polylineutility cual me llama la atención porque NO funciona.
Así que les recomendaré usar daftlogic-polyline-encoder para hacer codificación de polilíneas, o mejor aún geometry-encodings donde ya podemos ver el resultado instantáneamente con el código encriptado a la derecha.

La codificación polilínea sería
En vez de hacer esto
map.addPolyline(new PolylineOptions().geodesic(true)
             .add(new LatLng(-31.534113, -68.526428))
             .add(new LatLng(-31.537332, -68.526085))
             .add(new LatLng(-31.538064, -68.538359))

Se cambia por esto
private final static String LINE = "f_n_EdagaLbScApCtkA";
List decodedPath = PolyUtil.decode(LINE);
getMap().addPolyline(new PolylineOptions().addAll(decodedPath));

A lo mejor no se ve a simple vista pero sería
En vez de muchos .add(new LatLng...... add(new LatLng...
se pasa una solo String LINE = "f_n_EdagaLbScApCtkA"

Ahora imaginen cuando .add debería tener en la siguiente imagen


la verdad que son muchos, porque las polilineas solo trabajan trazos rectos, yo calculo que había que serían unos 35 .add
que todo eso lo puedo cambiar por una línea codificada

Otro ejemplo interesante que podremos hacer es


que sin la librería en cuestión no sería posible ya que cuando utilizamos
marker.showInfoWindow();
Solo nos permite mostrar una por vez

El proyecto de github de la librería es github/android-maps-utils
La documentación android-maps-utils/javadoc/

En resumen.
Vamos a settings.gradle y vamos a encontrar solo en el include nuestra app

agregamos "library" para hacer esto anteriormente ya la tendríamos que haber copiado y pegado en la carpeta de nuestro proyecto y llamarla "library"

Vamos a Project Structure -> app -> Dependencies -> Module Dependencies -> :library (esta no tiene que aparecer sola, ya que lo agregamos con el include del paso anterior) -> OK



Nos va aparecer ese error

Para ello vamos a "gradle.propierties" nos va a aparecer todos esos comentarios


Agregamos el siguiente texto, que esta más arriba en el blog


Y finalmente ya estará enlazada la librería, si esto es, aparecerá "library" en negrita



27 comentarios:

  1. bro, estoy a 1 pelo de terminar mi aplicacion para luego compartirla con tigo y el blog,, pero necesito resolver un ultimo paso,,,, hice un marker en el mapa de google, me funciono, pero lo q quiero hacer es darle click a ese marker y q me envie a otro layout, es eso posible???

    ResponderEliminar
    Respuestas
    1. Si, se puede. Te digo como lo busque en Google "marker setOnClickListener"
      encontré dos muy buenas respuestas
      1- http://stackoverflow.com/questions/14226453/google-maps-api-v2-how-to-make-markers-clickable
      2- http://stackoverflow.com/questions/16635530/android-google-map-clicked-marker-opens-new-activity-or-bigger-window
      Espero de haber sido de ayuda.

      Eliminar
    2. llevo 3 dias tratando de hacerlo y nada aun :(

      Eliminar
    3. ya lo logre ramiro,, muchas gracias!!!!

      Eliminar
  2. fue un error mio al no posicionar bien el codigo dentro de la clase...

    ahora tengo otra duda... pasa q tengo 100 marcadores en el mapa y debo hacer tambien 100 layouts para mostarr la informacion de cada marcador y para mostrar los layouts debo hacer 100 clases q llamarana los layouts, se puede simplificar esto con haciendo solo 1 layout y q la informacion venga de una base de datos del mismo celular??? lo digo porq me imagino q si hago los 100 layouts y las 100 clases (todo con la informacion de cada marcador) pesara mucho la app

    ResponderEliminar
  3. y bueno, este es el codigo q ocupe para hacer el click en el mapa

    googleMap
    .setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {

    @Override
    public void onInfoWindowClick(Marker marker) {
    try {
    // aca colocar la llamada de la actividad
    ej: startActivity (new....
    } catch (Exception e) {
    }
    }
    });

    ResponderEliminar
  4. Hola Ramiro! muy buena seccion, mira estoy trabajando sobre un proyecto con google maps, especificamente sobre rutas de lineas de transporte, por el momento estoy agregando las rutas marcandolas manualmente, ya que no encuentro la forma de agregarlas de otra forma, a lo que voy:
    -Una ves marcada la ruta con un inicio y un fin, como puedo guardar esa ruta marcada a una base de datos, para mostrar al usuario en el mapa, dependiendo de ciertos parametros (ubicacion, tiempo, recorrido, etc)

    Te agradezco la respuesta, me ayudara muchisimo !!

    ResponderEliminar
    Respuestas
    1. es durisimo pero si, tenes que hacer linea por linea, yo uso este https://developers.google.com/maps/documentation/javascript/examples/geometry-encodings y después con ese código edito un poco lo hice a mi comodidad http://tottiapp.com/argentina.html y cuando me equivoco copio y lo pego acá https://developers.google.com/maps/documentation/utilities/polylineutility y lo corrijo sino tenes que empezar de nuevo.
      Yo al menos lo hago así, si encontras una mejor manera avisame.

      Eliminar
    2. Perfecto! es justo lo que necesito, esto me genera un codigo (Encoding), es esto lo que tengo que guardar en la base de datos? y bueno supongo que hay una funcion draw que recibe este codigo y lo muestra en el mapa?

      Te agradezco la respuesta, estoy empezando a trabajar con google maps aun no tengo claras muchas cosas, pero tu foro me esta ayudando bastante !

      Eliminar
    3. Hola compañeros, creo que busco un fin parecido al de MaTU143, necesito dibujar una ruta especifica, y que me la reconozca como un objeto de ese tipo para luego poder realizar consultas sobre ella , por ejemplo obtener la distancia entre dos puntos que se ubican dentro de la ruta.
      les agradeceria si me pudiesen hechar un manito
      Saludos desde Colombia excelente Blog

      Eliminar
  5. Hola, Tengo una duda, pienso desarrollar una app cual su funcion se basa en la api de google maps, pero necesito que cuando se escoja una ciudad se delimite el mapa a esta y no al mapa completo como puedo hacer esto, Te lo agradecería.

    ResponderEliminar
    Respuestas
    1. le podes hacer un zoom automatico
      LatLng LOCATION_SANJUAN = new LatLng(-31.550892, -68.5213835);
      mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LOCATION_SANJUAN, 13));

      Eliminar
    2. o algo así
      map.animateCamera(CameraUpdateFactory.newLatLngZoom(
      new LatLng(-31.550892, -68.5213835), 12));
      Espero que te sirva

      Eliminar
    3. Gracias, me funciono, pero ahora estoy en una parte de mi proyecto, el cual es el siguiente, en mi BBDD tengo los datos de los puntos, estos puntos se pintan en el mapa mediante un marker, al seleccionar el punto toma la posición del movil, y debe pintar una ruta en el mapa, que me aconsejas para poder trazar una ruta.

      Eliminar
  6. deberias de hacer un tutorial simple de como manejar las polinineas con google maps

    ResponderEliminar
  7. Excelente tuto! siempre fue un dolor de cabeza para mi que Android Studio reconozca las librerías. Realmente hay un trabajo increíble en todo tu blog. Saludos desde Misiones.

    ResponderEliminar
  8. hola Ramiro un saludo, estoy trabajando con mapas y bueno me encuentro en un problema quiero hacer lo siguiente, tengo un marcador fijado estático y bueno quisiera que cuando el usuario Active su ubicación le muestre una ruta desde su ubicación hasta el marcador que ya tengo en el mapa, te agradezco un montón por los tutoriales espero puedas ayudarme en este problema un saludo hasta pronto

    ResponderEliminar
  9. ERES UN HEROE VIEJO TE AMO ♥

    ResponderEliminar
  10. Ramiro Excelente tutorial sobre los marcadores, veras yo apenas me estoy empapando de Android Studio y me toca hacer una app movil donde se ponga las rutas de transporte de mi ciudad, crees que se pueda hacer en tiempo real?

    ResponderEliminar
  11. Sabes a que se debe un error "Configuration with name 'default' not found."? esto me pasa al tratar de hacer el project sync despues de haber hecho los pasos de arriba para la libreria.

    ResponderEliminar
  12. Buenas Tengo una pequeño problema estoy con la API de google maps, tengo los y tengo un boton que me agrega un marcador en mi posicion actual, el punto es que necesito saber como guardar o hacer que el marcador quede permanentemente ahi, ya que si cierro la app y vuelvo a abrirla el marker ya no esta

    ResponderEliminar
  13. Hola, me estoy iniciando en el desarrollo de Android y tu aporte fue de MUCHÍSIMA AYUDA!! Estoy realmente agradecido... Saludos.

    ResponderEliminar
  14. Muchísimas gracias master!
    Solo te pregunto algo que no estuve encontrando, como saber si una posición está o no dentro de un polígono geográfico.
    Gracias de nuevo!

    ResponderEliminar