viernes, 11 de octubre de 2013

Java: API Google Maps para Java

En esta ocasión, os voy a mostrar una serie de clases que he desarrollado para manejar de forma sencilla el API de Google Maps con Java. En concreto, vamos a ver 3 productos, un archivo .jar (denominado MapsJava.jar) que contendrá las clases mencionadas, un ejemplo sencillo por consola (denominado MapsJava_EjemploFacil), y un ejemplo más completo y visual de utilización de estas clases (denominado Maps.JAVA). Empezamos:

Índice de la entrada

  1. Clases MapsJava
    1. MapsJava
    2. Geocoding
    3. Elevation
    4. StaticMaps
    5. StreetView
    6. ShowMaps
    7. Route
    8. Places
  2. Límites de uso
  3. Ejemplo básico
  4. Ejemplo avanzado
  5. Resumen y descargas

1. Clases MapsJava

El archivo .jar, como decimos se llama MapsJava.jar y lo podéis descargar desde aquí. Este conjunto de clases está totalmente documentado en castellano (eso sí, el nombre de las funciones está en mi inglés tejano) y se compone de las siguientes clases:
Clase padre: MapsJava
Clases hijas: Elevation, Geocoding, Places, Route, ShowMaps, StaticMaps y StreetView.

1.1. MapsJava
Es la clase de la cual se derivan el resto y contiene una serie de funciones y propiedades (estáticas) principalmente para las diferentes opciones a la hora de realizar las peticiones al API Google Maps (sensor, idioma, etc.) y un seguimiento del estado de cada petición.

PROPIEDADES (lectura/escritura):
  • String Region (getRegion/setRegion): comprueba/establece las regiones de búsqueda de los diferentes resultados. Sirve principalmente, para que dé prioridad a resultados de la región seleccionada, es decir, si buscamos la ciudad de León habiendo puesto como región España (“es”), el primer resultado será de León (España), en cambio, si ponemos como región México (“mx”), nos aparece como primer resultado la ciudad de León (México). La región predeterminada es España (“es”). Para más información sobre los diferentes tipos de regiones, haz clic aquí.
  • String Language (getLanguage/setLanguage): comprueba/establece el idioma en el que se mostrarán los resultados de las búsquedas. El idioma predeterminado es español (“es”). Para más información sobre los diferentes idiomas, haz clic aquí.
  • Boolean Sensor (getSensor/setSensor): comprueba/estable el uso o no uso de un sensor GPS (GNSS) en las peticiones para obtener ubicación. De forma predeterminada es false.
  • String Key (getKey/setKey): comprueba/establece el uso de clave de desarrollador API Google Maps. Esta clave únicamente es necesaria para la petición de locales (Places). De forma predeterminada no hay clave (String vacío). Para más información de cómo obtener clave (es gratuita), pulsa aquí.

PROPIEDADES (sólo lectura):
  • String getLastRequestStatus: en esta propiedad se indica el estado de la última petición realizada. En caso de que no haya surgido ningún imprevisto será “OK”.
  • String getLastRequestURL: en esta propiedad se indica la URL de la última petición realizada. Un ejemplo sería, “ttp://maps.google.com/maps/api/geocode/xml?address=Madrid%2C+Puerta+del+Sol&region=es&language=es&sensor=false”
  • String getLastRequestInfo: en esta propiedad se indica información referente de qué tipo de servicio ha realizado la última petición. Un ejemplo sería, “Geocoding request”.
  • String getLastRequestException: en esta propiedad se indica si en la última petición ha habido excepciones. En caso de que todos haya sido correcto, el resultado sería “No exception”.
  • String[] getLastRequestRequest: en esta propiedad se muestra toda la información de la última petición realizada. En concreto es un vector con 6 posiciones, con el siguiente orden:
[0]="Número de petición"; [1]="Fecha/hora petición"; [2]="status de la petición";
[3]="URL de la petición"; [4]="Información sobre petición realizada"; [5]="Excepciones generadas";
  • [][]String getStockRequest: esta propiedad es exactamente igual que la anterior, pero en vez de almacenar únicamente la última petición, muestra información de todas las peticiones realizadas. En concreto se compone de dos dimensiones [i][6], donde la primera (i) es el índice de la petición y la segunda es la información de la petición. Si por ejemplo, queremos comprobar la información de la primera petición sería así:
[0][0]="Número de petición"; [0][1]="Fecha/hora petición"; [0][2]="status de la petición";[0][3]="URL de la petición"; [0][4]="Información sobre petición realizada"; [0][5]="Excepciones generadas";

FUNCIONES:
  • String APIkeyCheck (String key): esta función sirve para comprobar si una clave de desarrollador del API Google Maps es correcta. Se le envía la clave (key) y devuelve el estado de la petición. Si la clave es correcta, devuelve “OK”, en cualquier otro caso la clave no es correcta.

1.2. Geocoding
Esta clase contiene funciones de codificación geográfica, que se utilizan para transformar una dirección postal en sus coordenadas geográficas y viceversa.
Un ejemplo sería, transformar “Madrid, Puerta del Sol” en coordenadas geográficas (el resultado sería 40.4171111,-3.7031133).

FUNCIONES
  • Point2D.Double getCoordinates (String address): devuelve las coordenadas geográficas asociadas a la dirección postal enviada (address). Por ejemplo, si enviamos la siguiente dirección getCoordinates (“Madrid, Puerta del Sol”) nos va a devolver una variable de tipo Point2D.Double, y el resultado sería 40.4171111,-3.7031133.
Geocoding ObjGeocod=new Geocoding();
Point2D.Double resultadoCD=ObjGeocod.getCoordinates("Madrid, Puerta del Sol");
System.out.println( resultadoCD.x + "," + resultadoCD.y);
  • ArrayList<String> getAddress(Double latitude, Double longitude): devuelve el conjunto de direcciones postales asociadas al punto geográfico (latitude/longitude), especificado. Por ejemplo, si enviamos las siguientes coordenadas getAddress(40.4171111,-3.7031133) nos va a devolver un ArrayList con las direcciones asociadas, siendo los índices menores, direcciones más específicas. Nos devolverá:
Plaza Puerta del Sol, 6, 28013 Madrid, España
Puerta del Sol, 28013 Madrid, España
Sol, Madrid, España
28013 Madrid, España
Centro, Madrid, España
Madrid, España
Madrid, España
Área Metropolitalitana y Corredor del Henares, Madrid, España
Madrid, España
Comunidad de Madrid, España
España
Geocoding ObjGeocod=new Geocoding();
ArrayList resultadoCI=ObjGeocod.getAddress(40.4171111,-3.7031133);
for(String direccion:resultadoCI){
   System.out.println(direccion);
}
//

