根据地址查询经纬度

来源:互联网 发布:php编程思想 编辑:程序博客网 时间:2024/05/01 05:22
有时候需要根据具体位置查询该地址对应的经纬度,然后将其保存到数据库中......
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 blocke.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 blocke.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 blocke.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;}@Overrideprotected JSONObject doInBackground(String... params) {JSONObject obj=getLocationInfo(strSearchAddress);return obj;}@Overrideprotected void onCancelled() {super.onCancelled();}@Overrideprotected 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());//经度}}}@Overrideprotected void onPreExecute() {// 预处理}@Overrideprotected void onProgressUpdate(Integer... values) {// 更新进度}}




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

android Location 过滤最佳的位置
http://lipeng88213.iteye.com/blog/1936338
0 0
原创粉丝点击