pg_sphere是支持球形數據類型、計算函數和操作符的開源PostgreSQL插件。主要解決球形(例如,地球)對象上的點、線、面如何表示的問題,同時支持計算點、線、面之間的距離或面積等功能。
使用指南
- 開啟或關閉插件
- 開啟插件。
CREATE EXTENSION pg_sphere;
- 關閉插件。
DROP EXTENSION pg_sphere;
- 開啟插件。
- 數據類型
pg_sphere插件支持以下類型的對象:
- Point:點
- Euler transformation:歐拉變換
- Circle:圓
- Line:線
- Ellipses:橢圓
- Path:路徑
- Polygon:多邊形
以Point為例來說明如何創建對象。球面上的點有以下三種表示方法:- 用經度和緯度指定位置,單位為弧度。
顯示結果如下:SELECT spoint '(0.1,-0.2)';
spoint -------------- (0.1 , -0.2) (1 row)
- 用經度和緯度指定位置,單位為度。
顯示結果如下:SELECT spoint '( 10.1d, -90d)';
spoint ---------------------------------------- (0.176278254451427 , -1.5707963267949) (1 row)
- 使用DMS(度、分、秒)來標識經度和緯度。
顯示結果如下:SELECT spoint '( 10d 12m 11.3s, -13d 14m)';
spoint ---------------------------------------- (0.176278254451427 , -1.5707963267949) (1 row)
說明 將圓周360等分,一等分對應的圓心角是1度;將1度對應的弧長60等分,一等分對應的圓心角是1分;將1分對應的弧長60等分,一等分對應的圓心角是1秒。
- 構造器
構造器用于通過其他數據類型來構造球形數據類型,構造器支持Point、Euler transformation、Circle、Line、Ellipses、Path、Polygon等類型。
以Point為例來說明如何創建。通過經緯度來構造球形點(得到一個經度為270,緯度為-30的球面位置):
顯示結果如下:SELECT spoint (270.0 * pi() / 180.0, -30.0 * pi() / 180.0) AS spoint;
spoint ----------------------------------------- (4.71238898038469 , -0.523598775598299) (1 row)
- 操作符
pg_sphere插件支持以下操作符:
- Casting:投影
- Equality:相等
- Contain and overlap:包含和重疊
- Crossing of lines:線條相交
- Distance:距離
- Length and circumference:長度和周長
- Center:中點
以Distance為例計算兩個圓之間的距離。
顯示結果如下:SELECT 180 * ( scircle '<(0d,20d),2d>' <-> scircle '<(0d,40d),2d>' ) / pi() AS dist;
dist ------ 16 (1 row)
- 函數
pg_sphere插件支持以下計算函數:
- 面積計算函數
- 路徑計算函數
- 距離計算函數
以面積計算函數和點計算函數為例,說明如何使用函數。
- 以pi為單位計算一個球形的面積。
顯示結果如下:SELECT area( scircle '<(0d,90d),60d>' ) / pi() AS area;
area -------------------- 0.9999999999999997 (1 row)
- 獲取一個球形點的經度和緯度,單位為度。
說明 pg_sphere插件中的
long(spoint)
函數更改為long_sphere(spoint)
函數。
顯示結果如下;SELECT long_sphere ( spoint '(10d,20d)' ) * 180.0 / pi() AS longitude;
longitude ------------ 10 (1 row)
顯示結果如下:SELECT lat ( spoint '(10d,20d)' ) * 180.0 / pi() AS latitude;
latitude ---------- 20 (1 row)
相關參考
pg_sphere的詳細說明可參考pg_sphere官方幫助文檔。