PROPIEDADES
  • String getAddressFound(): esta propiedad nos devuelve la dirección encontrada a partir de la enviada como parámetro en la función getCoordinates. Es decir, si hemos llamado a la función getCoordinates(“Madrid, Puerta del Sol”), y hacemos la llamada a esta propiedad, nos devolverá “Plaza Puerta del Sol, Madrid, España”ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getCoordinates.
  • String getPostalcode(): esta propiedad devuelve el código postal encontrado tras una llamada a getCoordinates o getAddress. Es decir, si por ejemplo hemos llamado a la función getCoordinates(“Madrid, Puerta del Sol 3”), y hemos la llamada a esta propiedad, nos devolverá “28013”. ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getCoordinates o getAddress.

1.3. Elevation
Esta clase contiene funciones para obtener la altitud de puntos a partir de sus coordenadas geográficas.
Un ejemplo sería, obtener la altitud de “28.2725,-16.6425” cuyo resultado sería 3696.6992188 (las unidades son metros).

FUNCIONES
  • double getElevation(double latitude, double longitude): devuelve la altitud (en metros) del punto geográfico que le hemos pasado a través de su latitud y longitud. Por ejemplo, si hacemos la siguiente llamada getElevation(28.2725,-16.6425) nos va a devolver una variable de tipo double, y el resultado sería 3696.6992188.
Elevation ObjElevat=new Elevation();
double resultadoAlt=ObjElevat.getElevation(28.2725,-16.6425);
System.out.println(String.valueOf(resultadoAlt));
  • ArrayList<Double> getElevation(ArrayList<Double> LatiLong): esta función realiza las mismas funciones que la anterior, pero nos devuelve la altitud de una serie de puntos en una misma llamada. El parámetro de entrada LatiLong es un ArrayList en el que se deben de pasar la latitud/longitud por pares (es decir, latitud1/longitud1/latitud2/longitud2, etc) y nos devolverá un ArrayList con las altitudes correspondientes a cada par de coordenadas.

PROPIEDADES
  • double getResolution(): esta propiedad devuelve la distancia máxima (en metros) entre los puntos de datos desde los que se interpoló la elevación, es decir su resolución, a partir de una llamada a la función getElevation(double latitude, double longitude). Si por ejemplo hemos llamado a la función getElevation(28.2725,-16.6425) y solicitamos la resolución con dicha propiedad, nos devolverá “9.543952”. ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getElevation(double latitude, double longitude).
  • ArrayList<Double> getResolutionList(): esta propiedad devuelve la distancia máxima (en metros) entre los puntos de datos desde los que se interpolí la elevación, es decir su resolución, a partir de una llamada a la función getElevation(ArrayList<Double> LatiLong). Si una vez hemos llamado a la función, comprobamos la resolución, nos devolverá un ArrayList con la resolución asociada a cada par de coordenadas latitud/longitud. ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getElevation(ArrayList<Double> LatiLong).

1.4. StaticMaps
Esta clase contiene funciones  para crear mapas estáticos y obtener su imagen (en formato Image). Estos mapas contendrán un marcador del centro de dicho mapa, posibilidad de varios tipos de formatos y tipos de mapas, entre otras características.

Un ejemplo sería obtener el mapa cuyo centro sería “Madrid, Puerta del Sol”, en formato .png, y mapa de carreteras. El resultado sería el siguiente:

Mapa estático
FUNCIONES
  • Image getStaticMap(String centerAddress,int zoom,Dimension size,int scale,Format format, Maptype maptype): devuelve el mapa asociado a los parámetros que recibe la función. La variable devuelta será de tipo Image. Un ejemplo sería:
StaticMaps ObjStatMap=new StaticMaps();
Image resultadoMapa=ObjStatMap.getStaticMap("Madrid, Puerta del Sol", 14,new Dimension(300,300), 1, StaticMaps.Format.png, StaticMaps.Maptype.roadmap);
Los parámetros que se pueden pasar a esta función son los siguientes:
  • String centerAddress: define el centro del mapa que se creará (como "dirección postal" o "latitud,longitud"). 
  • int zoom: define el nivel de zoom del mapa, que determina su nivel de ampliación. Valores 0 muestran todo el planeta y mayores que 21 muestran edificios individuales.
  • Dimension size: tamaño del mapa que se generará.
  • int scale: afecta al número de píxeles que se muestran. Los dos valores posibles son 1 o 2.
  • Format format: define el formato de la imagen resultante. Véase un poco más abajo enumeraciones.
  • Maptype maptype: define el tipo de mapa que se va a generar. Véase un poco más abajo enumeraciones

ENUMERACIONES
  • enum Format{png,png32,gif,jpg,jpg_baseline}: indica el formato de la imagen devuelta. Las opciones son:
  • png: especifica el formato PNG de 8 bits.
  • png32: especifica el formato PNG de 32 bits.
  • gif: especifica el formato GIF.
  • jpg: especifica el formato de compresión JPEG.
  • jpg_baseline: especifica un formato de compresión JPEG no progresivo.
  • enum Maptype{roadmap, satellite, hybrid,terrain}: define el tipo de mapa que se va a generar. Sus posibles valores son:
  • roadmap: especifica una imagen de mapa de carreteras estándar, como se muestra habitualmente en la página de Google Maps.
  • satellite: especifica una imagen obtenida por satélite.
  • hybrid: especifica una imagen de mapa de relieve físico, en la que aparece relieve y vegetación.
  • terrain: especifica un híbrido de imagen obtenida por satélite e imagen de mapa de carreteras, en la que aparece una capa transparente de calles principales y nombres de lugares en la imagen obtenida por satélite.

1.5. StreetView 
Esta clase incluye funciones para mostrar imágenes estáticas de Google Street View, con posibilidad de incluir varios parámetros (como orientación de la cámara) para personalizarla.

Un ejemplo sería obtener la imagen estática de Google Street View cuya dirección sería “Madrid, Puerta del Sol”,  con una orientación horizontal de la cámara de 90º. El resultado sería el siguiente:  

Imagen estática Street View

