Récupération d'une adresse avec coordonnées géographiques à l'aide du géocodage inversé

Votre application peut utiliser la classe ReverseGeocoder pour récupérer le nom intelligible d'une position, de type adresse, ville ou pays, à l'aide d'un ensemble de coordonnées géographiques.

Lorsque vous envoyez une requête de géocodage inversé, vous pouvez indiquer la limite administrative pour laquelle recevoir des informations, par exemple, adresse, ville ou pays. La classe ReverseGeocodeExchange contient les constantes suivantes que vous pouvez utiliser pour indiquer le niveau de limite administrative.

  • ADDRESS : renvoie le type et le nom de la voie.
  • CITY : renvoie la ville.
  • COUNTRY : renvoie le pays.
  • MCC : renvoie le code pays du réseau mobile.
  • POSTAL : renvoie le code postal.
  • PROVINCE_STATE : renvoie la province ou l'état.
  • TIME_ZONE_ID : renvoie le fuseau horaire.

Dans les situations pour lesquelles la précision est essentielle, un adresse précise peut être utile. Dans d'autres situations, le nom de la ville ou le pays peut être suffisant.

Parfois, votre application envoie une requête de géocodage inversé mais ne reçoit pas les données attendues en retour. Par exemple, si votre application envoie une requête avec la limite administrative ADDRESS, si la position géographique est hors des limites de la ville, il est possible que le serveur de géocodage inversé ne parvienne à localiser une adresse précise. Dans ce cas, seul le nom de la province/du département peut être renvoyé à l'application.

Les résultats de requêtes de géocodage inversé sont mis en cache sur le terminal, sauf lorsque la requête portait sur une adresse précise. Lorsque vous initiez une requête de géocodage inversé, l'application recherche dans le cache les résultats de recherche précédents avant d'appeler le serveur, sauf si votre requête porte sur une adresse spécifique. Les requêtes de géocodage inversé peuvent être synchrones ou asynchrones.

Indication des coordonnées géographiques d'une position

Pour récupérer le nom d'une position avec coordonnées géographiques, vous devez créer un objet MapPoint contenant les coordonnées géographiques.
MapPoint location = new MapPoint(43.4815, -80.5407);

Envoi d'une requête de géocodage inversé asynchrone

Lorsque vous envoyez une requête de géocodage inversé asynchrone, vous devez transmettre une référence à une classe qui met en œuvre l'interface ServerExchangeCallback, représentée par la variable callback dans l'échantillon de code suivant. Vous devez également indiquer les coordonnées de la position, la limite administrative, l'orientation du terminal et le délai avant arrivée à expiration de la requête. Lorsque vous appelez ReverseGeocoder.reverseGeocode(), l'application envoie la requête au serveur de géocodage et appelle la méthode ServerExchangeCallback appropriée en la présence d'un résultat.
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
}

Pour créer une classe déployant l'interface ServerExchangeCallback, vous devez inclure trois méthodes : requestSuccess(), requestFailure() et requestHalted(). Lors du traitement d'une requête de géocodage inversé, votre application appelle l'une de ces méthodes selon le résultat de la requête.

Lorsqu'une requête de géocodage inversé aboutit, elle renvoie un objet ReverseGeocodeExchange contenant un objet Vector de résultats de recherche, auquel vous pouvez accéder en appelant ReverseGeocodeExchange.getResults(). L'objet Vector contient un objet net.rim.device.api.lbs.maps.model.MapLocation intégrant des informations concernant une position, telles que le nom de la position, une description et les coordonnées. Pour obtenir la liste complète de propriétés, consultez 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
    }
}

Envoi d'une requête de géocodage inversé synchrone

Pour les requêtes de géocodage inversé synchrone, votre application n'est pas contrainte de déployer l'interface ServerExchangeCallback. Pour établir une requête de géocodage synchrone, vous devez indiquer null en tant qu'argument au lieu de transmettre une référence à une classe déployant ServerExchangeCallback. Lorsque vous exécutez une requête de géocodage synchrone, vous devez en vérifier le résultat manuellement. Généralement, vous devez exécuter les requêtes de géocodage synchrone sur un thread autre que le thread d'interface utilisateur. Sinon, les utilisateurs ne pourront pas interagir avec l'interface utilisateur pendant la requête.
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
}

Ces informations vous ont-elles été utiles ? Envoyez-nous vos commentaires.