他のバージョンの文書 : 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

9.11. 幾何関数と演算子 #

point、box、lseg、line、path、polygon、およびcircle幾何データ型には、PostgreSQLが元々サポートしている関数と演算子が豊富に揃っています(表 9.36、表 9.37、および表 9.38を参照してください)。

表9.36 幾何データ演算子

演算子

説明

例

geometric_type + point → geometric_type

最初の引数の各々の点に二番目のpointの座標を加え、平行移動します。 point、box、path、circleで利用可能です。

box '(1,1),(0,0)' + point '(2,0)' → (3,1),(2,0)

path + path → path

2つの開経路を結合します。(どちらかの経路が閉じていればNULLを返します。)

path '[(0,0),(1,1)]' + path '[(2,2),(3,3),(4,4)]' → [(0,0),(1,1),(2,2),(3,3),(4,4)]

geometric_type - point → geometric_type

最初の引数の各々の点に二番目のpointの座標を減算し、平行移動します。 point、box、path、circleで利用可能です。

box '(1,1),(0,0)' - point '(2,0)' → (-1,1),(-2,0)

geometric_type * point → geometric_type

最初の引数の各々の点に2番目のpointの座標を乗じます。(点を実数部と虚数部で表現する複素数として扱い、標準複素乗法を行います。) 2番目のpointをベクトルと解釈すると、これはオブジェクトの大きさと原点からの距離をベクトルの長さで拡大し、x軸に対する角度分原点周りで反時計方向に回転させたものになります。 point、box [a] path、circleで利用可能です。

path '((0,0),(1,0),(1,1))' * point '(3.0,0)' → ((0,0),(3,0),(3,3))

path '((0,0),(1,0),(1,1))' * point(cosd(45), sind(45)) → ((0,0),​(0.7071067811865475,0.7071067811865475),​(0,1.414213562373095))

geometric_type / point → geometric_type

最初の引数の各々の点を2番目のpointの座標で除算します。(点を実数部と虚数部で表現する複素数として扱い、標準複素除法を行います。 2番目のpointをベクトルと解釈すると、これはオブジェクトの大きさと原点からの距離をベクトルの長さで縮小し、x軸に対する角度分原点周りで時計方向に回転させたものになります。 point、box[a]、path、circleで利用可能です。

path '((0,0),(1,0),(1,1))' / point '(2.0,0)' → ((0,0),(0.5,0),(0.5,0.5))

path '((0,0),(1,0),(1,1))' / point(cosd(45), sind(45)) → ((0,0),​(0.7071067811865476,-0.7071067811865476),​(1.4142135623730951,0))

@-@ geometric_type → double precision

全長を計算します。lseg、pathで利用可能です。

@-@ path '[(0,0),(1,0),(1,1)]' → 2

@@ geometric_type → point

中心点を計算します。 box、lseg、polygon、circleで利用可能です。

@@ box '(2,2),(0,0)' → (1,1)

# geometric_type → integer

点の数を返します。 path、polygonで利用可能です。

# path '((1,0),(0,1),(-1,0))' → 3

geometric_type # geometric_type → point

交点を計算します。交点がなければNULLを返します。 lseg、lineで利用可能です。

lseg '[(0,0),(1,1)]' # lseg '[(1,0),(0,1)]' → (0.5,0.5)

box # box → box

2つの矩形の共通部を計算します。 共通部がなければNULLを返します。

box '(2,2),(-1,-1)' # box '(1,1),(-2,-2)' → (1,1),(-1,-1)

geometric_type ## geometric_type → point

最初のオブジェクトから2番目のオブジェクトへの2番目のオブジェクト上の最近点を計算します。 以下の型の対で利用可能です。 (point, box), (point, lseg), (point, line), (lseg, box), (lseg, lseg), (line, lseg).

point '(0,0)' ## lseg '[(2,0),(0,2)]' → (1,1)

geometric_type <-> geometric_type → double precision

オブジェクト間の距離を計算します。 7つのすべての幾何型、pointと他のすべての幾何型との組み合わせ、そして次の型の組み合わせで利用できます。 (box、lseg)、(lseg、line)、(polygon、circle)(そして可換の組み合わせ)。

circle '<(0,0),1>' <-> circle '<(5,0),1>' → 3

geometric_type @> geometric_type → boolean

最初のオブジェクトは2番目のオブジェクトを含んでいるか? 次の型の組み合わせで利用できます。 (box、point)、 (box、box)、 (path、point)、 (polygon、point)、 (polygon、polygon)、 (circle、point)、 (circle、circle)。

circle '<(0,0),2>' @> point '(1,1)' → t

geometric_type <@ geometric_type → boolean

最初のオブジェクトは2番目のオブジェクトに含まれているかあるいはその上にあるか? 次の型の組み合わせで利用できます。 (point、 box)、 (point、 lseg)、 (point、 line)、 (point、 path)、 (point、 polygon)、 (point、 circle)、 (box、 box)、 (lseg、 box)、 (lseg、 line)、 (polygon、 polygon)、 (circle、 circle)。

point '(1,1)' <@ circle '<(0,0),2>' → t

geometric_type && geometric_type → boolean

これらのオブジェクトは重なり合っているか? (共通の点があれば真となります。) box、polygon、circleで利用可能です。

box '(1,1),(0,0)' && box '(2,2),(0,0)' → t

geometric_type << geometric_type → boolean

最初のオブジェクトは完全に2番目のオブジェクトの左にあるか? point、box、polygon、circleで利用可能です。

circle '<(0,0),1>' << circle '<(5,0),1>' → t

geometric_type >> geometric_type → boolean

最初のオブジェクトは完全に2番目のオブジェクトの右にあるか? point、box、polygon、circleで利用可能です。

circle '<(5,0),1>' >> circle '<(0,0),1>' → t

geometric_type &< geometric_type → boolean

最初のオブジェクトは2番目のオブジェクトの右にはみ出していないか? box、polygon、circleで利用可能です。

box '(1,1),(0,0)' &< box '(2,2),(0,0)' → t

geometric_type &> geometric_type → boolean

最初のオブジェクトは2番目のオブジェクトの左にはみ出していないか? box、polygon、circleで利用可能です。

box '(3,3),(0,0)' &> box '(2,2),(0,0)' → t

geometric_type <<| geometric_type → boolean

最初のオブジェクトは完全に2番目のオブジェクトの下にあるか? point、box、polygon、circleで利用可能です。

box '(3,3),(0,0)' <<| box '(5,5),(3,4)' → t

geometric_type |>> geometric_type → boolean

最初のオブジェクトは完全に2番目のオブジェクトの上にあるか? point、box、polygon、circleで利用可能です。

box '(5,5),(3,4)' |>> box '(3,3),(0,0)' → t

geometric_type &<| geometric_type → boolean

最初のオブジェクトは2番目のオブジェクトの上にはみ出していないか? box、polygon、circleで利用可能です。

box '(1,1),(0,0)' &<| box '(2,2),(0,0)' → t

geometric_type |&> geometric_type → boolean

最初のオブジェクトは2番目のオブジェクトの下にはみ出していないか? box、polygon、circleで利用可能です。

box '(3,3),(0,0)' |&> box '(2,2),(0,0)' → t

box <^ box → boolean

最初のオブジェクトは2番目のオブジェクトの下か? (辺が接しているのを許容します)

box '((1,1),(0,0))' <^ box '((2,2),(1,1))' → t

box >^ box → boolean

最初のオブジェクトは2番目のオブジェクトの上か? (辺が接しているのを許容します)

box '((2,2),(1,1))' >^ box '((1,1),(0,0))' → t

geometric_type ?# geometric_type → boolean

これらのオブジェクトは交差しているか? 次の型の組み合わせで利用できます。 (box、 box)、 (lseg、 box)、 (lseg、 lseg)、 (lseg、 line)、 (line、 box)、 (line、 line)、 (path、 path)。

lseg '[(-1,0),(1,0)]' ?# box '(2,2),(-2,-2)' → t

?- line → boolean

?- lseg → boolean

線は水平か?

?- lseg '[(-1,0),(1,0)]' → t

point ?- point → boolean

点は水平に並んでいるか? (つまりy座標が同じであるということです。)

point '(1,0)' ?- point '(0,0)' → t

?| line → boolean

?| lseg → boolean

線は垂直か?

?| lseg '[(-1,0),(1,0)]' → f

point ?| point → boolean

点は垂直に並んでいるか? (つまりx座標が同じであるということです。)

point '(0,1)' ?| point '(0,0)' → t

line ?-| line → boolean

lseg ?-| lseg → boolean

(指定された)2つの線は垂直か?

lseg '[(0,0),(0,1)]' ?-| lseg '[(0,0),(1,0)]' → t

line ?|| line → boolean

lseg ?|| lseg → boolean

線は平行か?

lseg '[(-1,0),(1,0)]' ?|| lseg '[(-1,2),(1,2)]' → t

geometric_type ~= geometric_type → boolean

オブジェクトは同じか? point、box、polygon、circleで利用可能です。

polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))' → t

[a] boxをこれらの演算子で「回転」してもその頂点を動かすだけです。 原点に対して矩形の辺は平行のままです。ですから矩形の大きさは保存されません。真の回転ならば保存します。


注意

「同じを示す」~=演算子はpoint、box、polygon、およびcircle型に対し通常の等価概念を示すことに注意してください。これらのいくつかの型は=演算子を持ちますが、=は面積の等しさのみを比較します。これらの型で利用可能であれば、その他のスカラ比較演算子(<=など)は同様に面積を比較します。

注記

PostgreSQLの14より前では、点の下/上の厳密比較演算子point <<| pointおよびpoint |>> pointは、それぞれ<^および>^という名前でした。 これらの名前はまだ利用できますが、削除予定であり最終的にはなくなるでしょう。

表9.37 幾何データ型関数

関数

説明

例

area ( geometric_type ) → double precision

面積を計算します。 box、path、circleで利用可能です。 入力pathは閉じていなければなりません。さもなければNULLが返ります。 またpathが自分自身と交わっていれば、結果は無意味なものになります。

area(box '(2,2),(0,0)') → 4

center ( geometric_type ) → point

中心点を計算します。 box、circleで利用可能です。

center(box '(1,2),(0,0)') → (0.5,1)

diagonal ( box ) → lseg

矩形の対角線を線分として取り出します。 (lseg(box)と同じです。)

diagonal(box '(1,2),(0,0)') → [(1,2),(0,0)]

diameter ( circle ) → double precision

円の直径を計算します。

diameter(circle '<(0,0),2>') → 4

height ( box ) → double precision

矩形の高さを計算します。

height(box '(1,2),(0,0)') → 2

isclosed ( path ) → boolean

閉経路か?

isclosed(path '((0,0),(1,1),(2,0))') → t

isopen ( path ) → boolean

開経路か?

isopen(path '[(0,0),(1,1),(2,0)]') → t

length ( geometric_type ) → double precision

全長を計算します。 lseg、pathで利用可能です。

length(path '((-1,0),(1,0))') → 4

npoints ( geometric_type ) → integer

点の数を返します。 path、polygonで利用可能です。

npoints(path '[(0,0),(1,1),(2,0)]') → 3

pclose ( path ) → path

経路を閉じた状態に変換します。

pclose(path '[(0,0),(1,1),(2,0)]') → ((0,0),(1,1),(2,0))

popen ( path ) → path

経路を開いた状態に変換します。

popen(path '((0,0),(1,1),(2,0))') → [(0,0),(1,1),(2,0)]

radius ( circle ) → double precision

円の半径を計算します。

radius(circle '<(0,0),2>') → 2

slope ( point, point ) → double precision

2つの点で描いた直線の傾きを計算します。

slope(point '(0,0)', point '(2,1)') → 0.5

width ( box ) → double precision

矩形の幅を計算します。

width(box '(1,2),(0,0)') → 1


表9.38 幾何型変換関数

関数

説明

例

box ( circle ) → box

円に内接する矩形を計算します。

box(circle '<(0,0),2>') → (1.414213562373095,1.414213562373095),​(-1.414213562373095,-1.414213562373095)

box ( point ) → box

点を空の矩形に変換します。

box(point '(1,0)') → (1,0),(1,0)

box ( point, point ) → box

2つの対角する点を矩形に変換します。

box(point '(0,1)', point '(1,0)') → (1,1),(0,0)

box ( polygon ) → box

多角形の外接矩形を計算します。

box(polygon '((0,0),(1,1),(2,0))') → (2,1),(0,0)

bound_box ( box, box ) → box

2つの矩形の外接矩形を計算します。

bound_box(box '(1,1),(0,0)', box '(4,4),(3,3)') → (4,4),(0,0)

circle ( box ) → circle

矩形を含む最小の円を計算します。

circle(box '(1,1),(0,0)') → <(0.5,0.5),0.7071067811865476>

circle ( point, double precision ) → circle

中心と半径から円を作成します。

circle(point '(0,0)', 2.0) → <(0,0),2>

circle ( polygon ) → circle

多角形を円に変換します。 円の中心は多角形の点の位置の平均で、半径は中心から多角形の点の平均距離です。

circle(polygon '((0,0),(1,3),(2,0))') → <(1,1),1.6094757082487299>

line ( point, point ) → line

2点を通過する直線に変換します。

line(point '(-1,0)', point '(1,0)') → {0,-1,0}

lseg ( box ) → lseg

矩形の対角線を線分として取り出します。

lseg(box '(1,0),(-1,0)') → [(1,0),(-1,0)]

lseg ( point, point ) → lseg

2つの点から線分を作ります。

lseg(point '(-1,0)', point '(1,0)') → [(-1,0),(1,0)]

path ( polygon ) → path

同じ点のリストで多角形を閉経路に変換します。

path(polygon '((0,0),(1,1),(2,0))') → ((0,0),(1,1),(2,0))

point ( double precision, double precision ) → point

座標から点を作ります。

point(23.4, -44.5) → (23.4,-44.5)

point ( box ) → point

矩形の中心点を計算します。

point(box '(1,0),(-1,0)') → (0,0)

point ( circle ) → point

円の中心点を計算します。

point(circle '<(0,0),2>') → (0,0)

point ( lseg ) → point

線分の中心を計算します。

point(lseg '[(-1,0),(1,0)]') → (0,0)

point ( polygon ) → point

多角形の中心を計算します。 (多角形の点の位置の平均です。)

point(polygon '((0,0),(1,1),(2,0))') → (1,0.3333333333333333)

polygon ( box ) → polygon

矩形を4点の多角形に変換します。

polygon(box '(1,1),(0,0)') → ((0,0),(0,1),(1,1),(1,0))

polygon ( circle ) → polygon

円を12点の多角形に変換します。

polygon(circle '<(0,0),2>') → ((-2,0),​(-1.7320508075688774,0.9999999999999999),​(-1.0000000000000002,1.7320508075688772),​(-1.2246063538223773e-16,2),​(0.9999999999999996,1.7320508075688774),​(1.732050807568877,1.0000000000000007),​(2,2.4492127076447545e-16),​(1.7320508075688776,-0.9999999999999994),​(1.0000000000000009,-1.7320508075688767),​(3.673819061467132e-16,-2),​(-0.9999999999999987,-1.732050807568878),​(-1.7320508075688767,-1.0000000000000009))

polygon ( integer, circle ) → polygon

円をn点の多角形に変換します。

polygon(4, circle '<(3,0),1>') → ((2,0),​(3,1),​(4,1.2246063538223773e-16),​(3,-1))

polygon ( path ) → polygon

同じ点のリストで閉経路を多角形に変換します。

polygon(path '((0,0),(1,1),(2,0))') → ((0,0),(1,1),(2,0))


あたかもpointは添字0、1を有する配列であるかのように、pointの2つの構成要素にアクセスすることができます。 例えば、t.pがpoint列の場合、SELECT p[0] FROM tという式でX座標を抽出できます。また、UPDATE t SET p[1] = ...でY座標を変更できます。 同様に、box型またはlseg型の値も、2つのpoint型の値の配列のように扱えます。