メインコンテンツへスキップ
メインコンテンツへスキップ

地理座標を扱うための関数

greatCircleDistance

大円距離の公式を用いて、地球表面上の2点間の距離を計算します。

greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

入力パラメータ

  • lon1Deg — 1つ目の地点の経度(度単位)。範囲: [-180°, 180°]
  • lat1Deg — 1つ目の地点の緯度(度単位)。範囲: [-90°, 90°]
  • lon2Deg — 2つ目の地点の経度(度単位)。範囲: [-180°, 180°]
  • lat2Deg — 2つ目の地点の緯度(度単位)。範囲: [-90°, 90°]

正の値は北緯および東経を表し、負の値は南緯および西経を表します。

戻り値

地球表面上の2点間の距離(メートル単位)。

入力パラメータの値が範囲外の場合は、例外がスローされます。

SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673) AS greatCircleDistance
┌─greatCircleDistance─┐
│            14128352 │
└─────────────────────┘

geoDistance

greatCircleDistance と似ていますが、球ではなく WGS-84 楕円体上の距離を計算します。これは地球ジオイドをより正確に近似したものです。 パフォーマンスは greatCircleDistance と同じです(性能低下はありません)。地球上の距離を計算する場合は geoDistance の使用を推奨します。

技術メモ: 十分に近接した点同士の距離については、座標の中点における接平面上の計量を用いた平面近似で距離を計算します。

geoDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

入力パラメーター

  • lon1Deg — 1つ目の地点の経度(度)。範囲: [-180°, 180°]
  • lat1Deg — 1つ目の地点の緯度(度)。範囲: [-90°, 90°]
  • lon2Deg — 2つ目の地点の経度(度)。範囲: [-180°, 180°]
  • lat2Deg — 2つ目の地点の緯度(度)。範囲: [-90°, 90°]

正の値は北緯および東経を表し、負の値は南緯および西経を表します。

返される値

地球表面上の2点間の距離をメートル単位で返します。

入力パラメーターの値が範囲外の場合、例外をスローします。

SELECT geoDistance(38.8976, -77.0366, 39.9496, -75.1503) AS geoDistance
┌─geoDistance─┐
│   212458.73 │
└─────────────┘

greatCircleAngle

大円距離の公式を使用して、地球表面上にある2つの地点間の中心角を計算します。

greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

入力パラメータ

  • lon1Deg — 1つ目の地点の経度(単位: 度)。
  • lat1Deg — 1つ目の地点の緯度(単位: 度)。
  • lon2Deg — 2つ目の地点の経度(単位: 度)。
  • lat2Deg — 2つ目の地点の緯度(単位: 度)。

戻り値

2つの地点間の中心角(単位: 度)。

SELECT greatCircleAngle(0, 0, 45, 0) AS arc
┌─arc─┐
│  45 │
└─────┘

pointInEllipses

点が少なくとも 1 つの楕円に含まれているかどうかを判定します。 座標はデカルト座標系における幾何学座標です。

pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ)

入力パラメータ

  • x, y — 平面上の点の座標。
  • xᵢ, yᵢi 番目の楕円の中心座標。
  • aᵢ, bᵢi 番目の楕円の軸の長さ(x, y 座標と同じ単位)。

入力パラメータの数は 2+4⋅n でなければならず、ここで n は楕円の個数を表す。

返り値

点が少なくとも 1 つの楕円の内部にある場合は 1、そうでない場合は 0

SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
│                                               1 │
└─────────────────────────────────────────────────┘

pointInPolygon

点が平面上の多角形内に含まれているかどうかを判定します。

pointInPolygon((x, y), [(a, b), (c, d) ...], ...)

入力値

  • (x, y) — 平面上の点の座標。データ型 — Tuple — 2 つの数値からなるタプル。
  • [(a, b), (c, d) ...] — 多角形の頂点。データ型 — Array。各頂点は座標の組 (a, b) で表されます。頂点は時計回りまたは反時計回りの順序で指定する必要があります。頂点の最小数は 3 です。多角形は定数でなければなりません。
  • 関数は穴(切り抜かれた領域)を持つ多角形もサポートします。データ型 — Polygon。2 番目の引数として Polygon 全体を渡すか、外側のリングを最初に渡し、その後に各穴を個別の追加引数として渡します。
  • 関数はマルチポリゴンもサポートします。データ型 — MultiPolygon。2 番目の引数として MultiPolygon 全体を渡すか、各構成ポリゴンをそれぞれ個別の引数として渡します。

戻り値

点が多角形の内側にある場合は 1、そうでない場合は 0。 点が多角形の境界上にある場合、この関数は 0 または 1 のどちらかを返すことがあります。

SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
┌─res─┐
│   1 │
└─────┘

注記
• ジオメトリ検証をスキップするには、validate_polygons = 0 を設定できます。
pointInPolygon は、すべてのポリゴンが適切に構成されていることを前提とします。入力が自己交差していたり、リングの順序が誤っていたり、エッジが重なっている場合、特にエッジや頂点の上、あるいは自己交差部分の内部のように「内側」と「外側」の概念が定義できない位置にある点については、結果が信頼できなくなります。