2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

F.14. earthdistance — 計算大圓距離 #

earthdistance 模組提供了兩種不同的方法來計算地球表面的大圓距離。第一種方法依賴於 cube 模組。第二種方法基於內建的 point 資料型別,使用經度和緯度作為座標。

在此模組中,地球被假定為一個完美的球體。(如果這對您來說不夠精確,您可能需要檢視 PostGIS 專案。)

在安裝 earthdistance 之前必須安裝 cube 模組(儘管您可以使用 CREATE EXTENSIONCASCADE 選項一次性安裝兩者)。

注意

強烈建議將 earthdistancecube 安裝在同一個模式(schema)中,並且該模式是尚未授予任何不受信任使用者 CREATE 許可權的模式。否則,如果 earthdistance 的模式包含惡意使用者定義的物件的,將存在安裝時的安全風險。此外,在安裝後使用 earthdistance 的函式時,整個搜尋路徑應僅包含受信任的模式。

F.14.1. 基於立方體的地球距離 #

資料儲存在以立方體表示的點(其兩個角點相同)中,使用三個座標代表從地球中心到該點的 x、y 和 z 距離。提供了一個基於 cube 型別的 earth ,該域包含約束檢查,以確保值滿足這些限制並且在地球表面附近。

地球的半徑透過 earth() 函式獲取。單位是米。但透過更改此函式,您可以將模組更改為使用其他單位,或使用您認為更合適的半徑值。

此包也可用於天文學資料庫。天文學家可能希望將 earth() 更改為返回半徑 180/pi(),以便距離以度為單位。

提供了支援以經緯度(以度為單位)輸入、支援輸出經緯度、計算兩點之間的球形距離以及輕鬆指定用於索引搜尋的邊界框的函式。

提供的函式顯示在 表 F.4 中。

表 F.4. 基於立方體的地球距離函式

函式

描述

earth () → float8

返回假定的地球半徑。

sec_to_gc ( float8 ) → float8

將地球表面兩點之間的直線(割線)距離轉換為它們之間的大圓距離。

gc_to_sec ( float8 ) → float8

將地球表面兩點之間的大圓距離轉換為它們之間的直線(割線)距離。

ll_to_earth ( float8, float8 ) → earth

給定一個點在地球表面的緯度(引數 1)和經度(引數 2)(以度為單位),返回該點在地球上的位置。

latitude ( earth ) → float8

返回地球表面一個點的緯度(以度為單位)。

longitude ( earth ) → float8

返回地球表面一個點的經度(以度為單位)。

earth_distance ( earth, earth ) → float8

返回地球表面兩點之間的大圓距離。

earth_box ( earth, float8 ) → cube

返回一個適合使用 cube @> 運算子進行索引搜尋的框,用於查詢距離某個位置給定大圓距離內的點。此框中的某些點可能比指定的大圓距離更遠,因此查詢中應包含使用 earth_distance 進行的第二次檢查。


F.14.2. 基於點的地球距離 #

該模組的第二部分依賴於將地球位置表示為 point 型別的值,其中第一個分量被視為經度(以度為單位),第二個分量被視為緯度(以度為單位)。將點表示為(經度,緯度)而不是反過來,是因為經度更接近 x 軸的直觀概念,而緯度更接近 y 軸。

提供了一個運算子,顯示在 表 F.5 中。

表 F.5. 基於點的地球距離運算子

運算子

描述

point <@> pointfloat8

計算地球表面兩點之間的法定英里數距離。


請注意,與模組中基於 cube 的部分不同,這裡的單位是硬編碼的:更改 earth() 函式不會影響此運算子的結果。

經緯度表示法的一個缺點是,您需要小心處理靠近極點和經度 +/- 180 度附近的邊緣情況。基於 cube 的表示法避免了這些不連續性。

提交更正

如果您在文件中發現任何不正確、與您的實際體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。