MySQL8.0.11使ってみたSRIDが実装されたと聞いて自己紹介
発表者：おざき（@ozo360）
生息地：味噌国
「たけやぶ だいすき」というハンドルでQiitaにQGIS3.0系の記事を書いてましたのでパンダアイコンの人と呼ばれたりしました。
普段はQGISのプラグインやQGISを組み込んだシステム開発なんかをしています。

MySQL8系を触るきっかけ
普段はPostgresを使っているのですが15年くらい前はMySQLが好きだった
Web系のお仕事からGIS系のお仕事に変わってすっかりPostgresしか使わなくなった
最近はWP使う時にセットアップしたことがあるくらいジオメトリ扱えるのは知ってるけどなんちゃって実装でしょ？と思ってたんです。

そこで見つけたこんな記事
坂井さんのブログ
http://sakaik.hateblo.jp/entry/20180420/mysql_8.
0.11_ga_released

sakaikの日々雑感～(T)編
MySQL 8.0.11 (GA)がリリースされました

MySQL 8.0 のオススメ、注目の機能は？
使う人それぞれが何を大切にしているかによって変わるけど、個人的には GIS 機能に注目している。MyISAMじゃなくて InnoDBで使えるようになったんだ。 仕様もこれまでの勝手実装ではなく OpenGISに準拠する形でしっかりと実装されている

まじですか？

笹食ってる場合じゃねぇ！！

まずはインストール
公式サイトからインストーラーをダウンロードしてインストールを行いました。
日本語化はされてませんけど非常に簡単にセットアップが進行します。

ここだけは注意ですAuthenticationMethodはLegacyを選択しておきましょう。
ここでレコメンドって言葉に惑わされてデフォルトを選ぶと物凄く後悔します。
やばいです。
セキュリティは大事ですがデータベースは接続できてなんぼです。

MySQL Workbenchを使って接続
MySQL WorkbenchというGUI管理ツールがインストールされますので、起動して接続してみます。
PgAdmin3なんかを使ったことがある方ならなんとなく使える感じです。

スキーマとテーブルを作成Postgresの感覚だと[データベース]-[スキーマ]-[テーブル]という構造ですけどMySQLでは[スキーマ]-[テーブル]って感じですね。
テーブル作成ウィザードではフィールド型にPOINTやLINEが選択できて標準で地物が扱えることがわかります。
空間インデックス（R-tree）もGUIから貼ることができました。

できた
とりあえずポイントを扱う地物テーブルができました。
データを入れていきましょう。

Shapeを取り込むウィザード
スキーマのコンテキストメニューにLoadSpatialDataというのを見つけました。
シェープファイルを取り込めるようですね！
shp2pgsqlとかコマンド不要って便利！

動くとは言ってない動きませんでした。
調べてみたところ、海外コミュニティサイトで環境変数にogrinfoとogr2ogrのPATHを通すといいよって書いてありましたので試しましたが駄目でした。
コマンドプロンプトからogr2ogrが動くようにはなりましたけど。

じゃあQGISで入れていこう
今回はQGIS2.18.20を使ってみます。
ベクタレイヤの追加でMySQLの接続を作ります。
データベースタイプをMySQLにする他はPostGISと変わりません。
まあテストなんでrootで接続しておきます。

追加できました
CRSにWGS84を指定してOKするとレイヤパネルに追加されました。

これはQGISの仕様ですがレイヤソースは仕方ありませんが、レイヤ名にもパスワードをばっちり含んだDSNが入ってしまうので変えておきましょう。

地物の追加をしてみましょう
QGISでレイヤを編集モードに切り替えてポイントを追加します。
が、レイヤの保存時にエラーが出て失敗しました。

エラーの原因を探りましょう
MySQL error message:FUNCTION geotest.GeometryFromText does not exist
Description: INSERT INTO `test_pt` (`the_geom` , `gid` , `point_name`) VALUES(GeometryFromText('POINT (136.88184188928 35.1703251460096)',-2) , 3,'nagoya_station')
GeometryFromTextって関数が無いって言われていますね。
MySQL8系ではST_GeometryFromTextに変わったようです。
更にWGS84のレイヤなのにSRIDが-2になってしまっています。
QGIS3.0.1でも試しましたが同じSQLが生成されてしまいます。
どうやら現行のQGISはMySQL8系に対応していないようですね。

じゃあSQLで入れましょう
先ほどのSQLを修正してWorkbenchで流し込みましょう。
INSERT INTO `test_pt` (`the_geom` , `gid` , `point_name`) VALUES(ST_GeometryFromText('POINT (136.88184188928 35.1703251460096)',4326) ,3, 'nagoya_station');
実行するとまたエラーがでました。
Error Code: 3617. Latitude 136.881842 is out of range in function
st_geometryfromtext. It must be within [-90.000000, 90.000000].
ん？-90～90の値じゃない？

