背景
當我們收到別人分享的航跡文檔,即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文檔可視化小工具了,希望可以幫助到大家。