[OSGeoJapan-discuss] PostGISでの図形の回転について

Takeshi FURUTA MQSOL LLC furuta @ mq-sol.jp
2012年 12月 13日 (木) 20:25:10 PST


今木さんにDMしてしまったので、再送

実は、PosgreSQLが8.3なので、今木さんの指摘の方法は使えませんでした。

しかしながら、PostGISの2.0のソースをみたところ下記の通りそのまま使えそう
なので、取り込みました。

-- Availability: 2.0.0
CREATE OR REPLACE FUNCTION ST_Rotate(geometry,float8,float8,float8)
        RETURNS geometry
        AS 'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1, $3 - cos($2) * $3 + sin($2) * $4, $4 - sin($2) * $3 - cos($2) * $4, 0)'
        LANGUAGE 'SQL' IMMUTABLE STRICT;

-- Availability: 2.0.0
CREATE OR REPLACE FUNCTION ST_Rotate(geometry,float8,geometry)
        RETURNS geometry
        AS 'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1, ST_X($3) - cos($2) * ST_X($3) + sin($2) * ST_Y($3), ST_Y($3) - sin($2) * ST_X($3) - cos($2) * ST_Y($3), 0)'
        LANGUAGE 'sql' IMMUTABLE STRICT;

実際のところ、今木さんの指摘通り内部的にはST_Affineを使っているんですね。

# この機に、行列関数や三角関数をやり直しが必要かな。しかし、だいぶ忘れてるなぁ


------
今木さん

ご回答いただきまして、ありがとうございました。

僕も最初は、原点で回転させて平行動しないと行けないのかなと思っていました。

しかし、解法がわからないので、皆さんに聞いた次第です。

早速、自分のPGに実装してみます。


On Thu, 13 Dec 2012 21:22:06 -0500
Hiroo Imaki <hiroo @ angeli.org> wrote:

> 古田さま、
> はじめまして、今木と申します。
> 以前、古田さんがやろうとしていたことに私も随分頭を悩ました覚えがあります。私も最初はST_Rotate()だと思ったのですが、結局ST_Affin()を使いました。
> http://postgis.refractions.net/documentation/manual-2.0/ST_Affine.html
> というのは、昔のRotateは、原点からの回転だけを扱ったので、任意の原点になった時に上手く働いてくれませんでした。そこで私の場合、回転させる軸となる点の位置をオフセットして回転させましたAffineは回転とオフセットを一回でやってくれます。しかしこれは面倒です。一応今でもできますが。
> 
> さすがに改善されたろうと思ってRotate()のところをもう一度読みなおしてみたら、以下のように原点を指定して回転させられるとのことで、これでいいのではないでしょうか?
> 
> --セントロイドを使って時計回りに60度回転
> SELECT ST_AsEWKT(ST_Rotate(geom, -pi()/3, ST_Centroid(geom)))
> FROM (SELECT 'LINESTRING (50 160, 50 50, 100 50)'::geometry AS geom) AS foo;
>                            st_asewkt
> --------------------------------------------------------------
>  LINESTRING(116.4225 130.6721,21.1597 75.6721,46.1597 32.3708)
> (1 row)
> 
> 古田さんの場合だと、
> SELECT ST_AsEWKT(ST_Rotate(geom, -pi()/3, (select 'POINT (2 2)'::geometry
> AS b)))
> FROM (SELECT 'LINESTRING (1 1,3 1,2 3,1 1)'::geometry AS geom) AS foo;
> でいいのではないでしょうか?
> 
> 参考までに。
> 
> 今木
> 
> 
> 
> 2012/12/13 Takeshi FURUTA MQSOL LLC <furuta @ mq-sol.jp>
> 
> > 古田です。
> >
> > PostGISについての質問です。
> >
> > 図形の回転について教えて欲しいのですが、図形の中心(もしくは任意の点)で
> > 回転させるのはどうしたいのでしょうか?
> >
> > RotateX,RotateY,RotateZを使えばいいのはわかるのですがどう組み合わせてい
> > いのかがわかりません。
> >
> > 例えば、LINESTRING(1 1,3 1,2 3,1 1)の三角形をPoint(2 2)を中心としてθ
> > (ラジアン)回転させるのはどうやるのでしょうか?
> >
> >
> > よろしくお願いします。
> >
> >
> > ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
> > 合同会社 マップクエストソリューションズ
> > ( http://mq-sol.jp/> > 代表 古田 武士 ( furuta @ mq-sol.jp )
> > 住所:〒103-0028 東京都中央区八重洲1−9−13
> > 八重洲駅前合同ビル6階
> > 電話: 03-5843-5923 携帯:090-8985-1587
> >
> > 埼玉: 〒331-0013 埼玉県戸田市喜沢1−33−8
> > ベルテラス板橋202
> > 電話・FAX:048−229−0554
> > ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
> >
> >
> > _______________________________________________
> > OSGeoJapan-discuss mailing list
> > OSGeoJapan-discuss @ lists.osgeo.org
> > http://lists.osgeo.org/mailman/listinfo/osgeojapan-discuss
> >
> 
> 
> 
> -- 
> Hiroo Imaki
> hiroo @ angeli.org
> http://www.geopacific.org

ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
合同会社 マップクエストソリューションズ
 ( http://mq-sol.jp/ )
代表 古田 武士 ( furuta @ mq-sol.jp )
住所:〒103-0028 東京都中央区八重洲1−9−13
          八重洲駅前合同ビル6階
電話: 03-5843-5923 携帯:090-8985-1587

埼玉: 〒331-0013 埼玉県戸田市喜沢1−33−8
          ベルテラス板橋202
電話・FAX:048−229−0554
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ




More information about the OSGeoJapan-discuss mailing list