java百度地圖介面呼叫獲取經緯度

sayWhat_sayHello發表於2018-07-18

1.這個介面是傳入一個 中文地址 獲取對應的 地理編碼即經緯度。以下是介面文件:
http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
介面文件提供了請求路徑:
http://api.map.baidu.com/geocoder/v2/?address=北京市海淀區上地十街10號&output=json&ak=您的ak&callback=showLocation //GET請求
由於我們使用的是java,這個callback請求是不用的,所以請求的url應該是:
http://api.map.baidu.com/geocoder/v2/?address=請求地址&output=json&ak=您的ak //GET請求
其中ak的申請在http://lbsyun.baidu.com/apiconsole/key?application=key

2.我們在這裡請求的引數有兩個,一個地址,一個ak。這裡對地址做了處理,這個因為使用者的輸入很難確認,有的地址裡有, 有的地址有\n, 更加誇張的是居然會有這種上海市xxxx22號樓207室 由於地址資訊比較敏感,中間我做了處理。
引數這裡有一個限制條件:最多支援84個位元組。一箇中文字元兩個位元組,那麼string的長度不能超過84/2=41,但是由於奇葩的資料真的多,一般長度到25已經是能到街道了,所以這裡又做了一個處理。

public static String convertAddress(String address, String ak) {
        URL url = null;
        HttpURLConnection urlConnection = null;
        BufferedReader rd = null;
        Double lng = null;
        Double lat = null;
        Map<String, Object> map = null;
        Map<String, Object> result = null;
        Map<String, Object> location = null;

        address = address.trim();
        address = address.replaceAll("\\\\", "");
        String regEx = "[`~!@#$%^&*()\\-+={}':;,\\[\\].<>/?¥%…()_+|【】‘;:”“’。,、?\\s]";
        address = address.replaceAll(regEx,"").trim();
        if (address.length()>=25)address = address.substring(0,25);
        String urlString = new StringBuilder().append("http://api.map.baidu.com/geocoder/v2/?").append("address=").append(address).append("&output=json").append("&ak=").append(ak).toString();
        try {
            URLEncoder.encode(urlString,"UTF-8");
            url = new URL(urlString);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);
            rd = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
            StringBuffer sb = new StringBuffer();
            String data = null;
            while ((data = rd.readLine()) != null) {
                sb.append(data);
            }
            System.out.println(sb);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            urlConnection.disconnect();
            try {
                rd.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return sb.toString();
    }

在專案裡:
1. jdbc建立和資料庫的連線,獲取地址
2. 使用上述方法將地址轉換成經緯度
3. 將地址轉換的經緯度存回資料庫。

我們會發現一個問題:由於單純呼叫這種方法,開啟連線和釋放連線的時間太久。
資料庫裡我有5880條資料,居然跑了17分鐘!
為此我想了一下可能有下面3個解決方案:

  • http連線池減少建立http連線,釋放的時間
  • 資料庫連線池批量插入資料
  • 多執行緒?

最後我採用了httpclient及相關連線池+多執行緒將時間壓縮到了2分30s。
這裡我就不做相關描述了。

相關文章