根据经纬度查询地址并对获取的json数据进行解析

该博客介绍了如何从Google服务器通过经纬度获取JSON格式的地址数据,并详细展示了如何解析这个JSON数据,包括提取国家、行政区域、本地化信息等步骤。

第一步:根据指定的URL从google 服务器上获得包含地址的json格式的数据(其还提供xml格式的,但json解析效率比xml高)

  1. private static StringBuffer getJSONData(String urlPath){  
  2.           
  3.         try {  
  4.             URL url = new URL(urlPath);  
  5.               
  6.             HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();  
  7.             httpURLConnection.setReadTimeout(5000);  
  8.             httpURLConnection.setRequestMethod("GET");  
  9.             if(httpURLConnection.getResponseCode() == 200){  
  10.                 InputStream inputStream = httpURLConnection.getInputStream();  
  11.                 InputStreamReader isr = new InputStreamReader(inputStream);  
  12.                 BufferedReader br = new BufferedReader(isr);  
  13.                 String temp = null;  
  14.                 StringBuffer jsonsb = new StringBuffer();  
  15.                 while((temp = br.readLine()) != null){  
  16.                     jsonsb.append(temp);  
  17.                 }  
  18.                 return jsonsb;  
  19.             }  
  20.         } catch (MalformedURLException e) {  
  21.             // TODO Auto-generated catch block  
  22.             e.printStackTrace();  
  23.         } catch (IOException e) {  
  24.             // TODO Auto-generated catch block  
  25.             e.printStackTrace();  
  26.         }     
  27.         return null;  
  28.     }  

传入经纬度作为参数

[java:showcolumns]  view plain copy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. /** 
  2.      * 根据经纬度获得地址 
  3.      * @param latitude 
  4.      * @param longitude 
  5.      * @return 
  6.      */  
  7.     public static StringBuffer getCurrentAddressByGPS(long latitude,long longitude){  
  8.           
  9.         StringBuffer stringBuffer = new StringBuffer();  
  10.         stringBuffer.append(GOOGLE_GPS_PREFIX).append(latitude).append(",")  
  11.             .append(longitude).append(GOOGLE_GPS_SUFFIX);  
  12.               
  13.         return getJSONData(stringBuffer.toString());  
  14.     }  
第三,解析json数据:


·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. public static boolean parseAddressJSON(StringBuffer sb){  
  2.           
  3.         try {  
  4.             if(sb != null){  
  5.                 JSONObject jsonAllData = new JSONObject(sb.toString());  
  6.                 /** 
  7.                  * 获得一个长度为1的JSON数组,如:[{数据内容}] 
  8.                  */  
  9.                 String placemarkStr = jsonAllData.getString("Placemark");  
  10.                 /** 
  11.                  * 将placemarkStr数组类型字符串构造成一个JSONArray对象 
  12.                  */  
  13.                 JSONArray placemarkArray = new JSONArray(placemarkStr);  
  14.                 /** 
  15.                  * Placemark标签内容是一个长度为1的数组,获得数组的内容并转换成字符串 
  16.                  */  
  17.                 String jsonDataPlacemarkStr = placemarkArray.get(0).toString();  
  18.                 /** 
  19.                  * 对上面得到的JSON数据类型的字符串(jsonDataPlacemarkStr)进行解析 
  20.                  */  
  21.                 JSONObject jsonDataPlacemark = new JSONObject(jsonDataPlacemarkStr);  
  22.                 /** 
  23.                  * 获得标签AddressDetails的JSON数据 
  24.                  */  
  25.                 String jsonAddressDetails = jsonDataPlacemark.getString("AddressDetails");  
  26.                 /** 
  27.                  * 对上面得到的JSON数据类型的字符串(jsonAddressDetails)进行解析 
  28.                  */  
  29.                 JSONObject jsonDataAddressJDetails = new JSONObject(jsonAddressDetails);  
  30.                 /** 
  31.                  * 获得标签Country的JSON数据 
  32.                  */  
  33.                 String jsonCountry = jsonDataAddressJDetails.getString("Country");  
  34.                   
  35.                   
  36.                 /** 
  37.                  * 对上面得到的JSON数据类型的字符串(jsonCountry)进行解析 
  38.                  */  
  39.                 JSONObject jsonDataCountry = new JSONObject(jsonCountry);  
  40.                   
  41.                 /** 
  42.                  * 对解析出来的感兴趣的数据进行封装 
  43.                  */  
  44.                 LewatekGPSAddress lewatekGPSAddress = new LewatekGPSAddress();  
  45.                 /** 
  46.                  * 设置CountryName 
  47.                  */  
  48.                 lewatekGPSAddress.setCountryName(jsonDataCountry.getString("CountryName"));  
  49.                 /** 
  50.                  * 设置CountryNameCode 
  51.                  */  
  52.                 lewatekGPSAddress.setCountryNameCode(jsonDataCountry.getString("CountryNameCode"));  
  53.                   
  54.                   
  55.                 /** 
  56.                  * 获得标签AdministrativeArea的JSON数据 
  57.                  */  
  58.                 String jsonAdministrativeArea = jsonDataCountry.getString("AdministrativeArea");  
  59.                   
  60.                 /** 
  61.                  * 对上面得到的JSON数据类型的字符串(jsonAdministrativeArea)进行解析 
  62.                  */  
  63.                 JSONObject jsonDataAdministrativeArea = new JSONObject(jsonAdministrativeArea);  
  64.                   
  65.                 /** 
  66.                  * 设置AdministrativeAreaName 
  67.                  */  
  68.                 lewatekGPSAddress.setAdministrativeAreaName(jsonDataAdministrativeArea.getString("AdministrativeAreaName"));  
  69.                   
  70.                 /** 
  71.                  * 获得标签Locality的JSON数据 
  72.                  */  
  73.                 String jsonLocality = jsonDataAdministrativeArea.getString("Locality");  
  74.                   
  75.                 /** 
  76.                  * 对上面得到的JSON数据类型的字符串(jsonLocality)进行解析 
  77.                  */  
  78.                 JSONObject jsonDataLocality = new JSONObject(jsonLocality);  
  79.                   
  80.                   
  81.                 /** 
  82.                  * 设置LocalityName 
  83.                  */  
  84.                 lewatekGPSAddress.setLocalityName(jsonDataLocality.getString("LocalityName"));  
  85.                   
  86.                   
  87.                 /** 
  88.                  * 获得标签DependentLocality的JSON数据 
  89.                  */  
  90.                 String jsonDependentLocality = jsonDataLocality.getString("DependentLocality");  
  91.                   
  92.                 /** 
  93.                  * 对上面得到的JSON数据类型的字符串(jsonDependentLocality)进行解析 
  94.                  */  
  95.                 JSONObject jsonDataDependentLocality = new JSONObject(jsonDependentLocality);  
  96.                   
  97.                 lewatekGPSAddress.setDependentLocalityName(jsonDataDependentLocality.getString("DependentLocalityName"));  
  98.                   
  99.                 Log.e(TAG,lewatekGPSAddress.toString());  
  100.                   
  101.                 return true;  
  102.             }  
  103.         } catch (JSONException e) {  
  104.             // TODO Auto-generated catch block  
  105.             e.printStackTrace();  
  106.         }  
  107.           
  108.         return false;  
  109.     }  
