使用百度開發者平臺
阿新 • • 發佈:2018-11-29
使用百度地圖開發者平臺,通過呼叫介面,傳入經緯度獲取相應的位置
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)