MySQLにGIS(Spatial)関数を増やそうプロジェクト(勝手にやっている)。とりあえず実装した(AIに実装させた)57関数について、ひとつひとつ確認をしながらブログで紹介しています。
今回は STX_Perimeter()。
MySQL本体への機能追加を行い、コントリビュートしていたのですが、現時点で2ヶ月以上経過してもまったく音沙汰なしという、がっかりするやらがっかりするやら控えめに言ってもがっかりするやら、複雑な思いのある関数です。(体制変更のタイミングと重なってしまって、それどころじゃないとか、担当者がいなくなっちゃったとか色々あるのは承知しています。ヒトコトで言えば「タイミングが悪かった」)
STX_Perimeter()
ポリゴンの周長を返す関数です。ポリゴン以外に対しては動作しません(エラーを返す)。
動作紹介
- デカルトで一辺10の正方形の周長は 40
mysql> SELECT STX_Perimeter(ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))')) pm;
+------+
| pm |
+------+
| 40 |
+------+
1 row in set (0.022 sec)
- 真ん中をくり抜くとそのぶんも周長として加算される。これは先ほどの40に、くりぬき部分一辺6(4辺で24)を加えた値が返ってくる
mysql> SELECT STX_Perimeter(ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0), (2 2, 8 2, 8 8, 2 8, 2 2))')) pm;
+------+
| pm |
+------+
| 64 |
+------+
1 row in set (0.000 sec)
- MULTIPOLYGON でも周長の合計が返ってくる
mysql> SELECT STX_Perimeter(ST_GeomFromText('MULTIPOLYGON(((0 0, 5 0, 5 5, 0 5, 0 0)), ((10 10, 15 10, 15 15, 10 15, 10 10)))')) pm;
+------+
| pm |
+------+
| 40 |
+------+
1 row in set (0.000 sec)
- 測地系を指定した例。赤道付近で1度は約111kmというのを知っていると、なんかそれっぽい値が得られているかな、とアタリをつけられる(戻り値の単位はメートル)
mysql> SELECT STX_Perimeter(ST_GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))', 4326)) pm;
+--------------------+
| pm |
+--------------------+
| 443768.41657864227 |
+--------------------+
1 row in set (0.000 sec)
- 緯度が上がると、緯度1度の幅は狭くなるので、この結果もそれっぽいと判断できる(測地系を6668にしていますが、ほぼ4326と同じなのでざっくり比較)
mysql> SELECT STX_Perimeter(ST_GeomFromText('POLYGON((35 135, 35 136, 36 136, 36 135, 35 135))', 6668)) pm;
+--------------------+
| pm |
+--------------------+
| 403352.30562388065 |
+--------------------+
1 row in set (0.000 sec)
- POINT値を与えたらエラー(予定通り)
mysql> SELECT STX_Perimeter(ST_GeomFromText('POINT(1 1)'));
ERROR 3516 (22S01): POLYGON/MULTIPOLYGON value is a geometry of unexpected type POINT in stx_perimeter.
- LINESTRING値を与えたらエラー(予定通り)
mysql> SELECT STX_Perimeter(ST_GeomFromText('LINESTRING(1 1,2 2)'));
ERROR 3516 (22S01): POLYGON/MULTIPOLYGON value is a geometry of unexpected type LINESTRING in stx_perimeter.
- NULLはNULL。ヌル2
mysql> SELECT STX_Perimeter(null) pm; +------+ | pm | +------+ | NULL | +------+ 1 row in set (0.000 sec)
追加情報
今回の動作確認の過程で、POLYGON系以外の時のエラーが正常に発出されない事象を確認したのと、戻り数値の有効桁が無駄に長く表示される事象を確認したので、修正作業を行いながら本エントリーを書きました。 ver. 0.1.1 以降で直っているので、動作がこれと違う場合は最新のプラグインにしてください。
AIさん、「本体の修正しているんじゃないんで。プラグインではエラーを表示できないんですよ」としれっといってくるので、あの手この手で疑いの目を向け、調査してもらい、エラーが出るように修正されました。部下(AI)を信じるのも大切ですが、あえて部下を信じないのも大事ですね。
こんな感じで関数一つ一つ修正しながらより良いものにしていきたいと思います。
