Slide 1

Slide 1 text

MySQLの Spatial(GIS)機能を もっと充実させたい 2025/12/19 日本MySQLユーザ会 坂井 恵 ( @sakaik) 日本MySQLユーザ会 望年LT大会2025

Slide 2

Slide 2 text

自己紹介 (略)

Slide 3

Slide 3 text

閑古鳥アドベント毎年やってます • RDBMS-GIS • 毎年閑古鳥 • たぶん今年で最後にします

Slide 4

Slide 4 text

MySQLのSpatial機能 • わかりやすくいうと「GIS機能」 • 「地理情報」とか「空間情報」という言い方をするときも • MySQL 8.0 で「丸い地球」に対応した本格機能に • 類似機能は他のDBMSにもだいたいある • OSSとしての先行は PostgreSQLのExtension である PostGIS

Slide 5

Slide 5 text

MySQL vs PostGIS • PostGISのほうが歴史が長い • 積み上げられた実績もけた違いに多い • 事実上のデファクト(重言)、事実上唯一の選択肢 • PostGISのほうが機能が充実 • 関数の数を見ても全然桁が違う • 特に空間分析系の関数が充実

Slide 6

Slide 6 text

MySQLのSpatial機能のいいところ • 拡張機能ではなく本体の標準機能 • 追加インストールが不要 • バージョンアップ時にも本体のみのupdateでOK • 拡張機能ではなく本体の標準機能 • 拡張機能ではなく本体の標準機能

Slide 7

Slide 7 text

MySQLのSpatial機能のいいところ • 地理座標と投影座標をシームレスに扱えるのは、いいところな んじゃないかな、、と思っています • (SRS_IDにより判別可能) • (もう少し正確に言うと、SRS_IDにより ST_SPATIAL_REFERENCE _SYSTEMSテーブル上にある定義を見て判別)

Slide 8

Slide 8 text

MySQLのSpatial機能の足りない所 • とにかく関数が少ない! • POINT, LINESTRING, POLYGONの管理や判別、距離等の、通 常使うと思われる関数群は充分にある • 分析関数を中心に、まだまだ不足している。(集約系も弱い気 がする、、ちょっと詳細追い切れていませんが) • 出力系は致命的に足りない。ST_AsXXXX()系

Slide 9

Slide 9 text

MySQLのspatial機能の実装 • MySQL 5.7 で、Boost::Geometryライブラリを使用してSpatial機 能をとりあえず再実装 • MySQL 8.0で「丸い地球(回転楕円体)上の位置」を表せるよう に拡張。関数名もSQL標準に沿った ST_*()という名前に統一 → 現在のMySQLのspatial機能の処理は Boost::Geometryライブラリに任せている

Slide 10

Slide 10 text

大事なこと spatial機能の処理は Boost::Geometryライブラリに任せている MySQLの関数がまだまだ足りない spatial機能の処理は Boost::Geometryライブラリに任せている MySQLの関数がまだまだ足りない spatial機能の処理は Boost::Geometryライブラリに任せている

Slide 11

Slide 11 text

いいこと思いついた! Boostライブラリを 呼んでるだけなら、 簡単に 関数追加 できるんじゃね?

Slide 12

Slide 12 text

できました • ST_Perimeter() 関数。 Polygonの周長を返す

Slide 13

Slide 13 text

実行例

Slide 14

Slide 14 text

実行例(測地系付)

Slide 15

Slide 15 text

spatial関数追加のポイント • 引数と戻り値 • 何を受け取り、何を返すのか • SRS対応か非対応か • 測地系に依らず計算できるものもある • LINESTRINGの結合や中心座標算出など • 長さに関するものは基本的にSRSを考慮した計算が必要 → 似たような特徴を持つ既存関数を探す

Slide 16

Slide 16 text

コントリビュートしてみた Bug #119566 • https://bugs.mysql.com/bug.php?id=119566 • よかったら Affects me を!

Slide 17

Slide 17 text

Thanks • コントリビュート出してみるにあたって • 2年前のけんつさんのブログ • 現代のyoku0825さんの助言 に助けられました。 ありがとうございました。 https://rabbitfoot141.hatenablog.com/entry/2023/12/06/170449

Slide 18

Slide 18 text

タイミングが悪かった • 年末なので(?)OCAの申請の最終承認の連絡がまだ来ない • 年末なので(?)ステータスが "Open" のまま • 迅速に取り込んでもらえたとしても 1月のリリースには入らない • 4月のリリースは 新LTS(9.7LTS!!!)なので、おそらく Innovation Releaseはされない • 最短で7月かぁ。。。。 そもそも昨今の対応の遅さ(悪さ)から、完全に無視されたま ま終わってしまう可能性も、心配し始めました...

Slide 19

Slide 19 text

今後 • この方法で受け入れてもらえることが分かれば、他の関数も実 装してみたい • 出力系(ST_As*() )は Boostの力を借りてないので結構難しそ う