Recuperar una dirección para unas coordenadas geográficas mediante la codificación geográfica inversa

Su aplicación puede utilizar la clase ReverseGeocoder para recuperar el nombre de una ubicación legible, como la dirección de una calle, una ciudad o un país, mediante una serie de coordenadas geográficas.

Cuando envía una solicitud de codificación geográfica inversa, puede especificar el límite administrativo del que desea recibir información (por ejemplo, la dirección de la calle, la ciudad o el país). La clase ReverseGeocodeExchange contiene las siguientes constantes que puede utilizar para especificar el nivel del límite administrativo.

  • ADDRESS: devuelve la dirección de la calle.
  • CITY: devuelve la ciudad.
  • COUNTRY: devuelve el país.
  • MCC: devuelve el código de país móvil.
  • POSTAL: devuelve el código postal.
  • PROVINCE_STATE: devuelve la provincia o el estado.
  • TIME_ZONE_ID: devuelve la zona horaria.

En las situaciones en las que la precisión sea esencial, tal vez desee solicitar que se devuelva la dirección de una calle. En otras situaciones, quizás necesite únicamente que se devuelva el nombre de la ciudad o el país.

Pueden darse casos en los que su aplicación envíe una solicitud de codificación geográfica inversa, pero no reciba los datos esperados. Por ejemplo, si su aplicación envía una solicitud mediante el límite administrativo ADDRESS y la ubicación geográfica está fuera del perímetro urbano, es posible que el servidor de codificación geográfica inversa no pueda localizar la dirección de una calle específica. En ese caso, es posible que sólo se devuelva a la aplicación el nombre del estado o la provincia.

Los resultados de las solicitudes de codificación geográfica inversa se agregan a una caché del dispositivo, excepto si la solicitud era para la dirección de una calle concreta. Cuando inicia una solicitud de codificación geográfica inversa, la aplicación comprueba si hay resultados de búsquedas anteriores en la caché antes de llamar al servidor, excepto en aquellos casos en los que se solicite una dirección específica. Las solicitudes de codificación geográfica inversa pueden ser síncronas o asíncronas.

Especificar las coordenadas geográficas de una ubicación

Para recuperar el nombre de una ubicación para unas coordenadas geográficas, debe crear un objeto MapPoint que contenga las coordenadas geográficas.
MapPoint location = new MapPoint(43.4815, -80.5407);

Enviar una solicitud de codificación geográfica inversa asíncrona

Cuando envía una solicitud de codificación geográfica inversa asíncrona, debe pasar una referencia a una clase que implemente la interfaz ServerExchangeCallback (representada por la variable callback en el siguiente ejemplo). También debe especificar las coordenadas de la ubicación, el límite administrativo, el rumbo del dispositivo y la cantidad de tiempo que puede transcurrir antes de que la solicitud caduque. Al invocar ReverseGeocoder.reverseGeocode(), la aplicación envía la solicitud al servidor de codificación geográfica y llama al método ServerExchangeCallback apropiado cuando obtiene un resultado.
int bearing = 1;
int timeout = 0;
MyServerExchangeCallback callback = new MyServerExchangeCallback();
try
{
    ReverseGeocoder.getInstance().reverseGeocode(callback, location, 
            ReverseGeocodeExchange.ADDRESS, bearing, timeout);
} 
catch (ReverseGeocodeException e)
{
    // Do something with the exception
}

Para crear una clase que implemente la interfaz ServerExchangeCallback, hay tres métodos que debe incluir en su aplicación: requestSuccess(), requestFailure() y requestHalted(). Cuando se completa una solicitud de codificación geográfica inversa, su aplicación invoca uno de estos métodos en función del resultado de la solicitud.

Una solicitud correcta de codificación geográfica inversa devuelve un objeto ReverseGeocodeExchange que contiene un Vector de resultados de búsqueda a los que pude acceder invocando ReverseGeocodeExchange.getResults(). El Vector contiene un objeto net.rim.device.api.lbs.maps.model.MapLocation que incluye detalles acerca de una ubicación, como el nombre de la ubicación, una descripción y las coordenadas. Para obtener la lista completa de propiedades, consulte la clase MapLocation.
public class MyServerExchangeCallback implements ServerExchangeCallback
{
    public void requestSuccess(ServerExchange exchange)
    {
        if(exchange instanceof ReverseGeocodeExchange)
        {
            // Casts the Exchange object to a ReverseGeocodeExchange 
            // object and retrieves the Vector of results.
            ReverseGeocodeExchange reverseGeocodeExchange = 
                    (ReverseGeocodeExchange)exchange;
            Vector results = reverseGeocodeExchange.getResults();
            // Do something with the results
        }
    }
    public void requestFailure(ServerExchange exchange)
    {
        // Inform the user of the failure
    }
    public void requestHalted()
    {
        // Invoked when the request is stopped
    }
}

Enviar una solicitud de codificación geográfica inversa síncrona

Para las solicitudes de codificación geográfica inversa síncronas, no es necesario que su aplicación implemente la interfaz ServerExchangeCallback. Para iniciar una solicitud de codificación geográfica síncrona, debe especificar null como argumento en lugar de pasar una referencia a una clase que implemente ServerExchangeCallback. Cuando ejecute una solicitud de codificación geográfica síncrona, deberá comprobar el resultado de la solicitud manualmente. Normalmente, deberá ejecutar las solicitudes de codificación geográfica síncronas en un subproceso diferente del subproceso de la interfaz de usuario ya que, de lo contrario, los usuarios no podrán interactuar con la interfaz de usuario durante la solicitud.
try
{ 
    ReverseGeocodeExchange exchange = ReverseGeocoder.getInstance().reverseGeocode(
            callback, location, ReverseGeocodeExchange.ADDRESS, bearing, timeout);
    // Check if the request was successful
    if(exchange.getExceptionList().size() == 0)
    {
        if(exchange instanceof ReverseGeocodeExchange)
        {
            // Casts the Exchange object to a ReverseGeocodeExchange 
            // object and retrieves the Vector of results.
	           ReverseGeocodeExchange reverseGeocodeExchange = 
                    (ReverseGeocodeExchange)exchange;
            Vector results = reverseGeocodeExchange.getResults();
            // Do something with the results
        }
    }
    else
    {
        // Inform the user of the failure
    }
}
catch(GeocodeException e)
{
    // Do something with the exception
}

¿Le ha resultado útil esta información? Envíenos sus comentarios.