¿Cómo puedo encontrar la latitud y la longitud de la dirección?


Respuestas:


139
public GeoPoint getLocationFromAddress(String strAddress){

Geocoder coder = new Geocoder(this);
List<Address> address;
GeoPoint p1 = null;

try {
    address = coder.getFromLocationName(strAddress,5);
    if (address==null) {
       return null;
    }
    Address location=address.get(0);
    location.getLatitude();
    location.getLongitude();

    p1 = new GeoPoint((double) (location.getLatitude() * 1E6),
                      (double) (location.getLongitude() * 1E6));

    return p1;
    }
}

strAddresses una cadena que contiene la dirección. La addressvariable contiene las direcciones convertidas.


1
Lanza

3
Necesita los permisos adecuados para poder acceder al servicio. # <uses-allow android: name = "android.permission.ACCESS_COARSE_LOCATION" /> <uses-allow android: name = "android.permission.INTERNET" />
Flo

qué versión de la api de Android está creando la aplicación que necesita para tener la API de Google disponible. Tengo una compilación con la API de Google 8. Compruebe que la carpeta de la API de Google esté en su proyecto. y en su archivo de manifiesto agregue la biblioteca de usos com.google.android.maps
ud_an

1
Ya les di esos permisos e incluí la biblioteca ... puedo obtener la vista del mapa ... arroja esa IOException en el geocodificador ...
Kandha

6
Consulte la respuesta de @NayAneshGupte a continuación, no creo que haya una GeoPointclase en las nuevas bibliotecas. En su lugar utilice LatLng. stackoverflow.com/a/27834110/2968401
user2968401

80

Solución de Ud_an con API's actualizadas

Nota : la clase LatLng es parte de Google Play Services.

Obligatorio :

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

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

Actualización: si tiene el SDK de destino 23 y superior, asegúrese de tener el permiso de tiempo de ejecución para la ubicación.

public LatLng getLocationFromAddress(Context context,String strAddress) {

    Geocoder coder = new Geocoder(context);
    List<Address> address;
    LatLng p1 = null;

    try {
        // May throw an IOException
        address = coder.getFromLocationName(strAddress, 5);
        if (address == null) {
            return null;
        }

        Address location = address.get(0);
        p1 = new LatLng(location.getLatitude(), location.getLongitude() );

    } catch (IOException ex) {

        ex.printStackTrace();
    }

    return p1;
}

2
Gracias, funcionó para mí, la solución anterior no funcionaba.
Rizwan Sohaib

1
Al crear una instancia del Geocoder, debe pasar el contexto Geocoder coder = new Geocoder (this); o nuevo Geocoder (getApplicationContext) no getActivity () como se indica en la respuesta.
The_Martian

1
@Quantumdroid El código anterior está escrito en un fragmento. De lo contrario, está absolutamente en lo cierto. Es contexto.
Nayanesh Gupte

2
Solución hermosa y limpia. Ninguna de las respuestas menciona que Geocoder usa acceso síncrono, por lo que se recomienda encarecidamente poner esto en un servicio en segundo plano para evitar bloquear la interfaz de usuario.
The_Martian

1
Gran solución. Se llamará a IOException cuando se ingrese una dirección / código postal no válido. Puede evitar ese error con un simple if(address.size() <1){//show a Toast}else{//put rest of code here}
grantespo

51

Si desea colocar su dirección en el mapa de Google, entonces es una forma fácil de usar siguiendo

Intent searchAddress = new  Intent(Intent.ACTION_VIEW,Uri.parse("geo:0,0?q="+address));
startActivity(searchAddress);

O

si necesita obtener lat long desde su dirección, use Google Place Api siguiendo

cree un método que devuelva un JSONObject con la respuesta de la llamada HTTP como sigue

public static JSONObject getLocationInfo(String address) {
        StringBuilder stringBuilder = new StringBuilder();
        try {

        address = address.replaceAll(" ","%20");    

        HttpPost httppost = new HttpPost("http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false");
        HttpClient client = new DefaultHttpClient();
        HttpResponse response;
        stringBuilder = new StringBuilder();


            response = client.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }
        } catch (ClientProtocolException e) {
        } catch (IOException e) {
        }

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject = new JSONObject(stringBuilder.toString());
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return jsonObject;
    }

