無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

9.11. 幾何関数と演算子

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

注意

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

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

演算子 説明
+ 平行移動 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-31. 幾何データ型関数

関数 戻り値 説明
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-32. 幾何型変換関数

関数 戻り値 説明
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 ) path 多角形を経路に変換 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は添字0、1を有する配列であるかのように、 point の2つの構成要素にアクセスすることができます。 例えば、 t.p point 列の場合、 SELECT p[0] FROM t という式でX座標点を抽出できます。また、 UPDATE t SET p[1] = ... でY座標点を変更できます。同様に、 box または lseg でも、2つの point からなる配列のように扱えます。

area 関数は、 box circle path 型に対して動作します。 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 を並べてグラフ用紙に書いてみてください。


powered by SEO.CUG.NET