2009-01-23 9 views
45

Estoy tratando de obtener una dirección basada en long/lat. parece que algo como esto debería funcionar?Android: geocodificación inversa - getFromLocation

Geocoder myLocation = Geocoder(Locale.getDefault()); 
    List myList = myLocation.getFromLocation(latPoint,lngPoint,1); 

La cuestión es que me siguen dando: El método Geocoder (Locale) no está definida para el tipo savemaplocation

Cualquier ayuda sería de gran ayuda. Gracias.


Gracias, he intentado el contexto, un entorno regional, en primer lugar, y que fracasó y estaba mirando a algunos de los otros constructores (que había visto que había mencionado solo local). En cualquier caso,

no funcionó, ya que todavía estoy recibiendo: El método Geocoder (Contexto, Locale) no está definida para el tipo savemaplocation

tengo: android.location.Geocoder importación;

Respuesta

62

El siguiente fragmento de código está haciendo por mí (lat y lng dobles mencionadas este bit):

Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1); 
+1

También probé esto, cada vez que trato de ver la lista de direcciones, explota. No estoy seguro de lo que está pasando. Voy a probar con una nueva aplicación aquí en un día o dos para ver qué puedo encontrar. – Chrispix

+4

Encontré esto muy útil para posicionar cosas: http://blogoscoped.com/archive/2008-12-15-n14.html –

+1

... también tengo los siguientes dos permisos en mi manifiesto: Cuando omití una de ellas (no recuerdo cuál) la aplicación arrojó un error realmente inútil. –

34

Parece que hay dos cosas que suceden aquí.

1) Se ha perdido la palabra clave new de antes de llamar al constructor.

2) El parámetro que está pasando al constructor de Geocoder es incorrecto. Está pasando en un Locale donde está esperando un Context.

Hay dos Geocoder constructores, los cuales requieren un Context, y también se toma una Locale:

Geocoder(Context context, Locale locale) 
Geocoder(Context context) 

Solución

modificar el código para pasar en un contexto válido e incluyen new y deberías ser bueno para ir.

Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); 
List<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1); 

Nota

Si todavía tiene problemas, puede ser un problema para conceder permiso. La geocodificación utiliza implícitamente Internet para realizar las búsquedas, por lo que su aplicación requerirá una etiqueta de permiso de uso INTERNET en su manifiesto.

Agregue el siguiente nodo permisos de uso dentro del nodo manifest de su manifiesto.

<uses-permission android:name="android.permission.INTERNET" /> 
+0

Gracias, creo que estaba trabajando demasiado tarde la noche anterior, no está seguro de lo que pasó con mi nueva. Creo que lo olvidé originalmente, lo volví a poner cuando solo tenía mi Locale, y luego cuando regresé, lo olvidé de nuevo ... Lo aprecio ... – Chrispix

+0

No me preocupo, tampoco lo descubrí la primera vez :) –

2

Bueno, todavía estoy perplejo. Así que aquí hay más código.

Antes de dejar mi mapa, llamo al SaveLocation(myMapView,myMapController); Esto es lo que termina llamando a mi información de geocodificación.

Pero desde getFromLocation puede lanzar una IOException, que tenía que hacer lo siguiente para llamar SaveLocation

try 
{ 
    SaveLocation(myMapView,myMapController); 
} 
catch (IOException e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Entonces tengo que cambiar SaveLocation diciendo que arroja IOExceptions:

public void SaveLocation(MapView mv, MapController mc) throws IOException{ 
    //I do this : 
    Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); 
    List myList = myLocation.getFromLocation(latPoint, lngPoint, 1); 
//... 
    } 

Y se estrella cada vez.

+0

Podría ser un problema de permisos. El geocodificador usa Internet para realizar las búsquedas, por lo que necesita un permiso de uso de Internet. Actualizó la respuesta con detalles. –

+0

Tengo los permisos de internet allí para el mapeo. Muy extraño por qué sigue fallando. Déjame obtener un logcat. – Chrispix

+0

Esta es la excepción que obtengo: java.lang.IllegalArgumentException: latitude == 3.2945512E7 – Chrispix

