geo_distance

2つの地理空間オブジェクト間の距離を決定します。
double geo_distance(any*, any*)

1番目と2番目のパラメータany*には、任意のジオメトリ・オブジェクトを指定できます。

この関数は2つの入力ジオメトリ間の測地距離を返します。返される距離は、1つ目のポイントが1つ目のジオメトリに属し、2つ目のポイントが2つ目のジオメトリに属しているポイントのペアの距離の最小値として定義されます。このような2つのポイントの間の距離は、ポイントを結ぶ測地線の長さです。

測地線の概要

2点間の測地線は、地球の楕円体表面上の2点間に描画できる最短の線です。単純な、ただしより実例的な定義にするために、地球の表面が球面であると想定します。地球上の2点間の測地線は、これらの点に対応する大円の2点間にある劣弧です。つまり、地球の中心と2点で定義された球面と平面の交差で形成される円です。

次の図は、ロサンゼルスとロンドンの間の測地線と直線の違いを示しています。
geodetic-vs-straight-line.jpgの説明が続きます
図geodetic-vs-straight-line.jpgの説明

2つのパラメータのいずれかが単一の有効なジオメトリ・オブジェクトを返さず、そのことがコンパイル時に検出された場合は、エラーが発生します。

実行時の動作は次のとおりです。
  • いずれかのパラメータが0個または複数の項目を返した場合は-1を返します。
  • いずれかのパラメータがNULLを返した場合はNULLを返します。
  • パラメータのいずれかがジオメトリ・オブジェクトでない場合は-1を返します。
それ以外の場合、関数は2つの入力ジオメトリ間の測地距離をメートル単位で返します。

ノート:

結果は距離に基づいて昇順にソートされます(最短距離が最初に表示されます)。
例: 指定の場所から最も近いレストランまでの距離はどれくらいですか。
SELECT 
t.poi.name AS restaurant_name,
t.poi.address.street AS street_name,
geo_distance(
    t.poi.location,
    { 
       "type" : "point",
       "coordinates": [-121.94034576416016,37.2812239247177]
    }
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "restaurant" ;
説明:
  • PointsOfInterest表を問い合せて、restaurantの行をフィルタします。
  • 正しい場所のポイントを指定し、geo_distance関数を使用して距離を決定します。
結果:
{"restaurant_name":"Coach Sports Bar & Grill","street_name":"80 Edward St","distance_in_meters":799.2645323337218}
{"restaurant_name":"Ricos Taco","street_name":"80 East Boulevard St","distance_in_meters":976.5361117138553}
{"restaurant_name":"Effie's Restaurant and Bar","street_name":"80 Woodeard St","distance_in_meters":2891.0508307646282}    

現在の場所から最も近いレストランまでの距離は799 mです。