1. 程式人生 > >java根據地址獲得經緯度(百度地圖)

java根據地址獲得經緯度(百度地圖)

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);


        }
}

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述