百度地图批量转换 GPS坐标转百度地图坐标 问题

百度地图的官方网址
官方批量转换的demo

花了几天时间了解了一下百度地图,之前是后端的一个小伙伴在负责,他跟我吐槽这是前端的东西,让我来写(之前他们老大交给他了,我也以为是后端的任务(๑′ᴗ‵๑)。。)
言归正传,开始解决问题吧!

两种方法:
一、一个一个的转
二、批量转换

看一下官网示例:

    var points = [new BMap.Point(116.3786889372559,39.90762965106183),new BMap.Point(116.38632786853032,39.90795884517671),new BMap.Point(116.39534009082035,39.907432133833574),new BMap.Point(116.40624058825688,39.90789300648029),new BMap.Point(116.41413701159672,39.90795884517671)];//地图初始化var bm = new BMap.Map("allmap");bm.centerAndZoom(new BMap.Point(116.378688937,39.9076296510), 15);//坐标转换完之后的回调函数translateCallback = function (data){if(data.status === 0) {for (var i = 0; i < data.points.length; i++) {bm.addOverlay(new BMap.Marker(data.points[i]));bm.setCenter(data.points[i]);}}}setTimeout(function(){var convertor = new BMap.Convertor();convertor.translate(points, 1, 5, translateCallback)}, 1000);

1. 一个一个的转(经粗略测试600条以内没什么问题,数据量大的不建议此方法),参考https://bbs.csdn.net/topics/392444544

this.axios('接口',参数)
.then(res => {var map = new BMap.Map("iotmap");  // 创建地图实例 id="iotmap"map.addControl(new BMap.MapTypeControl());//显示地图,卫星,三维map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放          // map.centerAndZoom(point) 中心点是坐标转换后数据中的第一个点let ggPoint = {};   //修改后台传过来的数据格式let pointsArr = [];   //用来储存所有的坐标点for(var i = 0; i< res.list.length; i++){//res.list[i].devLong, res.list[i].devLat是后台传过来的gps坐标ggPoint = new BMap.Point( res.list[i].devLong, res.list[i].devLat );pointsArr.push(ggPoint);}          //1.坐标转换-----startlet translateArr = []; //坐标转换后的所有坐标集合//坐标转换完之后的回调函数var translateCallback = function (data){if(data.status === 0) {translateArr.push(data.points[0]);//因为是一个一个进行转换的,这里判断转换前和转换后的数组长度,如果相等,说明全部转换完了console.log(translateArr)if(translateArr.length == pointsArr.length) {map.centerAndZoom(new BMap.Point(translateArr[0].lng,translateArr[0].lat), 10);  // 设置中心点for(let i = 0; i<translateArr.length; i++){//连线----start    转换后,相邻的两个点连线//if(i<translateArr.length-1){              //  var polyline = new BMap.Polyline([//    new BMap.Point(translateArr[i].lng, translateArr[i].lat),//    new BMap.Point(translateArr[i+1].lng, translateArr[i+1].lat)//    ],//    {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5}//    );//  map.addOverlay(polyline);//}//连线----end//标注var marker = new BMap.Marker(translateArr[i]);        // 创建标注    map.addOverlay(marker);                     // 将标注添加到地图中 //标注//只有数组的第一个点和最后个点才显示标注if(i == 0 || i == translateArr.length-1){  var marker = new BMap.Marker(translateArr[i]); // 创建标注 map.addOverlay(marker); // 将标注点添加到地图中//监听标注事件marker.addEventListener("click", function(e){    console.log("e",e)      //这里建议使用e.target.point.lng,而不用e.point.lng,因为e.point.lng可能存在误差var infoWindow = new BMap.InfoWindow("经度:"+e.point.lng+"<br/>纬度:"+e.point.lat, opts);map.openInfoWindow(infoWindow, e.target.point);    // 打开信息窗口});  }                  }}}}setTimeout(function(){for(var i=0; i<pointsArr.length; i++){var arr=[pointsArr[i]]var convertor = new BMap.Convertor();convertor.translate(arr, 1, 5, translateCallback);}}, 1000);
}).catch(function (error) {console.log(error);
});

