pg_sphere は、球面データの型、関数、およびオペレーターをサポートするオープンソースの PostgreSQL 拡張機能です。これにより、地球の点、線、ポリゴンなど、球上のオブジェクトを表現できます。また、これらのオブジェクト間の距離や面積の計算もサポートしています。
前提条件
PolarDB for PostgreSQL の次のバージョンがサポートされています。
PostgreSQL 16 (マイナーエンジンバージョン 2.0.16.9.6.0 以降)
PostgreSQL 14 (マイナーエンジンバージョン 2.0.14.5.1.0 以降)
PostgreSQL 11 (マイナーエンジンバージョン 2.0.11.9.27.0 以降)
マイナーエンジンバージョンは、[コンソール] で確認するか、SHOW polardb_version; 文を実行して確認できます。マイナーエンジンバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをスペックアップする必要があります。
手順
拡張機能のインストールまたはアンインストール
拡張機能をインストールします。
CREATE EXTENSION pg_sphere;拡張機能をアンインストールします。
DROP EXTENSION pg_sphere;
データの型
pg_sphere 拡張機能は、次のオブジェクトタイプをサポートしています。
点
オイラー変換
円
線
楕円
パス
ポリゴン
次の例は、点オブジェクトを作成する方法を示しています。球上の点は、次の 3 つの方法のいずれかで表現できます。
ラジアン単位の経度と緯度で位置を指定します。
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.178078367649387 , -0.230965237680583) (1 row)説明円は 360 度に分割されます。1 度は 60 分に分割されます。1 分は 60 秒に分割されます。
コンストラクター
コンストラクターは、他のデータの型から点、オイラー変換、円、線、楕円、パス、ポリゴンなどの球面データの型を作成するために使用されます。
次の例では、経度と緯度から球面点を作成します。結果の点の経度は 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 拡張機能は、次のオペレーターをサポートしています。
キャストは射影を指します。
等価性
包含と重複
線の交差
距離
長さと円周
中心
次の例では、距離オペレーターを使用して 2 つの円の間の距離を計算します。
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 ------ 1 (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 公式ドキュメント」をご参照ください。