MySQL Spatial Functions Plugin の関数紹介(動作テストがてら)。今回はちょっと楽しい STX_Rotate()。
STX_Reverse()
指定した点を中心にジオメトリデータを回転します。
動作紹介
- (35 135) を中心としてPOLYGONを30度回転します
mysql> SET @g1=ST_GeomFromText('POLYGON((35 135, 35.5 135, 35.3 135.5, 35 135.5, 35 135))',6668);
mysql> SET @gc=ST_GeomFromText('POINT(35 135)',6668);
mysql> SELECT ST_AsText(CAST(@g1 AS POLYGON)) g2,
-> ST_AsText(CAST(STX_Rotate(@g1, 30/360*2*PI(), @gc) AS POLYGON)) g3;
+-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| g2 | g3 |
+-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| POLYGON((35 135,35 135.5,35.3 135.5,35.5 135,35 135)) | POLYGON((35 135,35.24990930454934 135.43306505227235,35.50974833591276 135.28311946954275,35.43306505227237 134.75009069545067,35 135)) |
+-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
- 回転中心をちょっとずらして図形の真ん中付近にしてみたもの。45度の界点がわかります
mysql> SET @g1=ST_GeomFromText('POLYGON((35 135, 35.5 135, 35.3 135.5, 35 135.5, 35 135))',6668);
mysql> SET @gc=ST_GeomFromText('POINT(35.25 135.25)',6668);
mysql> SELECT ST_AsText(CAST(@g1 AS POLYGON)) g2,
-> ST_AsText(CAST(STX_Rotate(@g1, 45/360*2*PI(), @gc) AS POLYGON)) g3;
+-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| g2 | g3 |
+-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| POLYGON((35 135,35 135.5,35.3 135.5,35.5 135,35 135)) | POLYGON((34.89644660940672 135.25,35.25 135.60355339059328,35.46213203435596 135.39142135623732,35.25 134.89644660940672,34.89644660940672 135.25)) |
+-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
なんだか回転すると直角が保存されていないのが気持ち悪いですが、たぶん地理座標で(緯度経度で)回転移動をするとこういう結果になるんだと思います(詳細未検証)。
- 試しに平面直角座標系で実施(数値結果省略。DBeaverで描画させるためのSQL)
SET @g1=ST_GeomFromText('POLYGON((100 100, 100 300, 450 300, 550 100, 100 100))',6677);
SET @gc=ST_GeomFromText('POINT(240 200)',6677);
SELECT CAST(@g1 AS POLYGON),
CAST(STX_Rotate(@g1, 30/360*2*PI(), @gc) AS POLYGON);平面直角座標系であれば角度が保持されていることがわかります。一安心。

- 第3引数を省略すると原点まわりでの回転になります。
SET @g1=ST_GeomFromText('POLYGON((10 10, 10 30, 45 30, 55 10, 10 10))',4326);
SELECT CAST(@g1 AS POLYGON),
CAST(STX_Rotate(@g1, 60/360*2*PI()) AS POLYGON);形を保持して回転しているようには見えないけどたぶんあってます。。

