高德地图API中折线polyline不能跨越180度经度线的解决方案
1、问题
最近在使用高德地图的API,有一个需求是画出对象的历史轨迹,采用了高德地图API中的折线polyline函数。但如果需要跨180度经度线的折线,会出现不能跨越的情况,如下图所示:

图中有三个标记点,从西向东坐标点依次为[135, 21],[165, 23],[195, 25]。我们想要画出对象的历史轨迹方向应该一直是从西向东,依次连接三个点,由图可知第一个点到第二个点是从西向东,但是第二个点到第三个点是从东向西,绕了大半个地球到达第三个点

2、解决方案
首先需要了解一下高德地图中的坐标系是如何建立的:
在高德地图中,坐标用类AMap.LngLat表示,为了方便理解,我们用[longitude,latitude]表示AMap.LngLat类中的经纬度,longitude为经度,latitude为纬度,[0,0]为坐标原点,经度范围为[-180,180],纬度范围为[-90,90]
AMap.LngLat的构造函数为AMap.LngLat(lng:Number,lat:Number,noAutofix:bool)。其中noAutoFix表示是否自动将经度修正到 [-180,180] 区间内,缺省为false,此时会自动将经度修正到[-180,180]范围内
在问题的例子中,我们传入的轨迹点的经纬度数组为
1 let pathInfo = [[135, 21],[165, 23],[195, 25]];
使用折线函数画出轨迹折线,并查看轨迹点的经纬度数组
1 //对象轨迹
2 let Polyline = new AMap.Polyline({
3 map: map, //指定目标地图
4 path: pathInfo, //折线的节点坐标数组
5 showDir: true, //是否延路径显示白色方向箭头,默认false(Canvas绘制时有效,建议折线宽度大于6时使用)
6 strokeColor: "red", //线颜色
7 strokeOpacity: 1, //线透明度
8 strokeWeight: 6, //线宽
9 // strokeStyle: "solid" //线样式
10 });
11
12 console.log("pathInfo", pathInfo);
此时由控制台可以看到,pathInfo数组的元素类型已经被自动转换为了对象,即传入时是数组,使用Amap.Polyline函数后自动将数组转换为了AMap.LngLat对象

pathInfo仍然为一个数组,但是数组元素转换为了AMap.LngLat对象,可以看到第三个点,即pathInfo[2]元素的经度从195修改为了-165。造成这种情况的原因就是pathInfo的数组元素在自动转换时默认将经度修改到了[-180,180]范围内。解决这种问题的方法很简单,即Amap.Polyline类的path属性我们直接传入的是对象数组,而不是二维数组
对pathInfo的赋值操作进行修改
1 let pathInfo = [];
2 pathInfo.push(new AMap.LngLat(135, 21, true));
3 pathInfo.push(new AMap.LngLat(165, 23, true));
4 pathInfo.push(new AMap.LngLat(195, 25, true));
pathInfo仍为数组,只不过数组元素手动创建为Amap.LngLat对象,而不交给程序自动转换。此处注意AMap.LngLat(lng:Number,lat:Number,noAutofix:bool)第三个参数即noAutofix设为true,表示不需要自动将经度修正到[-180,180]范围内
此时查看pathInfo数组的值

第三个点,即pathInfo[2]元素的经度仍然为195,那么就可以达成跨越180经度线的目的了。轨迹效果图如下

