简体   繁体   中英

How to get address from latitude and longitude in Android?

I am building an android application where I am using TouchableWrapper class for getting latitude & longitude.When a user removes the finger, the camera center position latitude and longitude are parsed and shown in a toast. Now all I need is the address at that latitude and longitude . Here is code that I am using to get latitude and longitude :

public class MainActivity extends FragmentActivity implements TouchActionDown, TouchActionUp {
    CameraPosition mDownCameraPosition;
    CameraPosition mUpCameraPosition;
    ImageView submitbtn,mappoint;
    String addressfixed,completed;
    EditText whitebord;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maintut);

        // get data views
        mappoint = (ImageView) findViewById(R.id.mappoint);
        whitebord = (EditText) findViewById(R.id.searchmapedit);
        mappoint.setImageResource(R.drawable.point);
        submitbtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                onBackPressed();
            }
        });
        getMap().getMap().setMyLocationEnabled(true);
        getMap().getMap().setOnMapLoadedCallback(
                new GoogleMap.OnMapLoadedCallback() {
                    @Override
                    public void onMapLoaded() {
                        Location myLocation = getMap().getMap().getMyLocation();
                        LatLng myLatLng = new LatLng(myLocation.getLatitude(),
                                myLocation.getLongitude());

                        CameraPosition myPosition = new CameraPosition.Builder()
                                .target(myLatLng).zoom(17).bearing(90).tilt(30)
                                .build();
                        getMap().getMap().animateCamera(
                                CameraUpdateFactory
                                        .newCameraPosition(myPosition));
                    }
                });
    }

    @Override
    protected void onResume() {
        super.onResume();
        // check google play services
        int isAvailable = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(this);
        if (isAvailable != ConnectionResult.SUCCESS) {
            GooglePlayServicesUtil.getErrorDialog(isAvailable, this, 1).show();
        }
    }

    @Override
    public void onTouchDown(MotionEvent event) {
        mDownCameraPosition = getMap().getMap().getCameraPosition();
    }

        @Override
    public void onTouchUp(MotionEvent event) {
    mUpCameraPosition = getMap().getMap().getCameraPosition();
    getMap().getMap().clear();// to remove previous marker
    MarkerOptions options = new MarkerOptions()
            .title("This is your selected place to host game")
            .position(
                    new LatLng(mUpCameraPosition.target.latitude,
                            mUpCameraPosition.target.longitude));
    new GetAddressTask(getApplicationContext()).execute();

}
private SupportMapFragment getMap() {
    return ((SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map));
}

public class GetAddressTask extends AsyncTask<android.location.Location, Void, String> {

    public GetAddressTask (Context context) {
        super();
        mContext = context;
    }

    @Override
    protected String doInBackground (android.location.Location... params) {
        Geocoder geocoder =
                new Geocoder(mContext, Locale.getDefault());
        android.location.Location location = params[0];
        Location markerLocation = getMap().getMap().getMyLocation();

        List<Address> addresses = null;
        try {
            if (mByMap && markerLocation != null) {
                addresses = geocoder.getFromLocation(markerLocation.getLatitude(),
                        markerLocation.getLongitude(), 1);
            } else if (!mByMap && location != null) {
                addresses = geocoder.getFromLocation(mUpCameraPosition.target.latitude,
                        mUpCameraPosition.target.longitude, 1);
            }
        } catch (IOException exception) {
            Log.e("ComplaintLocation",
                    "IO Exception in getFromLocation()", exception);
  //                handler.post(new Runnable() {
  //
  //                    @Override
  //                    public void run() {
 //                     Toast.makeText(mContext,
//                              mContext.getString("Updating your location failed"),
//                              Toast.LENGTH_SHORT).show();
 //                 }
//              });
            return ("IO Exception trying to get address");
        } catch (IllegalArgumentException exception) {
            String errorString = "Illegal arguments " +
                    Double.toString(location.getLatitude()) + " , " +
                    Double.toString(location.getLongitude()) + " passed to address service";
            Log.e("LocationSampleActivity", errorString, exception);

            return errorString;
        }

        if (addresses != null && addresses.size() > 0) {
            Address address = addresses.get(0);

            if (address.getMaxAddressLineIndex() > 0) {
                return String.format(
                        "%s/%s/%s/%s/%s/%s",
                        address.getLatitude(), // 0
                        address.getLongitude(), // 1
                        address.getThoroughfare(), // 2
                        address.getSubThoroughfare(), //3
                        address.getPostalCode(), // 4
                        address.getLocality()); // 5
            } else {
                return String.format(
                        "%s/%s/%s/%s",
                        address.getLatitude(), // 0
                        address.getLongitude(), // 1
                        address.getPostalCode(), // 2
                        address.getLocality()); // 3
            }
        } else return "No address found";
    }

