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

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

如何做到这一点?


当前回答

尝试使用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(",", "") + ", ";
        } 
    }

其他回答

使用Geocoder类从纬度和经度中获得完整地址非常容易。下面是代码示例。希望这能有所帮助!

 if (l != null) {
        val lat = l.latitude
        val lon = l.longitude

        val geocoder = Geocoder(this, Locale.getDefault())
        val addresses: List<Address>

        addresses = geocoder.getFromLocation(lat, lon, 1) 

        val address = addresses[0].getAddressLine(0)
        val address2 = addresses[0].getAddressLine(1)
        val city = addresses[0].locality
        val state = addresses[0].adminArea
        val country = addresses[0].countryName
        val postalCode = addresses[0].postalCode
        val knownName = addresses[0].featureName

        val message =
                "Emergency situation. Call for help. My location is: " + address + "." + "http://maps.google.com/maps?saddr=" + lat + "," + lon

    }

您可以只使用地址值,因为它提供了所有完整的地址。如果需要单独的组件,也可以使用其他组件。

你可以这样做,以获得完整的经纬度地址:

  public class MainActivity extends AppCompatActivity {

         ...

  private Geocoder geocoder;
  private TextView mAddressTxtVu;

         ...


  // I assume that you got latitude and longitude correctly 

  mLatitude  =  20.23232
  mLongitude =  32.999

  String errorMessage = "";

  geocoder = new Geocoder(context, Locale.getDefault());

  List<Address> addresses = null;

  try {
              addresses = geocoder.getFromLocation(
                       mlattitude,
                       mlongitude,
                       1);
      } catch (IOException e) {
              errorMessage = getString(R.string.service_not_available);
              Log.e(TAG, errorMessage, e);
      } catch (IllegalArgumentException illegalArgumentException) {
                        // Catch invalid latitude or longitude values.
              errorMessage = getString(R.string.invalid_lat_long_used);
              Log.e(TAG, errorMessage + ". " + "Latitude = " + mlattitude +", Longitude = " + mlongitude, illegalArgumentException);
      }

      // Handle case where no address was found.
      if (addresses == null || addresses.size() == 0) {
             if (errorMessage.isEmpty()) {
                      errorMessage = getString(R.string.no_address_found);
                      Log.e(TAG, errorMessage);
             }

      } else {
             Address address = addresses.get(0);
             ArrayList<String> addressFragments = new ArrayList<String>();

             // Fetch the address lines using getAddressLine,
             // join them, and send them to the thread.
             for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
                      addressFragments.add(address.getAddressLine(i));
             }
             // Log.i(TAG, getString(R.string.address_found));


    mAddressTxtVu.setText(TextUtils.join(System.getProperty("line.separator"),
                                addressFragments));
                    }

用这个对我有用:D

检索纬度和经度的json数据。

https://maps.googleapis.com/maps/api/geocode/json?key=AIzaSyAr29XeWWAeWZcrOgjjfs3iSnqkWtAz4No&latlng=2.1812,102.4266&sensor=true

用你自己的地方改变纬度、经度。

https://maps.googleapis.com/maps/api/geocode/json?key= < \ API_KEY_HERE > &latlng =“纬度,经度”&sensor = true

您可以使用自己的密钥更改<\API_KEY_HERE>。

需要在谷歌控制台为新的api密钥启用api服务。

D选项是正确答案

在onCreate () . .

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0, this);
    Criteria criteria = new Criteria();
    String bestProvider = locationManager.getBestProvider(criteria, true);
    Location location = locationManager.getLastKnownLocation(bestProvider);

    if (location == null) {
        Toast.makeText(getApplicationContext(), "GPS signal not found",
                3000).show();
    }
    if (location != null) {
        Log.e("location", "location--" + location);
        Log.e("latitude at beginning",
                "@@@@@@@@@@@@@@@" + location.getLatitude());
        onLocationChanged(location);
    }

在onLocationChanged()中编写代码

@Override
public void onLocationChanged(Location location) {

    Geocoder geocoder;
    List<Address> addresses;
    geocoder = new Geocoder(this, Locale.getDefault());

    latitude = location.getLatitude();
    longitude = location.getLongitude();

    Log.e("latitude", "latitude--" + latitude);

    try {
        Log.e("latitude", "inside latitude--" + latitude);
        addresses = geocoder.getFromLocation(latitude, longitude, 1);

        if (addresses != null && addresses.size() > 0) {
            String address = addresses.get(0).getAddressLine(0); 
            String city = addresses.get(0).getLocality();
            String state = addresses.get(0).getAdminArea();
            String country = addresses.get(0).getCountryName();
            String postalCode = addresses.get(0).getPostalCode();
            String knownName = addresses.get(0).getFeatureName(); 

            locationTxt.setText(address + " " + city + " " + country);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

如果您使用Kotlin语言,我创建这个方法来直接获取地址位置

private fun getAddress(latLng: LatLng): String {
    val geocoder = Geocoder(this, Locale.getDefault())
    val addresses: List<Address>?
    val address: Address?
    var addressText = ""

    addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1)

    if (addresses.isNotEmpty()) {
        address = addresses[0]
        addressText = address.getAddressLine(0)
    } else{
        addressText = "its not appear"
    }
    return addressText
}

但是当你调用这个方法时,这个方法只返回String值

如果你想获取所有地址,你只需使用这个方法/函数

fun getAddress(latLng: LatLng){
    val geocoder = Geocoder(this, Locale.getDefault())
    val addresses: List<Address>?
    val address: Address?
    var fulladdress = ""
    addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1)

    if (addresses.isNotEmpty()) {
        address = addresses[0]
        fulladdress = address.getAddressLine(0) // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex
        var city = address.getLocality();
        var state = address.getAdminArea();
        var country = address.getCountryName();
        var postalCode = address.getPostalCode();
        var knownName = address.getFeatureName(); // Only if available else return NULL
    } else{
        fulladdress = "Location not found"
    }
}