GPX可视化工具 GPX航迹预览工具
背景
当我们收到别人分享的航迹文档,即gpx文档时,如何快速的进行浏览呢?我们可以使用GIS软件来打开gpx文档并显示gpx中所记录的航迹,例如常用的GIS软件有googleEarth, Basecamp, GPXsee, GPX Editor 等。
今天教分享一个脚本,大家可以不依赖上述软件即可快速的浏览gpx航迹。
准备工作
本文所分享的脚本,需要依赖python工作,所以需要电脑上安装python解释器哦。
基本原理
本文所分享的脚本,其工作的基本逻辑如下:
- bat脚本获取gpx文档
- 调用py脚本打开并解析gpx文档内容
- py脚本根据gpx内容并使用gpxAndMap模块生成folium地图文档(html文档)
- py脚本直接调用浏览器打开所生成的html文档进行显示航迹
两个脚本展示
以下为今天所分享的两个脚本,一个bat脚本,一个py脚本,这两个脚本需要放在同一路径下才可正常工作哦
bat脚本内容
@echo off
chcp 65001
set srcDir=%1echo.
echo %srcDir%
echo.python "%~dp0gpxShower.py" --gpx文档=%1echo.
echo 5s后自动退出窗口
timeout /t 5
py脚本内容
# -*- coding:UTF-8 -*-# region 引入必要的依赖
import os模块名 = 'GpsAndMap'
try:from GpsAndMap.MapModule import *
except ImportError as impErr:print(f"尝试导入 {模块名} 依赖时检测到异常:{impErr}")print(f"尝试安装 {模块名} 模块:")try:os.system(f"pip install {模块名}")except OSError as osErr:print(f"尝试安装模块 {模块名} 时检测到异常:{osErr}")exit(0)else:try:from GpsAndMap.MapModule import *except ImportError as impErr:print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")exit(0)模块名 = 'DebugInfo'
try:from DebugInfo.DebugInfo import *
except ImportError as impErr:print(f"尝试导入 {模块名} 依赖时检测到异常:{impErr}")print(f"尝试安装 {模块名} 模块:")try:os.system(f"pip install {模块名}")except OSError as osErr:print(f"尝试安装模块 {模块名} 时检测到异常:{osErr}")exit(0)else:try:from DebugInfo.DebugInfo import *except ImportError as impErr:print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")exit(0)模块名 = 'gpxpy'
try:import gpxpy
except ImportError as impErr:print(f"尝试导入 {模块名} 依赖时检测到异常:{impErr}")print(f"尝试安装 {模块名} 模块:")try:os.system(f"pip install {模块名}")except OSError as osErr:print(f"尝试安装模块 {模块名} 时检测到异常:{osErr}")exit(0)else:try:import gpxpyexcept ImportError as impErr:print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")exit(0)# endregionclass 入参类(入参基类):def __init__(self):# 初始化父类super().__init__()# 添加入参参数self._添加参数('gpx文档', str, '请指定需要解析的gpx文档')# region 访问器@propertydef gpx文档(self) -> str:if 'gpx文档' in self._参数字典:return self._参数字典['gpx文档'].值else:return ''@gpx文档.setterdef gpx文档(self, 值: str):if 'gpx文档' in self._参数字典:self._参数字典['gpx文档'].值 = str(值)# endregiondef 展示gpx数据(gpx文档: str, 画板: 打印模板 = None):画板 = 画板 if isinstance(画板, 打印模板) else 打印模板()画板.执行位置(展示gpx数据)if not gpx文档:画板.提示错误('gpx文档 无值')return Falseif not os.path.isfile(gpx文档):画板.提示错误(f'gpx文档 不存在:{gpx文档}')return False# 创建一个地图对象,并添加高德地图,高德卫星地图底图地图: 地图类 = 地图类().添加瓦片.高德地图().高德卫星地图().智图GeoQ().地图# 添加一个网页标题,显示gpx文档名地图.添加网页标题(os.path.basename(gpx文档))with open(gpx文档, 'r') as f:gpx数据 = gpxpy.parse(f)if gpx数据 and gpx数据.tracks:for track in gpx数据.tracks:if track.segments:for seg in track.segments:if seg.points:折线 = 折线类(蚂蚁路径=蚂蚁路径标记类(显示=True))for point in seg.points:折线.添加路径点(GPS坐标类(point.longitude, point.latitude, GPS坐标系类型.wgs84))地图.添加标记(地图.添加图层(), 折线)地图.优化网络资源().保存html(文档名=f"{os.path.basename(gpx文档)}.html", 目标路径=os.path.dirname(os.path.abspath(gpx文档)), 画板=画板.副本.缩进()).打开()return Trueif __name__ == '__main__':画板: 打印模板 = 打印模板(True)入参: 入参类 = 入参类()入参.解析入参(画板=画板.副本.缩进())if 画板.正在调试:入参.展示(画板=画板.副本.缩进())if not 入参.gpx文档:画板.提示错误('未指定gpx文档')if not 画板.正在调试:exit(0)else:展示gpx数据(gpx文档=入参.gpx文档, 画板=画板.副本.缩进())
设置打开方式
在windows中, 我们可以通过设置gpx文档的打开方式,来设置我们使用bat脚本做为默认的gpx文档的打开应用。设置方式如下图所示👇
设置完成后,当我们双击gpx文档时,系统会自动调用【gpxShower.bat】来打开/处理gpx文档,并生成html文档,并自动调用浏览器打开该html文档。
如下图👇所示,当我们双击gpx文档后,bat脚本+py脚本将会在同路径下创建同名html文档,做为gpx航迹的可视化文档。并且当我们再次双击同一gpx文档后,html文档会重新生成并覆盖旧的html文档。
效果展示
如下图👇,在html文档中,我们首先可以看到gpx文档的文档名被显示为网页的标题,这样当我们打开浏览多个gpx文档时,不至于会发生混淆。
如下图👇,在html文档中,我们可以看到gpx航迹的地图有三种,分别是普通高德地图, 高德卫星地图, 和智力GeoQ地图,三种底图分别提供了不同的地图风格,以供我们选择使用。
如下图👇,在html文档中,gpx航迹以蚂蚁路径的效果显示。
如下图👇,这是在高德卫星地图下的显示效果。
如下图👇,这是在智力GeoQ地图下的显示效果。
如下图👇,这是在高速互通场景下的显示效果,可以看出,轨迹显示与地图道路的匹配度是不错的。
优点
参考下图👇,我们可以看出,gpx文档大概是1MB的体积,但生成的html文档只有564KB的体积,我们可以很方便的把html文档作为分离的媒介,以使对方可以在不安装GIS软件的情况下,浏览我们的航迹信息。
注意点
如下图👇,我们可以看到在生成的html文档中引用了大量的js/css资源,这些资源的加载需要互联网的支持,如果您在使用此脚本方法时,发现html文档打开是空白,或者打开时间过长,请检查您的网络链接是否畅通。
小结
以上就是这次分享的gpx文档可视化小工具了,希望可以帮助到大家。
B-1696525190859)]
注意点
如下图👇,我们可以看到在生成的html文档中引用了大量的js/css资源,这些资源的加载需要互联网的支持,如果您在使用此脚本方法时,发现html文档打开是空白,或者打开时间过长,请检查您的网络链接是否畅通。
[外链图片转存中…(img-d8tDDylY-1696525190860)]
小结
以上就是这次分享的gpx文档可视化小工具了,希望可以帮助到大家。
相关文章:

