使用纬度和经度获取特定地址[重复]
Posted
技术标签:
【中文标题】使用纬度和经度获取特定地址[重复]【英文标题】:Get the particular address using latitude and longitude [duplicate] 【发布时间】:2013-05-07 02:39:46 【问题描述】:我需要知道是否有任何 API,我可以从那里接收当前地点的地址。使用位置管理器我已经收到了当前地点的纬度和经度,但我需要地址。
我已经尝试了下面的 api。
http://maps.googleapis.com/maps/api/geocode/json?latlng="+ lat + "," + lon + &sensor=true"
但它没有显示确切的位置。有人可以帮助我吗。@谢谢
【问题讨论】:
developer.android.com/reference/android/location/Geocoder.html 可能重复***.com/questions/2296377/… 你用 key=API_KEY 替换传感器。它会工作 【参考方案1】:从Geocoder 对象,您可以调用getFromLocation(double, double, int) 方法。
喜欢:-
private String getAddress(double latitude, double longitude)
StringBuilder result = new StringBuilder();
try
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses.size() > 0)
Address address = addresses.get(0);
result.append(address.getLocality()).append("\n");
result.append(address.getCountryName());
catch (IOException e)
Log.e("tag", e.getMessage());
return result.toString();
另一个最佳答案在这里How to get city name from latitude and longitude coordinates in Google Maps?
【讨论】:
感谢使用上面的代码我可以得到确切的地址位置 让我检查一下,+1 为您提供帮助 不行,地址总是空的,没有错误,没有异常,只有空。【参考方案2】:我创建了一个类,用于获取特定纬度、经度的地址。你可以用这个:
public class getReverseGeoCoding
private String Address1 = "", Address2 = "", City = "", State = "", Country = "", County = "", PIN = "";
public void getAddress()
Address1 = "";
Address2 = "";
City = "";
State = "";
Country = "";
County = "";
PIN = "";
try
JSONObject jsonObj = parser_Json.getJSONfromURL("http://maps.googleapis.com/maps/api/geocode/json?latlng=" + Global.curLatitude + ","
+ Global.curLongitude + "&sensor=true");
String Status = jsonObj.getString("status");
if (Status.equalsIgnoreCase("OK"))
JSONArray Results = jsonObj.getJSONArray("results");
JSONObject zero = Results.getJSONObject(0);
JSONArray address_components = zero.getJSONArray("address_components");
for (int i = 0; i < address_components.length(); i++)
JSONObject zero2 = address_components.getJSONObject(i);
String long_name = zero2.getString("long_name");
JSONArray mtypes = zero2.getJSONArray("types");
String Type = mtypes.getString(0);
if (TextUtils.isEmpty(long_name) == false || !long_name.equals(null) || long_name.length() > 0 || long_name != "")
if (Type.equalsIgnoreCase("street_number"))
Address1 = long_name + " ";
else if (Type.equalsIgnoreCase("route"))
Address1 = Address1 + long_name;
else if (Type.equalsIgnoreCase("sublocality"))
Address2 = long_name;
else if (Type.equalsIgnoreCase("locality"))
// Address2 = Address2 + long_name + ", ";
City = long_name;
else if (Type.equalsIgnoreCase("administrative_area_level_2"))
County = long_name;
else if (Type.equalsIgnoreCase("administrative_area_level_1"))
State = long_name;
else if (Type.equalsIgnoreCase("country"))
Country = long_name;
else if (Type.equalsIgnoreCase("postal_code"))
PIN = long_name;
// JSONArray mtypes = zero2.getJSONArray("types");
// String Type = mtypes.getString(0);
// Log.e(Type,long_name);
catch (Exception e)
e.printStackTrace();
public String getAddress1()
return Address1;
public String getAddress2()
return Address2;
public String getCity()
return City;
public String getState()
return State;
public String getCountry()
return Country;
public String getCounty()
return County;
public String getPIN()
return PIN;
JSON 解析器类
public class parser_Json
public static JSONObject getJSONfromURL(String url)
// initialize
InputStream is = null;
String result = "";
JSONObject jObject = null;
// http post
try
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
catch (Exception e)
Log.e("log_tag", "Error in http connection " + e.toString());
// convert response to string
try
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
sb.append(line + "\n");
is.close();
result = sb.toString();
catch (Exception e)
Log.e("log_tag", "Error converting result " + e.toString());
// try parse the string to a JSON object
try
jObject = new JSONObject(result);
catch (JSONException e)
Log.e("log_tag", "Error parsing data " + e.toString());
return jObject;
【讨论】:
curLongitude
未被识别。有什么办法可以解决吗?
只需在 Global.curLongitude 和 Global.curLatitude 的地方传递你的经纬度即可。
非常感谢,但我在 logcat 02-26 16:48:21.900 31246-31246/guide_me_for_all.guide_me_for_all E/log_tag﹕ Error in http connection android.os.NetworkOnMainThreadException 02-26 16:48:21.900 31246-31246/guide_me_for_all.guide_me_for_all E/log_tag﹕ Error converting result java.lang.NullPointerException: lock == null 02-26 16:48:21.910 31246-31246/guide_me_for_all.guide_me_for_all E/log_tag﹕ Error parsing data org.json.JSONException: End of input at character 0 of
中收到此错误,在此 if (Status.equalsIgnoreCase("OK"))
中收到空指针异常。
当应用程序尝试在其主线程上执行网络操作时会引发此异常。尝试在 AsyncTask 中运行您的代码。有关更多详细信息,请参阅此链接link
真棒小子【参考方案3】:
String longti = "0";
String lati = "0";
LocationManager locationManager;
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, 1, new MyLocationListners());
final Location location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//these are your longtitude and latitude
lati = String.valueOf(location.getLatitude());
longti = String.valueOf(location.getLongitude());
//here we are getting the address using the geo codes(longtitude and latitude).
String ad = getAddress(location.getLatitude(),location.getLongitude());
private String getAddress(double LATITUDE, double LONGITUDE)
String strAdd = "";
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
try
List<Address> addresses = geocoder.getFromLocation(LATITUDE,
LONGITUDE, 1);
if (addresses != null)
Address returnedAddress = addresses.get(0);
StringBuilder strReturnedAddress = new StringBuilder("");
for (int i = 0; i < returnedAddress.getMaxAddressLineIndex(); i++)
strReturnedAddress
.append(returnedAddress.getAddressLine(i)).append(
"\n");
strAdd = strReturnedAddress.toString();
Log.w("My Current loction address",
"" + strReturnedAddress.toString());
else
Log.w("My Current loction address", "No Address returned!");
catch (Exception e)
e.printStackTrace();
Log.w("My Current loction address", "Canont get Address!");
return strAdd;
public class MyLocationListners implements LocationListener
@Override
public void onLocationChanged(Location location)
@Override
public void onProviderDisabled(String provider)
@Override
public void onProviderEnabled(String provider)
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
//确保gps和互联网已开启 //有时,由于某些//google服务问题,在您第一次运行代码时位置将不可见,因此您必须重新启动手机 //希望对你有帮助
【讨论】:
【参考方案4】:我已尝试修改Vipul Purohit answer 给出的类以使其更好
public class ReverseGeoCoding
private String address1, address2, city, state, country, county, PIN;
private static final String LOG_TAG = ReverseGeoCoding.class.getSimpleName();
public ReverseGeoCoding(double latitude, double longitude)
init();
retrieveData(latitude, longitude);
private void retrieveData(double latitude, double longitude)
try
String responseFromHttpUrl = getResponseFromHttpUrl(buildUrl(latitude, longitude));
JSONObject jsonResponse = new JSONObject(responseFromHttpUrl);
String status = jsonResponse.getString("status");
if (status.equalsIgnoreCase("OK"))
JSONArray results = jsonResponse.getJSONArray("results");
JSONObject zero = results.getJSONObject(0);
JSONArray addressComponents = zero.getJSONArray("address_components");
for (int i = 0; i < addressComponents.length(); i++)
JSONObject zero2 = addressComponents.getJSONObject(i);
String longName = zero2.getString("long_name");
JSONArray types = zero2.getJSONArray("types");
String type = types.getString(0);
if (!TextUtils.isEmpty(longName))
if (type.equalsIgnoreCase("street_number"))
address1 = longName + " ";
else if (type.equalsIgnoreCase("route"))
address1 = address1 + longName;
else if (type.equalsIgnoreCase("sublocality"))
address2 = longName;
else if (type.equalsIgnoreCase("locality"))
// address2 = address2 + longName + ", ";
city = longName;
else if (type.equalsIgnoreCase("administrative_area_level_2"))
county = longName;
else if (type.equalsIgnoreCase("administrative_area_level_1"))
state = longName;
else if (type.equalsIgnoreCase("country"))
country = longName;
else if (type.equalsIgnoreCase("postal_code"))
PIN = longName;
catch (Exception e)
e.printStackTrace();
private void init()
address1 = "";
address2 = "";
city = "";
state = "";
country = "";
county = "";
PIN = "";
private URL buildUrl(double latitude, double longitude)
Uri uri = Uri.parse("http://maps.googleapis.com/maps/api/geocode/json").buildUpon()
.appendQueryParameter("latlng", latitude + "," + longitude)
.build();
try
return new URL(uri.toString());
catch (MalformedURLException e)
e.printStackTrace();
Log.e(LOG_TAG, "can't construct location object");
return null;
private String getResponseFromHttpUrl(URL url) throws IOException
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try
InputStream in = urlConnection.getInputStream();
Scanner scanner = new Scanner(in);
scanner.useDelimiter("\\A");
if (scanner.hasNext())
return scanner.next();
else
return null;
finally
urlConnection.disconnect();
public String getAddress1() return address1;
public String getAddress2() return address2;
public String getCity() return city;
public String getState() return state;
public String getCountry() return country;
public String getCounty() return county;
public String getPIN() return PIN;
【讨论】:
修改了你的答案。检查上面【参考方案5】:这么多人给出了这么多答案,但都错过了最关键的部分。以下是我如何做到这一点:您需要一个 API 密钥。 https://developers.google.com/maps/documentation/android-api/signup 只是花点时间耐心地浏览代码。我在片段中使用了内部类。 代码:-
private class DownloadRawData extends AsyncTask<LatLng, Void, ArrayList<String>>
@Override
protected void onPreExecute()
super.onPreExecute();
progressDialog=new ProgressDialog(getActivity());
progressDialog.setMessage("Loading........");
progressDialog.setCancelable(false);
progressDialog.show();
@Override
protected ArrayList<String> doInBackground(LatLng... latLng)
ArrayList<String> strings=retrieveData(latLng[0].latitude,latLng[0].longitude);
return strings;
@Override
protected void onPostExecute(ArrayList<String> s)
super.onPostExecute(s);
if(progressDialog!=null)
progressDialog.dismiss();
LocationInfoDialog locationinfoDialog=new LocationInfoDialog(getActivity(),s);
locationinfoDialog.show();
locationinfoDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
locationinfoDialog.setCancelable(false);
private void init()
address1 = "";
address2 = "";
city = "";
state = "";
country = "";
county = "";
PIN = "";
private String createUrl(double latitude, double longitude) throws UnsupportedEncodingException
init();
return "https://maps.googleapis.com/maps/api/geocode/json?" + "latlng=" + latitude + "," + longitude + "&key=" + getActivity().getResources().getString(R.string.map_apiid);
private URL buildUrl(double latitude, double longitude)
try
Log.w(TAG, "buildUrl: "+createUrl(latitude,longitude));
return new URL(createUrl(latitude,longitude));
catch (MalformedURLException e)
e.printStackTrace();
Log.e(LOG_TAG, "can't construct location object");
return null;
catch (UnsupportedEncodingException e)
e.printStackTrace();
return null;
private String getResponseFromHttpUrl(URL url) throws IOException
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try
InputStream in = urlConnection.getInputStream();
Scanner scanner = new Scanner(in);
scanner.useDelimiter("\\A");
if (scanner.hasNext())
return scanner.next();
else
return null;
finally
urlConnection.disconnect();
public String getAddress1() return address1;
public String getAddress2() return address2;
public String getCity() return city;
public String getState() return state;
public String getCountry() return country;
public String getCounty() return county;
public String getPIN() return PIN;
private ArrayList<String> retrieveData(double latitude, double longitude)
ArrayList<String> strings=new ArrayList<>();
try
String responseFromHttpUrl = getResponseFromHttpUrl(buildUrl(latitude, longitude));
JSONObject jsonResponse = new JSONObject(responseFromHttpUrl);
String status = jsonResponse.getString("status");
if (status.equalsIgnoreCase("OK"))
JSONArray results = jsonResponse.getJSONArray("results");
JSONObject zero = results.getJSONObject(0);
JSONArray addressComponents = zero.getJSONArray("address_components");
String formatadd= zero.getString("formatted_address");
for (int i = 0; i < addressComponents.length(); i++)
JSONObject zero2 = addressComponents.getJSONObject(i);
String longName = zero2.getString("long_name");
JSONArray types = zero2.getJSONArray("types");
String type = types.getString(0);
if (!TextUtils.isEmpty(longName))
if (type.equalsIgnoreCase("street_number"))
address1 = longName + " ";
else if (type.equalsIgnoreCase("route"))
address1 = address1 + longName;
else if (type.equalsIgnoreCase("sublocality"))
address2 = longName;
else if (type.equalsIgnoreCase("locality"))
// address2 = address2 + longName + ", ";
city = longName;
else if (type.equalsIgnoreCase("administrative_area_level_2"))
county = longName;
else if (type.equalsIgnoreCase("administrative_area_level_1"))
state = longName;
else if (type.equalsIgnoreCase("country"))
country = longName;
else if (type.equalsIgnoreCase("postal_code"))
PIN = longName;
strings.add(formatadd);
strings.add(address1);
strings.add(address2);
strings.add(city);
strings.add(county);
strings.add(state);
strings.add(country);
strings.add(PIN);
catch (Exception e)
e.printStackTrace();
return strings;
初始化如下:-
googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener()
@Override
public void onMapClick(LatLng latLng)
markerOptions.position(latLng);
// Setting the title for the marker.
// This will be displayed on taping the marker
markerOptions.title(latLng.latitude + " : " + latLng.longitude);
googleMap.addMarker(markerOptions);
new DownloadRawData().execute(latLng);
);
【讨论】:
【参考方案6】:试试这个:https://www.google.com/maps/search/?api=1&query=latitude,longitude 并给出经纬度
【讨论】:
以上是关于使用纬度和经度获取特定地址[重复]的主要内容,如果未能解决你的问题,请参考以下文章