我正在构建一个Android应用程序,我正在使用TouchableWrapper
类获取纬度和范围当用户移开手指时,摄像机中心位置的纬度和经度将被解析并以祝酒词显示。
现在我需要的是latitude and longitude
处的地址。
以下是我用于获取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));
}
}
非常感谢任何帮助。
答案 0 :(得分:5)
您可以通过 GeoCoder 对象获取地址 请注意,您将收到建议地址列表。 在这个示例中,我采用了第一个
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);
}
答案 1 :(得分:3)
您可以使用GeoCoder通过提供Android开发者指南中所述的纬度和经度来查找位置地址:Displaying a Location Address
因为我最近在搜索时遇到了问题:您可以使用Address
的{{3}}(以及getSubThoroughfare
)getter方法获取街道。
创建一个新类GeoLocation
,将以下内容复制到其中:
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 + "]");
}
}
}
然后使用
实例化它GeoLocation geoLocation = new GeoLocation(getActivity()); // or (this) if called from an activity and not from a fragment
mGeoLocation.lookUpAddress(LOCATION_FROM_MAP);
当然,您必须将LOCATION_FROM_MAP
替换为您从地图中获得的位置对象。
答案 2 :(得分:1)
使用此代码将纬度和长片转换为相机更改时的地址
@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) {
}
}
并在map map
之后调用onMapReady中的onCameraChangeListenermGoogleMap.setOnCameraChangeListener(this);