高德地图绘制 GPX 数据路线

这篇具有很好参考价值的文章主要介绍了高德地图绘制 GPX 数据路线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

高德地图绘制 GPX 路径,gpx 文件详解


重要!

高德地图 js api 文档: https://lbs.amap.com/api/javascript-api-v2/documentation
你所有需要知道的关于 AMap 的所有对象,及其属性、方法、事件都在这里面写明白了。

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

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

Demo 页面: http://kylebing.cn/tools/map/#/gpx/gpx-viewer

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

高德地图绘制 GPX 数据路线,高德地图,数据库

目前是这样的,当然日后会优化。

高德地图绘制 GPX 数据路线,高德地图,数据库

一、试验

最开始的时候我就用描点的方式显示,结果显示了4000多个点,卡,显示成了这样。
高德地图绘制 GPX 数据路线,高德地图,数据库
是不是很有立体感,因为这是卡片的堆叠,放大后是这样

高德地图绘制 GPX 数据路线,高德地图,数据库
显然,这样做是不合适的。我提了个工单给官方,官方给我的回复是:

高德地图绘制 GPX 数据路线,高德地图,数据库
我看了下这个例子,确实是我需要的,开整。

二、在地图上绘制曲线

先看官方的例子

例子: 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 的参数如下,具体的请查看官方文档:

高德地图绘制 GPX 数据路线,高德地图,数据库
我给整理了下可能的参数:

 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 | dashed
    strokeDasharray: [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 数据

现在我们需要的就只是获取到 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 数据,还有高度信息 ele

直到我把路径画出来我也不知道这个 ele 是什么意思,搜了下,结果它是 Elevation 的意思,就是海拔的意思:

高德地图绘制 GPX 数据路线,高德地图,数据库

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

https://www.jsont.run/

高德地图绘制 GPX 数据路线,高德地图,数据库

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)

这样的结果就是
高德地图绘制 GPX 数据路线,高德地图,数据库
单点数据结构是:

{
  "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. 固定偏移量

关于地图偏移量的问题,我也不知道是怎么产生的。这里只讲一下自己最直接的处理方式:就是将每个点都偏移到当前地图正常的位置。

上面那个 path 值,也就是 Array<[lng, lat]> 还可以是 Array<AMap.LngLat> ,而 AMap.LngLat 就可以进行偏移距离的操作:

高德地图绘制 GPX 数据路线,高德地图,数据库

let pointers = this.xmlObj.gpx.trk.trkseg.trkpt
let pathPointers = pointers.map(item => {
    let lnglat = new AMap.LngLat(item._lon, item._lat)
    return lnglat.offset(535,40)  // E,N 向东,向北移动距离,单位:米
})

这个偏移量是慢慢试出来的,这样就显示正常了。

高德地图绘制 GPX 数据路线,高德地图,数据库
高德地图绘制 GPX 数据路线,高德地图,数据库
高德地图绘制 GPX 数据路线,高德地图,数据库
比如我载入了两条路线,显示正常:

高德地图绘制 GPX 数据路线,高德地图,数据库

2. 动态偏移量

从网友那里要了一个 .gpx 文件,再对比我的,直接放到地图上都不会完美的契合。
应该是每个软件、每个硬件设备生成的 .gpx 文件的 gps 都不一样,多少有点偏差。
所以为了解决这个问题,我把向北向东的偏移量改成了可设置的,只需要载入路径之后调整这个数值就可以,结果是实时可见的。

高德地图绘制 GPX 数据路线,高德地图,数据库
操作中就是这样,很方便。
高德地图绘制 GPX 数据路线,高德地图,数据库

五、我最终实现的

我目前最终实现的效果是这样:

  1. 起始|终止 点都用特殊图标展示
  2. 每隔多少个数据点展示一个Marker,目前显示的是当前点的时间
  3. 可隐藏|显示图上的 Marker
  4. 可隐藏|显示路径
  5. 添加路径的长度、总用时

高德地图绘制 GPX 数据路线,高德地图,数据库

这里只简单说一下实现过程,具体的实现可以去 Github 上看源码:

https://github.com/KyleBing/map/blob/master/src/page/gpx/GpxViewer.vue

  1. 起始|终止 点都用特殊图标展示
    将 gpx 路径点的 [0][length-1] 两个点作特殊标记,就是标记它是 start 和 end 点,放置在 AMap.Marker.extData 中,具体看官方文档,在新建 AMap.Marker 的时候有个参数是 extData 可以传递附加的数据,它的类型是 any,所以你传什么都可以。在展示点的时候,判断一下是否为特殊点,如果是,就添加特殊的 icon
  2. 每隔多少个数据点展示一个 Marker,目前显示的是当前点的时间。
  3. 可隐藏|显示图上的 Marker
    判断 marker 是否为特殊点,开始和结束的两个点将始终显示。这里用到的是 AMap.Markerhide()show() 方法
  4. 可隐藏|显示路径
    这里用到的是 AMap.Polylinehide()show() 方法
  5. 路径总用时、长度
    用到的是 AMap.polylinegetLength() 方法,返回的是路径的长度,单位是米,这个方法还可以接收一个参数,就是计算路径长度的时候是否考虑地形高度。如果需要就填 true
    高德地图绘制 GPX 数据路线,高德地图,数据库

六、演示项目地址:

路书: http://kylebing.cn/tools/map/#/gpx/gpx-viewer
github: https://github.com/KyleBing/map文章来源地址https://www.toymoban.com/news/detail-805841.html

到了这里,关于高德地图绘制 GPX 数据路线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记录下uniapp开发结合webview调用高德地图(路线规划,多路选择,双向通信)

    uniapp结合webview实现(微信和app上)简单版导航打车应用,总体实现方案是 在uniapp上嵌入web网页,在web网页上调用高德地图api实现渲染地图及路线 去高德开放平台注册账号并创建web应用,再生成web安全密钥和key 如果需要运行到微信上则需要开通微信公众平台上应用需要的定位

    2024年02月19日
    浏览(26)
  • 【QT--使用百度地图API显示地图并绘制路线】

    先吐槽一下下,本身qt学的就不咋滴,谁想到第一件事就是让写一个上位机工具,根据CAN总线传来的位置信息,在地图上去绘制路线,并获取当前路段的限速信息等。当听到这个需求的时候,第一时间是有点懵逼的。自己原本是没接触过这方面的知识,而且qt学的也特别的垃圾

    2024年01月24日
    浏览(28)
  • 高德地图自定义绘制园区区域,区域描边,并添加自定义内容maker标注

    绘制自定义区域第一步需要获取指定区域的边界坐标点list,可以在高德地图官网的工具中获取 高德选点工具,拿到区域边界点list后就是绘制,区域绘制有几种方式,具体可查看高德的API,大体可用Wall和Prism两种方式,区别是wall没有区域填充颜色,Prism可以填充,所以我选择

    2024年02月12日
    浏览(37)
  • Vue 高德地图(@amap/amap-jsapi-loader)的基本使用:添加标记、POI关键字搜索、路线规划...(方法一)

    具体的步骤可以参考我的上一篇博客,有详细说明如何注册申请高德的Key、秘钥,初始化地图等等 vue-amap : vue-amap 基于 Vue 2.x 与高德的地图组件 高德官方介绍:地图 JS API Web服务API简介 高德Web服务API向开发者提供HTTP接口,开发者可通过这些接口使用各类型的地理数据服务,

    2024年01月18日
    浏览(39)
  • 【微信小程序】微信小程序集成高德卫星地图完成多边形绘制与截图保存

    目录 功能需求 使用的技术点 注意点 实现步骤 代码 微信小程序-地图所在的wxml 微信小程序-地图所在的js 微信小程序-展示截图结果的wxml 微信小程序-展示截图结果的js H5-地图所在的html 完成效果  参考文档 感谢阅读,欢迎讨论 打开页面展示卫星地图,用户自行在地图上绘制

    2024年02月06日
    浏览(70)
  • MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划

    利用MATLAB绘制地图需要三个基本数据: 节点 节点坐标 节点间相通的路线 以11B交通巡警平台调度问题中的A区数据为例: (数据及工程文件下载链接见文末) Demo1: 可通过已知节点的坐标,计算出各节点之间的距离,有Matlab基础的同学可以尝试Demo2, 也可通过Excel自行实现;

    2023年04月21日
    浏览(37)
  • vue 高德地图Loca.GeoJSONSource、Loca.PolygonLayer绘制3D楼房、AMap.LabelMarker文字标注、Loca.ScatterLayer绘制水波扩散效果

    假设已经正确引入了高德地图,这里使用2.0版本,注意了,1.4.x版本的使用和2.x版本的使用方式不一样。有很多地方不兼容哦。 话说3D效果这一块,高德是真比不上百度地图哦,要不是项目一直用的高德地图,怕影响数据,就真想换百度地图了。百度地图有很多地方,地级市

    2024年04月25日
    浏览(23)
  • vue - vue使用腾讯api进行定位获取,绘制地图、标点、搜索、路线规划

    首本文主要记录一下在Vue项目里面使用腾讯地图api实现的一些功能。如:引入腾讯地图SDK、定位获取当前经纬度和详细地址、地图marker的使用、搜索功能和路线规划。 我这边实现的效果图如下: 首先要成为腾讯位置服务开发者或者使用公司提供的 key 值;才可以使用腾

    2023年04月17日
    浏览(42)
  • 【数据库通关之路】 MySQL 全路线学习知识点梳理(下)

    本文是MYSQL零基础小白学习系列的第三篇文章,点此阅读 上一篇文章 文末 包邮随机送《MySQL数据库进阶实战 》 五本 (点击下方目录直达) 目的:主键是一行数据的唯一标识,要求非空且唯一 添加约束: 建完表后添加主键约束: 删除约束: 目的:保存数据时,未指定值则采

    2024年02月04日
    浏览(37)
  • 【数据库通关之路】 MySQL 全路线学习知识点梳理(上)

    这是一篇 MySQL 通关 硬核经验学习路线,包括数据库相关知识,SQL语句的使用,数据库约束,设计等。专为小白整理,针对数据库零基础的朋友们,手把手带你学习MySQL,让你轻松学会! 文末包邮送《WPS Office高效办公:数据处理与分析 》1本(点击下方目录直达),本文每+1000浏览

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包