自作の MySQL Spatial Functions Plugin の関数をひとつひとつ検証しています。今回は Googleの Encoded Polyline 形式に変換したり、逆にEncoded PolylineからLINESTRINGに変換したりするエンコード、デコード関数を。
STX_AsEncodedPolyline(geom [, prec])、STX_LineFromEnccodedPolyline(text [, srid [, prec]])
LINESTRINGをGoogle の Encoded Polyline 形式にエンコード/デコードする関数です。
Encoded Polylineについては、こちらを:
developers.google.com
動作紹介
以下の青い線を表すLINESTRINGを用意します
LINESTRING(35.870196 139.975133, 35.868136 139.977429, 35.861102 139.983394, 35.856148 139.979398)

- LINESTRINGを EncodedPolylineとして出力。意味不明の文字列が返ってくる。これがEncodedPolylineってやつ。
mysql> SELECT STX_AsEncodedPolyline(ST_GeomFromText(
-> 'LINESTRING(35.870196 139.975133,
'> 35.868136 139.977429,
'> 35.861102 139.983394,
'> 35.856148 139.979398)',6668)) en;
+--------------------------+
| en |
+--------------------------+
| w{|yEq{iuYzKkM~j@gd@|]|W |
+--------------------------+
1 row in set (0.000 sec)
- この不思議な文字列(EncodedPolyline)からLINESTRINGに変換。表示用にAsText化している。
mysql> SELECT ST_AsText(STX_LineFromEncodedPolyline('w{|yEq{~j@gd@|]|W',6668)) ls;
+---------------------------------------------------------------+
| ls |
+---------------------------------------------------------------+
| LINESTRING(35.8702 7.20841,35.87616 7.20346,35.87217 7.20346) |
+---------------------------------------------------------------+
1 row in set (0.000 sec)DBeaverで表示させてみると、ただしく元の線が再現されていることがわかる。ちなみにEncodedPolyline文字列には測地系の情報は含まれていない(Googleさんなのでもうデフォルトで4326だろうという発想(?))ので、6668で扱いたいなら第2引数にSRIDを指定する必要がある。

- PostGISマニュアルに載っていたコードでも、LineStringに変換できた
mysql> SELECT ST_AsText(STX_LineFromEncodedPolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@')) ls;
+------------------------------------------------------+
| ls |
+------------------------------------------------------+
| LINESTRING(38.5 -120.2,40.7 -120.95,43.252 -126.453) |
+------------------------------------------------------+
1 row in set (0.000 sec)
余談
この Googleの Encoded Polyline という記述法。今回PostGISマニュアルを眺めるまで全然知りませんでした。色々な表現方法があるんですね。
この記法で出し入れできて何が嬉しいのか正直分かっていないので(このコードで公開されているデータとかがあるのかな?逆にこのコードをGoogleに渡すことでイイコトがあったりするのかな)、ご存じの方はぜひ教えてください。
