Obter um endereço para coordenadas geográficas usando geocodificação reversa

Seu aplicativo pode usar a classe ReverseGeocoder para recuperar um nome legível de uma localização, como a rua, cidade ou país, usando um conjunto de coordenadas geográficas.

Quando você envia uma solicitação de geocodificação reversa, pode especificar o limite administrativo do qual deseja receber informações (por exemplo, rua, cidade ou país). A classe ReverseGeocodeExchange contém as seguintes constantes que você pode usar para especificar o nível de limite administrativo.

  • ADDRESS: Retorna a rua.
  • CITY: Retorna a cidade.
  • COUNTRY: Retorna o país.
  • MCC: Retorna o código do país do celular.
  • POSTAL: Retorna o código postal ou CEP.
  • PROVINCE_STATE: Retorna a província ou o estado.
  • TIME_ZONE_ID: Retorna o fuso horário.

Em situações em que precisão é essencial, recomendamos a solicitação de uma rua. Em outras situações, talvez você só precise do nome da cidade ou do país.

Pode haver casos em que seu aplicativo envia uma solicitação de geocodificação reversa, mas não recebe os dados esperados no retorno. Por exemplo, se seu aplicativo envia uma solicitação usando o limite administrativo ADDRESS e a localização geográfica está fora dos limites de cidade, o servidor de geocodificação reversa talvez não possa localizar uma rua específica. Nesse caso, talvez só o nome de estado ou província seja retornado ao aplicativo.

Os resultados de solicitações de geocodificação reversa são adicionados a um cache no aparelho, exceto quando a solicitação foi para uma rua exata. Quando você inicia uma solicitação de geocodificação reversa, o aplicativo verifica o cache para ver resultados anteriores de pesquisa antes de fazer uma chamada ao servidor, exceto nesses casos em que você solicita um endereço específico. As solicitações de geocodificação reversa podem ser síncronas ou assíncronas.

Especificar as coordenadas geográficas para uma localização

Para obter um nome de localização para coordenadas geográficas, você deve criar um objeto MapPoint que contenha as coordenadas geográficas.
MapPoint location = new MapPoint(43.4815, -80.5407);

Enviar uma solicitação assíncrona de geocodificação reversa

Quando você envia uma solicitação assíncrona de geocodificação reversa, deve passar uma referência à classe que implementa a interface ServerExchangeCallback (representada pela variável callback no exemplo a seguir). Você também deve especificar as coordenadas da localização, o limite administrativo, a posição do aparelho e o período de tempo antes do qual a solicitação deve expirar. Quando você chama ReverseGeocoder.reverseGeocode(), o aplicativo envia a solicitação ao servidor de geocodificação e chama o método ServerExchangeCallback apropriado quando tem um 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 criar uma classe que implementa a interface ServerExchangeCallback, há três métodos que você deve incluir: requestSuccess(), requestFailure() e requestHalted(). Quando uma solicitação de geocodificação reversa é concluída, seu aplicativo chama um desses métodos, dependendo do resultado da solicitação.

Uma solicitação bem-sucedida de geocodificação reversa retorna um objeto ReverseGeocodeExchange que contém um Vector de resultados de pesquisa que você pode acessar chamando ReverseGeocodeExchange.getResults(). O Vector contém um objeto net.rim.device.api.lbs.maps.model.MapLocation que apresenta detalhes sobre uma localização, tal como o nome da localização, uma descrição e as coordenadas. Para ver a lista completa de propriedades, consulte a classe 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 uma solicitação de geocodificação reversa síncrona

Para solicitações síncronas de geocodificação reversa, seu aplicativo não precisa implementar a interface ServerExchangeCallback. Para iniciar uma solicitação síncrona de geocodificação reversa, você deve especificar null como argumento em vez de passar uma referência a uma classe que implementa ServerExchangeCallback. Ao executar uma solicitação síncrona de geocodificação, você deve verificar o resultado da solicitação manualmente. Geralmente, você deve executar solicitações síncronas de geocodificação em um thread diferente do thread da UI, senão os usuários não poderão interagir com a UI durante a solicitação.
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
}

Estas informações foram úteis? Gostaríamos de receber seus comentários.