「位置情報は楽しい」MySQLで位置情報を扱う時の基本
2019年12月5日の「MySQL Technology Cafe #6」では位置や空間情報をテーマに開催された。最初に登壇したのはMyNAでは副代表を務める坂井恵氏。近年、坂井氏はすっかり位置情報にはまっているらしく、日本水準原点など地理情報の名所を次々と訪問し、国家試験の測量士補にも合格するほど。「位置情報は難しくない。楽しい」と熱く語る。MySQLで位置情報を扱う時に知っておくべきポイントをまとめてくれた。
![日本MySQLユーザ会 坂井恵氏](http://cz-cdn.shoeisha.jp/static/images/article/11875/11875_003.jpg)
- 発表資料:MySQLで扱う空間情報のきほん
坂井氏は「MySQLにおいて位置情報とは、型がひとつ増えただけ」と言う。文字列型や数値型などの型に並び、空間情報型という型があると考えればいい。
MySQL 8.0の大きな特徴にGIS機能強化がある。厳密にはそれまでも位置情報を扱うことは可能だったものの、MySQL 8.0からは地球の丸さを考慮した実用的なものになったそうだ。コミュニティでは「MySQLは8.0で地球が丸いことを知った」と語り継がれている。
空間情報型には何種類かある。緯度経度の1点を表すのが「POINT型」、点をつなげた線が「LINESTRING型」、さらに始点と終点がつながり面(領域)となるのが「POLYGON型」だ。これらのいずれにも対応する「GEOMETRY型」があるため、最低限「GEOMETRY型」だけ覚えておけばいいそうだ。
表記は緯度経度の数値を並べる。例えば「POINT(2 7)」となる。カンマを入れたくなるが、点における表記はスペース区切りだ。複数の点をつないで線を表すには「LINESTRING(1 3, 2 4)」というようにカンマでつなげる。こうした表記は人間が読むときのもので「WKT(Well Known Text)」と呼ばれる。実際にMySQLに格納する時にはバイナリ形式「WKB(Well Known Binary)」にする。それぞれの表記方法を変換するための関数がある。
ところで測地系は1つではない。ここには歴史やいろんな奥深い事情がある。日本では「Tokyo」(今ではほとんど使われない)、「JDG2011」、「WGS 84」などが使われている。また、地球上の位置を緯度経度で表す地理座標系と、平面に投影して地図上で定められた基点からの距離で表す投影座標系があり、測地系と座標系の組合せで空間参照系が定義されている。一般的に、空間参照系を識別するために、SRIDというIDが割り振られているため、MySQLでも使用する空間参照系をSRIDで指定する必要がある。
また日本では平面直角座標系という投影座標系を用いることもある。日本全体を19のエリアに分割し、各エリアにおける原点からの距離を「北に何メートル、東に何メートル」と表記する。ちなみに日本オラクルがある青山のビルのすぐ近くには3級基準点があるそうだ。
MySQLでGIS機能を使う時はこうする チュートリアルやデモで紹介
続いて、日本オラクル 山﨑由章氏がMySQL 8.0におけるGIS機能の扱い方を解説した。
![日本オラクル MySQL GBU 山﨑由章氏](http://cz-cdn.shoeisha.jp/static/images/article/11875/11875_004.jpg)
まずは事例から。MySQLのGIS機能を活用したものの例として、国産のCMSとなる「a-blog cms」がある。a-blog cmsでは、記事を投稿する時に属性として位置情報を持たせることができる。この機能を活用し、名古屋地区などの情報サイト「SpyMaster」では近隣のスポット情報を表示したり、住宅資材の「圓屋」では現在地から近い順に店舗を表示したりなど、位置情報を活用したWebページ作成が可能になっている。他にも登山記録の「ヤマレコ」では空間インデックスを使用し、山行記録を高速に検索できるようにしている。
MySQLにおける位置情報型は坂井氏が解説したように、「POINT型」、「LINESTRING型」、「POLYGON型」、「GEOMETRY型」がある。それぞれが緯度経度の点、ルートの線、市区町村の区画などで使われる。集合になると「POINT」は「MULTIPOINT」、「LINESTRING」は「MULTILINESTRING」、「POLYGON」は「MULTIPOLYGON」となるが、「GEOMETRY」は「GEOMETRYCOLLECTION」となるので注意が必要だ。
山﨑氏はMySQL 8.0 GIS機能を試すためのチュートリアルを作成し、それをGitHubで公開している(MySQL-GIS-Tutorial)。手を動かして覚えるにはとても有用な教材となる。最初はテストデータの入力から始める。緯度経度となるデータを1件ずつ入力したり、集合の状態で入力したりする。さらに線の入力や、領域の入力も行う。
データを入力したら、MySQLのビジュアルツールとなるMySQL Workbenchで確認する。MySQL Workbenchには空間情報に対応した「Spatial View」もあり、空間情報を視覚的に確認できる。格納した緯度経度が指す点をOpenStreetMapで表示することも可能だ。MySQL Workbenchの設定を変更すれば使用するマップを別のもの(例えばGoogleマップ)にすることもできる。
他にも山﨑氏は2点間の距離を計算する「ST_Distance()」関数や外部ファイルからデータをMySQLに取り込む方法なども示した。1時間に満たないセッションの間に基本的なGIS機能が一通り紹介された。
さらに山﨑氏は個人的な活動としてMySQLのGIS機能を手軽に試せるように、MySQLに取り込み済みのGISデータ配布を行っている。手始めに政府統計の総合窓口でオープンデータとして公開されている都道府県の境界データを公開している(MySQL-GIS-Data-Japan-eStat)。熱意が伝わってくる。
最後に梶山氏からのメッセージを記しておこう。「どんな内容でもいいし、短いセッションでもいいです。『チューニングをここまでがんばったけど、これでいい?』とみんなに問いかけるものでもいいです。ぜひ登壇にチャレンジしてください。場を繋げますし、登壇の支援もします。登壇したらサキーラぬいぐるみも贈呈しますよ。ここでユーザー同士のネットワークが広がることを期待しています」
![](http://cz-cdn.shoeisha.jp/static/images/article/11875/11875_002.jpg)
次回は1月17日。MySQL ShellというMySQLの新しいクライアントツールについてのセッションを予定している。
![](http://cz-cdn.shoeisha.jp/static/images/article/11875/11875_FreeTier.png)
MySQL Technology Cafeは次回1月17日開催!
MySQL Technology Cafe #7では、MySQLの新しいクライアントツール「MySQL Shell」の機能を紹介します。MySQL Shellの機能を把握した後は、実際にMySQL Shellの拡張機能を使ってプラグインを作るもくもくタイムも。ぜひご参加ください!