高德地图绘制 GPX 数据路线

高德地图绘制 GPX 数据路线

.gpx 文件是在分享地图路径时最常用的一种数据格式。里面包含了路径点的相关信息,每个点还有可能拥有自己的时间、距离等信息。

一直想自己导出自己的 gpx 路线,然后导入到地图中查看这个路线的具体信息,今天细致看了下,大体找到了方法,分享下。
因为对高德地图的操作已经很熟了,所以再看官方的文档就很轻松,不熟的可以看看我以前关于高德地图的一些文章。

Demo 网站: http://kylebing.cn/tools/map/#/index

我要实现的结果是类似这样的:

在这里插入图片描述

目前是这样的,当然日后会优化。
在这里插入图片描述

一、试验

最开始的时候我就用描点的方式显示,结果显示了4000多个点,卡,显示成了这样。
在这里插入图片描述
是不是很有立体感,因为这是卡片的堆叠,放大后是这样

在这里插入图片描述
显然,这样做是不合适的。我提了个工单给官方,官方给我的回复是:

在这里插入图片描述
我看了下这个例子,确实是我需要的,开整。

二、在地图上绘制曲线

先看官方的例子

例子: https://lbs.amap.com/demo/javascript-api-v2/example/overlayers/polyline-draw
官方 API 文档: https://lbs.amap.com/api/javascript-api-v2/documentation#polyline

查看官方文档,关于 AMap.Polyline 的参数如下,具体的请查看官方文档:

在这里插入图片描述
我给整理了下可能的参数:

 let polyline = new AMap.Polyline({path: ptArray,           // Array<[number, number]>isOutline: true,outlineColor: '#ffeeff', // 路线边框颜色borderWeight: 3,         // 路线边框宽度strokeColor: "#3366FF",  // 路线颜色strokeOpacity: 1,        // 路线透明度strokeWeight: 6,         // 路线宽度strokeStyle: "solid",    // solid | dashedstrokeDasharray: [10, 5],// 虚线间隔lineJoin: 'round',       // 折线拐点的绘制样式,默认值为'miter'尖角,其他可选值:'round'圆角、'bevel'斜角lineCap: 'round',        // 折线两端线帽的绘制样式,默认值为'butt'无头,其他可选值:'round'圆头、'square'方头zIndex: 50,showDir: true,           // 显示方向箭头, 宽度 > 6 时有效geodesic: false,         // 是否显示大地线extraData: {}            // any
})
map.add([polyline]);
map.setFitView();

细致说一下,这里 path 的参数类型是 Array<[lng, lat]>,如:

[["117.1028857", "36.6956868"],["117.1028860", "36.6956897"],["117.1028859", "36.6956933"],["117.1028862", "36.6956977"]
]

结果就是这样的,能看到路径发生了偏移,这个我们在后面进行处理。

在这里插入图片描述

三、获取 gpx 数据

现在我们需要的就只是获取到 gpx 文件中的 gps 坐标点的数据了。

比如从我高驰 Apex 手表中导出的一条 gpx 的数据内容是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gpxdata="http://www.cluetrust.com/XML/GPXDATA/1/0" xmlns="http://www.topografix.com/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.cluetrust.com/XML/GPXDATA/1/0 http://www.cluetrust.com/Schemas/gpxdata10.xsd" creator="Coros Wearables"><metadata><time>2023-11-18T12:08:29Z</time><link href="https://www.coros.com">COROS</link></metadata><trk><name>济南市 徒步</name><type>running</type><trkseg><trkpt lat="36.7426527" lon="117.0671413"><ele>18</ele><time>2023-11-18T12:08:53Z</time><extensions><heartrate>96</heartrate><distance>13</distance></extensions></trkpt><trkpt lat="36.7426560" lon="117.0671390"><ele>18</ele><time>2023-11-18T12:08:54Z</time><extensions><heartrate>96</heartrate><distance>13</distance></extensions></trkpt>...

1. 分析 gpx 文件内部的数据格式

能看到 gpx 文件不过是个 xml 文件,并且里面有 lng lat 数据。

能看到它的内部结构是这样的:

https://www.jsont.run/

在这里插入图片描述

2. 添加 xml 转义工具

在项目中添加 xml 转义工具,这里用 fast-xml-parser

yarn add fast-xml-parser
# 或
npm i fast-xml-parser

3. 转义数据

页面中 import 它

import {XMLParser, XMLBuilder, XMLValidator} from "fast-xml-parser"

使用它

// 新建 parser
let xmlParser = new XMLParser({ignoreAttributes: false,  // 读取xml节点的属性值,这里需要读取节点属性值,因为经纬度在那上面attributeNamePrefix : "_"
})
let xmlObj = xmlParser.parse(xmlContentString)

