android 输入一个地址 转成经纬度 为什么第二次就不进ongetaddrresult

如题所述

  如果打算写一些LBS方面的的应用,可能用到地址与经纬度的互相转换。android.location.Geocoder类提供了此功能。实际上,Geocoder既提供了前向转换,也提供了后向转换——它可以获取地址并返回经纬度,也可以将经纬度对转换为一组地址。

  可以通过各种方式来描述位置。例如,getFromLocationName() 方法可以获得地方的名称、物理地址和机场编号,或者该位置的流行名称。这些方法提供了一个地址列表(List<Address>),而不是一个地址。因为这些方法返回多个结果,官方建议最好提供1~5的maxResults 值来限制结果集,下面我们来看一个查询地址的例子,和上次一样我们得自己定义一个类继承MapActivity。

  我们可以试着写一个输入地名返回经纬度的程序。

  在XML中定义一个输入框,一个按钮,一个MapView.

  用户输入一个地名点击按钮,返回经纬度。

  这是按钮的OnCliclk方法,其他省略。

  public void onClick(View v) {
  try {
  EditText loc = (EditText) findViewById(R.id.location);
  String locationName = loc.getText().toString();
  List<Address> addressList = geocoder.getFromLocationName(
  locationName, 5);
  if (addressList != null && addressList.size() > 0) {
  int lat = (int) (addressList.get(0).getLatitude() * 1E6);
  int lng = (int) (addressList.get(0).getLongitude() * 1E6);
  
  GeoPoint pt = new GeoPoint(lat, lng);
  mapView.getController().setZoom(15);
  mapView.getController().setCenter(pt);
  }
  } catch (Exception e) {
  e.printStackTrace();
  }
  }

  这样写感觉是没什么错,实际测试时发现,如果输入“tian an men”就可以返回经纬度,但输入“天安门”就会抛异常,说服务不可以用什么的,网上也有遇到这问题的人,eoe上边也有,但都不了了之了。国外也有输入英文抛异常的,http://code.google.com/p/android/issues/detail?id=8816,

  在21楼发现了新的方法,完全放弃了getFromLocationName方法,用的是The Google Geocoding API

  这个API整合可以代替先前的方法,输入地名返回JSON或者XML格式的文件,包含一对地址信息。

  XML为http://maps.googleapis.com/maps/api/geocode/xml?address=北京交通大学&sensor=false

  JSON为http://maps.googleapis.com/maps/api/geocode/json?address=北京交通大学&sensor=false

  现在需要自己写一个静态方法去解析XML或者JSON,以JSON为例:

  public class MapUtility {
  public static JSONObject getLocationInfo(String address) {

  HttpGet httpGet = new HttpGet("http://maps.google."

  + "com/maps/api/geocode/json?address=" + address

  + "&sensor=false");

  HttpClient client = new DefaultHttpClient();

  HttpResponse response;

  StringBuilder stringBuilder = new StringBuilder();

  try {

  response = client.execute(httpGet);

  HttpEntity entity = response.getEntity();

  InputStream stream = entity.getContent();

  int b;

  while ((b = stream.read()) != -1) {

  stringBuilder.append((char) b);

  }

  } catch (ClientProtocolException e) {

  e.printStackTrace();

  } catch (IOException e) {

  e.printStackTrace();

  }

  JSONObject jsonObject = new JSONObject();

  try {

  jsonObject = new JSONObject(stringBuilder.toString());

  } catch (JSONException e) {

  e.printStackTrace();

  }

  return jsonObject;

  }

  // converts JSONObject into a GeoPoint.

  public static GeoPoint getGeoPoint(JSONObject jsonObject) {

  Double lon = new Double(0);

  Double lat = new Double(0);

  try {

  lon = ((JSONArray) jsonObject.get("results")).getJSONObject(0)

  .getJSONObject("geometry").getJSONObject("location")

  .getDouble("lng");

  lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)

  .getJSONObject("geometry").getJSONObject("location")

  .getDouble("lat");

  } catch (JSONException e) {

  e.printStackTrace();

  }

  return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));

  }

  }

  第一个方法根据地址取得JSON,第二个方法从JSON提取坐标。

  最后程序效果如下:

  Android地址与经纬度转换

  最后,应该考虑在不同于UI线程的线程中执行地理编码操作。很明显:这项操作很耗时,而且你一定不希望UI在进行地理编码时停顿,如果停顿会阻塞整个用户界面。当在执行一些耗时的操作的时候,不能及时地分发 事件,包括用户界面重绘事件。从用户的角度来看,应用程序看上去像挂掉了。更糟糕的是,如果阻塞应用程序的时间过长,Android会向用户提示 一些信息,即打开一个“应用程序没有相应(application not responding)” 的对话框。
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网