Recupero delle coordinate geografiche di un indirizzo mediante il geocoding

L'applicazione può utilizzare la classe Geocoder per recuperare le coordinate geografiche di un indirizzo. Ad esempio, l'applicazione può richiedere all'utente un indirizzo e quindi visualizzare l'indirizzo su una mappa. L'indirizzo può essere una stringa non strutturata oppure un oggetto MapLocation. Le richieste di geocoding possono essere sincrone o asincrone.

Specifica di un indirizzo

Maggiori sono i dettagli forniti per un indirizzo, più accurati potranno essere i risultati. Ad esempio, se si fornisce solo un indirizzo civico, il server di geocoding potrebbe restituire un numero elevato di risultati. Tuttavia, se si fornisce un contesto geografico sufficiente con la richiesta, è possibile fornire il numero minimo di informazioni relative all'indirizzo. La stringa di indirizzo non strutturata non fornisce sempre gli stessi risultati di un indirizzo strutturato.
// Structured address
MapLocation address1 = new MapLocation();
address1.addData(MapLocation.LBS_LOCATION_CITY_KEY, "waterloo");
address1.addData(MapLocation.LBS_LOCATION_COUNTRY_KEY, "canada");
address1.addData(MapLocation.LBS_LOCATION_STREET_ADDRESS_KEY, "419 phillip st");
address1.addData(MapLocation.LBS_LOCATION_POSTAL_CODE_KEY, "N2L3X2");
// Unstructured address
String address2 = new String("419 phillip st, waterloo, canada, N2L3X2");

Come fornire il contesto geografico con l'indirizzo

Per consentire al server di geocoding di restituire i risultati più pertinenti, è consigliabile fornire un contesto geografico con la richiesta di geocoding. Per fornire il contesto, è possibile creare un oggetto MapDimensions che contiene le coordinate geografiche (ad esempio la posizione corrente dell'utente BlackBerry). Fornendo il contesto, l'applicazione può ricevere le coordinate geografiche pertinenti anche se un utente fornisce solo un indirizzo civico. Se non si fornisce un oggetto MapDimensions, l'applicazione può utilizzare l'ultima posizione salvata in BlackBerry Maps come contesto. Tuttavia, i risultati potrebbero non essere quelli desiderati.

Come procedura consigliata, è preferibile fornire il contesto dall'applicazione. Se l'applicazione non fornisce un contesto sufficiente con una richiesta, i risultati della ricerca potrebbero risultare irrilevanti. Quando viene creato un oggetto MapDimensions da utilizzare con le richieste di geocoding, i valori di larghezza, altezza, zoom e rotazione non sono significativi.
MapPoint origin = new MapPoint(43.4815, -80.5407);
MapDimensions context = new MapDimensions(origin, 480, 360, 5, 0);

Invio di una richiesta di geocoding asincrona

Quando si invia una richiesta di geocoding asincrona, è necessario passare un riferimento alla classe che implementa l'interfaccia ServerExchangeCallback (rappresentato dalla variabile callback nell'esempio di codice riportato di seguito). Inoltre, è necessario fornire l'indirizzo, il contesto geografico per la richiesta (ad esempio, la posizione corrente dell'utente) e il periodo di tempo prima del timeout della richiesta. Quando si richiama Geocoder.geocode(), l'applicazione invia la richiesta al server di geocoding e, se riceve un risultato, richiama il metodo ServerExchangeCallback appropriato.
MyServerExchangeCallback callback = new MyServerExchangeCallback();
try
{
    Geocoder.getInstance().geocode(callback, address1, context, 0);
} 
catch (GeocodeException 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, l'applicazione richiama uno di questi metodi in base al risultato della richiesta.

Una richiesta di geocoding riuscita restituisce un oggetto GeocodeExchange che contiene un elemento Vector con i risultati della ricerca ai quali è possibile accedere richiamando GeocodeExchange.getResults(). Ciascun indice nell'elemento Vector contiene un oggetto net.rim.device.api.lbs.maps.model.MapLocation con i dettagli su una posizione, ad esempio un nome visualizzato, una descrizione, le coordinate e l'indirizzo. Se vengono restituiti più risultati, il risultato più pertinente si trova nel primo indice dell'elemento Vector.
public class MyServerExchangeCallback implements ServerExchangeCallback
{
    public void requestSuccess(ServerExchange exchange)
    {
        if(exchange instanceof GeocodeExchange)
        {
            GeocodeExchange geocodeExchange = (GeocodeExchange)exchange;
            Vector results = geocodeExchange.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 sincrone, l'applicazione non deve necessariamente implementare l'interfaccia ServerExchangeCallback. Per inviare una richiesta di geocoding 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.
GeocodeExchange exchange = Geocoder.getInstance().geocode
        (null, address2, context, 0);
// Check if the request was successful
if(exchange.getExceptionList().size() == 0)
{
    // Do something with the result of the request
}
else
{
    // Inform the user of the failure
}
Argomento precedente: Geocoding e geocoding inverso

Le informazioni sono state utili? Inviateci i vostri commenti.