从google服务器上获得的json数据(提取对我有用的数据:CountryName、LocalityName、AdministrativeAreaName、DependentLocalityName,即中国上海市上海市浦东新区(中国湖南省衡阳市衡山县这样的数据也能提取)):


  1. {  
  2.   "name""31.20322202833381,121.59876351250254",  
  3.   "Status": {  
  4.     "code": 200,  
  5.     "request""geocode"  
  6.   },  
  7.   "Placemark": [ {  
  8.     "id""p1",  
  9.     "address""中国上海市浦东新区祖冲之路994号-1088号",  
  10.     "AddressDetails": {  
  11.    "Accuracy" : 8,  
  12.    "Country" : {  
  13.       "AdministrativeArea" : {  
  14.          "AdministrativeAreaName" : "上海市",  
  15.          "Locality" : {  
  16.             "DependentLocality" : {  
  17.                "DependentLocalityName" : "浦东新区",  
  18.                "Thoroughfare" : {  
  19.                   "ThoroughfareName" : "祖冲之路994号-1088号"  
  20.                }  
  21.             },  
  22.             "LocalityName" : "上海市"  
  23.          }  
  24.       },  
  25.       "CountryName" : "中国",  
  26.       "CountryNameCode" : "CN"  
  27.    }  
  28. },  
  29.     "ExtendedData": {  
  30.       "LatLonBox": {  
  31.         "north": 31.2070152,  
  32.         "south": 31.2007199,  
  33.         "east": 121.6018752,  
  34.         "west": 121.5955799  
  35.       }  
  36.     },  
  37.     "Point": {  
  38.       "coordinates": [ 121.5986103, 31.2038252, 0 ]  
  39.     }  
  40.   } ]  
  41. }  
  42.  Value [{"id":"p1","ExtendedData":{"LatLonBox":{"south":31.2007199,"west":121.5955799,"east":121.6018752,"north":31.2070152}},"address":"中国上海市浦东新区祖冲之路994号-1088号","Point":{"coordinates":[121.5986103,31.2038252,0]},"AddressDetails":{"Country":{"CountryNameCode":"CN","CountryName":"中国","AdministrativeArea":{"Locality":{"LocalityName":"上海市","DependentLocality":{"DependentLocalityName":"浦东新区","Thoroughfare":{"ThoroughfareName":"祖冲之路994号-1088号"}}},"AdministrativeAreaName":"上海市"}},"Accuracy":8}}] at Placemark of type org.json.JSONArray cannot be converted to JSONObject  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值