FUNCIONES
  • Image getStreetView(String address,Dimension sizeImage,double heading,double fov,double pitch): devuelve la imagen de Street View estática (no interactiva), indicando a través de sus diferentes parámetros las diferentes características de la misma. La variable devuelta sería de tipo Image. Un ejemplo sería:
StreetView ObjStreet=new StreetView();
Image imgResultado=ObjStreet.getStreetView("Madrid, Puerta del Sol", new Dimension(300,300), 90, 100, -100);
Los parámetros que se pueden pasar a esta función son los siguientes:
  • String address: define la dirección de la imagen que se utilizará para crear la imagen Street View más cercana a la posición indicada (como "dirección postal" o "latitud,longitud").
  • Dimension sizeImage: define el tamaño de la imagen creada. El máximo es de 640x640.
  • double heading: indica el encabezado de la brújula de la cámara. Se admiten valores comprendidos entre 0 y 360. En caso de que se quiera utilizar el valor predeterminado, se debe pasar como parámetro -1.
  • double fov: determina el campo horizontal de visión de la imagen. Este campo de visión se expresa en grados, con un valor permitido máximo de 120. En caso de que se quiera utilizar el valor predeterminado, se debe pasar como parámetro -1.
  • double pitch: especifica la inclinación del ángulo de la cámara hacia arriba o hacia abajo en relación con el vehículo de Street View. En caso de que se quiera utilizar el valor predeterminado, se debe pasar como parámetro -100.

1.6. ShowMaps
Esta clase contiene funciones para crear la URL asociada a un mapa web (no estático) y así poder visualizarlo en un navegador. Por ejemplo, para mostrar un mapa interactivo cuyo centro sea “Madrid, Puerta del Sol”. El resultado, visto en un navegador, sería:

Mapa visto en Google Chrome
FUNCIONES
  • String getURLMap(String address): esta función devuelve la URL (en formato String), asociada a un mapa cuyo centro se determina como dirección postal con el parámetros address. En el siguiente ejemplo vemos cómo hacer la llamada a la función para luego cargar el navegador predeterminado del usuario con la dirección obtenida.
ShowMaps ObjShowMap=new ShowMaps();
String direccionMapa=ObjShowMaps.getURLMap(“Madrid, Puerta del Sol”);
Desktop.getDesktop().browse(new URI(direccionMapa));
  • String getURLMap(Double latitude, Double longitude): función similar a la anterior, pero el centro del mapa se determina con los parámetros latitude y longitude, los cuales especifican las coordenadas geográficas del centro de mapa.

1.7. ROUTE
Esta clase se utiliza para crear rutas entre un punto de origen y uno de destino. En las rutas se puede incluir rutas a coche, andando, en bicicleta, además de hitos intermedios de paso obligador, etc.

FUNCIONES
  • String[][] getRoute(String originAddress, String destinationAddress, ArrayList<String> waypoints,Boolean optimize, mode travelMode,avoids avoidsRoad): esta función devuelve el resultado de una ruta en función de los parámetros que reciba. Por ejemplo, vamos a ver cómo crear una ruta entre “Madrid” y “Barcelona”, sin hitos intermedios, por carretera y sin restricciones de carreteras. 
Route ObjRout=new Route();
String[][] resultadoRuta=ObjRout.getRoute("Madrid", "Barcelona", null, Boolean.TRUE, Route.mode.driving, Route.avoids.nothing);
for(int i=0;i< resultadoRuta.length;i++){
   System.out.println("Tramo " + i + ":");
   for(int j=0;j< resultadoRuta [0].length;j++){
      System.out.print(resultado[i][j] + "\t");
   }
}
El String[i][5] que devuelve la función, se conforma de dos dimensiones, la primera (i) indica el tramo actual, y la segunda (tiene un tamaño de 5) indica la información del tramo. La estructura es la siguiente:
[0][0]=" Tiempo del tramo (en horas/minutos)"; [0][1]=" Distancia recorridas en el tramo (en m/km)"; [0][2]=" Indicaciones del tramo";[0][3]=" Latitud de llegada del tramo"; [0][4]=" Longitud de llegada del tramo"; 
Los parámetros que se pueden pasar a esta función son los siguientes: 
  • String originAddress: dirección postal de origen de la ruta.
  • String destinationAddress: dirección postal de destino de la ruta.
  • ArrayList<String> waypoints: lista de hitos intermedios de paso obligado (opcional). Puede ser null.
  • Boolean optimize: reordena (en caso de ser true) los hitos de forma más eficaz para optimizar la ruta proporcionada. Esta optimización es el resultado de aplicar el Problema del viajante.
  • mode travelMode: indica el tipo de medio de transporte. Véase un poco más abajo enumeraciones.
  • avoids avoidsRoad: indica restricción de vías. Véase un poco más abajo enumeraciones.

PROPIEDADES
  • String getSummary (): esta propiedad nos devuelve el resumen de la ruta. Un ejemplo de resumen de ruta, sería, “AP-2 y A-2”. ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getRoute.
  • String getCopyright (): esta propiedad nos devuelve el copyright de los datos de la ruta. Un ejemplo de copyright de ruta, sería, “Datos de mapa ↄ2013 Google, basado en BCN IGN España”. ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getRoute.
  • ArrayList<Integer> getWaypointIndex(): esta propiedad devuelve un ArrayList con el orden de paso de hitos (puntos intermedios de paso obligado), en caso de haberlos. ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getRoute, además de haber incluido waypoints en la ruta.
  • ArrayList<Integer> getTotalTime(): esta propiedad devuelve un ArrayList con el tiempo total (en segundos) de la ruta. En caso de no haber hitos intermedios, esta propiedad sólo tendrá una posición con el tiempo total. ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getRoute.
  • ArrayList<Integer> getTotalDistance(): esta propiedad devuelve un ArrayList con la distancia (en metros) de la ruta. En caso de no haber hitos intermedios, esta propiedad sólo contendrá una posición con la distancia total. ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getRoute.
  • ArrayList<String> getTotalDistance (): esta propiedad indica la referencia de las polilíneas asociadas a cada tramo. ESTA FUNCIÓN REQUIERE QUE PREVIAMENTE LLAMEMOS A getRoute.

