MySQLのGIS機能について学ぼう

データベースで地理情報を扱う
大量のデータを扱う際に、リレーショナルデータベース管理システム(RDBMS)はよく使われます。当初は文字列や数値、日付時刻といった基本的な型の情報を中心に扱っていたRDBMSも、最近ではより応用的な様々なデータを扱えるようにと進化しています。その1つが「空間データ型」です。英語では「Spatial data type」と呼びます。Specialに綴りが似ているので、初めて目にする人には「スペシャルなデータですか?」と言われることもあります。Spatialは、Space(空間)に関連する単語で「スペイシャル」と発音します。
MySQLでは、2018年にリリースされたMySQL 8.0から、実際の地球の球面を考慮した実用的な空間データ(スペイシャルなデータ)を取り扱う機能が実装されました。
MySQLでの地理情報データ機能の歴史
MySQLに実用的な空間データ型が提供されたのは比較的最近になってからですが、それ以前にも空間データ型自体は実装されていました。ただし、それらの機能は平面座標(デカルト座標)にのみ対応したものでした。地球上の曲面を考慮していないため、特に距離が長くなると誤差が大きくなるなど、地球上の位置を取り扱うには、制限の大きさを感じざるを得ないものでした。
MySQLの空間情報機能の歴史をまとめます。
バージョン | リリース年 | 内容 |
---|---|---|
MySQL 4.1 | 2004年 | MyISAM上で空間情報を扱う機能を提供(空間データ型+各種関数群) |
MySQL 5.0 | 2005年 | InnoDBにも 4.1でのMyISAMと同様の機能を提供(一部機能を除く) |
MySQL 5.7 | 2015年 | これまで独自実装だった空間情報に関するコードをすべて廃止し、OSSとして公開されているBoost.Geometryライブラリを採用 |
MySQL 8.0 | 2018年 | Boost.Geometryライブラリを使用した機能で「丸い地球」に対応 |
MySQL 8.0で「測地系」と呼ばれる地球のモデルを実装に持ったことで、ようやく平面の空間情報のみを扱う機能だけでなく、地球上の「位置情報」を扱えるようにとなりました。このことはMySQLコミュニティ内でもしばしば「MySQLはついに、地球が丸いことを知った」という感動的な言葉で語られます。2018年はMySQLの位置情報を扱う機能の元年と言っても良いでしょう。
測地系とは丸い地球を含めたさまざまな地球上の位置を表すためのモデルですが、これについては語ることも多いので、今後の連載で改めて紹介します。
MySQLの空間情報にないもの
地球の丸さを覚えたMySQLですが、2025年9月時点でデータ型として不足しているものがあります。それが「高さ」に関するデータの取り扱いです。地球上の正確な位置は「緯度」「経度」「標高」の3つの情報により表しますが、MySQLではこのうち緯度と経度2つの数字による座標のみを取り扱うことができます([注]:正確には緯度、経度などの角度で表すものの他に平面直角座標系やUTM座標系などの"メートル"で表す座標もありますが、いずれにせよ2つの数値により平面位置を特定します)。
「デジタルツイン」をはじめとする、空間情報を管理する布石としても高さの情報を取り扱えることには価値があるため、MySQLでの今後の実装に期待したいところです。実は高さの情報は地球上の場所によっても条件が異なるなど、意外と複雑な側面を持っています。そういったことも理解した上で、高さについては別カラムの数値として扱うというのが現時点での落とし所と言えるかもしれません。
また、標高というものは誰もが知っているようでほとんどの人がきちんと知らないものの1つで、実は結構複雑なのです。GPSで測定した値をそのまま使えば良いというものでもありません。こちらも、今後の連載で紹介する予定です。
MySQLのGIS機能を使うには
MySQLの地理情報機能(GIS機能)を使うには、特別な準備は必要ありません。バージョン 8.0以降のMySQLをインストールするだけです(2025年9月時点ではバージョン 8.4シリーズを推奨。最新機能をいち早く試したい場合はバージョン 9.xシリーズも注目ください)。いずれのバージョンでも、GIS機能はMySQL本体に含まれています。
地理情報のデータを扱うには、テーブルを作る際に、
CREATE TABLE t1 ( id INTEGER, name VARCHAR(10) );と記述するのと同様の感覚で、例えば、地理情報の型の1つであるGEOMETRYを指定するだけです。
CREATE TABLE t2 ( id INTEGER, name VARCHAR(10), pos GEOMETRY SRID 4326 );
MySQLで使える地理情報の型については、今度の連載で紹介していきたいと思います。
現在、さまざまなRDBMS製品が地理情報データを扱うための機能を持っています。MySQLとともにオープンソースのRDBMSとしてよく知られる「PostgreSQL」にも地理情報データを扱うための機能があります。PostgreSQLに拡張機能として追加できる「PostGIS」です。MySQL 8.0に先立つこと17年、2001年に最初のバージョンが公開されたという老舗の拡張機能と言えます。オープンソースのRDBMSで空間情報を扱いたい場合には事実上、このPostGIS一択だったため、長い間、多くの人に利用されてきました。
PostGISにはMySQLのGIS機能とは比べものにならないくらいの実績があり、ノウハウが蓄積されています。特にMySQL民から見て羨ましいのは、地理情報の分析を行うための機能が充実していることです。例えば、コンビニやファストフードなどの店舗の所在地情報(点の情報)が多数登録されている場合に、最も近い点となる境界を特定して領域ごとに区分する「ボロノイ図」などを求める関数といった、地理空間分析を行うための機能があります。
とは言え、MySQLの地理情報にも、距離計算や包含検索、交叉の判定といった通常の用途に対して十分な機能が備わっており、海外では実際に大手デリバリサービスに採用されているなど、採用のケースも増えてきているようです。
2025年8月に福岡で開催された「FOSS4G KYUSHU」という地理空間情報(私たちはしばしば「ジオ系」と呼んだりします)に関するイベントで、MySQLのGIS機能を紹介する発表がありました。会場からの「PostgreSQLのPostGISと比べて、MySQLのGIS機能はどんな強みや採用のメリットがあるのか」という質問に対して、発表された方は「PostGISのほうが歴史と実績もあり、関数の多さなど機能も充実している」とPostGISの素晴らしさを評価した上で「敢えてMySQLのほうが良い点を挙げると、エクステンションとしての拡張機能を入れることなく、MySQLをインストールしただけでGIS機能も中に入っている」という点を挙げていました。「敢えて」という言葉が示すように、これは「苦し紛れの良いところ探し」のような面もなきにしもあらずですが、バージョンアップ時の手間(拡張機能として入れる場合は、DBMS本体のバージョンのほかに拡張機能の対応バージョンを意識する必要がある)の違いや、はじめてGIS機能を触ってみようという人の最初のワンステップにかける手間の違いなど、メリットとなるケースも少なくないのは、あながち単なる苦し紛れだけとも言えない面もあるかなと感じました。
また、私自身がMySQLで本格的にGISデータの世界に入った立場として、PostGISの関数の挙動に戸惑ったこともありました。緯度経度で示される2つの場所(ポイント)間の距離を求める関数としてST_Distance()があります。MySQLでしばらくこの関数を使用した後に初めてPostGISの同関数を使ったときに、全然違う値が返ってきたことに驚いたことがあります。調べてみると「度」の値が返されており、メートルで得たい場合はひと手間をかける必要があることが分かりました。通常は距離を「度」で知りたいことはないので(しかも度では場所や向きによって距離が変化してしまう)、ユーザの期待する「メートル」値をデフォルトで返してくれるのはMySQLの関数のほうが使いやすいなぁと感じたものでした。
このように、それぞれに特徴のある両OSSのRDBMSですが、本連載ではMySQLの機能を紹介しつつ、地理空間情報の楽しさをお伝えしていけたらと思っています。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- ちきゅうは丸い ー地球上の位置情報を示す「度」の基本を学ぼう
- GPUを活用してデータベースを爆速化する「PG-Strom」の仕組み
- AWS、Amazon RDS for PostgreSQLを発表
- アシスト、オープンソースデータベース「PostgreSQL」の支援サービスを刷新
- PostgreSQLの進化に迫る
- 医療システムを席巻するFirebird!
- オークリーとMetaの新型AIグラスが北米で予約開始/中国Vivo新型MRヘッドセットを発表ほか
- 「MariaDB 10.2 GA」リリース
- 「MariaDB 10.2 GA」リリース
- オープンソースのCMS「Drupal」に2件のセキュリティ修正