背景
当我们收到别人分享的航迹文档,即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=%1
echo.
echo %srcDir%
echo.
python "%~dp0gpxShower.py" --gpx文档=%1
echo.
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 gpxpy
except ImportError as impErr:
print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")
exit(0)
# endregion
class 入参类(入参基类):
def __init__(self):
# 初始化父类
super().__init__()
# 添加入参参数
self._添加参数('gpx文档', str, '请指定需要解析的gpx文档')
# region 访问器
@property
def gpx文档(self) -> str:
if 'gpx文档' in self._参数字典:
return self._参数字典['gpx文档'].值
else:
return ''
@gpx文档.setter
def gpx文档(self, 值: str):
if 'gpx文档' in self._参数字典:
self._参数字典['gpx文档'].值 = str(值)
# endregion
def 展示gpx数据(gpx文档: str, 画板: 打印模板 = None):
画板 = 画板 if isinstance(画板, 打印模板) else 打印模板()
画板.执行位置(展示gpx数据)
if not gpx文档:
画板.提示错误('gpx文档 无值')
return False
if 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 True
if __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文档可视化小工具了,希望可以帮助到大家。