    // Format address string after lookup
    @Override
    protected void onPostExecute (String address) {

        String[] addressFields = TextUtils.split(address, "/");
        Log.d("ADDRESS ARRAY", Arrays.toString(addressFields));
  //            Log.d("LOCATION", "Using " + mProvider);

        // Workaround: doInBackground can only return Strings instead of, for example, an
        // Address instance or a String[] directly. To be able to use TextUtils.isEmpty()
        // on fields returned by this method, set each String that currently reads "null" to
        // a null reference
        for (int fieldcnt = 0; fieldcnt < addressFields.length; ++fieldcnt) {
            if (addressFields[fieldcnt].equals("null"))
                addressFields[fieldcnt] = null;
        }

        String mStreet,mHouseNumber,mLatitude,mLongtitude,mPostalCode,mCity;
        switch (addressFields.length) {
            case 4:
                mStreet = null;
                mHouseNumber = null;
                mLatitude = addressFields[0];
                mLongtitude = addressFields[1];
                mPostalCode = addressFields[2];
                mCity = addressFields[3];
                break;
            case 6:
                mLatitude = addressFields[0];
                mLongtitude = addressFields[1];
                mStreet = addressFields[2];
                mHouseNumber = addressFields[3];
                mPostalCode = addressFields[4];
                mCity = addressFields[5];
                break;
            default:
                mLatitude = null;
                mLongtitude = null;
                mStreet = null;
                mHouseNumber = null;
                mPostalCode = null;
                mCity = null;
                break;
        }
        Toast.makeText(getApplicationContext(), mStreet,
                   Toast.LENGTH_LONG).show();
    }
}


private boolean mByMap;

// Lookup address via reverse geolocation
public void lookUpAddress (boolean byMap) {
    mByMap = byMap;
    if (Geocoder.isPresent()) {
//          (new GetAddressTask(mContext)).execute(mCurrentBestLocation);
    }
}

    private SupportMapFragment getMap() {
        return ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map));
    }
}

Any help would be greatly appreciated.

You can get address by GeoCoder Object note that you will receive a list of suggested addresses. Here in the example I take the first one

Geocoder geocoder;
List<Address> yourAddresses;
geocoder = new Geocoder(this, Locale.getDefault());
yourAddresses= geocoder.getFromLocation(yourLatitude, yourLongitude, 1);

if (yourAddress.size() > 0)
{
 String yourAddress = yourAddresses.get(0).getAddressLine(0);
 String yourCity = yourAddresses.get(0).getAddressLine(1);
 String yourCountry = yourAddresses.get(0).getAddressLine(2);
}

You can use GeoCoder for the purpose of finding a Location Address by providing latitude and longtitude as described in the Android Developer Guidelines: Displaying a Location Address

Because I had trouble finding it when I was searching for it recently: You can get the street by using Address 's getThoroughfare (and getSubThoroughfare ) getter methods.


Create a new class GeoLocation , copy the following into it:

package com.stackoverflow.hitesh.geocoder;

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

public class GeoLocation {

    private Context mContext;

    private String mLatitude;
    private String mLongtitude;
    private String mStreet;
    private String mHouseNumber;
    private String mPostalCode;
    private String mCity;

    private Location mMarkerLocation;

    public GeoLocation (Context context) {
        mContext = context;
    }

    public String getStreet () {
        return mStreet;
    }

    public String getHouseNumber () {
        return mHouseNumber;
    }

    public String getPostalCode () {
        return mPostalCode;
    }

    public String getCity () {
        return mCity;
    }

    public String getLatitude () {
        return mLatitude;
    }

    public String getLongtitude () {
        return mLongtitude;
    }

    // Lookup address via reverse geolocation
    // Call this one
    public void lookUpAddress (Location markerLocation) {
        mMarkerLocation = markerLocation;
        if (Geocoder.isPresent()) {
            (new GetAddressTask(mContext)).execute();
        }
    }

    public class GetAddressTask extends AsyncTask<android.location.Location, Void, String> {

        public GetAddressTask (Context context) {
            super();
            mContext = context;
        }

