他のバージョンの文書 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.10. 幾何関数と演算子

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

表 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)'
## 第一演算項目と第二演算項目との近接点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))'
&< 右側にはみださないか?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 '((5,0),1)'
>> 右側にあるか?circle '((5,0),1)' >> circle '((0,0),1)'
<^ 下にあるか?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))'

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

関数戻り値説明
area(object)double precision面積area(box '((0,0),(1,1))')
box_intersect(box, box)box矩形の交差box_intersect(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))')
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)integer点の数npoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon)integer点の数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)
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(lseg, lseg)point交差point(lseg '((-1,0),(1,0))', lseg '((-2,-2),(2,2))')
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を並べてグラフ用紙に書いてみてください。