GPS 編程和開發歷險記:地理空間教程
已發表: 2022-03-11這一切都始於 10 多年前的 Zbevnica 徒步旅行。 我有我的新 GPS,我的一個朋友有一個連接到 Windows ME 手機的 GPS。 徒步旅行很棒,但是當我們回到車上時,我們驚訝地發現一個 GPS 聲稱我們已經走了 6.2 公里,而另一個報告了 6.7 公里。 一個人聲稱我們的海拔增加(即我們徒步旅行的所有上坡部分的總和)是 300m,而另一個人報告它是 500m。
作為一名程序員(最終成為一名 GIS 程序員),我立即對這個問題產生了興趣。 我對自己說,“用一個簡單的腳本來解決這個問題應該不難。” 畢竟,GPS 軌跡只是(latitude, longitude, elevation)形式的元組列表,對吧?
嗯,不是真的。
於是我開始了對 GPS 軌跡、跟踪錯誤以及更普遍的 GIS 編程的迷人世界的遊覽。
地理空間信息系統 (GIS) 是一個龐大而復雜的領域,包括地圖投影和大地基準))、光柵和矢量數據處理以及遙感。 對該領域的全面介紹將遠遠超出本文的範圍。 由於專注於特定問題通常是一種將自己介紹給新領域的有用方式,因此我將介紹一些我遇到的特定 GIS 挑戰和一些可能的解決方案; 即:
- 如何識別、理解和以編程方式糾正 GPS 跟踪錯誤
- 如何從 GPS 軌跡中計算和獲取額外的有用信息
對於初學者來說,GPS 軌跡不僅僅是一系列(緯度、經度、海拔)元組。 許多支持 GPS 的設備還將提供時間、心率等元數據。 一些 GPS 設備甚至會提供有關數據準確性的信息; 又名“精度稀釋”。 但是,不幸的是,大多數 GPS 設備——尤其是主導市場的低端設備——不會提供這些信息,我們面臨著自行推斷設備準確性的挑戰(理想情況下,在可能的情況下進行相應的校正) )。
讓我們從一種可能的算法開始,以檢測通常具有低質量 GPS 數據的低端 GPS 設備(如大多數智能手機)。
海拔錯誤和特質
如果您居住在世界的某些地方,當您使用智能手機記錄軌跡時,您可能會注意到 GPS 海拔精度的一些奇怪之處。 當您檢查高程時,它們始終被記錄為高於或低於正確的高程(按恆定值)。 例如,我住在 Višnjan(克羅地亞),我的 Android 一直告訴我,我比實際海拔高大約 35-40 米。
例如,這是我幾個月前進行的一次短途徒步旅行的 GPS 海拔圖:
這裡需要注意兩點。
首先,第一部分記錄的GPS數據中的“山丘”完全是設備捏造出來的。 雖然圖表似乎表明我們徒步旅行的最高點距離起點只有幾百米,但實際上它是在大約 4 公里之後。
其次,也許更重要(並且在圖表上不可見)是整個圖表是不准確的。 高度值一直被報告為比實際高出大約 30-40 米,我們將在本文中進一步詳細討論。
這些都是廉價 GPS 設備可能發生的事情。 當我們可以檢測到軌道有這些錯誤時,我們可以推斷該設備可能是一個低質量的 GPS,因此可以預期還會有其他錯誤——不僅僅是海拔錯誤——這些錯誤是此類設備常見的。
啟動海拔錯誤
GPS 設備基本上採用兩種技術來確定海拔:“GPS 高度”(由 GPS 衛星系統向設備報告)和“氣壓高度”(由設備根據氣壓讀數計算得出)。 兩者都不完美。
GPS 高度值可能有許多小誤差(通常在 +/- 10m 範圍內),如果我們稍後決定計算累積高度增益,這可能會特別成問題。 另一方面,氣壓高度不僅對高度敏感,而且對天氣條件也很敏感,這可能會引入其自身的一系列不准確性。
因此,一些設備採用混合方法,使用氣壓讀數來記錄海拔,但使用 GPS 讀數來幫助(重新)校準這些值,以幫助解釋天氣(壓力)變化等。 使用這樣的設備,在開始跟踪時,氣壓高度可能完全錯誤,但是通過使用越來越多的 GPS 衛星數據重新校準,高度數據變得更加可靠。 因此,此類設備遇到我們之前在高程圖中觀察到的“假山”啟動錯誤類型並不少見。
持續的 GPS 海拔不准確
為了解釋高度報告中的一貫錯誤,我們需要回到我們的小學地理。 地理老師通常會解釋說地球不是一個球體而是一個橢球體。 如果這是,事實上,嚴格正確,高度將很容易數學計算。 但事實並非如此。 地球是不規則的; 實際上,它更像是一個類似於橢球的馬鈴薯,而不是一個完美的橢球,這意味著對於 GIS 開發,您需要地球上幾乎每個點的詳細高度數據集。 在大地測量學中,這個參考橢球體(又名基準面)是一個數學定義的表面,它近似於大地水準面,即地球的“更真實”圖形。
此外,重要的是要認識到,即使這些基準也只是地球表面實際形狀的近似值。 有些在世界的某些地方工作得更好,而另一些在其他地方工作得更好。 例如,下圖(使用我的 Ruby 庫生成)顯示了地球與最常用的橢球模型之一(WGS84 基準面)的不同之處。 黑色部分代表地球上方的部分,白色代表下方地球的部分,理想的橢球體(大陸和島嶼輪廓以紅色顯示)。
您可以看到印度位於 WGS84 橢球下方,南部是絕對最小值(幾乎 -100 米!),而歐洲位於其上方。
由於低質量的 GPS 設備不使用任何此類數據,它們實際上只是在假設一個完美的橢球體的情況下計算高程。 因此,它們始終不准確。
檢測和糾正 GPS 高度誤差
在 GPS 應用程序開發中,可以使用地球引力模型 EGM2008 數據集(有時也稱為“大地水準面波動”數據集)來檢測記錄我們軌蹟的設備是否存在這些類型的錯誤。 使用 EGM2008,我們可以逼近實際地球表面與理想橢球體之間的差異。
但是要知道我們的GPS 軌跡是否有這個錯誤,我們還需要一件事——真正的海拔。 航天飛機雷達地形任務 (SRTM) 是一個可以對此有所幫助的公共數據庫。 SRTM 是一個基於柵格的數據庫,它以大約每 30m(赤道)為美國和世界其他地區每 90m 的分辨率提供高程值。 例如,當計算上述軌跡中點的 SRTM 值時,會出現不同的圖形(藍線):
這裡的一個小煩惱是圖形的粗糙邊緣,但這很容易平滑。 請注意,通過平滑,我們幾乎不會損失(如果有的話)精度,因為 SRTM 本身僅在等距位置提供離散點,在任何情況下我們都需要在這些位置之間進行插值。 這是上圖的一個版本,上面的紅線覆蓋表示平滑的 SRTM 數據:
順便說一句,使用我的 GPS Python 庫,所有這些都可以輕鬆完成:
- srtm.py:航天飛機雷達地形任務(SRTM)高程數據的python解析器
- gpxpy:一個用於解析和操作GPX文件的簡單python庫(GPX,GPS交換格式,是一種用於GPS數據的輕量級XML數據格式)
對於 Ruby 用戶,還有我的 Geoelevations.rb 解析器庫,用於 SRTM 和 EGM2008 波動。
檢測到這些異常後,根據我們使用的軟件類型,我們可以 (a) 自行自動更正錯誤,或 (b) 簡單地通知用戶在其高程數據中檢測到不准確之處。
此外,由於有不同的算法可用於以編程方式糾正這些 GPS 高程誤差,我們可能希望讓用戶選擇使用哪種算法(例如,用戶是否希望我們只使用平滑的 SRTM 數據“按原樣”或用戶是否希望我們使用 SRTM 數據來幫助糾正設備報告的高度)。
平滑軌跡並去除異常值
如果一名足球運動員佩戴 GPS 設備並記錄比賽,那麼由此產生的賽道將會一團糟。 比賽場地將密密麻麻地佈滿一條由許多急轉彎、加速和減速組成的賽道。
幸運的是,人們使用 GPS 的大多數情況不會有這種相同的模式——GPS 軌跡線(和加速度)會相對平滑。 在這種情況下,可以假定我們軌跡中的不穩定點是由誤差引起的,因此可以使用平滑函數合理地去除這些異常值。
作為 GIS 開發人員,平滑最常見的方法是遍歷點並根據相鄰坐標的值更改坐標。 例如,我們可以使用如下算法更改每個緯度和經度:
points[n].latitude = points[n-1].latitude * 0.3 + points[n].latitude * .4 + points[n+1].latitude * .3 points[n].longitude = points[n-1].longitude * 0.3 + points[n].longitude * .4 + points[n+1].longitude * .3
係數越大,對應的相鄰點對當前點修改位置的影響越大。 我在本例中使用的係數(0.3、0.4、0.3)有些隨意,但在大多數情況下,您希望它們的總和等於 1.0。 (例如,更複雜的方法是使用點之間的距離,然後,點越近,相應的係數就越大。)

