一.使用Google提供的Geocoding API完成反向地理编码
Google提供的反向地理编码接口为:
http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true_or_false
其中,sensor=true_or_false表示这条请求是否来自于某个设备的位置传感器,通常指定成false.
二.对经纬度进行解析
基本步骤:先发送一个HTTP请求到谷歌服务器,然后对返回的JSON数据进行解析
public static final int SHOW_LOCATION = 0;
// 显示经纬度
private void showLocation(final Location location) {
new Thread(new Runnable() {
@Override
public void run() {
try {
//组装反向地理编码的接口地址
StringBuilder url = new StringBuilder();
url.append("http://maps.googleapis.com/maps/api/geocode/json?latlng=");
url.append(location.getLatitude()).append(",");
url.append(location.getLongitude());
url.append("&sensor=false");
// HttpClient是一个接口,无法创建实例,通常情况下创建一个DefaultHttpClient对象
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url.toString());
// 在请求消息头中指定语言,保证服务器会返回中文数据
httpGet.addHeader("Accept-Language", "zh-CN");
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity, "utf-8");
JSONObject jsonObject = new JSONObject(response);
// 获取results节点下的位置信息
JSONArray resultArray = jsonObject
.getJSONArray("results");
if (resultArray.length() > 0) {
JSONObject subObject = resultArray.getJSONObject(0);
String address = subObject
.getString("formatted_address");
Message message = new Message();
message.what = SHOW_LOCATION;
message.obj = address;//使用obj字段来携带一个Object对象
handler.sendMessage(message);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
//异步消息处理机制,在主线程中更新UI
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_LOCATION:
String currentPosition = (String) msg.obj;
positionTextView.setText(currentPosition);
break;
default:
break;
}
}
};