116

I want to show the location of an address in Google Maps.

How do I get the latitude and longitude of an address using the Google Maps API?

Irgendw Pointer
  • 1,428
  • 2
  • 24
  • 56
Kandha
  • 3,539
  • 12
  • 32
  • 46

9 Answers9

142
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;
    }
}

strAddress is a string containing the address. The address variable holds the converted addresses.

ud_an
  • 4,835
  • 4
  • 24
  • 42
  • 1
    It throws the "java.io.IOException service not available" – Kandha Aug 26 '10 at 13:02
  • 4
    You need the right permissions to be able to access the service. # – Flo Aug 26 '10 at 14:09
  • which android api version you are building application you need to have google api available i have build with google api 8. check that google api folder is there in your project. and in your manifest file add uses library com.google.android.maps – ud_an Aug 27 '10 at 03:57
  • 1
    i already gave those permission and include the library...i can get map view...it throws that IOException at geocoder... – Kandha Aug 27 '10 at 05:02
  • the logcat error was 09-02 16:32:22.861: ERROR/Exception(722): Service not Available 09-02 16:32:22.861: ERROR/Exception(722): java.io.IOException: Service not Available 09-02 16:32:22.861: ERROR/Exception(722): at android.location.Geocoder.getFromLocationName(Geocoder.java:159) 09-02 16:32:22.861: ERROR/Exception(722): at pack.sample.map.SampleMapApplication.onCreate(SampleMapApplication.java:36) 09-02 16:32:22.861: ERROR/Exception(722): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) – Kandha Sep 02 '10 at 11:02
  • 09-02 16:32:22.861: ERROR/Exception(722): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 09-02 16:32:22.861: ERROR/Exception(722): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 09-02 16:32:22.861: ERROR/Exception(722): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 09-02 16:32:22.861: ERROR/Exception(722): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 09-02 16:32:22.861: ERROR/Exception(722): at android.os.Handler.dispatchMessage(Handler.java:99) – Kandha Sep 02 '10 at 11:02
  • 09-02 16:32:22.861: ERROR/Exception(722): at android.os.Looper.loop(Looper.java:123) 09-02 16:32:22.861: ERROR/Exception(722): at android.app.ActivityThread.main(ActivityThread.java:4627) 09-02 16:32:22.861: ERROR/Exception(722): at java.lang.reflect.Method.invokeNative(Native Method) 09-02 16:32:22.861: ERROR/Exception(722): at java.lang.reflect.Method.invoke(Method.java:521) 09-02 16:32:22.861: ERROR/Exception(722): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) – Kandha Sep 02 '10 at 11:03
  • 09-02 16:32:22.861: ERROR/Exception(722): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 09-02 16:32:22.861: ERROR/Exception(722): at dalvik.system.NativeStart.main(Native Method) – Kandha Sep 02 '10 at 11:03
  • I had to add android.permission.ACCESS_FINE_LOCATION as permission – JP Hellemons Oct 06 '10 at 10:39
  • You might check a way through deal with this problem http://code.google.com/p/android/issues/detail?id=8816#c21 its pretty puch the same as geocoder – Necronet Nov 01 '10 at 06:05
  • Is there any solution to this problem? – Umberto Jul 04 '13 at 13:47
  • @ud_an There is no GeoPoint! – Dr.jacky Aug 01 '14 at 16:08
  • @ud_an Absolutly,it's there. :/ – Dr.jacky Aug 02 '14 at 19:45
  • @Mr.Hyde which API version you are using ? – ud_an Aug 03 '14 at 04:25
  • 6
    Check out the answer by @NayAneshGupte below, i don't think there is a `GeoPoint` class in the new libraries. Instead use `LatLng`. http://stackoverflow.com/a/27834110/2968401 – user2968401 Apr 24 '15 at 22:28
  • I call the method like "GeoPoint point= getLocationFromAddress("colombo,sri lanka");" but give null value. how to call it correctly – Tharindu Dhanushka Jan 14 '16 at 09:40
  • @LincolnWhite classes are changed with google maps api version V2 in place of GeoPoint new class is LatLang. you need google maps api in your project with key. and you just need to pass string address to this method to get lat,lang – ud_an Mar 17 '16 at 19:03
86

Ud_an's solution with updated API's

Note: LatLng class is part of Google Play Services.

Mandatory:

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

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

Update: If you have target SDK 23 and above, make sure you take care of runtime permission for location.

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;
}
Miguel Beltran
  • 1,905
  • 1
  • 19
  • 31
Nayanesh Gupte
  • 2,505
  • 22
  • 36
52

If you want to place your address in google map then easy way to use following

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

OR

if you needed to get lat long from your address then use Google Place Api following

create a method that returns a JSONObject with the response of the HTTP Call like following

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;
    }

now pass that JSONObject to getLatLong() method like following

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;
    }

I hope this helps to you nd others..!! Thank you..!!

Nirav Dangi
  • 3,517
  • 4
  • 47
  • 60
  • 1
    unfortunately this solution doesn't work with mobile connection of some mobile operators: the request always returns **OVER_QUERY_LIMIT**. Those mobile operators use NAT overloading, assigning the same IP to many devices... – Umberto Jul 04 '13 at 13:47
  • @UmbySlipKnot Can you explain more about OVER_QUERY_LIMIT? What is that? thank you. – FariborZ Feb 16 '17 at 03:13
7

The following code will work for 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

Where address is the String (123 Testing Rd City State zip) you want to convert to LatLng.

Neutrino
  • 311
  • 3
  • 3
4

This is how you can find the latitude and longitude of where we have click on map.

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;
} 

it works well.

To get the location's address we can use geocoder class.

gahooa
  • 114,573
  • 12
  • 89
  • 95
Rakesh Gondaliya
  • 1,207
  • 2
  • 25
  • 41
1

An answer to Kandha problem above :

It throws the "java.io.IOException service not available" i already gave those permission and include the library...i can get map view...it throws that IOException at geocoder...

I just added a catch IOException after the try and it solved the problem

    catch(IOException ioEx){
        return null;
    }
ylag75
  • 81
  • 1
  • 2
1
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();
    }
}
jay patoliya
  • 239
  • 2
  • 6
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();
        }
Manikanta Reddy
  • 573
  • 7
  • 13
0
public LatLang getLatLangFromAddress(String strAddress){
    Geocoder coder = new Geocoder(this, Locale.getDefault());
    List<Address> address;
    try {
        address = coder.getFromLocationName(strAddress,5);
        if (address == null) {
                return new LatLang(-10000, -10000);
            }
            Address location = address.get(0);
            return new LatLang(location.getLatitude(), location.getLongitude());
        } catch (IOException e) {
            return new LatLang(-10000, -10000);
        }
    }            

LatLang is a pojo class in this case.

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

Praveen
  • 160
  • 1
  • 13