需求:使用腾讯地图api,将百度地图经纬度转换为腾讯地图经纬度。

文档地址:腾讯地图坐标转换api文档地址
功能:实现从其它地图供应商坐标系或标准GPS坐标系,批量转换到腾讯地图坐标系。
需求:因为需要批量转换的经纬度数量过多,需要在后端分段请求接口,再拼接返回给前端。


//HTTP GET 请求 : 只支持1000字节
String url = "https://apis.map.qq.com/ws/coord/v1/translate?";//格式:纬度前,经度后,纬度和经度之间用",“分隔,每组坐标之间使用”;"分隔;
String locations = "locations=39.12,116.83;30.21,115.43";
String type = "&type=3";    //输入的locations的坐标类型范围:0-6。3为baidu经纬度
String key = "&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77";    //开发密钥(Key)在我的应用中获得
// 请求示例
String url = https://apis.map.qq.com/ws/coord/v1/translate?locations=lng1,lat1;lng2,lat2&type=3&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77//响应示例
{
"status": 0,
"message": "转换成功",
"locations": [{"lng": 116.8234023,"lat": 39.11428542},{"lng": 115.42357111,"lat": 30.20378632}
]

}

1.申请密钥

(1)登陆后,进入应用管理——我的应用——创建应用——获得密钥

(2)进入配额管理——我的配额,可以看到各个接口的每日最高调用量和并发量额度。

Tips:
(1)限制每秒请求次数:每秒最高的请求并发量是5次
(2)限制请求大小:批量支持坐标个数以HTTP GET方法请求上限为准:1000字节

2.处理方法

//计算字节大小
byte[]  buff = xqRange.getBytes();
int i = buff.length;
System.out.println(i);//经过测试,大概40组经纬度可以进行一次请求不会失败。

使用的类对象:

// 提取经纬度的类
public class xxxVO {private String lng;     // 经度private String lat;        // 纬度}
//接收坐标转换接口返回的参数类
public class HttpsResponseVO {// 状态private Integer status;      // 信息private String message;        // 转换后的地址private JSONArray locations;
}

转换方法1:

只处理了请求的数据量,未考虑每秒最大请求数。在需要请求的次数 > 5 时,会出现请求不到数据的情况


public String baidu2tencent1() {try {//## 配置请求字符串String url = "https://apis.map.qq.com/ws/coord/v1/translate?locations=";String type = "&type=3";  //baidu地图String key = "&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77";String range1 = "";      //保存拼接值String range2 = "";       //保存返回结果//Spring3.0开始支持的一个 HTTP 请求工具,用于在代码中请求第三方接口RestTemplate restTemplate = new RestTemplate();//## 处理用于请求转换的经纬度数组字符串:String range = "[{"lng":110.355443,"lat":20.038738},{"lng":110.358749,"lat":20.037388},{"lng":110.360217,"lat":20.036845},{"lng":110.360968,"lat":20.03648}]";//先转为jsonArray对象,在转为目标对象xxxVO集合JSONArray objects = JSONUtil.parseArray(range);      //hutool工具方法:JSONUtilList<xxxVO> xxxVOList = JSONUtil.toList(objects, xxxVO.class);// 计算数组大小int size = xxxVOList.size();if (size > 40) {//需要将经纬度数组,分成多个40组的集合,分段请求多次    int requestNum = size / 40;int add = size % 40;if (add > 0) {requestNum ++;}System.out.println("总共需要请求 = " + requestNum + "次");//保存分段请求集合List<List<xxxVO>> splitList = new ArrayList<List<xxxVO>>();   //分段请求的集合int loc = 40;   //记录每次分段的末尾经纬度位置for(int i = 0; i < requestNum ; i++) {if(loc > size) {loc = size;}System.out.println("起始位置 = " + i * 40 + " —— 结束位置 = " + loc);List<xxxVO> spList = xxxVOList.subList(i * 40 , loc);//截取集合部分splitList.add(spList);loc = loc + 40;       //末尾位置后移}//遍历截取的集合,组合每段请求的参数for(List<xxxVo> voList : splitList) {System.out.println("组合参数 " + " 》》》》》》");String rangeParam = "";       //保存请求的经纬度locations字段for (xxxVo childVo : voList) {//遍历集合,组合请求参数rangeParam = rangeParam + childVo.getLat() + "," + childVo.getLng() + ";"}// 遍历结束后,切割掉末尾的";"rangeParam = rangeParam.substring(0, rangeParam.length() - 1);//拼接请求urlString requestUrl = url + rangeParam + type + key;//请求接口HttpsResponseVo forObject = restTemplate.getForObject(requestUrl, HttpsResponseVO.class);//获取转换后的经纬度String local = "" + forObject.getLocations(); // "[{"lng": 116.8234023,"lat": 39.11428542},{"lng": 115.42357111,"lat": 30.20378632}]"range1 = range1 + local.substring(1, local.length() - 1) + ","    // "{"lng": 116.8234023,"lat": 39.11428542},{"lng": 115.42357111,"lat": 30.20378632},"}//所有的集合遍历结束后,拼接需要返回的字符串range2 = "[" + range1.substring(0, range1.length() - 1) + "]";System.out.println("最终返回的经纬度数组 = " + range2);} else {//只需要请求一次for (xxxVO vo : xxxVOList) {range1 = range1 + vo.getLat() + "," + vo.getLng() + ";";}xqRange = xqRange.substring(0, xqRange.length()-1);String requestUrl2 = url + range1 + type + key;HttpsResponseVO forObject = restTemplate.getForObject(url3, HttpsResponseVO.class);range2 = "" + forObject.getLocations();}return range2;
} catch (exception e) {e.printStackTrace();
}
}

转换方法2:

当一秒内请求次数大于5时,使用@Async进行异步调用处理

在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。

// 基于Java配置的启用方式:在启动项添加注解
@EnableAsync
public class IxxxProgram extends SpringBootServletInitializer {...
}

使用@Async注解的方法,返回值的数据类型为Future,具体结果类型为AsyncResult

public String main() throws ExecutionException, InterruptedException {//## 处理用于请求转换的经纬度数组字符串:String range = "[{"lng":110.355443,"lat":20.038738},{"lng":110.358749,"lat":20.037388},{"lng":110.360217,"lat":20.036845},{"lng":110.360968,"lat":20.03648}]";//先转为jsonArray对象,在转为目标对象xxxVO集合JSONArray objects = JSONUtil.parseArray(range);      //hutool工具方法:JSONUtilList<xxxVO> xxxVOList = JSONUtil.toList(objects, xxxVO.class);Future<String> stringFuture = baidu2tencent2(xxxVOList);//获得返回的字符串String res = stringFutrue.get();return res;
}@Async
public Future<String> baidu2tencent2(List<xxxVO> xxxVOList) {try {//## 配置请求字符串String url = "https://apis.map.qq.com/ws/coord/v1/translate?locations=";String type = "&type=3";  //baidu地图String key = "&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77";String range1 = "";String range2 = "";//Spring3.0开始支持的一个 HTTP 请求工具,用于在代码中请求第三方接口RestTemplate restTemplate = new RestTemplate();// 计算数组大小int size = xxxVOList.size();if (size > 40) {//需要将经纬度数组,分成多个40组的集合,分段请求多次   int requestNum = size / 40;int add = size % 40;if (add > 0) {requestNum ++;}System.out.println("总共需要请求 = " + requestNum + "次");//保存分段请求集合List<List<xxxVO>> splitList = new ArrayList<List<xxxVO>>();   //分段请求的集合int loc = 40;   //记录每次分段的末尾经纬度位置for(int i = 0; i < requestNum ; i++) {if(loc > size) {loc = size;}System.out.println("起始位置 = " + i * 40 + " —— 结束位置 = " + loc);List<xxxVO> spList = xxxVOList.subList(i * 40 , loc);//截取集合部分splitList.add(spList);loc = loc + 40;       //末尾位置后移}//遍历截取的集合,组合每段请求的参数for(List<xxxVo> voList : splitList) {System.out.println("组合参数 " + " 》》》》》》");String rangeParam = "";       //保存请求的经纬度locations字段for (xxxVo childVo : voList) {//遍历集合,组合请求参数rangeParam = rangeParam + childVo.getLat() + "," + childVo.getLng() + ";"}// 遍历结束后,切割掉末尾的";"rangeParam = rangeParam.substring(0, rangeParam.length() - 1);//拼接请求urlString requestUrl = url + rangeParam + type + key;//请求接口HttpsResponseVo forObject = restTemplate.getForObject(requestUrl, HttpsResponseVO.class);//因为一秒内超过请求次数,无法获得转换数据,等待一秒后在请求一次if (forObject.getLocations() == null) {Thread.sleep(1000);    //请求失败,等一秒forObject = restTemplate.getForObject(requestUrl, HttpsResponseVO.class);}//获取转换后的经纬度String local = "" + forObject.getLocations();  // "[{"lng": 116.8234023,"lat": 39.11428542},{"lng": 115.42357111,"lat": 30.20378632}]"range1 = range1 + local.substring(1, local.length() - 1) + ","    // "{"lng": 116.8234023,"lat": 39.11428542},{"lng": 115.42357111,"lat": 30.20378632},"}//所有的集合遍历结束后,拼接需要返回的字符串range2 = "[" + range1.substring(0, range1.length() - 1) + "]";System.out.println("最终返回的经纬度数组 = " + range2);} else {//只需要请求一次for (xxxVO vo : xxxVOList) {range1 = range1 + vo.getLat() + "," + vo.getLng() + ";";}xqRange = xqRange.substring(0, xqRange.length()-1);String requestUrl2 = url + range1 + type + key;HttpsResponseVO forObject = restTemplate.getForObject(url3, HttpsResponseVO.class);range2 = "" + forObject.getLocations();}return new AsyncResult<String>(range2);
} catch (exception e) {e.printStackTrace();
}
}

参考链接:
Spring中@Async用法详解及简单实例.
RestTemplate 用法详解.

地图api - 批量转换坐标经纬度相关推荐

  1. 百度地图批量精度和维度Java,关于百度地图API批量转换成坐标的方法

    下面的代码思路是:从页面获取馆Id数组,将其数组通过ajax提交到服务器,服务器返回馆的ID,馆名,和馆地址: 再循环地址,获取每个地址的坐标,并将馆ID和其坐标对应起来,提交到服务器更新,转换失败的 ...

  2. 利用高德地图API批量获取地点经纬度和行车线路与OD距离(excel和python)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.excel调取API方法 1.申请一个key 2.excel调用API 二.python方法 计算地址列表中两两之 ...

  3. 百度地图API批量地址转坐标(支持Excel上传,附案例)

    最近接到个小任务,需要把Excel 一批地址数据转换成坐标,又不想依赖项目,干脆直接写个HTML算了,内含坐标系转换(百度坐标BD09系转换GPS84坐标系). 目前国内主要有以下三种坐标系: WGS ...

  4. python调用百度地图API批量查询全国高速收费站点经纬度

    写在前面 大家好,我是饭都吃不起的南南 昨天帮朋友爬了全国的高速站点收费站这里下载 [http://www.bestunion.cn/gaosu/p_4/sfzlist.html] 由于该网站并没有西 ...

  5. python批量爬取小网格区域坐标系_Python爬虫实例_利用百度地图API批量获取城市所有的POI点...

    上篇关于爬虫的文章,我们讲解了如何运用Python的requests及BeautifuiSoup模块来完成静态网页的爬取,总结过程,网页爬虫本质就两步: 1.设置请求参数(url,headers,co ...

  6. python百度地图api经纬度_Python调用百度地图和高德地图API批量获取国内城市地址经纬度坐标...

    1 数据准备 经过尝试,百度地图API需要输入城市中文名称才能获取对应经纬度坐标,因此先将英文的城市名称转为中文 一共347个城市 由于在测试过程中发现高德和百度地图API分别有几个城市的地址无法获取 ...

  7. 百度地图API:根据起始点经纬度坐标确认最佳路线规划

    css样式 body, html {width: 100%;height: 100%;overflow: hidden;margin: 0;font-family: "微软雅黑"; ...

  8. java百度地图逆地址解析_web前端通过百度地图API批量逆解析地址

    前言 最近碰到一个需求,就是将我们系统中要导出一系列的工作数据,这里面有一个需求就是根据工作人员的经纬度去获取他可能的位置.说到这里大家肯定能想到用地图API了,我这里用的是百度地图的API(详情可参 ...

  9. 百度地图API 批量坐标转换

    在将原始坐标批量转换的时候,回调的时候发现 data.status = 25 translateCallback = function (data){//回调时 data.status = 25 } ...

最新文章

  1. redis如何通过读写分离来承载读请求QPS超过10万多
  2. springcloud demo---feign
  3. 个人开发者微信支付和支付宝支付
  4. uva 299 - Train Swapping
  5. 如何查看CO凭证号码及明细
  6. HTML - 元素/标签和属性基础
  7. pytorch bert文本分类_一起读Bert文本分类代码 (pytorch篇 三)
  8. 高速EDA设计课程报告(三)
  9. mysql经典脚本_mysql常用脚本
  10. 2022天梯赛 L1-087 机工士姆斯塔迪奥
  11. C/C++_随机生成0-1之间的数
  12. (P46)面向对象版表达式计算器:让表达式计算器支持变量赋值 ,Calc类实现
  13. Build Setting 之 Code Signing 详解
  14. Verilog之条件语句、循环语句、块语句与生成语句
  15. 悟已往之不谏,知来者之可追
  16. 学校电脑的无语配置%¥3
  17. matlab实现直方图规定化
  18. 如何提高本地文件上传至百度云的速度_【软件推荐】满速下载软件,说出来你可能不信最高速度达到150m/s...
  19. Realtek WiFi定频工具使用操作指南(rtl8188au/rtl8812au/rtl8192cu)
  20. bpmnjs activiti 添加定时事件timeDate,timeDuration,timeCycle

热门文章

  1. PTP校时模块(PTP时钟服务器)PTP授时服务器
  2. js 打印倒立三角形
  3. dom4j修改带有命名空间的xml文件
  4. WebView-WebChromeClient详解
  5. 2015实习生求职季总结
  6. Java循环语句练习(for循环、while循环、do-while循环)
  7. 短信营销时短信发送失败的原因有哪些?
  8. http请求报400错误
  9. 用request和xpath库,爬取PPT素材,(背景、图标、模板)
  10. java计算机毕业设计广东省梅州市宇恒节能科技有限公司源码+mysql数据库+系统+lw文档+部署