¿Cómo usar la API de Geonames?

24/07/2017

Si te mueves en el mundo de los datos abiertos habrás tenido que utilizar diferentes fuentes de datos para enriquecer tus información. Si es así, te sugiero que revises el repositorio geográfico de libre acceso Geonames. Como otros repositorios, dispone de diferentes librerías en diferentes lenguajes de programación para poder realizar búsquedas y trabajar con los resultados. En particular, en este artículo se utilizará la librería de Java.

En primer lugar debes crearte una cuenta y habilitar el uso de los servicios web. Geonames no permite el uso ilimitado de sus servicios y tu usuario sera indispensable para poder realizar hasta 2000 peticiones al día. En caso contrario, el servicio no funcionará.

Una vez tenemos el usuario creado, debemos crear un proyecto Java que incluya la librería. Me gusta la estructura de los proyectos Maven, pero no he conseguido localizar la librería en ningún repositorio y al final he optado por instalarla de forma local de la siguiente forma. Creamos en primer lugar la carpeta /lib/org/geonames/1.1.13/ y dentro copiamos el fichero geonames-1.1.13.jar (en su última versión) que descargaremos de la página de descargas de Geonames. A continuación añadimos el siguiente código a nuestro fichero pom.xml:

<dependency>
     <groupId>bvmc</groupId>
     <artifactId>geonames</artifactId>
     <scope>system</scope>
     <version>1.1.13</version>
     <systemPath>${basedir}/lib/org/geonames/1.1.13/geonames-1.1.13.jar</systemPath>
</dependency>

Ya tenemos disponible la librería en nuestro proyecto para poder utilizarla. A continuación simplemente tenemos que crear una clase que incluya el siguiente código:


public class GeonameService
{

  private static String username = "usuario";
  private static int maxResults = 5;

  public ToponymSearchResult search(String query){
    WebService.setUserName(username);
    ToponymSearchResult searchResult = null;

    if(!query.isEmpty()){

      ToponymSearchCriteria searchCriteria = new ToponymSearchCriteria();
      searchCriteria.setQ(query);

      // configurar el tipo de resultado
      //searchCriteria.setFeatureClass(FeatureClass.P);
      searchCriteria.setMaxRows(maxResults);
      searchCriteria.setFeatureClass(FeatureClass.P);

      try {
          searchResult = WebService.search(searchCriteria);
          
          for(Toponym t: searchResult.getToponyms()){
             System.out.println("PLACE matching IdGeonames: " + t.getGeoNameId() + 
                         " " + t.getName() + " country: " + t.getCountryName());
          }
      } catch (Exception e) {
          System.out.println("Error Geonames webservice." + e.getMessage());
      }
    }
    return searchResult;

  }
}

La variable username debe contener el valor de vuestro usuario y simplemente es necesario crear un objeto de tipo GeonameService y llamar al método search con el valor del texto de búsqueda.

Como podéis comprobar es muy sencillo y así podéis tener un primer ejemplo de programa para detectar lugares en vuestra base de datos 🙂

¡Espero que os haya gustado!