Pregunta

Soy capaz de conseguir con éxito latitud / longitud y pasarlo al geocodificador poder obtener una dirección. Sin embargo, no siempre sale un posterior dirección. Parece que lleva un par de intentos? No estoy seguro de por qué.

¿Hay una mejor manera para mí para obtener la dirección en este punto?

public List<Address> getAddresses(){
          Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
          List<Address> addresses = new ArrayList();
             try {
       addresses = geocoder.getFromLocation(latitude, longitude, 1);
      } catch (IOException e) {
       e.printStackTrace();
      }

      return addresses;
        }

Estoy llamando a este método aquí:

LocationListener onLocationChange=new LocationListener() {
        public void onLocationChanged(Location loc) {
            //sets and displays the lat/long when a location is provided
            String latlong = "Lat: " + loc.getLatitude() + " Long: " + loc.getLongitude();   
            latitude = loc.getLatitude();
            longitude = loc.getLongitude();

            List<Address> addresses = getAddresses();

            if(addresses.size() > 0 && addresses != null)
             zipcode = addresses.get(0).getPostalCode();

            Toast.makeText(getApplicationContext(), zipcode,Toast.LENGTH_SHORT).show();
        }
¿Fue útil?

Solución

En mi experiencia, Googles Geocoder no siempre funciona, tengo un par de puntos fijos en el mapa, al hacer clic en la superposición que aparece una tostada con la dirección para esa latitud / longitud, estos puntos no cambian , a veces hago clic en un mismo punto 10 veces, pero solo me dan una dirección 7 de ellos.

Es raro, pero esa es la forma en que está, me acaba de modificar mi aplicación para evitar el problema.

Otros consejos

El problema con el enfoque anterior, así como muchos otros ejemplos en todo el Internet, es que sólo tratan de recuperar los datos desde el proveedor de primera regresado con addresses.get(0).getPostalCode(). Cuando se ejecuta el código de List<Address> addresses = getAddresses(), recupera una lista de proveedores, cada uno su propio suministro de datos. No todos los proveedores contendrán los mismos datos.

Yo tenía el mismo problema con la recepción del código postal. Durante mis pruebas iniciales, descubrí que estaba recibiendo datos de 6 proveedores. Sólo 2 de los 6 proveedores devuelto un código postal. El primer proveedor que estaba tratando de acceso con address.get(0).getPostalCode(), no era uno de ellos. Un enfoque más adecuado sería recorrer todos los proveedores vuelto a ver quien devolvió los datos que estaba buscando.

Algo parecido a lo siguiente debería funcionar. Las probabilidades son, uno de los proveedores devolverá el código postal. Esto puede hacerse por cualquiera de los datos de geocodificación que necesita devueltos por los proveedores.

List<Address> address = gc.getFromLocation(myLatitude, myLongitude, 10);

if (address.size() > 0) {
   strZipcode = address.get(0).getPostalCode();

   //if 1st provider does not have data, loop through other providers to find it.
   count = 0;
   while (strZipcode == null && count < address.size()) {
      strZipcode = address.get(count).getPostalCode();
      count++;
   }
}

por si alguien todavía está buscando una solución, esto es lo que hice: En primer lugar, se aseguró de que todos los puntos estaban bien (cargaría), pero no siempre consiguen agarrado por geocodificación (obtener los datos es impredecible) En segundo lugar, forzamos el código para hacer lo que queremos que haga, en otras palabras, si sabemos que puede encontrar una latitud y longitud, deja apenas para hacer que seguir intentando hasta que lo haga! este diddnt parece afectar el tiempo de carga, ya sea! así que aquí está el código:

do {
$geocode=file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$prepAddr.'&key='.$key.'sensor=false');

$output= json_decode($geocode);
$lat = $output->results[0]->geometry->location->lat;
$long = $output->results[0]->geometry->location->lng;
} while($lat == '' and $long == '');

esto seguirá bucle hasta que ambos lat y largo no son cadenas vacías!

codificación feliz! : P

Geocoder no funciona en algunas áreas. En lugar de utilizar Geocoder, puede utilizar API de codificación geográfica. Sigue el enlace para obtener los detalles acerca de la API,

https://developers.google.com/s/results/? q = geocodificación + api

Si está utilizando autocompletar puede obtener el lugar de ubicación de la plaza objeto:

private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback
        = new ResultCallback<PlaceBuffer>() {
    @Override
    public void onResult(PlaceBuffer places) {
        if (!places.getStatus().isSuccess()) {
            // Request did not complete successfully
            AALog.e("Geocoder Place query did not complete. Error: " + places.getStatus().toString());
            return;
        }
        // Get the Place object from the buffer.
        final Place place = places.get(0);
        //--------------here you can recover the place location---------------------
        ((DrawerActivity)getActivity()).lastPlace = place.getLatLng();
        //----------------------------------------------------------------------           
        places.release();
        getActivity().getFragmentManager().beginTransaction().remove(AutocompleteFragment.this).commit();
    }
};

Esta devolución de llamada debe ser registrado como seguimiento dentro AdapterView.OnItemClickListener:

        PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi
                .getPlaceById(mGoogleApiClient, placeId);
        placeResult.setResultCallback(mUpdatePlaceDetailsCallback);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top