这样的结果就是
在这里插入图片描述
单点数据结构是:

{"ele": 18,"time": "2023-11-18T12:08:53Z","extensions": {"heartrate": 96,"distance": 13},"_lat": "36.7426527","_lon": "117.0671413"
}

这样我们目前需要的数据就是 _lat _lon ,其它数据可以在日后优化功能的时候使用。

4. 生成需要的 path array

let pointers = this.xmlObj.gpx.trk.trkseg.trkpt
let pathPointers = pointers.map(item => [item._lon, item._lat])

__注意:__当然,这里摘取数据点的操作是非常死的,如果想兼容其它 gpx 文件,还需要进一步作相关的判断操作。

再继续第二步的操作,将这值传入就能绘制出路线了。
我的页面中是通过选择 gpx 文件的方式传入的数据,具体如何实现的可以看我已开源的内容。

四、实现需要的

我最终要实现的是类似这样的效果:

在这里插入图片描述
让我我们拆分一下它的内容:

  1. 路线绘制,就是本文所说的
  2. 标点显示,就是上面的 1.2.3.4.5 它跟路径不是在一个图层。

这样两个结合起来就能做出想要的效果了。

五、<未完待续>

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

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

相关文章

CentOS 7上安装Anaconda 详细教程

目录 1. 下载Anaconda安装脚本2. 校验数据完整性&#xff08;可选&#xff09;3. 运行安装脚本4. 遵循安装指南5. 选择安装位置6. 初始化Anaconda7. 激活安装8. 测试安装9. 更新Anaconda10. 使用Anaconda 1. 下载Anaconda安装脚本 首先需要从Anaconda的官方网站下载最新的Anac…

千万不要在方法上打断点!千万不要!

我上周遇到了一个莫名其妙的搞心态的问题&#xff0c;浪费了我好几个小时。 气死我了&#xff0c;拿这几个小时来敲&#xff08;摸&#xff09;代&#xff08;摸&#xff09;码&#xff08;鱼&#xff09;不香吗&#xff1f; 主要是最后问题的解决方式也让我特别的无语&#…

Redis实现好友功能

好友功能是目前社交场景的必备功能之一&#xff0c;一般好友相关的功能包含有&#xff1a;关注/取关、我&#xff08;他&#xff09;的关注、我&#xff08;他&#xff09;的粉丝、共同关注等这样一些功能。 1.关注和取关 1.设计思路 总体思路我们采用MySQL Redis的方式结合…

【Ant Design of Vue】Modal.confirm无法关闭的bug

一、问题 在使用 Ant Design Vue 的 Modal.confirm 确认框时&#xff0c;出现了点击取消和确定后 Modal.confirm 确认框无法关闭的问题 二、代码 代码完全是 copy 的官网的代码&#xff0c;但是 copy 到本地后就会出现上述问题 <template><a-button click"sho…

48-DOM节点,innerHTML,innerText,outerHTML,outerText,静态获取,单机click,cssText

1.DOM基础 Document Object Module,文档对象模型,window对象,document文档,都可以获取和操作 1)文档节点 2)属性节点(标签内的属性href,src) 3)文本节点(标签内的文字) 4)注释节点 5)元素节点(标签) 2.获取元素节点 2.1通过标签名获取getElementsByTagName() …

Python中HTTP代理的配置和使用

在Python中&#xff0c;HTTP代理是一种常用的技术&#xff0c;用于控制和修改HTTP请求和响应。通过使用HTTP代理&#xff0c;我们可以更好地控制网络请求的行为&#xff0c;提高安全性、隐私性和效率。下面我们将详细介绍如何在Python中配置和使用HTTP代理。 一、配置HTTP代理…

Unity 编辑器篇|(十一)Gizmos (全面总结 | 建议收藏)

目录 1. 前言2 参数总览3 Gizmos绘制3.1 立方体&#xff1a;DrawCube3.2 视锥&#xff1a;DrawFrustum3.3 贴图&#xff1a;DrawGUITexture3.4 图标&#xff1a;DrawIcon3.5 线段&#xff1a;DrawLine3.6 网格&#xff1a;DrawMesh3.7 射线&#xff1a;DrawRay3.8 球体&#xf…

寒假刷题-递归与递推

寒假刷题 92. 递归实现指数型枚举 解法1递归 使用递归对每一个坑位进行选择&#xff0c;每个坑位有两种选择&#xff0c;填或者不填&#xff0c;使用st数组来记录每个坑位的状态&#xff0c;u来记录已经有多少坑位有了选择。 每个坑位有2钟选择&#xff0c;n个坑位的复杂度就…