GPX可视化工具 GPX航迹预览工具
背景 当我们收到别人分享的航迹文档,即gpx文档时,如何快速的进行浏览呢?我们可以使用GIS软件来打开gpx文档并显示gpx中所记录的航迹,例如常用的GIS软件有googleEarth, Basecamp, GPXsee, GPX E…...

学信息系统项目管理师第4版系列18_采购管理
1. 协议 1.1. 合同 1.1.1. 国际合作的项目经理应牢记,无论合同规定如何详尽,文化和当地法律对合同及其可执行性均有影响 1.2. 服务水平协议(SLA) 1.3. 谅解备忘录 1.4. 协议备忘录(MOA) 1.5. 订购单 …...
标准化数据模型
标准化数据模型 标准化被定义为减少或消除数据集中冗余的过程。 它已成为关系数据库中数据建模的事实上的方法,很大程度上是由于这些系统最初设计时所围绕的底层资源限制:缓慢的磁盘和昂贵的 RAM。更少的数据冗余/重复意味着更有效地从磁盘读取数据并占…...
linux平台源码编译ffmpeg
目录 编译平台 编译步骤 编译平台 中标麒麟 编译步骤 1 从Download FFmpeg 下载源码,我选中了4.2.9版 2 解压 3 在解压后的目录下输入 ./configure --enable-shared --prefix/usr/local/ffmpeg 4 make 5 sudo make install 6 ffmpeg的头文件、可执行程…...

Vue中如何进行拖拽与排序功能实现
在Vue中实现拖拽与排序功能 在Web应用程序中,实现拖拽和排序功能是非常常见的需求,特别是在管理界面、任务列表和图形用户界面等方面。Vue.js作为一个流行的JavaScript框架,提供了许多工具和库来简化拖拽和排序功能的实现。本文将介绍如何使…...