2. 批量转换 参考-麦田
将数据分割成10个为一组,进行转换,由于 convertor.translate(arr, 1, 5, translateCallback); 这个转换函数是异步的,所以转换回来的坐标组的顺序是混乱的。可以根据循环时 i 来确定转换回来的坐标数组的顺序。

this.axiosPostRequst('接口',参数).then(res => {var map = new BMap.Map("iotmap");  // 创建地图实例 id="iotmap"map.addControl(new BMap.MapTypeControl());//显示地图,卫星,三维map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放          var opts = {    width : 200,     // 信息窗口宽度    height: 80,     // 信息窗口高度    title : "经纬度"  // 信息窗口标题   }   let ggPoint = {};   //修改后台传过来的数据格式let pointsArr = [];   //用来储存所有的坐标点for(var i = 0; i< res.list.length; i++){ggPoint = new BMap.Point( res.list[i].devLong, res.list[i].devLat );pointsArr.push(ggPoint);}        //1.坐标转换----start         var total = 0; //总记录数var groupCount = 0; //每次转十条var translateArr = []; //转换后的所有坐标集合 二维数组var newPoints = []; // 二维数组转换成一维数组--转换成功的最终结果if (pointsArr.length % 10 > 0) {groupCount = (pointsArr.length / 10) + 1;}else {groupCount = (pointsArr.length / 10);}if(res.list.length != 0){ //判断返回来的数组是否为空,若没有数据,则定位到上海复旦for(let i=0;i<groupCount;i++){ //外层循环,有多少组十条var pos = new Array();for(let j=0;j<10;j++){ //内层循环,每组十条if(total<pointsArr.length){ //不超过总记录数结束var point = new BMap.Point(pointsArr[(i * 10) + j].lng,pointsArr[(i * 10) + j].lat);pos.push(point);}total++;}var translateCallback = function (data) { translateArr[i] = data.points;  //根据对应的i,将数据放到translateArr中if(data.status === 0) {if(translateArr.length == parseInt(groupCount)){//将二维数组转换成一位数组newPoints = translateArr.reduce(function (a, b) { return a.concat(b)} );   //2.坐标全部转换完成后的操作----startif(newPoints.length == pointsArr.length){for(var x = 0; x < newPoints.length ; x++){//3.只给数组第一个和最后一个标注---startif(x == 0  || x == newPoints.length -1 ){var marker = new BMap.Marker(newPoints[x]) ;     // 创建标注    map.addOverlay(marker);                  // 将标注添加到地图中 map.centerAndZoom(newPoints[0], 15); // 初始化地图,设置中心点坐标和地图级别 //监听标注事件marker.addEventListener("click", function(e){    var infoWindow = new BMap.InfoWindow("经度:"+e.target.point.lng+"<br/>纬度:"+e.target.point.lat, opts);  // 创建信息窗口对象    map.openInfoWindow(infoWindow, e.target.point);      // 打开信息窗口 }); }//3.只给数组第一个和最后一个标注---end//4.出行路线规划---startvar walk = new BMap.WalkingRoute(map, { renderOptions: { map: map, autoViewport: false //控制缩放 } ,onPolylinesSet:function(routes) { var searchRoute = routes[0].getPolyline();//导航路线map.addOverlay(searchRoute); }, onMarkersSet:function(routes) {map.removeOverlay(routes[0].marker); //删除起点map.removeOverlay(routes[1].marker);//删除终点}});var start = newPoints[x];var end = newPoints[x+1];walk.search(start, end);//4.出行路线规划---end}}//2.坐标全部转换完成后的操作----end}}}var convertor = new BMap.Convertor();convertor.translate(pos, 1, 5, translateCallback);}} else {// 长度为0,即没有数据 让中心点定位在北京天安门var point = new BMap.Point(121.51296558787249, 31.293767902956343);    map.centerAndZoom(point, 15); var tianan = new BMap.Marker(point);        // 创建标注    map.addOverlay(tianan);                     // 将标注添加到地图中drawLab(point,"起点")}//1.坐标转换----end       }).catch(function (error) {console.log(error);});

到这里就结束啦,希望能给遇到这些问题的小伙伴们一些帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《React Native 精解与实战》书籍连载「Node.js 简介与 React Native 开发环境配置」

此文是我的出版书籍《React Native 精解与实战》连载分享&#xff0c;此书由机械工业出版社出版&#xff0c;书中详解了 React Native 框架底层原理、React Native 组件布局、组件与 API 的介绍与代码实战&#xff0c;以及 React Native 与 iOS、Android 平台的混合开发底层原理…

使用XStream将JSON转换为XML到Java对象

XStream库可以是将JSON从Java转换为XML来回转换的有效工具。 让我们逐一探究它们中的每一个&#xff0c;并查看使用了哪个驱动程序。 处理JSON 要将JSON转换为Java对象&#xff0c;您要做的就是使用适当的驱动程序初始化XStream对象&#xff0c;并准备将对象序列化到JSON&…

Hello Blog!

经过漫长的期待&#xff0c;终于在博客园开博了。 希望有一个很好的开端&#xff0c;请大家多多关照。 转载于:https://www.cnblogs.com/nouoo/archive/2010/09/25/1834289.html

JavaScript的二维数组

二维数组的初始化&#xff1a; 实例① var arr [[1,2],[a,b]]; console.log(arr[1][0]); //a 第2列第1行所在的元素实例② var arr new Array(new Array(1,2),new Array("a","b")); console.log(arr[1][0]);实例③ var arr new Array(); //先声…

vue+element 封装公共js代码

一、多个 js 方法&#xff0c;不想用 vue.prototype 二、使用Vue.prototype 封装公共 js 三、封装的方法较多&#xff0c;又想通过this.直接调用 一、多个 js 方法&#xff0c;不想用 vue.prototype 封装一个弹框为例&#xff1a; 1. 在 components 文件夹下新增一个 js 文件…

React.js 入门与实战课程思维导图

原文发表于我的技术博客 我在慕课网的「React.js 入门与实战之开发适配PC端及移动端新闻头条平台」课程已经上线了&#xff0c;在这里分享了课程中的思维导图&#xff0c;供大家参考。 原文发表于我的技术博客 此导图为课程中整理的重要知识点以及大纲导图&#xff0c;供大家学…

将递归文件系统遍历转换为流

在学习编程的时候&#xff0c;回到Turbo Pascal时代&#xff0c;我设法使用FindFirst &#xff0c; FindNext和FindClose函数在目录中列出文件。 首先&#xff0c;我想出了一个打印给定目录内容的过程。 您可以想象我为能够真正从自身调用该过程以递归遍历文件系统而感到自豪。…

Webpack 2 视频教程 002 - NodeJS 安装与配置

原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」。 Webpack 作为目前前端开发必备的框架&#xff0c;Webpack 发布了 2.0 版本&#xff0c;此视频就是基于 2.0 的版本讲解的。 这个基本就是目前国内最好的 Webpack 2.0 最好的学习视频了&#xff0c;…

vue+elementUI 添加多个可以全选的多选框

elementUI-checkbox官网&#xff1a;https://element.eleme.cn/#/zh-CN/component/checkbox 一、要做上面这种效果&#xff0c;首先要了解全选框中indeterminate 状态和v-model的变量的关系 参考 -Dayer-&#xff1a; <el-checkbox :indeterminate"isIndeterminate&…

WMI in C#[强类型操作]

C# 进行WMI操作的内容封装在System.Management.dll中&#xff0c;具体的在MSDN有详细描述&#xff0c;默认是用[“**’]去读取和设置属性等。 此处介绍一个自动生成强类型的包装软件&#xff0c;这样处理起来就简单了很多&#xff0c;不用在反复的查看参数等信息了。 1、 使用W…

JSR 303从I18N属性文件加载消息

总览 本文将说明如何适应JSR 303验证API来从I18n属性文件加载消息&#xff0c;并通过保留国际化的所有好处和对多种语言的支持来实现这一点。 为此&#xff0c;我们将实现一个基于Spring API的自定义MessageInterpolator&#xff0c;用于管理I18N消息。 依存关系 在进行这项工…

2019年ipa发布苹果应用商店审核指南

https://baijiahao.baidu.com/s?id1623886553597961077&wfrspider&forpc ipa 发布审核指南 说明&#xff1a; 本指南为初版&#xff0c;旨在帮助非技术人员快速了解苹果ipa发布审核流程非技术的审核专员发布审核只需处理 &#xff08;五&#xff09;、iTunes connect …

GridView生成序号

一个经常碰到的情况&#xff1a;GridView需要添加一个序号列&#xff0c;并且从1开始自动编号。而数据库中的ID往往是不连续的&#xff08;会有记录被删除的情况&#xff09;&#xff0c;我们无法绑定现有字段作为编号。因此我们需要手动给GridView编号。 思路&#xff1a;在Gr…

[前端优化]使用Microsoft Ajax Minifier对资源文件进行压缩优化

在前端优化中&#xff0c;js、css等文件的优化一般都是压缩的优化&#xff0c;进行合并、减小体积以达到减小请求的目的。 今天发现了一个集成在VS中的压缩插件&#xff0c;使得压缩变得比较快捷。 配置方法 首先需要去下载Microsoft Ajax Minifier&#xff0c;一路安装就可以&…

手把手教你用 elementUI 实现导航栏

elementUI导航栏官网 1. 安装 elementUI 2. 文件准备 3. 配置路由 4. 导航栏代码 一、安装 elementUI npm i element-ui -S&#xff1b; 在 main.js 中注册组件&#xff1a; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; Vue.use(Elem…

Java 8编写自定义收集器简介

Java 8引入了收集器的概念。 大多数时候&#xff0c;我们几乎不使用Collectors类中的工厂方法&#xff0c;例如collect(toList()) &#xff0c; toSet()或其他更花哨的方法&#xff0c;例如counting()或groupingBy() 。 实际上&#xff0c;没有多少人真正去研究如何定义和实现收…

vuex+element 从后台获取数据写导航栏-菜单权限

主要用到 vuex、router.beforeEach、router.addRoutes()。vuex 的使用方法可以看我的另一篇博客&#xff1a;vue笔记&#xff08;四&#xff09;vuex。 顺便安利一个 在线视频转gif图。 因为第一次用到 router.addRoutes()&#xff0c;在做这个需求的时候遇到了很多问题&…

Sql Server全局变量(转)

Sql Server一共提供了30多个全局变量常用:IDENTITY : 返回最后插入行的标识列的列值。ERROR : 返回最后执行的Transact-SQL语句的错误代码。没有错误则为零。ROWCOUNT : 返回受上一语句影响的行数&#xff0c;任何不返回行的语句将这一变量设置为0。DBTS : 返回当前数据库的…

P3393 逃离僵尸岛 最短路dijkstra

题目描述 小a住的国家被僵尸侵略了&#xff01;小a打算逃离到该国唯一的国际空港逃出这个国家。 该国有N个城市&#xff0c;城市之间有道路相连。一共有M条双向道路。保证没有自环和重边。 K个城市已经被僵尸控制了&#xff0c;如果贸然闯入就会被感染TAT...所以不能进入。由其…

jquery 给iframe里的元素添加事件

$("#iframeId").on("load", function(event){//判断 iframe是否加载完成 这一步很重要$("#divId",this.contentDocument).click(function(){//添加点击事件alert("就是这样");}); });更多专业前端知识&#xff0c;请上 【猿2048】www…