バージョンごとのドキュメント一覧

9.11. 幾何関数と演算子 #

<title>Geometric Functions and Operators</title>

The geometric types <type>point</type>, <type>box</type>, <type>lseg</type>, <type>line</type>, <type>path</type>, <type>polygon</type>, and <type>circle</type> have a large set of native support functions and operators, shown in <xref linkend="functions-geometry-op-table"/>, <xref linkend="functions-geometry-func-table"/>, and <xref linkend="functions-geometry-conv-table"/>. pointboxlseglinepathpolygon、およびcircle幾何データ型には、PostgreSQLが元々サポートしている関数と演算子が豊富に揃っています(表 9.36表 9.37、および表 9.38を参照してください)。

表9.36 幾何データ演算子

<title>Geometric Operators</title>

Operator 演算子

Description 説明

Example(s)

geometric_type + pointgeometric_type

Adds the coordinates of the second <type>point</type> to those of each point of the first argument, thus performing translation. Available for <type>point</type>, <type>box</type>, <type>path</type>, <type>circle</type>. 最初の引数の各々の点に二番目のpointの座標を加え、平行移動します。 pointboxpathcircleで利用可能です。

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

path + pathpath

Concatenates two open paths (returns NULL if either path is closed). 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 - pointgeometric_type

Subtracts the coordinates of the second <type>point</type> from those of each point of the first argument, thus performing translation. Available for <type>point</type>, <type>box</type>, <type>path</type>, <type>circle</type>. 最初の引数の各々の点に二番目のpointの座標を減算し、平行移動します。 pointboxpathcircleで利用可能です。

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

geometric_type * pointgeometric_type

Multiplies each point of the first argument by the second <type>point</type> (treating a point as being a complex number represented by real and imaginary parts, and performing standard complex multiplication). If one interprets the second <type>point</type> as a vector, this is equivalent to scaling the object's size and distance from the origin by the length of the vector, and rotating it counterclockwise around the origin by the vector's angle from the <replaceable>x</replaceable> axis. Available for <type>point</type>, <type>box</type>,<footnote id="functions-geometry-rotation-fn"><para><quote>Rotating</quote> a box with these operators only moves its corner points: the box is still considered to have sides parallel to the axes. Hence the box's size is not preserved, as a true rotation would do.</para></footnote> <type>path</type>, <type>circle</type>. 最初の引数の各々の点に2番目のpointの座標を乗じます。(点を実数部と虚数部で表現する複素数として扱い、標準複素乗法を行います。) 2番目のpointをベクトルと解釈すると、これはオブジェクトの大きさと原点からの距離をベクトルの長さで拡大し、x軸に対する角度分原点周りで反時計方向に回転させたものになります。 pointbox [a] pathcircleで利用可能です。

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 / pointgeometric_type