新款UI动态壁纸头像潮图小程序源码
新款UI动态壁纸头像潮图小程序源码,不需要域名服务器,直接添加合法域名,上传发布就能使用。 可以对接开通流量主,个人也能运营,不需要服务器源码完整。整合头像,动态壁纸,文案功能齐全。 源码…...

Python逐日填补Excel中的日期并用0值填充缺失日期的数据
本文介绍基于Python语言,读取一个不同的列表示不同的日期的.csv格式文件,将其中缺失的日期数值加以填补;并用0值对这些缺失日期对应的数据加以填充的方法。 首先,我们明确一下本文的需求。现在有一个.csv格式文件,其第…...

【C语言经典100例题-70】求一个字符串的长度(指针)
代码 使用指针来遍历字符串,直到遇到字符串结尾的空字符\0为止,统计字符数量即为字符串长度。 #include<stdio.h> #define n 20 int getlength(char *a) {int len 0;while(*a!\0){len;a;}return len; } int main() {char *arr[n] { 0 };int l…...

十天学完基础数据结构-第八天(哈希表(Hash Table))
哈希表的基本概念 哈希表是一种数据结构,用于存储键值对。它的核心思想是将键通过哈希函数转化为索引,然后将值存储在该索引位置的数据结构中。 哈希函数的作用 哈希函数是哈希表的关键部分。它将输入(键)映射到哈希表的索引位…...
flink集群部署
虚拟机配置 bigdata-hmaster 192.168.135.112 4核心 32GB bigdata-hnode1 192.168.135.113 4核心 16GB bigdata-hnode2 192.168.135.114 4核心 16GB 安装包:https://dlcdn.apache.org/flink/flink-1.17.1/flink-1.17.1-bin-scala_2.12.tgz 放到/usr/lcoal/lib目录…...
2.证明 非单一点 Oct.2023
目录 原题解引申出的编程问题非单一点题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题解题目正解 原题 已知等边 Δ P 0 P 1 P 2 \Delta P_0P_1P_2 ΔP0P1P2,它的外接圆是 O O O,设 O O O的半径是 R R R。同时,设 Δ …...

常见的软件脱壳思路
单步跟踪法 1.本方法采用OD载入。 2.跟踪F8,实现向下的跳。 3.遇到程序回跳按F4。 4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现! 5.刚载入程序有一个CALL的,我们就F7跟进去,不然程序很容…...
Python:torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解
Python:torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解 1. 函数参数 在torch中的卷积操作有三个,torch.nn.Conv1d(),torch.nn.Conv2d()还有torch.nn.Conv3d(),这是搭建网络过程中常用的网络层,为了用好卷积层࿰…...
scala 连接 MySQL 数据库案例
1 依赖准备 mysql 8添加: <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency> mysql 5 添加: <dependency><grou…...
guava工具类常用方法
Guava是Google开发的一个Java开源工具类库,它提供了许多实用的工具类和功能,可以简化Java编程中的常见任务。 引入依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>2…...
CSShas伪类选择器案例附注释
<!DOCTYPE html> <html lang="en"> <head><meta charset...

nodejs+vue中医体质的社区居民健康管理系统elementui
可以实现首页、中医体质量表、健康文章、健康视频、我的等,在我的页面可以对医生、小区单元、医疗药品等功能进行操作。目前主要的健康管理系统是以西医为主,而为了传扬中医文化,提高全民健康意识,解决人民日益增长的美好生活需要…...
Kotlin中reified 关键字
前言 在开始之前,让我们先讨论一下泛型。泛型用于为类、函数或接口提供通用的实现。下面是一个示例泛型方法: fun <T> displayValue(value: T) {println(value) }fun main() {displayValue<String>("Generics")displayValue<…...
Linux命令(95)之alias
linux命令之alias 1.alias介绍 linux命令alias是用来将/bin目录下的命令进行别名设置,将一些较长的命令进行简化。 alias命令的作用只局限于该次登入的操作,相当于临时变量。 如果对当前用户永久生效,需修改~/.bashrc文件,使用…...

DHCPsnooping 配置实验(2)
DHCP报文泛洪攻击 限制接收到报文的速率 vlan 视图或者接口视图 dhcp request/ dhcp-rate dhcp snooping check dhcp-request enable dhcp snooping alarm dhcp-request enable dhcp snooping alarm dhcp-request threshold 1 超过则丢弃报文 查看[Huawei]dis dhcp statistic…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...