1. 程式人生 > >使用百度開發者平臺

使用百度開發者平臺

使用百度地圖開發者平臺,通過呼叫介面,傳入經緯度獲取相應的位置
1、首先先註冊一個賬號
https://lbsyun.baidu.com/
2、在這裡插入圖片描述
在這裡插入圖片描述
點選建立應用,然後一個應用有一個AK,和SK
在這裡插入圖片描述
附錄上有API開發文件
3、程式碼

package utils

import java.io.UnsupportedEncodingException
import java.net.URLEncoder
import java.security.NoSuchAlgorithmException
import java.util

import com.google.gson.{JsonObject,
JsonParser} import org.apache.commons.httpclient.HttpClient import org.apache.commons.httpclient.methods.GetMethod import org.apache.commons.lang3.StringUtils /** * 請求百度LBS,解析經緯度對應的商圈資訊 * */ object BaiduLBSHandler { /** * 對外提供的解析經緯度對應的商圈資訊 * * @param lng 經度 * @param lat 緯度 */
def parseBusinessTagBy(lng: String, lat: String) = { var business: String = "" val requestParams = requetParams(lng, lat) val requestURL = "http://api.map.baidu.com/geocoder/v2/?" + requestParams // 使用HttpClient 模擬瀏覽器傳送請求 val httpClient = new HttpClient() val getMethod = new GetMethod
(requestURL) val statusCode = httpClient.executeMethod(getMethod) if (statusCode == 200) { // HTTP.OK val response = getMethod.getResponseBodyAsString // 判斷是否是合法的json字元換 var str = response.replaceAll("renderReverse&&renderReverse\\(", "") if (!response.startsWith("{")) { str = str.substring(0, str.length - 1) } // 解析這個json字串,取出business節點資料 val returnData = new JsonParser().parse(str).getAsJsonObject // 伺服器返回來的json資料,status表示伺服器是否正常(0)處理了我的請求 val status = returnData.get("status").getAsInt if (status == 0) { val resultObject = returnData.getAsJsonObject("result") business = resultObject.get("business").getAsString.replaceAll(",", ";") // 判斷business是否為空,如果為空,接著解析改座標點附近的標籤資訊pois if (StringUtils.isEmpty(business)) { val pois = resultObject.getAsJsonArray("pois") var tagSet = Set[String]() for (i <- 0 until pois.size()) { val elemObject: JsonObject = pois.get(i).getAsJsonObject val tag = elemObject.get("tag").getAsString if (StringUtils.isNotEmpty(tag)) tagSet += tag } business = tagSet.mkString(";") } } } business } private def requetParams(lng: String, lat: String) = { //下面是填上自己的AK和SK val list ="G9GkjkDZhhhhhGxYBH8aqWz6nd6Nc,QFaLFDkRU0opdddsI2Nw7Ub3ofFVkQLSKV" val Array(ak, sk) = list.split(",") // 計算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請求中對應引數的出現順序保持一致。 val paramsMap = new util.LinkedHashMap[String, String](); paramsMap.put("callback", "renderReverse") // paramsMap.put("location", "39.343424,116.452987") paramsMap.put("location", lat.concat(",").concat(lng)) paramsMap.put("output", "json") paramsMap.put("pois", "1") paramsMap.put("ak", ak) // 請求的引數 val paramsStr = toQueryString(paramsMap) // 生成SN val wholeStr = new String("/geocoder/v2/?" + paramsStr + sk) val tempStr = URLEncoder.encode(wholeStr, "UTF-8") val sn = MD5(tempStr) paramsStr + "&sn=" + sn } // 對Map內所有value作utf8編碼,拼接返回結果 @throws[UnsupportedEncodingException] private def toQueryString(data: util.LinkedHashMap[String, String]): String = { val queryString = new StringBuffer import scala.collection.JavaConversions._ for (pair <- data.entrySet) { queryString.append(pair.getKey + "=") queryString.append(URLEncoder.encode(pair.getValue.asInstanceOf[String], "UTF-8") + "&") } if (queryString.length > 0) queryString.deleteCharAt(queryString.length - 1) queryString.toString } // 來自stackoverflow的MD5計算方法,呼叫了MessageDigest庫函式,並把byte陣列結果轉換成16進位制 private def MD5(md5: String): String = { try { val md = java.security.MessageDigest.getInstance("MD5") val array = md.digest(md5.getBytes) val sb = new StringBuffer var i = 0 while ( { i < array.length }) { sb.append(Integer.toHexString((array(i) & 0xFF) | 0x100).substring(1, 3)) { i += 1 i } } return sb.toString } catch { case e: NoSuchAlgorithmException => } null } }

呼叫

      val long =t.getAs[String]("long")
      val lat = t.getAs[String]("lat")
      //geohash演算法,
      val geoHash = GeoHash.geoHashStringWithCharacterPrecision(lat.toDouble,long.toDouble,8)
      val b = BaiduLBSHandler.parseBusinessTagBy(long,lat)