高德地图API中折线polyline不能跨越180度经度线的解决方案的更多相关文章
- 【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物
原文:[高德地图API]从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物 摘要:覆盖物,是一张地图的灵魂.有覆盖物的地图,才是完整的地图.在 ...
- 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨
原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...
- 高德地图API应用
高德地图官网:http://api.amap.com/javascript/ 输入关键字,搜索地址功能的网页: 1.引用远程Map Api(js)网址形式(注册后获取) 2.定义个<div> ...
- android 高德地图API 之 java.lang.UnsatisfiedLinkError: Couldn't load amapv3: findLibrary returned null错误
错误场景: 运行android app时,在运行到调用高德地图API时,出现 “java.lang.UnsatisfiedLinkError: Couldn't load amapv3: findLi ...
- 【高德地图API】汇润做爱地图技术大揭秘
原文:[高德地图API]汇润做爱地图技术大揭秘 昨日收到了高德地图微信公众号的消息推送,说有[一大波免费情趣用品正在袭来],点进去看了一眼,说一个电商公司(估计是卖情趣用品的)用高德云图制作了一张可以 ...
- 【高德地图API】一句话搞定webmap(一)——轻地图组件
原文:[高德地图API]一句话搞定webmap(一)——轻地图组件 摘要: 遥想当年,在APP中加入LBS元素相当困难:要刻苦学习java,要刻苦学习iOS开发,要刻苦学习javascript…… 而 ...
- 【高德地图API】从零开始学高德JS API(六)——坐标转换
原文:[高德地图API]从零开始学高德JS API(六)——坐标转换 摘要:如何从GPS转到谷歌?如何从百度转到高德?这些都是小case.我们还提供,如何将基站cell_id转换为GPS坐标? --- ...
- 【高德地图API】从零开始学高德JS API(五)路线规划——驾车|公交|步行
原文:[高德地图API]从零开始学高德JS API(五)路线规划——驾车|公交|步行 先来看两个问题:路线规划与导航有什么区别?步行导航与驾车导航有什么区别? 回答: 1.路线规划,指的是为用户提供3 ...
- 【高德地图API】从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索
原文:[高德地图API]从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索 摘要:地图服务,大家能想到哪些?POI搜素,输入提示,地址解析,公 ...
随机推荐
- 华为云计算IE面试笔记-eBackup有哪几种备份组网方式,各备份组网方式主要的应用场景及备份流程?
应用场景: LAN-Base一般用于备份数据量小,且对备份窗口没有特殊要求的场景,此类场景下备份服务器和备份代理一般是虚拟机部署. LAN-Free一般用于备份数据量较大,且对备份窗口要求比较严格的场 ...
- P3211-[HNOI2011]XOR和路径【高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/P3211 题目大意 一个\(n\)个点\(m\)条边的无向图,从\(1\)到\(n\)随机游走.求期望路径异或和. ...
- Go语言之函数
函数就是一块执行特定任务的代码,在输入源的基础上通过一些算法生成预期的输出. 一.函数的声明 Go 语言中的函数声明语法如下: func 函数名(参数名 类型,参数名 类型)(返回值1类型,返回值2类 ...
- 轻松集成腾讯云短信服务实现短信发送(Java实现)
不论是阿里云还是腾讯云,要想在网站上实现短信发送功能,首先得保证你的网站域名是通过备案的,因为短信签名是需要用到备案过的域名截图,所以域名通过了,申请很快就会审批成功了. (说点题外话,备案的话,需要 ...
- jenkins容器内安装Python3之后使用pip3 install xxx失败,可以考虑换国内源
问题:pip3 install xxx失败 方案一:修改配置文件 首先在当前用户目录下建立文件夹.pip,然后在文件夹中创建pip.conf文件,再将源地址加进去即可. mkdir ~/.pipvim ...
- 用C++实现的数独解题程序 SudokuSolver 2.1 及实例分析
SudokuSolver 2.1 程序实现 在 2.0 版的基础上,2.1 版在输出信息上做了一些改进,并增加了 runtil <steps> 命令,方便做实例分析. CQuizDeale ...
- Spring框架访问数据库的两种方式的小案例
1.1 以Xml的方式访问数据库的案例 要以xml的方式访问数据库需要用到JdbcTemplate ,因为 JdbcTemplate(jdbc的模板对象)在Spring 中提供了一个可以操作数据库的对 ...
- 半天撸一个简易版mybatis
为什么需要持久层框架? 首先我们先看看使用原生jdbc存在的问题? public static void main(String[] args) { Connection connection = n ...
- 求求你了,用Docker吧
这是一个开始使用 Docker 的 Tutorial 大无语事件发生!大数据课实验课要用到Hadoop,实验指导是在一个Ubuntu虚机上通过安装包安装Hadoop并运行一个词频统计程序,整个实验就是 ...
- 如何获取ISO8601定义的Work Week
工作中遇到一个需求,需要在打印标签的时候打印生产当天的工作周.工作周按照ISO-8601定义的标准计算.找到两种方案. Excel函数 C#代码 Excel函数 非常简单,调用一个Excel自带函数就 ...