9.10. 幾何関数と演算子

pointboxlseglinepathpolygon、およびcircle幾何データ型には、PostgreSQLが元々サポートしている関数と演算子が豊富に揃っています(表9-28表9-29、および表9-30を参照してください)。

注意

"同じを示す"~=演算子はpointboxpolygon、およびcircle型に対し通常の等価概念を示すことに注意してください。これらのいくつかの型はまた=演算子を持ちますが、=は等しいareasのみを比較します。その他のスカラー比較演算子(<=など)はこれらの型の領域をそのうえ比較します。

表 9-28. 幾何データ演算子

演算子説明
+ 平行移動box '((0,0),(1,1))' + point '(2.0,0)'
- 平行移動box '((0,0),(1,1))' - point '(2.0,0)'
* 拡大縮小/回転box '((0,0),(1,1))' * point '(2.0,0)'
/ 拡大縮小/回転box '((0,0),(2,2))' / point '(2.0,0)'
# 交差点、交差矩形'((1,-1),(-1,1))' # '((1,1),(-1,-1))'
# 経路もしくは多角形の点の数# '((1,0),(0,1),(-1,0))'
@-@ 長さもしくは円周@-@ path '((0,0),(1,0))'
@@ 中心@@ circle '((0,0),10)'
## 第1演算項目と第2演算項目との近接点point '(0,0)' ## lseg '((2,0),(0,2))'
<-> 距離circle '((0,0),1)' <-> circle '((5,0),1)'
&& 重なっているかどうか?box '((0,0),(1,1))' && box '((0,0),(2,2))'
<< 正確に左側にあるか?circle '((0,0),1)' << circle '((5,0),1)'
>> 正確に右側にあるか?circle '((5,0),1)' >> circle '((0,0),1)'
&< 右側にはみ出さないか?box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&> 左側にはみ出さないか?box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<<| 正確に下側にあるか?box '((0,0),(3,3))' <<| box '((3,4),(5,5))'
|>> 正確に上側にあるか?box '((3,4),(5,5))' |>> box '((0,0),(3,3))'
&<| 上側に出ていないか?box '((0,0),(1,1))' &<| box '((0,0),(2,2))'
|&> 下側に出ていないか?box '((0,0),(3,3))' |&> box '((0,0),(2,2))'
<^ 下にあるか(接触は許可)?circle '((0,0),1)' <^ circle '((0,5),1)'
>^ 上にあるか(接触は許可)?circle '((0,5),1)' >^ circle '((0,0),1)'
?# 交わるか?lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'
?- 水平か??- lseg '((-1,0),(1,0))'
?- 水平方向に揃っているか?point '(1,0)' ?- point '(0,0)'
?| 垂直か??| lseg '((-1,0),(1,0))'
?| 垂直方向に揃っているか?point '(0,1)' ?| point '(0,0)'
?-| 直角をなすか?lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
?|| 平行か?lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
@> 含むか?circle '((0,0),2)' @> point '(1,1)'
<@ 含むか、境界上か?point '(1,1)' <@ circle '((0,0),2)'
~= 同一か?polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'

注意: PostgreSQL 8.2より前では、含有演算子@>および<@はそれぞれ~および@という名前でした。 これらの名前はまだ利用できますが、廃止予定で予告なしでなくなるかもしれません。

表 9-29. 幾何データ関数

関数戻り値説明
area(object)double precision面積area(box '((0,0),(1,1))')
center(object)point中心center(box '((0,0),(1,2))')
diameter(circle)double precision円の直径diameter(circle '((0,0),2.0)')
height(box)double precision矩形の高さheight(box '((0,0),(1,1))')
isclosed(path)boolean閉経路か?isclosed(path '((0,0),(1,1),(2,0))')
isopen(path)boolean開経路?isopen(path '[(0,0),(1,1),(2,0)]')
length(object)double precision長さlength(path '((-1,0),(1,0))')
npoints(path)int点の数npoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon)int点の数npoints(polygon '((1,1),(0,0))')
pclose(path)path閉経路に変換pclose(path '[(0,0),(1,1),(2,0)]')
popen(path)path開経路に変換popen(path '((0,0),(1,1),(2,0))')
radius(circle)double precision円の半径radius(circle '((0,0),2.0)')
width(box)double precision矩形の幅width(box '((0,0),(1,1))')

表 9-30. 幾何型変換関数

関数戻り値説明
box(circle)box円から矩形box(circle '((0,0),2.0)')
box(point, point)box座標点を矩形に変換box(point '(0,0)', point '(1,1)')
box(polygon)box多角形を矩形に変換box(polygon '((0,0),(1,1),(2,0))')
circle(box)circle矩形を円に変換circle(box '((0,0),(1,1))')
circle(point, double precision)circle中心と半径から円に変換circle(point '(0,0)', 2.0)
circle(polygon)circle多角形を円に変換circle(polygon '((0,0),(1,1),(2,0))')
lseg(box)lseg矩形の対角線を線分に変換lseg(box '((-1,0),(1,0))')
lseg(point, point)lseg座標点を線分に変換lseg(point '(-1,0)', point '(1,0)')
path(polygon)point多角形を経路に変換<path(polygon '((0,0),(1,1),(2,0))')
point(double precision, double precision)point座標点の構築point(23.4, -44.5)
point(box)point矩形の中心point(box '((-1,0),(1,0))')
point(circle)point円の中心point(circle '((0,0),2.0)')
point(lseg)point線分の中心point(lseg '((-1,0),(1,0))')
point(polygon)point矩形の中心point(polygon '((0,0),(1,1),(2,0))')
polygon(box)polygon矩形から4頂点の多角形polygon(box '((0,0),(1,1))')
polygon(circle)polygon円から12角形polygon(circle '((0,0),2.0)')
polygon(npts, circle)polygon円からnpts角形polygon(12, circle '((0,0),2.0)')
polygon(path)polygon経路から多角形polygon(path '((0,0),(1,1),(2,0))')

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

area関数は、boxcirclepath型に対して動作します。pathデータ型に対するarea関数は、そのpathが交差しない場合にのみ動作します。例えば、'((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATHというpathは動作しません。しかし、見た目は同じですが、'((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATHというpathでは動作します。pathの交差する、しないという概念がよくわからなければ、上の2つのpathを並べてグラフ用紙に書いてみてください。