我想从纬度和经度在安卓得到以下值

街道地址 城市/州 邮政编码 完整的地址

如何做到这一点?


当前回答

从latlong (Geo-coordinates)获取Address还有最后一个技巧。你可以简单地通过经度和纬度点击谷歌地图web服务。它只是一个GET-Method web服务。

它将返回JSON响应,可以很容易地解析以获得地址。它的URL是:

http://maps.googleapis.com/maps/api/geocode/json?latlng=32,75&sensor=true

你可以用lat,long代替32,75。

其他回答

从latlong (Geo-coordinates)获取Address还有最后一个技巧。你可以简单地通过经度和纬度点击谷歌地图web服务。它只是一个GET-Method web服务。

它将返回JSON响应,可以很容易地解析以获得地址。它的URL是:

http://maps.googleapis.com/maps/api/geocode/json?latlng=32,75&sensor=true

你可以用lat,long代替32,75。

1 -在onCreate方法中为LocationManager和LocationListener创建变量。

2 -检查是否有权限,因此执行位置更新并从locationManager获取lastKnownLocation,否则您将请求权限

3 -在主类中创建onRequestPermissionResult并检查是否有权限,然后执行位置更新

4 -创建分离的方法,其中包括Geocoder变量,并创建一个列表,从您的位置放置坐标, 所以为了安全起见,你检查列表是否存在,如果我们想在该列表中的每个信息是存在的,那么你使用(get通道==>街道地址),(getLocality ==>城市/州),(getPostalCode ==> Zip), (getAdminArea ==>完整地址)

5 -最后,在检查权限后调用该方法(lastKnownLocation参数==>,当应用程序运行时显示地址)和onLocationChanged with(位置参数==>,当位置改变时显示地址)

代码部分:

LocationManager locationManager;

LocationListener locationListener;

@SuppressLint("MissingPermission")
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    locationManager  = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {

            updateLocation(location);

        }
        @Override public void onStatusChanged(String provider, int status, Bundle extras) {

        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
    };

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

        Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        updateLocation(lastKnownLocation);

    }else {

        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
        }
    }
}


public void updateLocation ( Location location){


    Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
    try {
        List<Address> listAddresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);

        String address = "Could not find location :(";

        if (listAddresses != null && listAddresses.size() > 0) {

            if (listAddresses.get(0).getThoroughfare() != null) {

                address = listAddresses.get(0).getThoroughfare() + " ";
            }

            if (listAddresses.get(0).getLocality() != null) {

                address += listAddresses.get(0).getLocality() + " ";
            }

            if (listAddresses.get(0).getPostalCode() != null) {

                address += listAddresses.get(0).getPostalCode() + " ";
            }

            if (listAddresses.get(0).getAdminArea() != null) {

                address += listAddresses.get(0).getAdminArea();
            }
        }

        Log.i("Address",address);

    } catch (Exception e) {

        e.printStackTrace();

    }
}
}

你可以创建类

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 + 
    "]");
    }
 }
   }

然后使用

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

尝试使用geocoder使用下面的代码:

  Geocoder gcd = new Geocoder(MainActivity.this, Locale.getDefault());
  List<Address> geoAddresses = geoAddresses = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
  if (geoAddresses.size() > 0) {
      String mUserLocation = "";
      for (int i = 0; i < 4; i++) { //Since it return only four value we declare this as static.
           mUserLocation = mUserLocation + geoAddresses.get(0).getAddressLine(i).replace(",", "") + ", ";
        } 
    }
  public static String getAddressFromLatLng(Context context, LatLng latLng) {
    Geocoder geocoder;
    List<Address> addresses;
    geocoder = new Geocoder(context, Locale.getDefault());
    try {
        addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
        return addresses.get(0).getAddressLine(0);
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}