Abrufen einer Adresse für geografische Koordinaten mithilfe der umgekehrten Geokodierung

Ihre Anwendung kann die ReverseGeocoder-Klasse verwenden, um mithilfe eines Satzes geografischer Koordinaten einen lesbaren Namen für einen Standort abzurufen, z. B. Adresse, Stadt oder Land.

Wenn Sie eine umgekehrte Geokodierungs-Anforderung senden, können Sie die administrative Begrenzung festlegen, für die Sie Informationen empfangen möchten (z. B. Adresse, Stadt oder Land). Die ReverseGeocodeExchange-Klasse enthält die folgenden Konstanten, die Sie verwenden können, um die Ebene der administrativen Begrenzung festzulegen.

  • ADDRESS: Gibt die Adresse zurück.
  • CITY: Gibt die Stadt zurück.
  • COUNTRY: Gibt das Land zurück.
  • MCC: Gibt den Mobile Country Code zurück.
  • POSTAL: Gibt die Postleitzahl zurück.
  • PROVINCE_STATE: Gibt die Provinz oder den Bundesstaat zurück.
  • TIME_ZONE_ID: Gibt die Zeitzone zurück.

In Situationen, die eine hohe Genauigkeit erfordern, möchten Sie u. U. eine Adresse anfordern. In anderen Situationen benötigen Sie möglicherweise nur den Namen der Stadt oder des Landes.

In manchen Fällen sendet Ihre Anwendung u. U. eine umgekehrte Geokodierungs-Anforderung, empfängt aber nicht die erwarteten Daten. Wenn Ihre Anwendung z. B. eine Anforderung sendet, die als administrative Begrenzung ADDRESS verwendet, und der geografische Ort außerhalb der Stadtgrenze liegt, kann der Server, der die umgekehrte Geokodierung durchführt, u. U. keine bestimmte Adresse finden. In diesem Fall wird möglicherweise nur der Name des Bundesstaates oder der Provinz an die Anwendung zurückgegeben.

Die Ergebnisse von umgekehrten Geokodierungs-Anforderungen werden zu einem Cache auf dem Gerät hinzugefügt, es sei denn, die Anforderung war für eine genaue Adresse. Wenn Sie eine umgekehrte Geokodierungs-Anforderung initiieren, prüft die Anwendung den Cache auf vorherige Suchergebnisse, bevor sie Daten vom Server abruft, es sei denn, Sie fordern eine bestimmte Adresse an. Umgekehrte Geokodierungs-Anforderungen können synchron oder asynchron sein.

Festlegen der geografischen Koordinaten für einen Standort

Um einen Standortnamen für geografische Koordinaten abzurufen, müssen Sie ein MapPoint-Objekt erstellen, das die geografischen Koordinaten enthält.
MapPoint location = new MapPoint(43.4815, -80.5407);

Senden einer asynchronen umgekehrten Geokodierungs-Anforderung

Wenn Sie eine asynchrone umgekehrte Geokodierungs-Anforderung senden, müssen Sie einen Hinweis auf die Klasse übergeben, die die ServerExchangeCallback-Schnittstelle implementiert (im folgenden Beispiel durch die callback-Variable dargestellt). Sie müssen auch die Koordinaten des Standorts, die administrative Begrenzung, die Peilung des Geräts und der Dauer der Zeitüberschreitung für die Anforderung festlegen. Wenn Sie ReverseGeocoder.reverseGeocode() aufrufen, sendet die Anwendung die Anforderung an den Geokodierungs-Server und ruft die entsprechende ServerExchangeCallback-Methode auf, wenn ein Ergebnis vorliegt.
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
}

Um eine Klasse zu erstellen, die die ServerExchangeCallback-Schnittstelle implementiert, müssen Sie drei Methoden einschließen: requestSuccess(), requestFailure() und requestHalted(). Wenn eine umgekehrte Geokodierungs-Anforderung abgeschlossen ist, ruft Ihre Anwendung eine dieser Methoden in Abhängigkeit vom Ergebnis der Anforderung auf.

Eine erfolgreiche umgekehrte Geokodierungs-Anforderung gibt ein ReverseGeocodeExchange-Objekt zurück, das einen Vector von Suchergebnissen enthält, auf den Sie durch Aufrufen von ReverseGeocodeExchange.getResults() zugreifen können. Der Vector enthält ein net.rim.device.api.lbs.maps.model.MapLocation-Objekt mit Details zu einem Standort, z. B. einen Standortnamen, eine Beschreibung und die Koordinaten. Eine vollständige Liste der Eigenschaften finden Sie in der MapLocation-Klasse.
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
    }
}

Senden einer synchronen umgekehrten Geokodierungs-Anforderung

Für synchrone umgekehrte Geokodierungs-Anforderungen muss Ihre Anwendung die ServerExchangeCallback-Schnittstelle nicht implementieren. Um eine synchrone Geokodierungs-Anforderung zu initiieren, müssen Sie null als Argument angeben, statt einen Hinweis auf eine Klasse zu übergeben, die ServerExchangeCallback implementiert. Wenn Sie eine synchrone Geokodierungs-Anforderung ausführen, müssen Sie das Ergebnis der Anforderung manuell überprüfen. In der Regel sollten Sie synchrone Geokodierungs-Anforderungen auf einem Thread ausführen, der nicht dem Benutzeroberflächen-Thread entspricht, da andernfalls Benutzer während der Anforderung nicht mit der Benutzeroberfläche interagieren können.
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
}

Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.