支援的版本:目前 (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 專案。)

必須先安裝 cube 模組,才能安裝 earthdistance (雖然您可以使用 CREATE EXTENSIONCASCADE 選項,一次安裝兩個模組)。

注意

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

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

資料儲存在立方體中,立方體是點(兩個角相同),使用代表地球中心距離的 x、y 和 z 三個坐標。 提供了一個在 cube 類型之上的 網域 earth,其中包括約束檢查,以確保值滿足這些限制並且相當接近地球的實際表面。

地球的半徑是從 earth() 函數獲得的。 它以公尺為單位。 但是透過更改這個函數,您可以更改模組以使用其他單位,或者使用您認為更合適的不同半徑值。

這個套件也適用於天文資料庫。 天文學家可能希望將 earth() 更改為傳回 180/pi() 的半徑,以便距離以度為單位。

提供函數以支援經緯度(以度為單位)的輸入,以支援經緯度的輸出,以計算兩點之間的大圓距離,並輕鬆指定可用於索引搜尋的邊界框。

提供的函數如 表格 F.4 所示。

表格 F.4. 基於立方體的 Earthdistance 函數

函數

描述

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. 基於點的 Earthdistance 運算符

運算符

描述

point <@> pointfloat8

計算地球表面上兩點之間的距離(以英里為單位)。


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

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

提交更正

如果您在文件中發現任何不正確、與您的特定功能使用經驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。