根据具体的地址解析出对应的地区码
之前碰见的需求,根据具体的地址信息解析出对应的省市县地区码,以前是基于数据库做的根据表中字段是否包含地区,然后再向上或向下进行判断确保准确。具体是用mysql的函数location,但是这样碰见重复的会查询多次数据库,并且效率比较低。有些特殊的地址可能会判断错误。最近发现百度地图的api可以实现这个功能。代码如下:
1 public class BaiduMapUtils { 2 3 public static final String ak=""; 4 5 public static void parseAddress(String address){ 6 String url = "http://api.map.baidu.com/geocoder/v2/"; 7 8 HashMap<String, String> params = new HashMap<>(); 9 params.put("ak", ak); 10 params.put("output", "json"); 11 params.put("address", address); 12 13 String s = HttpClientUtils.doGet(url, params); 14 Double[] lngAndLat = getLngAndLat(s); 15 16 HashMap<String, String> params1 = new HashMap<>(); 17 18 params1.put("location", lngAndLat[1] + "," + lngAndLat[0]); 19 params1.put("output", "json"); 20 params1.put("ak", ak); 21 String s1 = HttpClientUtils.doGet(url, params1); 22 23 String adcode = getAdcode(s1); 24 //TODO 其他业务 25 System.out.println(getAdcode(s1)); 26 } 27 28 /** 29 * 获取行政编码 30 * @param result 31 * @return 32 */ 33 private String getAdcode(String result) { 34 if (StringUtil.isNotEmpty(result)){ 35 JSONObject jsonObject = JSON.parseObject(result); 36 if (jsonObject.getIntValue("status") == 0){ 37 JSONObject resultJson = jsonObject.getObject("result", JSONObject.class); 38 Map<String, String> address = resultJson.getObject("addressComponent", Map.class); 39 return address.get("adcode"); 40 } 41 } 42 return null; 43 } 44 45 /** 46 * 获取经纬度信息 47 * @param result 48 * @return 49 */ 50 private Double[] getLngAndLat(String result) { 51 if (StringUtil.isNotEmpty(result)){ 52 JSONObject jsonObject = JSON.parseObject(result); 53 int status = jsonObject.getIntValue("status"); 54 if (status == 0){ 55 JSONObject resultJson = jsonObject.getObject("result", JSONObject.class); 56 if (!result.isEmpty()){ 57 JSONObject location = resultJson.getObject("location", JSONObject.class); 58 return new Double[]{location.getDouble("lng"), location.getDouble("lat")}; 59 } 60 } 61 } 62 return null; 63 } 64 65 }
其中代码中的ak是自己申请的应用的密码,然后将获取的json进行处理获取最终的地区码。