博客 / 詳情

返回

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腳本,這兩個腳本需要放在同一路徑下才可正常工作哦
20231006001652

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文檔的打開應用。設置方式如下圖所示👇
20231006002258

設置完成後,當我們雙擊gpx文檔時,系統會自動調用【gpxShower.bat】來打開/處理gpx文檔,並生成html文檔,並自動調用瀏覽器打開該html文檔。

如下圖👇所示,當我們雙擊gpx文檔後,bat腳本+py腳本將會在同路徑下創建同名html文檔,做為gpx航跡的可視化文檔。並且當我們再次雙擊同一gpx文檔後,html文檔會重新生成並覆蓋舊的html文檔。
20231006002601

效果展示

如下圖👇,在html文檔中,我們首先可以看到gpx文檔的文檔名被顯示為網頁的標題,這樣當我們打開瀏覽多個gpx文檔時,不至於會發生混淆。
20231006002747

如下圖👇,在html文檔中,我們可以看到gpx航跡的地圖有三種,分別是普通高德地圖, 高德衞星地圖, 和智力GeoQ地圖,三種底圖分別提供了不同的地圖風格,以供我們選擇使用。
20231006002927

如下圖👇,在html文檔中,gpx航跡以螞蟻路徑的效果顯示。
20231006003312_rec_

如下圖👇,這是在高德衞星地圖下的顯示效果。
Snipaste_2023-10-05_23-35-26 gpx軌跡可視化效果 高德衞星圖效果

如下圖👇,這是在智力GeoQ地圖下的顯示效果。
Snipaste_2023-10-05_23-36-34 gpx軌跡可視化效果 智圖GeoQ效果

如下圖👇,這是在高速互通場景下的顯示效果,可以看出,軌跡顯示與地圖道路的匹配度是不錯的。
20231006003709
20231006003802

優點

參考下圖👇,我們可以看出,gpx文檔大概是1MB的體積,但生成的html文檔只有564KB的體積,我們可以很方便的把html文檔作為分離的媒介,以使對方可以在不安裝GIS軟件的情況下,瀏覽我們的航跡信息。
20231006004122

注意點

如下圖👇,我們可以看到在生成的html文檔中引用了大量的js/css資源,這些資源的加載需要互聯網的支持,如果您在使用此腳本方法時,發現html文檔打開是空白,或者打開時間過長,請檢查您的網絡鏈接是否暢通。
Snipaste_2023-10-06_00-49-28

小結

以上就是這次分享的gpx文檔可視化小工具了,希望可以幫助到大家。

user avatar u_16213589 頭像 devil_5931bede13754 頭像 kaige 頭像 tengxunweizhifuwu 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.