根据地址查询经纬度

有时候需要根据具体位置查询该地址对应的经纬度,然后将其保存到数据库中......

import android.location.Address;
import android.location.Geocoder;

/**
	 * 根据地址查询经纬度
	 * @param strSearchAddress 查询地址
	 * @return
	 */
	private Address getGeoByAddress(String strSearchAddress) {
		Address address=null;
		try {
			if (strSearchAddress != null&&strSearchAddress.length()>0) {
				Geocoder geocoder = new Geocoder(context,Locale.getDefault());
//				Geocoder geocoder = new Geocoder(context,Locale.US);
				List<Address> addresses = geocoder.getFromLocationName(strSearchAddress, 1);
				if (!addresses.isEmpty()) {
					address = addresses.get(0);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return address;
	}


不是每次都能获取到经纬度的,有时候会抛出unable to parse response from server 异常。
这是google map的bug,详情请见:
http://code.google.com/p/android/issues/detail?id=8816

当抛出异常后需要换一种方法解决,
直接请求url获得json数据,然后解析:
public 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();
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}

		JSONObject jsonObject = new JSONObject();
		try {
			jsonObject = new JSONObject(stringBuilder.toString());
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}

		return jsonObject;
	}
	
	public Address getGeoPoint(JSONObject jsonObject) {
		if(jsonObject==null){
			return null;
		}
		Double lng = new Double(0);
		Double lat = new Double(0);
		try {
			lng = ((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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		Address address=new Address(Locale.US);
		address.setLatitude(lat);
		address.setLongitude(lng);
		return address;
	}


在getGeoByAddress()方法的try catch中起一个线程执行getLocationInfo()方法:
}catch (Exception e) {
    strSearchAddress=strSearchAddress.replace(" ", "+").replace(",", ",+");
     DownloadTask task = new DownloadTask(strSearchAddress);//注意同步问题,要先返回,后操作。
     task.execute();
}

最后使用的时候要注意线程同步!
.........
Address latLong=getGeoByAddress(detailAddress);
			try {
//休眠2秒,好让请求url时有足够的时间返回经纬度。虽然是个很馊的主意,但至少有效。
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			if(latLong!=null){
				if(latLong.getLatitude()!=0&&latLong.getLongitude()!=0){
					App.store.setLatitude(latLong.getLatitude());//纬度
					App.store.setLongitude(latLong.getLongitude());//经度
				}
			}
.........


class DownloadTask extends AsyncTask<String, Integer, JSONObject> {
		String strSearchAddress;
		DownloadTask(String strSearchAddress) {
			this.strSearchAddress=strSearchAddress;
		}

		@Override
		protected JSONObject doInBackground(String... params) {
			JSONObject obj=getLocationInfo(strSearchAddress);
			return obj;
		}

		@Override
		protected void onCancelled() {
			super.onCancelled();
		}

		@Override
		protected void onPostExecute(JSONObject result) {
			Address address=getGeoPoint(result);
			if(address!=null){//赋值
				if(address.getLatitude()!=0&&address.getLongitude()!=0){
					App.store.setLatitude(address.getLatitude());//纬度
					App.store.setLongitude(address.getLongitude());//经度
				}
			}
		}

		@Override
		protected void onPreExecute() {
			// 预处理
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			// 更新进度
		}
	}




实现Android的不同精度的定位(基于网络和GPS) 
http://lszdb1983.blog.163.com/blog/static/2042634820126221635756/

android Location 过滤最佳的位置
http://lipeng88213.iteye.com/blog/1936338

猜你喜欢

转载自gundumw100.iteye.com/blog/1932024