這是一個有很多隨機錯誤的軌道示例:
請注意,賽道沒有很好地跟隨路徑,有很多急轉彎和鋸齒狀轉彎,有時會完全偏離預期的路徑。
經過幾次“平滑”迭代後,這條相同的軌道被轉換為:
雖然這要好得多,但它仍然是不完美的。 請注意,仍有一些地方(特別是在路徑中間附近)軌道仍然偏離道路。
您還可以嘗試其他方法。 在某些地區,對於某些 GPS 應用,您還可以使用 OpenStreetMap (OSM) 數據嘗試猜測正確的路徑,然後將這些點“捕捉”到這條新線路。 雖然這通常很有幫助,但它也可能不完美,例如在 OSM 數據包含兩條平行線(例如高速公路和附近的道路)或許多近距離路徑的情況下。
在這種情況下,一種可能的解決方案是嘗試使用本文中進一步討論的一些技術來檢測活動的類型。 例如,如果我們可以推斷出這條路線是一條遠足路線,並且可以選擇捕捉到高速公路或附近的小路,我們可以安全地假設遠足是沿著小路而不是高速公路。
另請注意,雖然此示例演示了表面坐標(即經度/緯度)的平滑,但平滑可以是一種同樣有效的技術,用於消除海拔或時間數據,甚至心率和自行車節奏數據中的偏差。
平滑的其他好處和用途的示例可能包括:
- 計算總海拔增益。 要計算軌道中的總海拔增益,僅將所有小的“跳躍”上坡相加是不夠的,因為它們通常包含小錯誤。 在求和之前平滑高程通常可以幫助緩解這個問題。
- 異常值去除。 “平滑”後,距離軌道太遠的點更容易被檢測到。 這些通常可以被認為是異常值,並且可以提示用戶詢問是否應該刪除它們。
該算法存在一種不足的問題:在某些情況下,GPS 會記錄一條平滑的路徑,但路徑會在某個方向上“移動”一個恆定的差異。 在這種情況下,平滑可能會進一步平滑線,但不會糾正此移位錯誤。
我們描述的簡單平滑技術的另一個不太明顯但重要的問題是,變換會修改路徑中的所有(或幾乎所有)點,即使是那些可能沒有錯誤的點。 雖然這種更簡單的方法對於普通 GPS 用戶來說往往是一個合理的解決方案,但更複雜的平滑算法肯定可以在 GIS 編程中使用。 在某些情況下,根據用戶、設備和應用程序,簡單地刪除異常值而不執行任何平滑可能會更好。
檢測最大速度
如果我們有路線上所有點的坐標和時間戳,那麼檢測軌道的最大速度是相當簡單的。 只需計算點之間的速度並找到最大值。 看起來很簡單。
但請記住,我們正在處理低端 GPS 設備,我們並不完全信任數據,這可能會對我們的計算產生重大影響。 如果一個設備每 5 米記錄一次位置,並且在某一點由於將點錯位 10 米而出錯,那麼該部分的軌道似乎比原來快 3 倍!
GIS 開發領域的一種常見方法是提取點之間的所有速度,然後只刪除前 5%(即使用第 95 個百分位數),希望刪除的 5% 代表大部分錯誤。 但這無疑是不科學的,也不能保證正確的結果。 在我對這種技術的試驗中,我嘗試了不同的百分位數值,發現有些值適用於一個 GPS 設備,有些適用於其他設備。 有些適合遠足,有些適合騎自行車。 但在大多數情況下,結果對我來說並不合適。
在嘗試了許多算法之後,對我有用的很簡單:添加另一個過濾器來去除極端,不僅是速度,還有距離,如下所示:
- 按鄰居之間的距離對點進行排序並刪除前 5%。
- (可選:)平滑軌道(水平和/或垂直)。
- 按鄰居之間的速度對點進行排序並刪除前 5%。
根據我的經驗,這種算法產生了相當可靠的結果,即使對於來自具有隨機錯誤的廉價 GPS 設備的軌跡也是如此。
推斷活動類型
在許多情況下,平均速度足以確定活動類型。 例如,如果平均時速為 5kmh,則可能是步行/遠足道,而如果平均時速為 30kmh,則可能是自行車道,依此類推。
但如果平均時速為 12kmh,則無法確定用戶是騎山地車還是跑步。 在這種情況下,最大速度有時可以幫助區分兩種類型的活動。 具體來說,我們可以利用跑步者的速度很少超過平均速度兩倍的事實,而騎自行車的人則經常這樣做(例如,在不太具有挑戰性的路徑上下坡時)。
因此,平均時速為12kmh,最高時速為18kmh的賽道可能是在跑步時記錄的,而平均時速為12kmh,最高時速為30kmh的賽道可能是在山地自行車時記錄的。 (當然,我們必須確保我們計算的最大速度是正確的,這樣才能可靠地工作。)
可見天空的百分比:GPS 錯誤檢測的巧妙代理
每次 GPS 測量的精度(即緯度、經度和海拔)很大程度上取決於記錄時可見的衛星數量。 因此,如果我們能夠以某種方式確定每次記錄時“視野內”有多少衛星,我們就可以用它來估計記錄的準確性。 例如,如果我們以某種方式知道所有需要的 GPS 衛星都在視野範圍內,我們可以假設相應 GPS 數據具有高度的準確性。 相反,如果我們以某種方式知道視野中沒有 GPS 衛星,我們可以假設數據容易出錯。
但在您過於興奮之前,請考慮嘗試解決此類 GIS 問題的複雜性。 首先,您需要知道您的設備能夠與哪個 GPS 衛星系統進行通信。 有最初的美國全球定位系統、歐洲的伽利略系統和俄羅斯的 GLONASS 系統。 一些設備適用於所有這些衛星類型,但許多設備不適用。 許多設備甚至不報告他們使用的系統。
但是有一種巧妙的方法可以規避這種複雜性,並粗略估計可見衛星的數量:使用可見天空的百分比作為可見衛星數量的代理。 不可見的天空意味著我們的 GPS 可以被更少的衛星“看到”(或被看到)。 但是我們如何計算地球上任何一點上可見天空的百分比呢? 解決方案實際上非常簡單:我們可以使用前面討論的 SRTM 數據計算我們周圍的地平線。
例如,如果您在使用 SRTM 計算的 Triglav(斯洛文尼亞的最高峰)下方的山谷中,這就是地平線:
(對於那些感興趣的人,可以在這裡找到我創建此圖像的代碼。)
該圖像基本上由從中心點看到的等距高程圖層組成。 藍色區域越深,高程層越遠; 藍色區域越淺,距離高程層越近。 繪製的最高點代表地平線。 如果 GPS 衛星位於天空中這條線以下,我們的設備可能無法看到(或被它看到)。 (但請注意,儘管圖像被繪製為扁平矩形,但實際上您需要一些球面幾何的基本知識才能正確計算地平線以下的區域。)
要記住的另一件事是,這不是檢測 GPS 高度誤差的靈丹妙藥。 首先,地球的大部分地區都不是山區,即使是山區,我們的心理也會高估海拔。 在絕大多數有人居住的地區,可見天空的實際百分比大於75% 。 但儘管如此,這種方法在某些情況下可能會有所幫助,例如登山時,您可能會從深峽谷(GPS 接收不良)到山脊(衛星接收可能要好得多)。 雖然這種方法不能絕對衡量軌道有多少錯誤,但它可以作為一個有用的指標,表明軌道的哪些部分可能比其他部分更容易出錯。
包起來
我們已經討論了低端 GPS 設備可能出現的一些更常見的 GPS 跟踪錯誤類型。 我們提供了對導致它們的原因的理解,以及一些用於糾正它們的 GIS 編程技術。
在某些情況下,我們可以高度自信地糾正軌跡。 在其他情況下,我們至少可以提醒用戶注意曲目中出現問題的部分。 在我們不確定的情況下,始終可以選擇讓用戶自己修復軌道,借助航拍圖像和地圖。 我們的概率猜測可以幫助突出顯示我們檢測到錯誤概率較高的軌道部分。
在許多情況下,我們概述的技術可以成為令人滿意的“80% 解決方案”,為低端 GPS 設備的用戶提供合理水平的 GPS 軌跡準確性自動改進。