我想从纬度和经度在安卓得到以下值
街道地址 城市/州 邮政编码 完整的地址
如何做到这一点?
我想从纬度和经度在安卓得到以下值
街道地址 城市/州 邮政编码 完整的地址
如何做到这一点?
当前回答
使用地理编码器,你可以得到这样的东西!
try {
Geocoder geo = new Geocoder(MapsActivity.this.getApplicationContext(), Locale.getDefault());
List<Address> addresses = geo.getFromLocation(origin.latitude, origin.longitude, 1);
address.setText("Loading...");
if (addresses != null && addresses.size() > 0) {
String locality = addresses.get(0).getAddressLine(0);
String country = addresses.get(0).getCountryName();
String state = addresses.get(0).getAdminArea();
String sub_admin = addresses.get(0).getSubAdminArea();
String city = addresses.get(0).getFeatureName();
String pincode = addresses.get(0).getPostalCode();
String locality_city = addresses.get(0).getLocality();
String sub_localoty = addresses.get(0).getSubLocality();
if (locality != null && country != null) {
address.setText(locality + ", " + (sub_localoty != null ? sub_localoty + ", " : "") + (locality_city != null ? locality_city + ", " : "" ) + (city != null ? city + ", " : "") + (sub_admin != null ? sub_admin + ", " : "") + (state != null ? state + ", " : "") + country + ", " + (pincode != null ? pincode : ""));
} else {
address.setText("Location could not be fetched...");
}
}
} catch (Exception e) {
address.setText("Location could not be fetched...");
e.printStackTrace(); // getFromLocation() may sometimes fail
}
其他回答
只要用这个方法,把你的背,长。
public static void getAddress(Context context, double LATITUDE, double LONGITUDE{
//Set Address
try {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);
if (addresses != null && addresses.size() > 0) {
String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
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(); // Only if available else return NULL
Log.d(TAG, "getAddress: address" + address);
Log.d(TAG, "getAddress: city" + city);
Log.d(TAG, "getAddress: state" + state);
Log.d(TAG, "getAddress: postalCode" + postalCode);
Log.d(TAG, "getAddress: knownName" + knownName);
}
} catch (IOException e) {
e.printStackTrace();
}
return;
}
尝试使用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 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));
}
如果您使用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"
}
}
public String getAddress(LatLng latLng) {
String cAddress = "";
if (latLng == null) {
errorMessage = "no_location_data_provided";
Log.wtf(TAG, errorMessage);
return "";
}
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
// Address found using the Geocoder.
List<Address> addresses = null;
try {
// Using getFromLocation() returns an array of Addresses for the area immediately
// surrounding the given latitude and longitude. The results are a best guess and are
// not guaranteed to be accurate.
addresses = geocoder.getFromLocation(
latLng.latitude,
latLng.longitude,
// In this sample, we get just a single address.
1);
} catch (IOException ioException) {
// Catch network or other I/O problems.
errorMessage = "service_not_available";
Log.e(TAG, errorMessage, ioException);
} catch (IllegalArgumentException illegalArgumentException) {
// Catch invalid latitude or longitude values.
errorMessage = "invalid_lat_long_used";
Log.e(TAG, errorMessage + ". " +
"Latitude = " + latLng.latitude +
", Longitude = " + latLng.longitude, illegalArgumentException);
}
// Handle case where no address was found.
if (addresses == null || addresses.size() == 0) {
if (errorMessage.isEmpty()) {
errorMessage = "no_address_found";
Log.e(TAG, errorMessage);
}
} else {
Address address = addresses.get(0);
ArrayList<String> addressFragments = new ArrayList<String>();
// Fetch the address lines using {@code getAddressLine},
// join them, and send them to the thread. The {@link android.location.address}
// class provides other options for fetching address details that you may prefer
// to use. Here are some examples:
// getLocality() ("Mountain View", for example)
// getAdminArea() ("CA", for example)
// getPostalCode() ("94043", for example)
// getCountryCode() ("US", for example)
// getCountryName() ("United States", for example)
String allAddress = "";
for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
addressFragments.add(address.getAddressLine(i));
allAddress += address.getAddressLine(i) + " ";
}
if (address.getAdminArea() != null) {
state = address.getAdminArea();
} else {
state = "";
}
if (address.getLocality() != null) {
city = address.getLocality();
} else {
city = "";
}
if (address.getPostalCode() != null) {
postalCode = address.getPostalCode();
} else {
postalCode = "";
}
Log.i(TAG, "address_found");
//driverAddress = TextUtils.join(System.getProperty("line.separator"), addressFragments);
cAddress = allAddress;
Log.e("result", cAddress.toString());
}
return cAddress;
}
您可以使用此方法对正确完整的地址进行地理编码