java根據地址獲得經緯度(百度地圖)
阿新 • • 發佈:2019-01-31
1.在百度地圖裡面建立應用
2.獲得簽名
根據需要我們要先做java版計算signature簽名!!之前建立的Ak放入引數中
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.NoSuchAlgorithmException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
//java版計算signature簽名
public class SnCal {
public static void main(String[] args) throws UnsupportedEncodingException,
NoSuchAlgorithmException {
SnCal snCal = new SnCal();
// 計算sn跟引數對出現順序有關,get請求請使用LinkedHashMap儲存<key,value>,該方法根據key的插入順序排序;post請使用TreeMap儲存<key,value>,該方法會自動將key按照字母a-z順序排序。所以get請求可自定義引數順序(sn引數必須在最後)傳送請求,但是post請求必須按照字母a-z順序填充body(sn引數必須在最後)。以get請求為例:http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak,paramsMap中先放入address,再放output,然後放ak,放入順序必須跟get請求中對應引數的出現順序保持一致。
Map paramsMap = new LinkedHashMap<String, String>();
paramsMap.put("address", "百度大廈");
paramsMap.put("output", "json");
paramsMap.put("ak", "yourak");
// 呼叫下面的toQueryString方法,對LinkedHashMap內所有value作utf8編碼,拼接返回結果address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=yourak
String paramsStr = snCal.toQueryString(paramsMap);
// 對paramsStr前面拼接上/geocoder/v2/?,後面直接拼接yoursk得到/geocoder/v2/?address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=yourakyoursk
String wholeStr = new String("/geocoder/v2/?" + paramsStr + "yoursk");
// 對上面wholeStr再作utf8編碼
String tempStr = URLEncoder.encode(wholeStr, "UTF-8");
// 呼叫下面的MD5方法得到最後的sn簽名7de5a22212ffaa9e326444c75a58f9a0
System.out.println(snCal.MD5(tempStr));
}
// 對Map內所有value作utf8編碼,拼接返回結果
public String toQueryString(Map<?, ?> data)
throws UnsupportedEncodingException {
StringBuffer queryString = new StringBuffer();
for (Entry<?, ?> pair : data.entrySet()) {
queryString.append(pair.getKey() + "=");
queryString.append(URLEncoder.encode((String) pair.getValue(),
"UTF-8") + "&");
}
if (queryString.length() > 0) {
queryString.deleteCharAt(queryString.length() - 1);
}
return queryString.toString();
}
// 來自stackoverflow的MD5計算方法,呼叫了MessageDigest庫函式,並把byte陣列結果轉換成16進位制
public String MD5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest
.getInstance("MD5");
byte[] array = md.digest(md5.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100)
.substring(1, 3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
}
}
呼叫百度地圖介面採用httpClient技術
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class AllSeagen {
public static void main(String[] args) throws IOException {
HttpClient client = HttpClients.createDefault();// 建立預設http連線
HttpPost post = new HttpPost("http://api.map.baidu.com/geocoder/v2/");// 建立一個post請求
List<NameValuePair> paramList = new ArrayList<NameValuePair>();
paramList.add(new BasicNameValuePair("ak", ""));//傳遞的引數
paramList.add(new BasicNameValuePair("sn", ""));//傳遞的引數
paramList.add(new BasicNameValuePair("address", "北京市海淀區上地十街10號"));//傳遞的引數
// 把參轉碼後放入請求實體中
HttpEntity entitya = new UrlEncodedFormEntity(paramList, "utf-8");
post.setEntity(entitya);// 把請求實體放post請求中
HttpResponse response = client.execute(post);// 用http連線去執行get請求並且獲得http響應
HttpEntity entity = response.getEntity();// 從response中取到響實體
String html = EntityUtils.toString(entity);// 把響應實體轉成文字
System.out.println(html);
}
}