Divides each point of the first argument by the second <type>point</type> (treating a point as being a complex number represented by real and imaginary parts, and performing standard complex division). If one interprets the second <type>point</type> as a vector, this is equivalent to scaling the object's size and distance from the origin down by the length of the vector, and rotating it clockwise around the origin by the vector's angle from the <replaceable>x</replaceable> axis. Available for <type>point</type>, <type>box</type>,<footnoteref linkend="functions-geometry-rotation-fn"/> <type>path</type>, <type>circle</type>. 最初の引数の各々の点を2番目のpointの座標で除算します。(点を実数部と虚数部で表現する複素数として扱い、標準複素除法を行います。 2番目のpointをベクトルと解釈すると、これはオブジェクトの大きさと原点からの距離をベクトルの長さで縮小し、x軸に対する角度分原点周りで時計方向に回転させたものになります。 pointbox[a]pathcircleで利用可能です。

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_typedouble precision

Computes the total length. Available for <type>lseg</type>, <type>path</type>. 全長を計算します。lsegpathで利用可能です。

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

@@ geometric_typepoint

Computes the center point. Available for <type>box</type>, <type>lseg</type>, <type>polygon</type>, <type>circle</type>. 中心点を計算します。 boxlsegpolygoncircleで利用可能です。

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

# geometric_typeinteger

Returns the number of points. Available for <type>path</type>, <type>polygon</type>. 点の数を返します。 pathpolygonで利用可能です。

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

geometric_type # geometric_typepoint

Computes the point of intersection, or NULL if there is none. Available for <type>lseg</type>, <type>line</type>. 交点を計算します。交点がなければNULLを返します。 lseglineで利用可能です。

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

box # boxbox

Computes the intersection of two boxes, or NULL if there is none. 2つの矩形の共通部を計算します。 共通部がなければNULLを返します。

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

geometric_type ## geometric_typepoint

Computes the closest point to the first object on the second object. Available for these pairs of types: 最初のオブジェクトから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_typedouble precision

Computes the distance between the objects. Available for all seven geometric types, for all combinations of <type>point</type> with another geometric type, and for these additional pairs of types: (<type>box</type>, <type>lseg</type>), (<type>lseg</type>, <type>line</type>), (<type>polygon</type>, <type>circle</type>) (and the commutator cases). オブジェクト間の距離を計算します。 7つのすべての幾何型、pointと他のすべての幾何型との組み合わせ、そして次の型の組み合わせで利用できます。 (boxlseg)、(lsegline)、(polygoncircle)(そして可換の組み合わせ)。

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

geometric_type @> geometric_typeboolean

Does first object contain second? Available for these pairs of types: (<literal>box</literal>, <literal>point</literal>), (<literal>box</literal>, <literal>box</literal>), (<literal>path</literal>, <literal>point</literal>), (<literal>polygon</literal>, <literal>point</literal>), (<literal>polygon</literal>, <literal>polygon</literal>), (<literal>circle</literal>, <literal>point</literal>), (<literal>circle</literal>, <literal>circle</literal>). 最初のオブジェクトは2番目のオブジェクトを含んでいるか? 次の型の組み合わせで利用できます。 (boxpoint)、 (boxbox)、 (pathpoint)、 (polygonpoint)、 (polygonpolygon)、 (circlepoint)、 (circlecircle)。

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

geometric_type <@ geometric_typeboolean

Is first object contained in or on second? Available for these pairs of types: (<literal>point</literal>, <literal>box</literal>), (<literal>point</literal>, <literal>lseg</literal>), (<literal>point</literal>, <literal>line</literal>), (<literal>point</literal>, <literal>path</literal>), (<literal>point</literal>, <literal>polygon</literal>), (<literal>point</literal>, <literal>circle</literal>), (<literal>box</literal>, <literal>box</literal>), (<literal>lseg</literal>, <literal>box</literal>), (<literal>lseg</literal>, <literal>line</literal>), (<literal>polygon</literal>, <literal>polygon</literal>), (<literal>circle</literal>, <literal>circle</literal>). 最初のオブジェクトは2番目のオブジェクトに含まれているかあるいはその上にあるか? 次の型の組み合わせで利用できます。 (pointbox)、 (pointlseg)、 (pointline)、 (pointpath)、 (pointpolygon)、 (pointcircle)、 (boxbox)、 (lsegbox)、 (lsegline)、 (polygonpolygon)、 (circlecircle)。

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

geometric_type && geometric_typeboolean

Do these objects overlap? (One point in common makes this true.) Available for <type>box</type>, <type>polygon</type>, <type>circle</type>. これらのオブジェクトは重なり合っているか? (共通の点があれば真となります。) boxpolygoncircleで利用可能です。

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

geometric_type << geometric_typeboolean

Is first object strictly left of second? Available for <type>point</type>, <type>box</type>, <type>polygon</type>, <type>circle</type>. 最初のオブジェクトは完全に2番目のオブジェクトの左にあるか? pointboxpolygoncircleで利用可能です。

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

geometric_type >> geometric_typeboolean

Is first object strictly right of second? Available for <type>point</type>, <type>box</type>, <type>polygon</type>, <type>circle</type>. 最初のオブジェクトは完全に2番目のオブジェクトの右にあるか? pointboxpolygoncircleで利用可能です。

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

geometric_type &< geometric_typeboolean

Does first object not extend to the right of second? Available for <type>box</type>, <type>polygon</type>, <type>circle</type>. 最初のオブジェクトは2番目のオブジェクトの右にはみ出していないか? boxpolygoncircleで利用可能です。

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

geometric_type &> geometric_typeboolean

Does first object not extend to the left of second? Available for <type>box</type>, <type>polygon</type>, <type>circle</type>. 最初のオブジェクトは2番目のオブジェクトの左にはみ出していないか? boxpolygoncircleで利用可能です。

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

geometric_type <<| geometric_typeboolean

Is first object strictly below second? Available for <type>point</type>, <type>box</type>, <type>polygon</type>, <type>circle</type>. 最初のオブジェクトは完全に2番目のオブジェクトの下にあるか? pointboxpolygoncircleで利用可能です。

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

geometric_type |>> geometric_typeboolean

Is first object strictly above second? Available for <type>point</type>, <type>box</type>, <type>polygon</type>, <type>circle</type>. 最初のオブジェクトは完全に2番目のオブジェクトの上にあるか? pointboxpolygoncircleで利用可能です。

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

geometric_type &<| geometric_typeboolean

Does first object not extend above second? Available for <type>box</type>, <type>polygon</type>, <type>circle</type>. 最初のオブジェクトは2番目のオブジェクトの上にはみ出していないか? boxpolygoncircleで利用可能です。

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

geometric_type |&> geometric_typeboolean

Does first object not extend below second? Available for <type>box</type>, <type>polygon</type>, <type>circle</type>. 最初のオブジェクトは2番目のオブジェクトの下にはみ出していないか? boxpolygoncircleで利用可能です。

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

box <^ boxboolean

Is first object below second (allows edges to touch)? 最初のオブジェクトは2番目のオブジェクトの下か? (辺が接しているのを許容します)

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

box >^ boxboolean

Is first object above second (allows edges to touch)? 最初のオブジェクトは2番目のオブジェクトの上か? (辺が接しているのを許容します)

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

geometric_type ?# geometric_typeboolean

Do these objects intersect? Available for these pairs of types: (<type>box</type>, <type>box</type>), (<type>lseg</type>, <type>box</type>), (<type>lseg</type>, <type>lseg</type>), (<type>lseg</type>, <type>line</type>), (<type>line</type>, <type>box</type>), (<type>line</type>, <type>line</type>), (<type>path</type>, <type>path</type>). これらのオブジェクトは交差しているか? 次の型の組み合わせで利用できます。 (boxbox)、 (lsegbox)、 (lseglseg)、 (lsegline)、 (linebox)、 (lineline)、 (pathpath)。

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

?- lineboolean

?- lsegboolean

Is line horizontal? 線は水平か?

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

point ?- pointboolean

Are points horizontally aligned (that is, have same y coordinate)? 点は水平に並んでいるか? (つまりy座標が同じであるということです。)

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

?| lineboolean

?| lsegboolean

Is line vertical? 線は垂直か?

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

point ?| pointboolean

Are points vertically aligned (that is, have same x coordinate)? 点は垂直に並んでいるか? (つまりx座標が同じであるということです。)

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

line ?-| lineboolean

lseg ?-| lsegboolean

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

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

line ?|| lineboolean

lseg ?|| lsegboolean

Are lines parallel? 線は平行か?

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

geometric_type ~= geometric_typeboolean

Are these objects the same? Available for <type>point</type>, <type>box</type>, <type>polygon</type>, <type>circle</type>. オブジェクトは同じか? pointboxpolygoncircleで利用可能です。

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

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


注意

Note that the <quote>same as</quote> operator, <literal>~=</literal>, represents the usual notion of equality for the <type>point</type>, <type>box</type>, <type>polygon</type>, and <type>circle</type> types. Some of the geometric types also have an <literal>=</literal> operator, but <literal>=</literal> compares for equal <emphasis>areas</emphasis> only. The other scalar comparison operators (<literal>&lt;=</literal> and so on), where available for these types, likewise compare areas. 同じを示す~=演算子はpointboxpolygon、およびcircle型に対し通常の等価概念を示すことに注意してください。これらのいくつかの型は=演算子を持ちますが、=面積の等しさのみを比較します。これらの型で利用可能であれば、その他のスカラー比較演算子(<=など)は同様に面積を比較します。

注記

Before <productname>PostgreSQL</productname> 14, the point is strictly below/above comparison operators <type>point</type> <literal>&lt;&lt;|</literal> <type>point</type> and <type>point</type> <literal>|&gt;&gt;</literal> <type>point</type> were respectively called <literal>&lt;^</literal> and <literal>&gt;^</literal>. These names are still available, but are deprecated and will eventually be removed. PostgreSQLの14より前では、点の下/上の厳密比較演算子point <<| pointおよびpoint |>> pointは、それぞれ<^および>^という名前でした。 これらの名前はまだ利用できますが、削除予定であり最終的にはなくなるでしょう。

表9.37 幾何データ型関数

<title>Geometric Functions</title>

Function 関数

Description 説明

Example(s)

area ( geometric_type ) → double precision

Computes area. Available for <type>box</type>, <type>path</type>, <type>circle</type>. A <type>path</type> input must be closed, else NULL is returned. Also, if the <type>path</type> is self-intersecting, the result may be meaningless. 面積を計算します。 boxpathcircleで利用可能です。 入力pathは閉じていなければなりません。さもなければNULLが返ります。 またpathが自分自身と交わっていれば、結果は無意味なものになります。

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

center ( geometric_type ) → point

Computes center point. Available for <type>box</type>, <type>circle</type>. 中心点を計算します。 boxcircleで利用可能です。

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

diagonal ( box ) → lseg

Extracts box's diagonal as a line segment (same as <function>lseg(box)</function>). 矩形の対角線を線分として取り出します。 (lseg(box)と同じです。)

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

diameter ( circle ) → double precision

Computes diameter of circle. 円の直径を計算します。

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

height ( box ) → double precision

Computes vertical size of box. 矩形の高さを計算します。

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

isclosed ( path ) → boolean

Is path closed? 閉経路か?

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

isopen ( path ) → boolean

Is path open? 開経路か?

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

length ( geometric_type ) → double precision

Computes the total length. Available for <type>lseg</type>, <type>path</type>. 全長を計算します。 lsegpathで利用可能です。

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

npoints ( geometric_type ) → integer

Returns the number of points. Available for <type>path</type>, <type>polygon</type>. 点の数を返します pathpolygonで利用可能です。

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

pclose ( path ) → path

Converts path to closed form. 経路を閉じた状態に変換します。

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

popen ( path ) → path

Converts path to open form. 経路を開いた状態に変換します。

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

radius ( circle ) → double precision

Computes radius of circle. 円の半径を計算します。

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

slope ( point, point ) → double precision

Computes slope of a line drawn through the two points. 2つの点で描いた直線の傾きを計算します。

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

width ( box ) → double precision

Computes horizontal size of box. 矩形の幅を計算します。

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


表9.38 幾何型変換関数

<title>Geometric Type Conversion Functions</title>

Function 関数

Description 説明

Example(s)

box ( circle ) → box

Computes box inscribed within the circle. 円に内接する矩形を計算します。

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

box ( point ) → box

Converts point to empty box. 点を空の矩形に変換します。

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

box ( point, point ) → box

Converts any two corner points to box. 2つの対角する点を矩形に変換します。

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

box ( polygon ) → box

Computes bounding box of polygon. 多角形の外接矩形を計算します。

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

bound_box ( box, box ) → box

Computes bounding box of two boxes. 2つの矩形の外接矩形を計算します。

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

circle ( box ) → circle

Computes smallest circle enclosing box. 矩形を含む最小の円を計算します。

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

circle ( point, double precision ) → circle

Constructs circle from center and radius. 中心と半径から円を作成します。

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

circle ( polygon ) → circle

Converts polygon to circle. The circle's center is the mean of the positions of the polygon's points, and the radius is the average distance of the polygon's points from that center. 多角形を円に変換します。 円の中心は多角形の点の位置の平均で、半径は中心から多角形の点の平均距離です。

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

line ( point, point ) → line

Converts two points to the line through them. 2点を通過する直線に変換します。

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

lseg ( box ) → lseg

Extracts box's diagonal as a line segment. 矩形の対角線を線分として取り出します。

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

lseg ( point, point ) → lseg

Constructs line segment from two endpoints. 2つの点から線分を作ります。

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

path ( polygon ) → path

Converts polygon to a closed path with the same list of points. 同じ点のリストで多角形を閉経路に変換します。

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

point ( double precision, double precision ) → point

Constructs point from its coordinates. 座標から点を作ります。

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

point ( box ) → point

Computes center of box. 矩形の中心点を計算します。

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

point ( circle ) → point

Computes center of circle. 円の中心点を計算します。

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

point ( lseg ) → point

Computes center of line segment. 線分の中心を計算します。

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

point ( polygon ) → point

Computes center of polygon (the mean of the positions of the polygon's points). 多角形の中心を計算します。 (多角形の点の位置の平均です。)

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

polygon ( box ) → polygon

Converts box to a 4-point polygon. 矩形を4点の多角形に変換します。

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

polygon ( circle ) → polygon

Converts circle to a 12-point 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

Converts circle to an <replaceable>n</replaceable>-point polygon. 円をn点の多角形に変換します。

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

polygon ( path ) → polygon

Converts closed path to a polygon with the same list of points. 同じ点のリストで閉経路を多角形に変換します。

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


It is possible to access the two component numbers of a <type>point</type> as though the point were an array with indexes 0 and 1. For example, if <literal>t.p</literal> is a <type>point</type> column then <literal>SELECT p[0] FROM t</literal> retrieves the X coordinate and <literal>UPDATE t SET p[1] = ...</literal> changes the Y coordinate. In the same way, a value of type <type>box</type> or <type>lseg</type> can be treated as an array of two <type>point</type> values. あたかもpointは添字0、1を有する配列であるかのように、pointの2つの構成要素にアクセスすることができます。 例えば、t.ppoint列の場合、SELECT p[0] FROM tという式でX座標を抽出できます。また、UPDATE t SET p[1] = ...でY座標を変更できます。 同様に、box型またはlseg型の値も、2つのpoint型の値の配列のように扱えます。