0.031 sec

これは随分悩みました
Qittaで原因らしきものを特定している記事を見つけました。
https://qiita.com/yellow_73/items/e15c5414c33874a4f94e

MySQLのaxis orderがバグってる？！
※追記：バグってはいないです。 P24の追記２を参照

axis orderなんて初めて聞く言葉でしたけどEPSGコードで定義されたXYが縦横なのか横縦なのかが云々。ともかく互換がありません。
日本語情報が本当に少ないのでありがたい。
yellow_73さんマジリスペクトじゃあogr2ogrコマンドで入れよう
まずはogrで対応フォーマットを確認する
C:\> ogrinfo --formats
Supported Formats:-> "ESRI Shapefile" (read/write)-> "MapInfo File" (read/write)-> "TIGER" (read/write)-> "Memory" (read/write)-> "CSV" (read/write)-> "SQLite" (read/write)-> "MySQL" (read/write)

うん、MySQL対応してる。

こんどこそ！！
ogr2ogrで適当なShapeを取り込んでみよう> ogr2ogr -f "MySQL" MYSQL:geotest,user=root,password=ozaki123123 C:\PackDLMap\shape\suiiki.shp
ERROR 1: MySQL error message:FUNCTION geotest.GeometryFromText does not exist Description: INSERTINTO `suiiki` (`SHAPE` , `id`, `fid`, `orggilvl`) VALUES (GeometryFromText('POLYGON((-37250.411218024557456 -100851.588679956985288,-37254.429199301739573-100845.649555620417232,-37259.449442731267482...省略

またお前かー！
ちなみにこちらもSRIDが正しく設定されません。
ogr2ogrもMySQL8系非対応でした。
試してませんがおそらくWGS84だとaxis orderも。。。

追記１：関数名の問題はGDALが原因
FOSS4G Hokkaidoで補足を頂きました。
QGISもOGRもGDALを使っていて、GDALがMySQL8系の関数名に対応していないのがそもそもの原因だそうです。
現状はMySQL5系が主流でしょうからGDAL側が変わってしまうとそれはそれで色々と問題あると思われる。

追記２：MySQLのaxis orderはバグってない
yellow_73さんからQiitaで言及記事を頂きました。

MySQLのaxis orderは「バグってる」わけではない
https://qiita.com/yellow_73/items/eea0c7fd21e40140b491
言葉選びが雑すぎ＆元記事をちゃんと読解できていなくて申し訳ありません。
そしてすごく対応速度が速くて惚れます。

というわけでまじ困った
なんもできねぇ気を取り直してMySQL8.0とPostGIS2.3とSpatialLite4.3を比較します。

空間関数
MySQL
https://dev.mysql.com/doc/refman/8.0/en/spatial-function-reference.html
PostGIShttps://postgis.net/docs/reference.html
SpatiaLite
http://www.gaia-gis.it/gaia-sins/spatialite-sql-4.3.0.html

MySQL8はPostGIS2.3やSpatialLite4.3と比較すると非常に限定的な関数しか実装されていません。5.6の空間関数名に互換を持たせなかったのも結構痛いですね。
PostGISは断トツ豊富ですがSpatiaLiteもとても充実していますね。
個人的に衝撃的だったST_VoronoiPolygonsもST_VoronojDiagramって感じで実装されているようです。（でもなんでVorono「j」なの？）

ベンチマークMySQLが不得意とされるサブクエリで複雑な空間演算をしてパフォーマンスをチェックしてみましょう。
とか考えていましたがそこに至れませんでした。残念。

まとめ
いろいろ困難があり、なんとか頑張りましたが成果がほとんどありませんでした。すみません。
日本語の情報がすごく少ないのでトラブルときっついです。
そしてめっちゃトラブります。
QGISもOGRもMySQL8系には対応していないので正直使いどころが見つけられませんでした。
空間関数も実装が少ないだけでなく、リファレンスを見ていると独自仕様っぽい感じがぬぐえません。

でも期待はしています！
中規模でSpatialデータを扱う場合は現状PostGIS以外選択肢がないと思ってます。
SpatiaLiteはマルチユーザーでの利用に向きませんし、Oracleは高価で手が出ません。
選択肢がないのは不健全なのでMySQLには頑張ってほしい。
超期待しています。
でも私レベルではまだちょっと触るの早すぎました。

ご清聴ありがとうございました。