        @Override
        protected String doInBackground (android.location.Location... params) {
            Geocoder geocoder =
                    new Geocoder(mContext, Locale.getDefault());
            android.location.Location location = params[0];

            List<Address> addresses = null;
            try {
                if (mMarkerLocation != null) {
                    addresses = geocoder.getFromLocation(mMarkerLocation.getLatitude(),
                            mMarkerLocation.getLongitude(), 1);
                }
            } catch (IOException exception) {
                Log.e("ComplaintLocation",
                        "IO Exception in getFromLocation()", exception);

                return ("IO Exception trying to get address");
            } catch (IllegalArgumentException exception) {
                String errorString = "Illegal arguments " +
                        Double.toString(location.getLatitude()) + " , " +
                        Double.toString(location.getLongitude()) + " passed to address service";
                Log.e("LocationSampleActivity", errorString, exception);

                return errorString;
            }

            if (addresses != null && addresses.size() > 0) {
                Address address = addresses.get(0);

                if (address.getMaxAddressLineIndex() > 0) {
                    return String.format(
                            "%s/%s/%s/%s/%s/%s",
                            address.getLatitude(), // 0
                            address.getLongitude(), // 1
                            address.getThoroughfare(), // 2
                            address.getSubThoroughfare(), //3
                            address.getPostalCode(), // 4
                            address.getLocality()); // 5
                } else {
                    return String.format(
                            "%s/%s/%s/%s",
                            address.getLatitude(), // 0
                            address.getLongitude(), // 1
                            address.getPostalCode(), // 2
                            address.getLocality()); // 3
                }
            } else return "No address found";
        }

        // Format address string after lookup
        @Override
        protected void onPostExecute (String address) {

            String[] addressFields = TextUtils.split(address, "/");
            Log.d("ADDRESS ARRAY", Arrays.toString(addressFields));

            // Workaround: doInBackground can only return Strings instead of, for example, an
            // Address instance or a String[] directly. To be able to use TextUtils.isEmpty()
            // on fields returned by this method, set each String that currently reads "null" to
            // a null reference
            for (int fieldcnt = 0; fieldcnt < addressFields.length; ++fieldcnt) {
                if (addressFields[fieldcnt].equals("null"))
                    addressFields[fieldcnt] = null;
            }

            switch (addressFields.length) {
                case 4:
                    mStreet = null;
                    mHouseNumber = null;
                    mLatitude = addressFields[0];
                    mLongtitude = addressFields[1];
                    mPostalCode = addressFields[2];
                    mCity = addressFields[3];
                    break;
                case 6:
                    mLatitude = addressFields[0];
                    mLongtitude = addressFields[1];
                    mStreet = addressFields[2];
                    mHouseNumber = addressFields[3];
                    mPostalCode = addressFields[4];
                    mCity = addressFields[5];
                    break;
                default:
                    mLatitude = null;
                    mLongtitude = null;
                    mStreet = null;
                    mHouseNumber = null;
                    mPostalCode = null;
                    mCity = null;
                    break;
            }

            Log.d("GeoLocation Street", mStreet);
            Log.d("GeoLocation No.", mHouseNumber);
            Log.d("GeoLocation Postalcode", mPostalCode);
            Log.d("GeoLocation Locality", mCity);
            Log.d("GeoLocation Lat/Lng", "[" + mLatitude + ", " + mLongtitude + "]");
        }
    }
}

You then instantiate it using

GeoLocation geoLocation = new GeoLocation(getActivity()); // or (this) if called from an activity and not from a fragment
mGeoLocation.lookUpAddress(LOCATION_FROM_MAP);

Of course, you have to replace LOCATION_FROM_MAP with the Location object you get from your map.

use this code for converting latitude and longitute to address on camera change

 @Override
public void onCameraChange(CameraPosition cameraPosition)
{
    mGoogleMap.setOnMapLoadedCallback(this);
}


  @Override
public void onMapLoaded()
{
     LatLng position = mGoogleMap.getCameraPosition().target;
     double Lat = position.latitude;
     double Long = position.longitude;

     Geocoder geocoder;
     List<Address> addresses;
     geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
     try
      {
        addresses = geocoder.getFromLocation(Lat, Long, 1); 
        if (addresses != null && addresses.size() > 0)
        {
          String address = addresses.get(0).getAddressLine(0); 
          String address11 = addresses.get(0).getAddressLine(1);
          String city = addresses.get(0).getLocality();
         }
       }
       catch (IOException e) {
        }
   }

and call onCameraChangeListener in onMapReady after map load

mGoogleMap.setOnCameraChangeListener(this);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM