通过经纬度解析商圈Scala实现方式
通过字段中的经纬度用百度的开发者平台,来解析周边的商圈信息,代码如下:
package com.utilsimport 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.OKval 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").getAsIntif (status == 0) {val resultObject = returnData.getAsJsonObject("result")business = resultObject.get("business").getAsString.replaceAll(",", ";")// 判断business是否为空,如果为空,接着解析改坐标点附近的标签信息poisif (StringUtils.isEmpty(business)) {val pois = resultObject.getAsJsonArray("pois")var tagSet = Set[String]()for (i <- 0 until pois.size()) {val elemObject: JsonObject = pois.get(i).getAsJsonObjectval tag = elemObject.get("tag").getAsStringif (StringUtils.isNotEmpty(tag)) tagSet += tag}business = tagSet.mkString(";")}}}business}private def requetParams(lng: String, lat: String) = {//3eWFUfbFLTMopRpY1xk9BRD3iFdxo3r4//rvGCL2H2iEScXwNgZvGplcyRsnDC2x9jval list ="cUriDdpqq1BibSZzS6jgUIFS5KoFHElK,bh9GsxVRkLBv7pZMuGR5TIZFbDR12Bbu"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)// 生成SNval 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 StringBufferimport 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 StringBuffervar i = 0while ( {i < array.length}) {sb.append(Integer.toHexString((array(i) & 0xFF) | 0x100).substring(1, 3)){i += 1i}}return sb.toString} catch {case e: NoSuchAlgorithmException =>}null}}
通过经纬度解析商圈Scala实现方式相关推荐
- 依据经纬度解析商圈scala实现
调用高德的API,需要先去高德申请一个key. import com.alibaba.fastjson.{JSON, JSONArray, JSONObject} import org.apache. ...
- 测试:使用高德地图把经纬度转为商圈
第一次使用高德地图,经纬对转换为商圈,测试如下 def parseGaodeJson(jsonStr: String) = { val areaList: List[JsonAST.JValue] = ...
- 如何实现基于商圈和地标的位置搜索
简介 标题中包含了两个关键词,商圈和地标,先来解释一下商圈和地标这两个名词.商圈是一个地理范围,但并不是官方的划分,而是民间大致的划分,它通常提供了民众消费.娱乐的功能,产生了一个相对集中的活动区域, ...
- MobTech城市智图 | 多维度交叉分析成都某核心商圈客流,助力商圈精细化运营
成都,是四川省省会.特大城市.成渝地区双城经济圈核心城市.近些年,成都以时尚潮流为标榜,成为网红城市,诞生了诸多打卡商业街与景点,例如,国际金融中心.成都远洋太古里.锦华万达广场.环球MALL .万象 ...
- 基于经纬度进行商圈定位
一:使用高德地图的接口 获取key的步骤: 1.申请网站: https://lbs.amap.com/ 2.登陆注册 3.选择开发支持–>web服务API 4.进入控制台–>我的应用 5. ...
- 【数据应用技巧】基于快速GeoHash,实现海量商品与商圈的高效匹配
案例来源:@阿里技术 案例地址:https://mp.weixin.qq.com/s/vwhetMpQllczILptBNcoWg 0. 背景:闲鱼每天都有海量商品位置(点数据)与大量商圈(面数据)的 ...
- [.NET/C#]快速采集全国城市商圈数据
声明:此文章及所涉及的程序代码仅供学习与交流,使用者如有违反相关法律的行为将负法律责任. [商圈]在O2O时代是个常用的数据,但数据在网上难以寻找,或遇数据公司的收费障碍.对于开发人员来说,比较好的方 ...
- Python:层次聚类分析——基于基站定位数据商圈分析
<Python数据分析与挖掘实战>书中本章无原始数据,文中仅展示了聚类分析了各人群聚集区特征(商圈特征,做营销策划住宅区.CBD商场.办公楼这还用聚类分析吗,直接肉眼也能辨别吧,这就是所有 ...
- 五一商圈之外,红星商圈再塑长沙商圈第二极
文 | 易不二 来源|螳螂财经(ID:TanglangFin) 在已经来临的2020年"十一假期plus",作为网红城市的长沙,排在了人们黄金周热门旅游目的地城市的第五位. 这样的 ...
最新文章
- 5/29 c的结构体变量
- 人工智能在牙科医疗领域是一片蓝海
- 使用c:foreach时链接失效
- 【算法】吴忠强:刷LeetCode的正确姿势!
- [转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib
- 各大银行对应的字段(仅做参考)
- hadoop-0.21.0-eclipse-plugin无法在eclipse中运行解决方案
- 支持国产处理器仿真的全数字实时仿真平台SkyEye与可信编译器L2C的核心翻译步骤
- python高阶_Python高阶学习
- Y15BeTa蜂鸣器-演奏版-简化版
- Qt总结之二:遍历文件夹和文件目录,并过滤和获取文件信息、后缀名、前缀名(二)
- 20165301陈潭飞2017-2018-2 20165301 实验三《Java面向对象程序设计》实验报告
- bzoj 2623 所罗门的咒语
- oracle查询时使用case,Oracle查询语句中Casewhen的使用
- 系统迁移工具迁移操作系统到别的硬盘
- linux编译n2n v2,在centos下安装n2n服务器
- ruby--数值类(Numeric)
- 不惧变化 抓住机遇 | A+CLUB 8月深圳站
- 如何恢复自身的精力 [转]
- 【Python打卡2019】20190417之计算BMR