ahora pase ese JSONObject al método getLatLong () como sigue

public static boolean getLatLong(JSONObject jsonObject) {

        try {

            longitute = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lng");

            latitude = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lat");

        } catch (JSONException e) {
            return false;

        }

        return true;
    }

Espero que esto te ayude a ti ya otros .. !! Gracias..!!


1
desafortunadamente, esta solución no funciona con la conexión móvil de algunos operadores móviles: la solicitud siempre devuelve OVER_QUERY_LIMIT . Esos operadores móviles usan la sobrecarga de NAT, asignando la misma IP a muchos dispositivos ...
Umberto

@UmbySlipKnot ¿Puedes explicar más sobre OVER_QUERY_LIMIT? ¿Que es eso? gracias.
FariborZ

7

El siguiente código funcionará para google apiv2:

public void convertAddress() {
    if (address != null && !address.isEmpty()) {
        try {
            List<Address> addressList = geoCoder.getFromLocationName(address, 1);
            if (addressList != null && addressList.size() > 0) {
                double lat = addressList.get(0).getLatitude();
                double lng = addressList.get(0).getLongitude();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } // end catch
    } // end if
} // end convertAddress

Donde dirección es la cadena (código postal 123 Testing Rd City State) que desea convertir a LatLng.


3

Así es como se puede encontrar la latitud y longitud de donde hemos hecho clic en el mapa.

public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{   
    //---when user lifts his finger---
    if (event.getAction() == 1) 
    {                
        GeoPoint p = mapView.getProjection().fromPixels(
            (int) event.getX(),
            (int) event.getY());

        Toast.makeText(getBaseContext(), 
             p.getLatitudeE6() / 1E6 + "," + 
             p.getLongitudeE6() /1E6 , 
             Toast.LENGTH_SHORT).show();
    }                            
    return false;
} 

funciona bien.

Para obtener la dirección de la ubicación, podemos usar la clase de geocodificador.


1

Una respuesta al problema de Kandha anterior:

Lanza el "servicio java.io.IOException no disponible" ya le di esos permisos e incluyo la biblioteca ... puedo obtener una vista de mapa ... arroja esa IOException en el geocoder ...

Acabo de agregar una excepción IOException después del intento y resolvió el problema

    catch(IOException ioEx){
        return null;
    }

0
Geocoder coder = new Geocoder(this);
        List<Address> addresses;
        try {
            addresses = coder.getFromLocationName(address, 5);
            if (addresses == null) {
            }
            Address location = addresses.get(0);
            double lat = location.getLatitude();
            double lng = location.getLongitude();
            Log.i("Lat",""+lat);
            Log.i("Lng",""+lng);
            LatLng latLng = new LatLng(lat,lng);
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(latLng);
            googleMap.addMarker(markerOptions);
            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,12));
        } catch (IOException e) {
            e.printStackTrace();
        }

1
Ese cheque nulo no está haciendo nada.
AjahnCharles

0
public void goToLocationFromAddress(String strAddress) {
    //Create coder with Activity context - this
    Geocoder coder = new Geocoder(this);
    List<Address> address;

    try {
        //Get latLng from String
        address = coder.getFromLocationName(strAddress, 5);

        //check for null
        if (address != null) {

            //Lets take first possibility from the all possibilities.
            try {
                Address location = address.get(0);
                LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

                //Animate and Zoon on that map location
                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                mMap.animateCamera(CameraUpdateFactory.zoomTo(15));
            } catch (IndexOutOfBoundsException er) {
                Toast.makeText(this, "Location isn't available", Toast.LENGTH_SHORT).show();
            }

        }


    } catch (IOException e) {
        e.printStackTrace();
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.