Recupero di un indirizzo per le coordinate geografiche utilizzando il geocoding inverso

La classe ReverseGeocoder contiene metodi che consentono di recuperare un nome leggibile per una posizione, ad esempio un indirizzo, una città o un Paese, mediante una serie di coordinate geografiche.

Quando si invia una richiesta di geocoding inverso, è possibile specificare il limite amministrativo per cui si desidera ricevere le informazioni (ad esempio, l'indirizzo, la città o il Paese). La classe ReverseGeocodeExchange contiene le costanti seguenti, che è possibile utilizzare per specificare il livello di limite amministrativo.

  • ADDRESS: restituisce l'indirizzo.
  • CITY: restituisce la città.
  • COUNTRY: restituisce il Paese.
  • MCC: restituisce l'indicativo paese mobile.
  • POSTAL: restituisce il codice postale.
  • PROVINCE_STATE: restituisce la provincia o lo stato.
  • TIME_ZONE_ID: restituisce il fuso orario.

Nelle situazioni in cui la precisione è un fattore importante, potrebbe essere necessario richiedere un indirizzo civico. In altre situazioni, potrebbe essere necessario richiedere solo la città o il Paese.

In alcuni casi, l'applicazione potrebbe inviare una richiesta di geocoding inverso, senza ricevere i dati previsti. Ad esempio, se l'applicazione invia una richiesta che utilizza il limite amministrativo ADDRESS e la posizione geografica si trova al di fuori dei confini della città, il server di geocoding inverso potrebbe non essere in grado di individuare un indirizzo civico specifico. In tal caso, potrebbe venire restituito all'applicazione solo il nome dello stato o della provincia.

I risultati delle richieste di geocoding inverso vengono aggiunti a una cache sul dispositivo, tranne per le richieste di un indirizzo preciso. Quando si invia una richiesta di geocoding inverso, l'applicazione controlla nella cache i risultati della ricerca precedente prima di eseguire una chiamata al server, eccetto nei casi in cui venga richiesto un indirizzo specifico. Le richieste di geocoding inverso possono essere sincrone o asincrone.

Specifica delle coordinate geografiche per una posizione

Per recuperare il nome di una posizione per le coordinate geografiche, è necessario creare un oggetto MapPoint contenente tali coordinate.
MapPoint location = new MapPoint(43.4815, -80.5407);

Invio di una richiesta di geocoding inverso asincrona

Quando si invia una richiesta di geocoding inverso asincrona, è necessario passare un riferimento a una classe che implementa l'interfaccia ServerExchangeCallback (rappresentato dalla variabile callback nell'esempio seguente). È necessario specificare anche le coordinate della posizione, il limite amministrativo, la direzione del dispositivo e il periodo di tempo precedente alla scadenza della richiesta. Quando si richiama ReverseGeocoder.reverseGeocode(), l'applicazione invia la richiesta al server di geocoding e, se riceve un risultato, richiama il metodo ServerExchangeCallback appropriato.
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
}

Per creare una classe che implementa l'interfaccia ServerExchangeCallback, è necessario includere nell'applicazione tre metodi: requestSuccess(), requestFailure() e requestHalted(). Al termine di una richiesta di geocoding inverso, l'applicazione richiama uno di questi metodi in base al risultato della richiesta.

Una richiesta di geocoding inverso corretta restituisce un oggetto ReverseGeocodeExchange che contiene un elemento Vector con i risultati della ricerca ai quali è possibile accedere richiamando ReverseGeocodeExchange.getResults(). L'elemento Vector contiene un oggetto net.rim.device.api.lbs.maps.model.MapLocation con i dettagli di una posizione, ad esempio il nome, una descrizione e le coordinate della posizione. Per l'elenco completo delle proprietà, vedere la 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
    }
}

Invio di una richiesta di geocoding inverso sincrona

Per le richieste di geocoding inverso sincrone, l'applicazione non deve necessariamente implementare l'interfaccia ServerExchangeCallback. Per inviare una richiesta di geocoding inverso sincrona, è necessario specificare null anziché passare un riferimento a una classe che implementa ServerExchangeCallback. Quando si esegue una richiesta di geocoding sincrona, è necessario verificare manualmente il risultato della richiesta. In genere, è consigliabile eseguire le richieste di geocoding sincrone in un thread diverso dal thread dell'interfaccia utente; in caso contrario, l'utente non potrà interagire con l'interfaccia utente durante la richiesta.
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 informazioni sono state utili? Inviateci i vostri commenti.