我想从纬度和经度在安卓得到以下值
街道地址 城市/州 邮政编码 完整的地址
如何做到这一点?
我想从纬度和经度在安卓得到以下值
街道地址 城市/州 邮政编码 完整的地址
如何做到这一点?
当前回答
从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号线和2号线…
例子在这里
So,
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude,longitude, 1);
String address = addresses.get(0).getAddressLine(0);
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String zip = addresses.get(0).getPostalCode();
String country = addresses.get(0).getCountryName();
似乎还没有人提供谷歌Docs (https://developer.android.com/training/location/display-address#java)建议的解决方案。正确的解决方案应该使用IntentService进行反向地理编码的网络调用。
使用意图服务而不是AsyncTask,因为它没有绑定到任何特定的活动。ie。它有自己的生命周期。当地理编码完成时,IntentService将自动停止。
public class GeocodingService extends IntentService {
public GeocodingService() {
super("GeocodingService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if (intent == null) {
return;
}
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
String errorMessage = "";
BCCDatabase BCCDatabase = skicompanion.skicompanion.storage.BCCDatabase.getInstance(getApplicationContext());
// Get the location passed to this service through an extra.
Location location = intent.getParcelableExtra(
"location");
long trackID = intent.getLongExtra("trackID", -1);
List<Address> addresses = null;
String addressString = "";
try {
addresses = geocoder.getFromLocation(
location.getLatitude(),
location.getLongitude(),
1);
} catch (IOException ioException) {
// Catch network or other I/O problems.
errorMessage = "service not available";
Log.d(Constants.SkiCompanionDebug, errorMessage, ioException);
} catch (IllegalArgumentException illegalArgumentException) {
// Catch invalid latitude or longitude values.
errorMessage = "invalid lat long used";
Log.d(Constants.SkiCompanionDebug, errorMessage + ". " +
"Latitude = " + location.getLatitude() +
", Longitude = " +
location.getLongitude(), illegalArgumentException);
}
// Handle case where no address was found.
if (addresses == null || addresses.size() == 0) {
if (errorMessage.isEmpty()) {
errorMessage = "no address found";
Log.d(Constants.SkiCompanionDebug, errorMessage);
}
} else {
if(addresses.get(0).getLocality() != null){
addressString += addresses.get(0).getLocality() + ", ";
}
if(addresses.get(0).getAdminArea() != null){
addressString += addresses.get(0).getAdminArea() + ", ";
}
if(addresses.get(0).getCountryName() != null){
addressString += addresses.get(0).getCountryName();
}
//updating DB
BCCDatabase.setTrackLocation(trackID, addressString);
Log.d(Constants.SkiCompanionDebug, "address found: "+ addressString);
}
}
}
只要用这个方法,把你的背,长。
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;
}
你可以创建类
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);
你可以这样做,以获得完整的经纬度地址:
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));
}