ENUMERACIONES
  • enum mode{driving,walking,bicycling,transit}: indica el tipo de medio de transporte de la ruta. Los valores son: 
  • driving: proporciona rutas estándar para llegar en coche a través de la red de carreteras.
  • walking: proporciona rutas a pie a través de aceras y rutas peatonales (según disponibilidad).
  • driving: proporciona rutas para llegar en bicicleta a través de carriles bici y vías preferenciales para bicicletas (según disponibilidad).
  • driving: solicita indicaciones a través de rutas de transporte público (según disponibilidad) (NO FUNCIONA ACTUALMENTE).
  • enum avoids{nothing,tolls,highways}: indica que la ruta deben evitar determinados elementos. A continuación, se indican los tres argumentos que admite actualmente este parámetro:
  • nothing: no se evita ningún tipo de elemento.
  • tolls: indica que la ruta calculada debe evitar los peajes de carretera y de puentes.
  • highways: indica que la ruta calculada debe evitar las autopistas y las autovías.

1.8. Places
Esta clase contiene funciones para poder obtener establecimientos, puntos de interés o locales (Places) asociados a un determinado lugar geográfico, pudiendo filtrarlos por tipo de local, palabras clave de búsqueda, etc. Además se puede obtener fotografías, detalles y críticas de los diferentes Places. 
Es importante recordar que esta función requiere disponer de clave de desarrollador para API Google Maps. Obtenerla es gratuito. Más información sobre cómo obtener clave API aquí. Para establecer la clave, se debe llamar a la función estática MapsJava.setKey(String key).

FUNCIONES
  • String[][] getPlaces(double latitude, double longitude,int radius,String keyword,String namePlace, Rankby rankby,ArrayList<String> types): esta función busca información sobre locales/lugares (places) y devuelve información asociada a esos lugares. Máximo 20 lugares por petición. Un ejemplo, en el que simplemente se muestran Places cercanos a “40.4171111,-3.7031133”, sería:
Places ObjPlace=new Places();
String[][] resultadoPlaces=ObjPlace.getPlaces(40.4171111, -3.7031133, 3000, "", "", Places.Rankby.prominence, null);
for(int i=0;i< resultadoPlaces.length;i++){
   System.out.println("Place " + i + ":");
   for(int j=0;j< resultadoPlaces [0].length;j++){
      System.out.print(resultado[i][j] + "\t");
   }
}
El String[i][6] que devuelve la función, se conforma de dos dimensiones, la primera (i) indica el Place actual, y la segunda (tiene un tamaño de 6) indica la información asociado al Place indicado. La estructura es la siguiente:
[0][0]="Nombre del lugar"; [0][1]=" Dirección (vecindad); [0][2]="Latitud”; [0][3]=" Longitud"; [0][4]="URL del icono asociado al tipo de place"; [0][5]=" Referencia del lugar";
Los parámetros que se pueden pasar a esta función son los siguientes:
  • String latitude: (OBLIGATORIO) latitud (junto con longitud), indica el punto alrededor del cual se quiere obtener información de sitios.
  • String longitude: (OBLIGATORIO) longitud (junto con latitud), indica el punto alrededor del cual se quiere obtener información de sitios.
  • Int radius: (OBLIGATORIO) define la distancia (en metros) dentro de la que se deben mostrar resultados de sitios.
  • String keyword:  indica un término que se debe comparar con todo el contenido indexado por Google para este sitio (por ejemplo, el nombre, el tipo y la dirección, así como las opiniones de los clientes y otro contenido de terceros).
  • String namePlace: indica un término que se debe comparar con los nombres de sitios.
  • Rankby rankby: especifica el orden en que se deben mostrar los resultados. Véase un poco más abajo enumeraciones.
  • ArrayList<String> types: restringe los resultados a los sitios que coinciden como mínimo con uno de los tipos especificados. Más información sobre tipos de locales en aquí
  • String[] getPlacesDetails(String referencePlace): obtiene detalles de un local a partir de su referencia. La referencia se obtiene a través de una búsqueda de places (getPlaces), ya que en los resultados devueltos el último lugar corresponde a la referencia de un lugar [i][5]. Un ejemplo sería obtener los detalles de un local a partir de su referencia: 
Places ObjPlace=new Places();
String[] resultadoDetalle=ObjPlace.getPlacesDetails (“CpQBgQAAAG7brY9c44bWfXYCWNeKNnMfF34sEthcG4iIB23wul6xVGzwDxdF3RVyNdzSMViloNBoQCIIJCQDc0vYHYDG8Oq1YFVqhWZ5K7KZKUnUYBgLpc8HEy7E3oHARsjxUyBfIB6A5_N6YZvDBC3yOn6hmuHPqGlwgmF0wUpssoQf3bgAkVDRGX9gSfDvevdZeslN4hIQ6NWrY1S13uvn6c1lqVy0wxoU29U3zc4zRuSOFCOByQ4tvijWvUw”);
for(int i=0;i< resultadoDetalle.length;i++){
   System.out.println (resultadoDetalle[i]);
}
El String[8] que devuelve la función, se conforma de 8 posiciones las cuales contienen la información del Place. La estructura es la siguiente:
[0]="Nombre local"; [1]="Vecindad"; [2]="Número de teléfono";[3]="Dirección del local"; [4]="URL página Google+"; [5]="Puntuación loca (sobre 5)";[6]="URL del icono asociado al tipo de place"; [7]="Página web del local";
  • String[][] getPlaceReview(String referencePlace): esta función obtiene las reviews de los usuarios de un determinado local. La referencia se obtiene a través de una búsqueda de places (getPlaces), ya que en los resultados devueltos el último lugar corresponde a la referencia de un lugar [i][5]. Un ejemplo sería obtener las reviews de un local a partir de su referencia. 
Places ObjPlace=new Places();
String[][] resultadoReviews=ObjPlace. getPlaceReview (“CpQBgQAAAG7brY9c44bWfXYCWNeKNnMfF34sEthcG4iIB23wul6xVGzwDxdF3RVyNdzSMViloNBoQCIIJCQDc0vYHYDG8Oq1YFVqhWZ5K7KZKUnUYBgLpc8HEy7E3oHARsjxUyBfIB6A5_N6YZvDBC3yOn6hmuHPqGlwgmF0wUpssoQf3bgAkVDRGX9gSfDvevdZeslN4hIQ6NWrY1S13uvn6c1lqVy0wxoU29U3zc4zRuSOFCOByQ4tvijWvUw”);
for(int i=0;i< resultadoReviews.length;i++){
   System.out.println("Review " + i + ":");
   for(int j=0;j< resultadoReviews [0].length;j++){
      System.out.print(resultadoReviews [i][j] + "\t");
   }
}
El String[i][4] que devuelve la función, se conforma de dos dimensiones, la primera (i) indica la review actual, y la segunda (tiene un tamaño de 4) indica la información asociado a la review indicada. La estructura es la siguiente:
[0][0]="Fecha de la review (en tiempo UNIX en segundos)";[0][1]="Nombre del autor"; [0][2]="Texto de la review";[0][3]="URL Google+ del autor";  
  • Image getPhoto(String photoreference,int maxWidth): esta función devuelve la foto del local (como variable Image) a través de su referencia. Dicha referencia, se obtiene a partir de una petición previa de detalles del local (getPlaceReview), que, en caso de haber fotografías, almacena todas sus referencias (dichas referencias se obtiene con la función getPhotosReference). Un ejemplo de fotografía a través de su referencia sería:
Places ObjPlace=new Places();
Image resultadoImagen=ObjPlace. getPhoto (“CnRuAAAAptYIEQtU15t25gMvdaGV6LmKZAnHucX9LnlOmREFbW25Nmg49y4ISdN3JLwyCSWjhUmfRM-aSqXI9w6CyvRB1CV3Abpeq636rAr5yziokKKzCv6UDMFWj43HaY9jkca5a_ge77Jgo0IT97Xf6464fxIQIAl8LO5P4EH5JoYA39OKExoUeXqLd21KW81LKETetSboK2MF03E”);>
Los parámetros que se pueden pasar a esta función son los siguientes:
  • String photoreference: referencia de la fotografía obtenida a través de la propiedad getPhotosReference.
  • int maxWidth: ancho máximo de la imagen devuelta.

PROPIEDADES
  • ArrayList<String> getPhotosReference():devuelve el conjunto de referencias de fotografías. Para obtenerlas, se REQUIERE QUE PREVIAMENTE SE LLAME A LA FUNCIÓN getPlaceReview, y en caso de haber fotografías, se almacenarán las referencias. Si no hubiese fotografías, se devolverá un ArrayList vacío.
  • Para obtener las fotografías asociadas a las referencias, hay que llamar a la función getPhoto y enviarle como parámetro la referencia.

ENUMERACIONES
  • enum Rankby{prominence,distance}: indica los diferentes tipos de ordenación de resultados de los Places. Los posibles valores son:
  • prominence: esta opción permite ordenar los resultados por importancia. 
  • distance: esta opción permite disponer los resultados en orden ascendente en función de la distancia a la que se encuentren de la ubicación especificada.

Éstas son, en resumen, todas las funcionalidades que componen las diferentes clases. Además, todas ellas están documentadas con JavaDoc, por lo tanto, si utilizamos un IDE como NetBeans, nos ayudará bastante.

Detalle JavaDoc en NetBeans


2. LÍMITES DE USO DIFERENTES CLASES

Límite de uso

3. EJEMPLO FÁCIL

Abrimos nuestro IDE favorito (en este caso utilizaremos NetBeans) y, una vez hemos descargado el archivo denominado MapsJava.jar, vamos a agregarlo a nuestro proyecto. Para ello, hacemos clic con el botón derecho encima de nuestra solución y pulsamos en Propiedades.

Propiedades del proyecto

Se nos muestra una ventana con las propiedades de nuestro proyecto, vamos a la sección Librerías, hacemos clic en Añadir Jar/Carpeta, y añadimos nuestro archivo MapsJava.jar.

Añadir MapsJava.jar

Ya tenemos todo listo para empezar a utilizar el API de Google Maps de forma sencilla. Vamos ahora a escribir este código muy fácil, que, aunque sólo utiliza unas pocas funcionalidades, nos hará ver un poco cómo funciona todo. El código no lo voy a poner aquí, ya que la entrada es demasiado larga. Pero lo puedes descargar desde aquí.

4. EJEMPLO AVANZADO

Para los que quieran ir un poco más allá, he creado una aplicación que utiliza más funcionalidades de las clases (aunque no todas) y podéis ver un poco qué se puede hacer con MapsJava.jar. Eso sí, aviso de antemano que el código fuente está un poco desordenado y su calidad es bastante dudosa… Lo podéis descargar desde aquí, y aquí tenéis un vídeo de la aplicación.



6. RESUMEN Y DESCARGAS

Bueno, esto es todo. Si alguien ha llegado hasta aquí leyendo toda la entrada, se puede considerar un héroe. Cualquier duda/crítica/sugerencia, como siempre, en los comentarios. Los archivos los podéis descargar desde aquí:


92 comentarios:

  1. Hola!,

    Buena explicacion, legible y clara.
    He intentado probarlo(el ejemploFacil) no encuentro el maps.jar(supongo que te lo da google, pero no lo he encontrado), lo podrias añadir? (lo he intentado desde las clases pero me tiranerror: 'unresolved compilation problem')

    Gracias!

    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola.
      Fíjate en el punto 3, ahí te lo explica. Lo primero que tienes es que crear un proyecto nuevo y agregar MapsJava.jar, y añadir el código fuente disponible en \MapsJava_EjemploFacil\src\mapsjava_ejemplofacil.java
      Un saludo

      Eliminar
  2. excelente trabajo te has currado. Muy interesante, gracias y felicitaciones!

    ResponderEliminar
  3. hola, muchas gracias por la aplicacion me aclaro unas cosas pero tengo una duda como hago para mostrar un mapa en el navegador con varios puntos, por ejemplo colocar un marcador sobre cada hospital de una ciudad

    ResponderEliminar
  4. En el navegador no se podría, lo único, mostrar los marcadores en un mapa estático.
    Un saludo

    ResponderEliminar
  5. Hola!

    He podido usar correctamente lo que nos indicas, muchas gracias.
    SIn embargo, tengo una consulta como calculas la ruta en transporte publico??

    Al llamar al metodo le pasamos el parametro Route.mode.NombreModo, y no esta definido el del transporte publico..

    Saludos.

    ResponderEliminar
    Respuestas
    1. HOla Karl.
      Como indico, actualmente no funciona el transporte público. No obstante, se podría implementar. La info está aquí: https://developers.google.com/maps/documentation/directions/?hl=es-ES#TransitDetails
      Un saludo.

      Eliminar
    2. Habria que modificar la clase e incluir en el enum ek transportePublico, es posible hacerlo?

      Saludos.

      Eliminar
    3. Sí, pero además de modificar la enumeración, habría que modificar un poco el código, ya que el archivo xml que genera una ruta con transporte público, es distinto...
      Un saludo

      Eliminar
    4. Gracias Luis,

      Hare lo que buenamente pueda :p

      Saludos.

      Eliminar
    5. De nada ;)
      Inténtalo, si te surge alguna duda, coméntalo a ver si te puedo ayudar.
      Un saludo

      Eliminar
  6. Hola Luis!.
    Excelente trabajo haz hecho.
    Tengo una pregunta con respecto a un proyecto que estoy haciendo.
    Quisiera saber si se puede mostrar el mapa y utilizar un PlaceMark que se pueda mover para que devuelva las coordenadas (Todo dentro de la misma aplicación). Es posible eso utilizando NetBeans?

    ResponderEliminar
  7. I can't set the search results language to english, please help!

    ResponderEliminar
    Respuestas
    1. in which folder i have to add this requette

      Eliminar
  8. Cual es la contraseña para iniciar?

    ResponderEliminar
    Respuestas
    1. Te tienes que registrar y obtener una clave de Google.
      Enlace: https://code.google.com/apis/console/

      Eliminar
  9. Luar biasa, terimakasih, salam dari Indonesia.. :)

    ResponderEliminar
  10. hola tengo una duda no se si sepas como hacer para que en google maps me salga como un icono pero que al hacer clic me habrá otra ventana de java (osea como un boton : P)

    ResponderEliminar
  11. Me podria pasar el link de la pagina donde descargo MapsJava.jar

    ResponderEliminar
    Respuestas
    1. https://onedrive.live.com/?cid=c6fdbf1f1fe1f985&id=C6FDBF1F1FE1F985%2132163

      Eliminar
  12. Buenos dias, Tengo una inquietud la libreria MapsJava.jar fue desarrollada por google.

    ResponderEliminar
    Respuestas
    1. Hola!
      Es una librería desarrollada por mí.
      Un saludo!

      Eliminar
  13. Hola una pregunta, esta librería que dices tu la hiciste tiene algún tipo de licencia o es completamente open source?, en el caso si tu la hiciste, te pregunto que tipo de clave necesito?? para usar tu clase places, porque viendo en Google solo tienen licencias para JavaScript y Flash

    ResponderEliminar
    Respuestas
    1. Hola.
      La clase la puedes usar sin restricciones.
      Con respecto a la clave, dentro de la consola de Google, desde ahí la activas.
      saludo

      Eliminar
    2. Gracias, tengo otra pregunta, en teoría la librería es una adaptación de las apis web supongo, pero tratando de buscar algunos sitios no me da los mismos resultados que buscándolos directamente desde Google maps, entonces la librería tiene algún tipo de limitación en comparación a las apis para javascript o es que debo setear alguna configuración en el código???. Gracias

      Eliminar
    3. Tiene librerías específicas para javascript (https://developers.google.com/maps/documentation/javascript/places?hl=es). En principio, revisando las opciones de la librería, son las mismas que haciendo la petición a través de petición HTTP.
      Lo que sí, a la hora de buscar un place en específico mediante su nombre, en google maps, encuentra el nombre a través del autocompletado, y ahí se pueden utilizar filtros y es más fácil que el place en concreto se busque con más precisión.
      https://developers.google.com/places/documentation/autocomplete?hl=es
      https://developers.google.com/places/documentation/query?hl=es
      Un saludo

      Eliminar
  14. Buenas Tardes

    muy buen trabajo

    una pregunta no hay forma de que se pueda dibujar la ruta que se le ingresa muchas gracias

    ResponderEliminar
  15. Entro al enlace para obtener la clave de google. Al ser introducida en el ejemplo facil no funciona

    ResponderEliminar
  16. Hola.
    Una vez que entras en la consola de Google y obtienes la clave, tienes que activar la opción de API places.
    Un saludo.

    ResponderEliminar
  17. hola, me encanta la libreria, pero consigo que me funcione. cuando ejecuto el metodo getAddress() el ArrayList siempre esta vacío... no entiendo porque. ¿se te ocurre algo por lo que me pueda pasar? deduzco que para usar solamente ese metodo no hace falta registrarme en la consola de google no? o si es necesario?

    ResponderEliminar
  18. con que versiones de la api de google maps funciona tu libreria? funciona con la 3?

    ResponderEliminar
  19. la libreria es magnifica. tengo una duda, que necesito para una aplicacion que estoy desrrollando. he visto en tu video "API Google Maps Java II", que consigues una imagen statica de una ruta para mostrar en la propia aplicacion. como podria hacer eso. necesito hacer lo mismo, pero que en vez de que me muestre el mapa estatico con cada tramo de la ruta, que me muestre un solo mapa estatico con la ruta completa marcada. es posible que me guies un poco? muchisimas gracias, da gusto que gente se tome la molestia de hacer librerias para facilitarnos la vida a los demas. muchisimas gracias.

    ResponderEliminar
    Respuestas
    1. Hola.
      Si te descargas el ejemplo que se ve en el vídeo (http://algoimagen.blogspot.com.es/2013/10/java-ejemplo-de-uso-mapsjava-api-google.html), al calcular la ruta, justo encima del mapa que se muestra, pone "Mapa general", si pulsas ahí se ve el mapa completo de la ruta.
      Un saludo

      Eliminar
    2. Dentro de "StaticMaps", uno de los métodos "getStaticMapRoute" tiene en su último parámetro un string que es "polilyne"
      Para obtener la polilínea completa de la ruta, una vez hemos hecho la petición de la ruta (con la clase Route), en la propiedad "getGeneralPolyline" se encuentra en string con la polilínea completa.

      Eliminar
    3. muchisimas gracias Luis, lo probaré esta tarde. De nuevo muchisimas gracias por regalarnos esta libreria tan util.

      Eliminar
    4. Luis, ¿hay alguna condicion relativa a los puntos intermedios de la ruta? si meto a mano, barcelona y madrid, me da la imagen bien. y por ejemplo si le meto de hito intermedio Almeria (sin acento), ya no me devuelve imagen, en cambion si le pongo el acento (Almería), si me la devuelve.

      yo recibo datos de posicion cada 5 minutos, y muchas veces esos datos son en la misma posicion, porque no hay movimiento, y me esta pasando que no me devuelve ninguna imagen. yo recogo del servidor latitud y longitud, y mediante el metodo correspondiente, consigo un arrayList con las direcciones en string. esas direcciones (las de la posicion [0], porque es la que mas detalles presenta), son las que uso como origen y destino e hitos intermedios., y luego creo otro arrayList para usar los hitos, con los nombres de las direcciones, pero eliminando primero el ultimo registro, ya que es el destino (String destino = arrayList.size()-1; //para extraer el destino) (arrayList.remove(arrayList.size()-1)), y el primer registro despues, que sería el origen. despues de borrar esos 2 registros, ese arrayList es el de los hitos.

      no se si se te ocurre algo por lo que me puede estar pasando esto.

      Eliminar
    5. de hecho, acabo de probar que si pongo Vigo de origen y Barcelona de destino, ya no me devuelve imagen :(

      Eliminar
    6. -Es posible que hayas agotado el número de peticiones de mapa. Y no recuerdo si poniendo clave de desarrollador (MapsJava.setKey(tuclavededesarrollador)), se incluía a la hora de hacer una petición de mapa estático (creo que no..). En ese caso tendrías que modificar la clase StaticMaps, y en la petición añadir "&key=tuclavededesarrollador".
      -Con respecto a hitos intermedios, hay limitación de 8.
      -Yo te recomiendo, cuando te dé fallos, revisar esta propiedad getStockRequest(), en la cual puedes ver las peticiones realizadas. Copias y pegas la petición en el navegador, y es más fácil ver de dónde vienen los fallos.
      Un saludo

      Eliminar
  20. Ya conozco la licencia del API de Google Maps, pero me podría decir donde consigo la información de la licencia de la librería?

    ResponderEliminar
    Respuestas
    1. Hola.
      La librería ha sido desarrollada por mí, y puedes hacer lo que quieras con ella ;)
      Un saludo

      Eliminar
  21. Me sale este errror cuando lo hago correr ayuda por favor tengo netbeans IDE 7.0

    java.lang.UnsupportedClassVersionError: mapsjava_ejemplofacil/MapsJava_EjemploFacil : Unsupported major.minor version 51.0

    ResponderEliminar
  22. Perdon que version de JDK??? usas y que version de JRE usas por favor me podrias avisar es que sale este error " Unsupported major.minor version 51.0"

    ResponderEliminar
    Respuestas
    1. El mismo error me aparece a mi. Como podriamos hace para hacerla funcionar en 1.6.

      Eliminar
  23. Hola, felicidades por todo el trabajo, me ha sido de muchísima utilidad.

    Te quería hacer una consulta si no es mucha molestia. He preparado una pequeña ejecución en Java para leer N puntos y calcular la matriz de distancias ejecutanto N*N veces el "getRoute". Sin embargo, ocurre algo curioso porque unas veces sí que calcula la ruta, pero otras veces no... Es más, si vuelvo a ejecutar los mismos N puntos, algunas rutas que antes había calculado ahora ya no las calculas y viceversa.

    ¿Por casualidad se te ocurre a qué se puede deber esto?

    Muchas gracias por adelantado y de nuevo felicidades por el blog.

    ResponderEliminar
  24. Saludo estoy implementando su proyecto pero simepre me da error en APIKEY y cuando le doy mostrar mapa me sale el siguiente mensaje en el navegador The Google Maps Embed API must be used in an iframe.

    ResponderEliminar
    Respuestas
    1. Hola

      Tienes que modificar un poquito las librerías y quitar esta parte "&output=embed" en ShowMaps.

      Un saludo

      Eliminar
    2. Cuando dices modificar las librerias... no puedo modificarlas porque estan compiladas... ¿Donde me puedo bajar el codigo sin compilar? Gracias!!

      Eliminar
    3. Ahora mismo no recuerdo qué archivo en concreto es. Pero seguro que está.
      Un saludo!

      Eliminar
    4. Tienes toda la razón del mundo!! Gracias!! :)

      Eliminar
  25. Hola

    Se puede saber de alguna forma la escala que se extrae del mapa? luego tengo que situar cosas encima de la imagen y es para poder situarlas en su lugar.

    Un saludo y muchas gracias por tu ayda

    ResponderEliminar
    Respuestas
    1. ¿En concreto en qué función? Detalla un poco la pregunta.
      Un saludo!

      Eliminar
    2. Hola seria en la función StaticMap, es para hacer una interface tipo radar aéreo. Por una lado con las librerías saco el mapa y por otro lado cojo los datos das-b con una tarjeta y quisiera situarlos en el mapa,

      Un saludo y perdón por las molestias.

      Eliminar
    3. Hola,
      La escala la podrías saber calculando la distancia que representa el mapa de esquina a esquina (con las coordenadas), con respecto a los pixeles del mapa estático. De todas maneras, supongo que si es para visualizar en la pantalla del ordenador, supongo que para saber la escala real habría que tener en cuenta los pixeles por pulgada... No lo tengo del todo claro..
      Un saludo

      Eliminar
  26. Es cierto que se usa menos código con las librerías para usar la nueva API de google maps?

    ResponderEliminar
  27. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  28. Hola Luis, excelente tu trabajo! Queria consultarte para ver si podrias ayudarme. Tengo el recorrido de un AUV justo con las coordenadas gps del recorrido. Mi idea es tratar de ver lo que el drone filmo y simultaneamente ir viendo como el google maps actualiza las coordenadas segundo a segundo, es decir, se estaria viendo lo mismo que filmo el drone. Sabes como podria hacer eso? Desde ya muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola Lucas.
      Quizá podrías utilizar un mapas estáticos (StaticMaps).

      StaticMaps ObjStatMap=new StaticMaps();
      Image resultadoMapa=ObjStatMap.getStaticMap("42,-6", 14,new Dimension(300,300), 1, StaticMaps.Format.png, StaticMaps.Maptype.roadmap);

      Puedes poner un temporizador, y que cada segundo actualice la imagen con las coordenadas actuales. De todas maneras, ten en cuenta las limitaciones de uso que tienen los mapas estáticos.
      Otra opción, es con una petición de este tipo:
      http://maps.googleapis.com/maps/api/staticmap?size=480x480&path=color:0x0000ff|weight:5|40.737102,-73.990318|40.749825,-73.987963|40.752946,-73.987384|40.755823,-73.986397
      Con lo que marcas la ruta de una vez, y después puedes ir desplazándote por la imagen. Más info en: https://developers.google.com/maps/documentation/staticmaps/?hl=es

      Eliminar
    2. Con esta última forma, ten en cuenta que si el path (recorrido) tienes muchas coordenadas, puede exceder el límite de 2048 caracteres para una URL, con lo que no se mostraría nada.
      Un saludo

      Eliminar
    3. Muchas gracias Luis! Lo pondré en practica.

      Eliminar
  29. first of all i would like to say thank you for your work! good job! but i wanna ask why my clace api is always not valid, and some function, like map doesnt work? please i need answer sir. thank you!

    ResponderEliminar
  30. HOLA LUIS , ESTOY MIRANDO TU COGIGO Y CUAL ES EL CODIGO DE DESARROLLADOR

    ResponderEliminar
  31. HOLA LUIS , ESTOY MIRANDO TU COGIGO Y CUAL ES EL CODIGO DE DESARROLLADOR

    ResponderEliminar
    Respuestas
    1. Hola,
      no entiendo muy bien la pregunta, si te refieres al código de las clases, es el archivo "Maps.jar"
      Un saludo

      Eliminar
  32. Hola Luis, grandísimo trabajo. Tengo un problema a ver si me lo pudieses resolver. Esta linea de código (que aparece en varias clases) me da error:

    setType(java.awt.Window.setType.UTILITY);

    La palabra Type aparece subrayada en rojo y no entiendo por que. ¿Sabrías decirme por que?
    Saludos

    ResponderEliminar
    Respuestas
    1. Perdon, es esta linea: setType(java.awt.Window.Type.UTILITY);

      Eliminar
  33. Hola Luís, mi admiración por tu trabajo.
    ¿Se puede crear con tu libreria una ruta comas de 8 hitos?. Google Maps standard no lo permite

    ResponderEliminar
  34. Espero no ser pesado.
    Se puede utilizar tu librería con otra fuente de mapas que no sea Google Maps (OpenStreetMaps, por ejemplo)

    ResponderEliminar
    Respuestas
    1. En ambas preguntas la respuesta es negativa.
      Un saludo

      Eliminar
  35. el proyecto ejemplo pide una clase de desarrollador al ejecutarla, cual es?

    ResponderEliminar
  36. el proyecto de ejemplo Mpasjava_EjemploFacil al ejecutar pide una clave de desarrollador, cual es?

    ResponderEliminar
  37. Buenas, ¿podrias explicar el funcionamiento de getStaticMapRoute, para sacar la imagen de la ruta de dos direcciones que pongas?

    Al tener solo un argumento String, no se que formato debe tener dicha cadena para poder señalar los dos puntos.

    ResponderEliminar
  38. hola sabes que no logro consegir la clave de desarrollador de la api me podrias instruir al respecto para poder utilizarla porfavor

    ResponderEliminar
  39. Hola buenisimo programa..pero solo una consulta cuando le doy en run me sale ese error:
    Exception in thread "main" java.lang.UnsupportedClassVersionError: maps/java/Geocoding : Unsupported major.minor version 51.0
    Favor de darme una manoo gracias!

    ResponderEliminar
  40. Hola, tu trabajo me servira de mucho. Tengo un problema al momento de cargar el mapa sale
    The Google Maps Embed API must be used in an iframe.
    Que tengo que hacer?

    ResponderEliminar
  41. exelente hermano felicitaciones que dios te bendiga mucho ya que te tomaste la molestia de compartir este trabajo que quisas a muchos de nosotros nos llevaria años llegar a ese nivel,
    pero gracias a ti hemos dado un gran paso en la programacion saludos

    ResponderEliminar
  42. Hola ! Hay alguna posibilidad de usar esta aplicación sin conexión???

    ResponderEliminar
    Respuestas
    1. Hola. No, necesitas conexión a Internet para poder obtener los datos.
      Un saludo

      Eliminar
  43. Hola, y como puedo hacerle para abrir en la aplicacion de escritorio el google maps , como si tuviera el navegador web dentro del frame. Saludos y gracias por el aporte!!

    ResponderEliminar
  44. Gran aporte y explicación, me ha venido genial.
    Tengo duda de como podría ubicar varios puntos Geocod en el mismo mapa.
    Genial entrada de post

    ResponderEliminar
  45. Buenas Luis. Antes de nada un gran trabajo, ojalá pudieramos hacerlo todos así.
    Yo estoy intentando hacer algo parecido pero mucho más sencillo, y debo hacerlo por mi propia vía se supone. En realidad solo debo sacar los tiempos de ruta entre dos puntos así que es quitarle muchísimo trabajo. Lo que no se es como introducir la libreria de google maps para java. En la página pone que se hace a través de maven o gradle pero por más que busco no me aclaro. Me puedes echar una mano? se que tu hiciste la libreria mapsjava, que se puede utilizar, pero es para poder entenderlo.
    Gracias de antemano si te encuentras muy liado.
    Un saludo.

    ResponderEliminar
  46. Hola Luis!!
    Sabes como se podría modificar la libreria para que permita mostar mas de una ruta?No quiero decir waypoints, sino mostrar dos rutas diferentes.
    Estoy un poco desesperada porque no se como hacerlo..
    Gracias..

    ResponderEliminar
  47. Se me olvidaba!!
    Gran trabajo con la libreria, es una pasada!

    ResponderEliminar
  48. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  49. Hola
    Muy buen proyecto
    Yo quiero Colocar una imágenes 360 (street view), pero no se como hacerlo quien me podría ayudar.

    ResponderEliminar
  50. Hola buenos dias necesito sacar una imagen como la de static maps con 2 puntos dereferencia y con la ruta me pueden ayudar es eso....

    ResponderEliminar
  51. Hola buenos dias, de ante mano muchisimas gracias por la libreria me a salvado la vida.. hasta los momento solo tengo un inconveniente, e implementado este codigo que tienes de ejemplo
    Elevation ObjElevat=new Elevation();
    double resultadoAlt=ObjElevat.getElevation(28.2725,-16.6425);
    System.out.println(String.valueOf(resultadoAlt));
    para el calculo de la elevacion pero sin importar las coordenadas que ingreso el valor que me trae siempre es 0.0... quisiera saber como poder resolver esto.....

    ResponderEliminar
  52. Hola Luis, admiro el trabajo que has realizado, solamente tengo un inconveniente, te explico:

    Al momento de hacer muchas peticiones con el metodo de la clase Route "getRoute()" sale un "indexOutOfBoundsException" dentro de la "clase MapsJava.java" he intentando crear diferentes instancias de Route pero el problema perciste, sería de gran ayuda si pudieras responder a este comentario.

    Saludos

    ResponderEliminar