MySQL 8.0にPOINTデータ(経度、緯度)を入れてMySQL Workbenchから検索し、OpenStreetMapで表示する


はじめに

本記事は RDBMS-GIS Advent Calendar 2018 の5日目です。

MySQLでは5.7でGIS機能をBoost.GeometryというC++のオープンソースライブラリを採用して再実装し、8.0でも引き続き機能強化しています。本記事をきっかけにMySQLのGIS機能に興味を持ってもらえると嬉しいです。

やること

1.MySQL 8.0にテーブルを作成し、POINTデータ(経度、緯度)をINSERTする
2.MySQL WorkbenchからINSERTしたデータを検索し、検索したデータを確認する
3.そのデータをOpenStreetMapで表示する

前提

この記事では、以下の前提が整っていることを想定しています。
・MySQL 8.0をインストール済み
MySQL Workbench 8.0をインストール済みで、MySQL 8.0のデータベースに接続できる
・ブラウザが使用できる

手順

1.POINTデータを格納するためのテーブルを作成

POINTデータを格納するためのテーブルを作成します。
POINTデータ型を定義する時にSRIDを指定することもできますが、この例では説明簡略化のためにSRIDは指定していません。

CREATE DATABASE geotest;
CREATE TABLE geotest.location_test(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), location POINT);

2.経度、緯度の情報をINSERT

経度、緯度の情報をINSERTします。
この例では日本標準時子午線にゆかりのある明石市立天文科学館の経度、緯度をINSERTしています。経度、緯度のデータはST_GeomFromText()関数を使用して、文字列からジオメトリデータを生成しています。

INSERT INTO geotest.location_test(name, location) VALUES('明石市立天文科学館', ST_GeomFromText('POINT(135.0013 34.6495)'));

この時、以下の点に注意して下さい。
 ・指定する経度、緯度は10進数で指定する
  (元データの経度、緯度が60進数の場合は、10進数に変換する必要がある)
 ・POINTデータを指定する時のフォーマットは経度、緯度の順である('POINT(経度 緯度)')。また、間はコンマではなく空白である。

上記のINSERT文は、Wikipediaで確認した明石市立天文科学館の経度、緯度(世界測地系の34°38' 58.9"N 135°00' 04.7"E)を10進数に変換して小数点下4桁まで指定しています。

3.MySQL WorkbenchでINSERTしたデータを検索

MySQL WorkbenchでINSERTしたデータを検索します。

MySQL Workbenchを起動し、先ほどデータをINSERTしたデータベースに接続します。そして左側の"SHEMAS"ツリーから"geotest.location_test"テーブルを右クリックし、"Select Rows"を選択します。

検索結果が表示されます。POINTデータについては、バイナリデータであるため"BLOB"と表示されています。

右側の"Form Editor"をクリックすることで、検索したデータを1件1件確認できます。また、"Form Editor"ではPOINTデータをテキスト形式で表示してくれます。

"Result Grid"をクリックして検索結果に戻ります。そして、確認したいPOINTデータを右クリックして"Show point in browser"をクリックします。

該当のPOINTデータがOpenStreetMapで表示されます。

右側の"+"をクリックしてズームすると、明石市立天文科学館を指していることが確認できます。

補足

・MySQL Workbenchの設定を変更することで、GoogleMapなどの別のWebMapに経度、緯度を渡して表示することも可能です。
 - "Edit" --> "Preferences..." をクリック
 - "Others"の"URL location to display geometry point:"の設定を変更
  (例:https://www.google.com/maps?q=%LAT%,%LON%)