0

He oído que Geocoder está en el lado buggy. Recientemente, armé una aplicación de ejemplo que usa el servicio de geocodificación http de Google para buscar la ubicación desde latitud/longitud. No dude en comprobar que funciona aquí

http://www.smnirven.com/?p=39

40

Aquí es un ejemplo de código completo usando un hilo y un manejador para obtener la respuesta Geocoder sin bloquear la interfaz de usuario.

Geocoder procedimiento de llamada, se puede situar en una clase de ayuda

public static void getAddressFromLocation(
     final Location location, final Context context, final Handler handler) { 
    Thread thread = new Thread() { 
     @Override public void run() { 
      Geocoder geocoder = new Geocoder(context, Locale.getDefault()); 
      String result = null; 
      try { 
       List<Address> list = geocoder.getFromLocation(
         location.getLatitude(), location.getLongitude(), 1); 
       if (list != null && list.size() > 0) { 
        Address address = list.get(0); 
        // sending back first address line and locality 
        result = address.getAddressLine(0) + ", " + address.getLocality(); 
       } 
      } catch (IOException e) { 
       Log.e(TAG, "Impossible to connect to Geocoder", e); 
      } finally { 
       Message msg = Message.obtain(); 
       msg.setTarget(handler); 
       if (result != null) { 
        msg.what = 1; 
        Bundle bundle = new Bundle(); 
        bundle.putString("address", result); 
        msg.setData(bundle); 
       } else 
        msg.what = 0; 
       msg.sendToTarget(); 
      } 
     } 
    }; 
    thread.start(); 
} 

Aquí está la llamada a este procedimiento Geocoder en su actividad de interfaz de usuario:

getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler()); 

Y el controlador para mostrar los resultados en su interfaz de usuario:

private class GeocoderHandler extends Handler { 
    @Override 
    public void handleMessage(Message message) { 
     String result; 
     switch (message.what) { 
     case 1: 
      Bundle bundle = message.getData(); 
      result = bundle.getString("address"); 
      break; 
     default: 
      result = null; 
     } 
     // replace by what you need to do 
     myLabel.setText(result); 
    } 
} 

No olvide poner el siguiente permiso en su Manifest.xml

<uses-permission android:name="android.permission.INTERNET" /> 
+0

el código funciona sin defectos, gran base para personalizar más – John

+0

Este es el correcto otro Android a través de 'NetworkOnMainThreadException'. Alternativamente, incluso se puede usar un' AsyncTask' más simple para hacer esto – Nezam

+0

La dirección geocodificada inversa aparece varias veces. No sé por qué? –

4

Primero obtenga Latitude y Longitude utilizando la clase Ubicación y LocationManager. Ahora pruebe el siguiente código para Obtener la ciudad, información de la dirección

double latitude = location.getLatitude(); 
double longitude = location.getLongitude(); 
Geocoder gc = new Geocoder(this, Locale.getDefault()); 
try { 
    List<Address> addresses = gc.getFromLocation(lat, lng, 1); 
    StringBuilder sb = new StringBuilder(); 
    if (addresses.size() > 0) { 
     Address address = addresses.get(0); 
     for (int i = 0; i < address.getMaxAddressLineIndex(); i++) 
      sb.append(address.getAddressLine(i)).append("\n"); 
      sb.append(address.getLocality()).append("\n"); 
      sb.append(address.getPostalCode()).append("\n"); 
      sb.append(address.getCountryName()); 
    } 

Información de la ciudad ahora está en sb. Ahora convierta el sb a String (usando sb.toString()).

+0

¡Gracias esto ayudó! – morty346

7

La razón de esto es el servicio backend inexistente:

clase El Geocoder requiere un servicio de back-end que no se incluye en el marco androide núcleo. Los métodos de consulta de Geocoder devolverán una lista vacía si no hay servicio de back-end en la plataforma.

+0

Esta es la respuesta correcta. Las otras respuestas no funcionarán sin back-end. – ajeh

0

Utilice esta

Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1); 
Cuestiones relacionadas