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

# はじめに
本記事は [RDBMS-GIS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/rdbms_gis) の5日目です。

MySQLでは5.7でGIS機能をBoost.GeometryというC++のオープンソースライブラリを採用して再実装し、[8.0でも引き続き機能強化](https://www.slideshare.net/yoyamasaki/mysql-80gis)しています。本記事をきっかけにMySQLのGIS機能に興味を持ってもらえると嬉しいです。

# やること
1．MySQL 8.0にテーブルを作成し、POINTデータ(経度、緯度)をINSERTする
2．[MySQL Workbench](https://www.mysql.com/jp/products/workbench/)からINSERTしたデータを検索し、検索したデータを確認する
3．そのデータを[OpenStreetMap](https://openstreetmap.jp/)で表示する

# 前提
この記事では、以下の前提が整っていることを想定しています。
・MySQL 8.0をインストール済み
・[MySQL Workbench 8.0](https://dev.mysql.com/downloads/workbench/)をインストール済みで、MySQL 8.0のデータベースに接続できる
・ブラウザが使用できる

# 手順

#### 1.POINTデータを格納するためのテーブルを作成
POINTデータを格納するためのテーブルを作成します。
[POINTデータ型を定義する時にSRIDを指定する](https://dev.mysql.com/doc/refman/8.0/en/spatial-type-overview.html)こともできますが、この例では説明簡略化のためにSRIDは指定していません。

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

#### 2.経度、緯度の情報をINSERT
経度、緯度の情報をINSERTします。
この例では[日本標準時子午線](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%A8%99%E6%BA%96%E6%99%82%E5%AD%90%E5%8D%88%E7%B7%9A)にゆかりのある[明石市立天文科学館](https://ja.wikipedia.org/wiki/%E6%98%8E%E7%9F%B3%E5%B8%82%E7%AB%8B%E5%A4%A9%E6%96%87%E7%A7%91%E5%AD%A6%E9%A4%A8)の経度、緯度をINSERTしています。経度、緯度のデータは[ST_GeomFromText()関数](https://dev.mysql.com/doc/refman/8.0/en/gis-wkt-functions.html#function_st-geomfromtext)を使用して、文字列からジオメトリデータを生成しています。

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

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

上記のINSERT文は、Wikipediaで確認した[明石市立天文科学館の経度、緯度](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%A8%99%E6%BA%96%E6%99%82%E5%AD%90%E5%8D%88%E7%B7%9A#cite_ref-Akashi-Planetarium-Web-Page-1_42-2)(世界測地系の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"を選択します。
![Advent_5_01.png](https://qiita-image-store.s3.amazonaws.com/0/223768/e32b7041-759d-1503-e692-cd7f1eac2b1d.png)

検索結果が表示されます。POINTデータについては、バイナリデータであるため"BLOB"と表示されています。
![Advent_5_02.png](https://qiita-image-store.s3.amazonaws.com/0/223768/29b37e50-36ac-f102-221a-31395f60ec8e.png)

右側の"Form Editor"をクリックすることで、検索したデータを1件1件確認できます。また、"Form Editor"ではPOINTデータをテキスト形式で表示してくれます。
![Advent_5_03.png](https://qiita-image-store.s3.amazonaws.com/0/223768/0ca5714e-31d5-0749-95e4-1caf192c317d.png)

"Result Grid"をクリックして検索結果に戻ります。そして、確認したいPOINTデータを右クリックして"Show point in browser"をクリックします。
![Advent_5_04.png](https://qiita-image-store.s3.amazonaws.com/0/223768/c9b86c11-eea3-569d-11af-b59f475b8fe9.png)

該当のPOINTデータがOpenStreetMapで表示されます。
![Advent_5_05.png](https://qiita-image-store.s3.amazonaws.com/0/223768/3a476978-0c04-9133-a767-0b0fb827f2de.png)

右側の"＋"をクリックしてズームすると、明石市立天文科学館を指していることが確認できます。
![Advent_5_06.png](https://qiita-image-store.s3.amazonaws.com/0/223768/2454bbb9-f6f3-bc56-8ee0-fbf5af91955a.png)

# 補足
・MySQL Workbenchの設定を変更することで、[GoogleMap](https://www.google.co.jp/maps/?hl=ja)などの別のWebMapに経度、緯度を渡して表示することも可能です。
　- "Edit" --> "Preferences..." をクリック
　- "Others"の"URL location to display geometry point:"の設定を変更
　　(例：https://www.google.com/maps?q=%LAT%,%LON%)
![Advent_5_08.png](https://qiita-image-store.s3.amazonaws.com/0/223768/e79a2d0d-5b1f-15d4-a088-ef51862e3524.png)