Java根据二叉树的先序和后序得到二叉树

一般情况下&#xff0c;我们会根据先序和后序写出二叉树&#xff0c;但是用代码怎末写呢&#xff1f; 例如&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二…

pdf怎么查看?6个不能错过的软件!

PDF&#xff0c;作为一种常用的文件格式&#xff0c;已经成为了我们工作、学习中的必备工具。然而&#xff0c;对于许多新手来说&#xff0c;如何查看和编辑PDF文件却是一个不小的挑战。今天&#xff0c;我们就来为大家详细介绍一下如何查看和编辑PDF文件&#xff0c;以及一些必…

01_泛型

文章目录 泛型泛型类泛型接口泛型方法泛型的通配泛型的擦除 泛型 参数化类型。 泛型的好处&#xff1a; 省去了类型强转的麻烦&#xff08;比如&#xff1a;Object类、interface接口等都需要类型强转&#xff09;将运行期遇到的问题转移到了编译期 泛型类 所谓泛型类, 就是…

Android Dialog setCanceledOnTouchOutside失效,点击dialog外面不消失

前言&#xff1a;有一个需求需要点击dialog外面要消失&#xff0c;本来以为很简单结果设置了一直未生效 setCanceledOnTouchOutside(true); 问了半天chat-gpt4结果给的答案都不明显 查看代码发现设置了style&#xff0c;于是尝试去除这个style&#xff0c;结果点击setCancele…

【c++】——栈or队列or优先级队列

目录 &#x1f393;容器适配器 &#x1f393;Stack栈 &#x1f6a9;Stack的介绍 &#x1f6a9;Stack的基本使用 &#x1f6a9;Stack底层实现 &#x1f393;queue队列 &#x1f6a9;queue的介绍 &#x1f6a9;queue的基本使用 &#x1f6a9;queue的底层实现 &#x1…

【C++】C++的IO流

一、C语言的输入与输出 C 语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf()。 scanf()&#xff1a;从标准输入设备&#xff08;键盘&#xff09;读取数据&#xff0c;并将值存放在变量中。printf()&#xff1a;将指定的文字/字符串输出到标准输出设备&#xff…

Java如何做到无感知刷新token含示例代码(值得珍藏)

1. 前言 在系统页面进行业务操作时&#xff0c;有时会突然遇到应用闪退&#xff0c;并被重定向至登录页面&#xff0c;要求重新登录。此问题的出现&#xff0c;通常与系统中用于存储用户ID和token信息的Redis缓存有关。具体来说&#xff0c;这可能是由于token过期所导致的身份…

容器部署的nextcloud配置onlyoffice时开启密钥

容器部署的nextcloud配置onlyoffice时开启密钥 配置 进入onlyoffice容器 docker exec -it 容器id bash编辑配置vi /etc/onlyoffice/documentserver/local.json enable设置为true&#xff0c;并配置secret 重启容器&#xff0c;并将配置的密钥填入nextcloud密钥页面 docker r…

复杂字幕特效SDK,重塑视频字幕新体验

字幕特效已经成为了提升视频品质、增强观众体验的重要手段。美摄科技作为行业领先的技术提供商&#xff0c;近期推出的复杂字幕特效SDK&#xff0c;更是引领了这一领域的创新潮流。 美摄科技复杂字幕特效SDK&#xff0c;不仅具备了电影级别的字幕功能&#xff0c;更实现了众多…

【全网最全】2024华数杯国际赛B题成品论文50页+1-4问高质量代码+完整数据集+建模过程+保姆级教学

基于数据分析下的光伏发电 摘 要&#xff08;完整版在文末&#xff09; 根据最新数据&#xff0c;中国的总发电量超过20万亿千瓦时&#xff0c;总体排名世界第一&#xff0c;而光伏发电是一种重要的可再生能源&#xff0c;可以将太阳能转化为电能可以减少对传统能源的依赖&…

VBA窗体跟随活动单元格【简易版】(2/2)

上一篇博客&#xff08;文章连接如下&#xff09;中使用工作表事件Worksheet_SelectionChange实现了窗体跟随活动单元格的动态效果。 VBA窗体跟随活动单元格【简易版】(1/2) 为了在用户滚动工作表窗体之后仍能够实现跟随效果&#xff0c;需要使用Application.Windows(1).Visibl…

归并排序详解

目录 ​&#x1f4a1;基本思想 &#x1f4a1;图文介绍 &#x1f4a1;动图演示 &#x1f4a1;过程解释 &#x1f4a1;代码实现 &#x1f4a1;递归实现 &#x1f4a1;非递归实现 &#x1f4a1;总结 &#x1f4a1;基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是…