OSM の建物のデータをMySQL8系にImportしてQGISで表示してみた

この記事は2019年12月14日に行われたFoss4Gの["GeoSaturday"](https://hackmd.io/v9awcwV6TXKR4gt8o-z5SQ)にて私[MIERUNE](https://mierune.co.jp/#ja)の[mottie0911](https://qiita.com/mottie0911)がTryした内容になります

中堅WebエンジニアでQGIS初心者ですが、MySQL8 でGIS機能が使えると聞いてOSM(OpenStreetMap)のデータをQGISで表示することに挑戦してみました

ogr2ogr の変換や全体的な手法については以下を参考にしました

https://github.com/YoshiakiYamasaki/MySQL-GIS-Data-Japan-eStat


## 環境

QGISをWindowsで使用しているので、WindowsにMySQL8系をInstallして実行した

* Windows10 64bit
* MySQL Community Server 8.0.18 (windows用)
* GDAL 3.0.0 (ogr2ogr変換実行時参照されるGDAL)
* QGIS 3.4.11



## OSM データのDL

OSMのデータをDLできるサイト[HOT](https://export.hotosm.org/en/v3/exports/new/describe)から、今回はShapeFileを選択しDLした(※要OSMの会員登録 & ログイン)
日本全国すべてのデータだと大きいので今回は札幌周辺の建物データとする。

<br>
1. DLしたい地域を選択(今回は札幌周辺をBOX選択) "1.Describe" タブの中のName等を適当に記載(今回のNameはsapporo_test) 
　　![](https://i.imgur.com/Yapyu7H.png)
  
2. "2 Formats" タブの中からDLしたいフォーマットを選択(今回はShapefile)

3. "3 Data" タブからBuildingsを選択
　　※このサイトはyaml等でDataの抽出方法を設定できるのでここの辺を使いこなせたら便利そう

4. "4 Summary" タブより内容を確認し "Create Export"を押下。しばらく経つとダウンロードできるようになる。
　　(今回は2分程度、データ作成処理が完了すると完了通知メールが登録メールアドレス宛に届く)


## ogr2ogr 変換
DLしzipを展開するとShapefile一式があるはずなので、.shpファイルに対しogr2ogrで変換&MySQL取り込みを行う
<br>
下準備として接続したいMySQLサーバにデータを格納したいDBを作成しておく。今回は以下の通り。

``` sql

> create database gis_test;
```

<br>
データベースができたら、DL＆回答したディレクトリに移動し、WindowsのPoworShell等より以下のコマンドを実行


* 文字コード変換

```
> ogr2ogr -f "ESRI Shapefile" -lco ENCODING=UTF-8 -oo  .\sapporo_test_planet_osm_polygon_polygons_utf8.shp .\sapporo_test_planet_osm_polygon_polygons.shp
```
<br>

* MySQL取り込み(今回は同じPC内にあるMySQLサーバに対し接続を行っている、うまく接続できない場合はHost, Portなどのパラメータを増やすこと)

```
> ogr2ogr -f "MySQL" MySQL:"gis_test,user=root,password=【パスワード】" .\sapporo_test_planet_osm_polygon_polygons_utf8.shp
```
<br>

* MySQLで確認

```sql

mysql> use gis_test
Database changed
mysql> show tables;
+-----------------------------------------------+
| Tables_in_gis_test                            |
+-----------------------------------------------+
| geometry_columns                              |
| sapporo_test_planet_osm_polygon_polygons_utf8 |
+-----------------------------------------------+
2 rows in set (0.01 sec)

mysql> desc sapporo_test_planet_osm_polygon_polygons_utf8;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| OGR_FID    | int(11)      | NO   | PRI | NULL    | auto_increment |
| SHAPE      | geometry     | NO   | MUL | NULL    |                |
| osm_id     | double       | YES  |     | NULL    |                |
| building   | varchar(80)  | YES  |     | NULL    |                |
| addrhousen | varchar(137) | YES  |     | NULL    |                |
| addrstreet | varchar(133) | YES  |     | NULL    |                |
| buildingma | varchar(80)  | YES  |     | NULL    |                |
| name       | varchar(183) | YES  |     | NULL    |                |
| accessroof | varchar(80)  | YES  |     | NULL    |                |
| roofmateri | varchar(80)  | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
10 rows in set (0.01 sec)

```
どうやら入っている模様

## QGIS側のMySQLプラグインのInstall
QGISからMySQLにつなぐには"MySQL Importer"というプラグインが必要
"QGIS→プラグイン→プラグインの管理とインストール→すべてのプラグイン"から "MySQL Importer"を検索しインストールすればよいのだが、そのままだと起動に失敗する。

![](https://i.imgur.com/rfNQzAk.png)
<br>
回避方法は以下のサイトにのっているので実施し、Uninstall&Install し、有効化しておく
[How to Install and Enable MySQL Importer Plugin on QGIS 3.4](https://freegistutorial.com/how-to-install-and-enable-mysql-importer-plugin-on-qgis-3-4/)

今回DLしたPythonのMysqlClientは "mysqlclient‑1.4.6‑cp37‑cp37m‑win_amd64.whl"
<br>

whlで圧縮されたファイルから対象フォルダを抽出しなければならないが、7zipで場所を指定して展開、等ではなく".whlファイルを右クリック→一番上の展開"より7zipのブラウザを起動し、フォルダに対してコピーをかけると上手く"C:\Program Files\QGIS 3.4\apps\Python37\Lib\site-packages"配下に対象ディレクトリ(mysqlclient-1.4.6.dist-info, MySQLdb)を持っていくことができる


## QGISで表示
QGISの "レイヤ→データソースマネージャ" のベクタよりデータベースを選択

"MySQL Importer"　がインストールされれば、データベースのタイプをプルダウンからMySQLが選択できるはずなのでMySQLを選択
<br>

接続の部分より新規の接続を作成(今回認証はベーシック認証を使用しました) 
<br>

* DBのユーザとPasswordを入れて構成に変換
![](https://i.imgur.com/RlvQLX4.png)
<br>

* 変換された認証設定を使用し接続テストを行い接続に成功すればOK
![](https://i.imgur.com/SDOhzA2.png)
<br>

* 接続設定ができたら"追加"を押下、追加するテーブル名を聞かれるので "sapporo_test_planet_osm_polygon_polygons_utf8" を選択
<br>

* ちゃんと表示できました
![](https://i.imgur.com/6XdUWsW.jpg)

## 余談
Qiitaにメモ程度以外の記事を書くのは初めてなのでこの記事はQiitaのお作法にのっとってないかもしれません。<br>

Web系エンジニアはPosgreではなくMySQLの方が馴染み深いと思うので、そういう人にとってGISを始めるハードルが下がれば幸いです。
(MySQLで接続できちゃえば、例えば建物のnameをとってきたりUpdateするのは簡単ですね)

## 追記 (MySQL workbenchでの内容確認)
[yyamazaki1](https://qiita.com/yyamasaki1)さんより、「そのデータMySQL workbenchでもみれるよ」との情報を頂いたので今回のデータを[MySQL 8.0にシェープファイルを取り込んで、MySQL Workbenchでポリゴンの形を確認する](https://qiita.com/yyamasaki1/items/073450d6987565223ba0)の記事にそって試してみました。もしQGISをインストールしていなくても、こちらで建物の図形や情報を確認することができます。
<br/>

~~尚、MySQL workbenchはMySQL8に同封されてインストールされていました~~
MySQLインストーラー起動時に"Setup Type"として"Developer Default"を選択した結果、MySQLServer等とともにインストールされていました。[@sakaik さん](https://twitter.com/sakaik) ご指摘ありがとうございました


<br>
メニューの"Database→Connect to Database"より接続
![mysqlb1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112174/775b6d40-b798-fafa-064c-103b0c8dbac4.png)

<br>
左側のTabよりSchemasを選択
![mysqlb2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112174/b23a6cd7-a16d-6689-273c-9dddd2bc4b9e.png)

<br>
テーブルを右クリックで選択し、"Select Rows -- Limit 1000" を実行
![mysqlb3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112174/a3370f4c-9d18-8d93-5219-f61721a2c0b5.png)

<br>
実行され、画面中央に結果が表示されました
![mysqlb4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112174/8ec8e077-0fb4-e370-2e04-35851bb0adaa.png)

<br>
select文を実行したり、FormEditorを使用すればgeometry型(POLYGON)の値や図を確認することができる
![mysqlb5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112174/6204235f-3587-452c-801e-14d2264fb0ba.png)
<br>
<br>
[yyamazaki1](https://qiita.com/yyamasaki1)さん、ありがとうございました