owned this note
owned this note
Published
Linked with GitHub
# 法務省地図XMLダイジェストを頑張って再現してみる!
###### tags: `OSGeo`
###### tags: `FOSS4G` `amxproject` `OSGEO` `GIS` `mysql`
## 概要
[法務省地図XMLダイジェスト](https://github.com/sakaik/kuwanauchi_xml_digest)を@sakaikさんが作られているので、自分でもやってみる
## 作業
### まず読む!
#### 大きな作業の流れ
- まず、getBasicInfo2.pyで、基本情報を読み出す
- 次に、これを[MySQLへのデータロード方法](https://github.com/sakaik/kuwanauchi_xml_digest/blob/main/text/how_to_load_to_mysql.md)を参考に、MySQLに読み込む
#### getBasicInfo2.py を実施
- 使い方は、[スクリプトについて](https://github.com/sakaik/kuwanauchi_xml_digest/blob/main/text/about_script.md)に書かれている
- 作業手順
- 動作環境を確認する
- Python3が動くこと
- OSGeo4WのPython3が、3.9.5なのでOK
- xmltodictが動くこと
- pip install mltodict
- すでにインストール済み
- xmlをクローンする
- サンプルとして、https://github.com/amx-project/kuwanauchi37kagawa
- 解凍して配置
- amx\kuwanauchi37kagawa-main にサンプルを多く
- 時間がかかるそうなので、一部を、amx\37201 に配置
- 37201はきっと、高松市
- getBasicInfo2.py 2つ上に配置
- [scripts](https://github.com/sakaik/kuwanauchi_xml_digest/tree/main/scripts)の中の[run_scripts.txt](https://github.com/sakaik/kuwanauchi_xml_digest/blob/main/scripts/run_scripts.txt)を参考に実行
- `python3 getBasicInfo2.py amx\37201 amx/ 37kawaga37021`
- ![](https://i.imgur.com/0TGaKVA.png)
- 走っている
- たしかに、ちょっと時間がかかる(汗
- zipをxmlに解凍したもので試してみる
- amx\08201 を ためす
- `python3 getBasicInfo2.py amx\08201 amx/ 08ibaraki08201`
- うまくいかない
- できれば、zipでなくxmlでやりたいなぁ。
- 解凍したxmlに対応したものを、作ってみる
- getBasicInfo_for_xml.py
- zipとxmlで比較
- ファイルは2つ
- 37208-4702-97と37201-4700-330
- zipは、7M, 9M. xmlは274M, 352M
- 手動計測で比較
- zipで1:12秒、xmlで1:12秒。変わらないことが確認できたので、OK(笑
- 出力は、2つのファイル。[出力ファイル(CSVフォーマット)について](https://github.com/sakaik/kuwanauchi_xml_digest/blob/main/text/data_format.md)より抜粋
- 概要
- 基本情報サマリファイル(_summary.csv)と図各情報ファイル(_zukaku.csv)ファイルの2つがあります
- ひとつの基本サマリファイルに対して 0..* 個の図郭情報が紐付きます。
- 基本サマリと図郭情報の紐付けはファイル名(今回は XMLではなくZIPファイル名)としています
- 基本情報サマリファイル(*_summary.csv)
- 各ファイルに1つだけ存在します(filename列でユニーク)
- この情報に紐付く図郭情報の数を numbers_of_zukaku列に掲載しています
- 図郭情報ファイル(*_zukaku.csv)
- (再掲)ひとつのファイルに対して1つまたは複数の図郭が存在します。存在しない場合もあります。
- 次に、mysqlに読み込む
- MySQLへの登録
- MySQL ワークベンチから行おうとすると、エラーが出ているのか?
- ![](https://i.imgur.com/ikcwarw.png)
- chcpコマンドが通らないと言っているが、そんな事があるのか?
- よくわかんないから、Workbenchを使わずに、コマンドからやることにする
- 作業はMySQL Shellで行うこととした。
- ただし、全体に流れが必要
- DB登録までの流れ
1. ローカルのファイルを読み込み可能な形でクライアントを起動
2. サーバのセッティングを変更して、ローカルファイルの読み込みを可能にする
3. データベースを作る
4. データベースに接続する
5. テーブルを作成する
6. 読み込みを行う
- 具体的手順:テーブル作成まで
1. ローカルのファイルを読み込み可能な形でクライアントを起動
- 以下のコマンドを含むショートカットを作成
- `"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" "-uroot" "-p" "--default-character-set=utf8mb4" "--local-infile=1"`
2. 起動して、サーバの設定を変更
- 起動して、以下のコマンドを実行
- `SET GLOBAL local_infile=on;`
- 以下のように帰ってきたので、きっとうまく行ったはず
```
mysql> SET GLOBAL local_infile=on;
Query OK, 0 rows affected (0.00 sec)
```
3. データベースを作る
- DBの確認
```
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
```
- DB作成
```
mysql> create database amxtest;
Query OK, 1 row affected (0.03 sec)
```
- 作成されたDBの確認
```
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| amxtest |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
```
4. データベースに接続する
- データベースに接続
```
mysql> use amxtest;
```
- カレントデータベースの確認
```
mysql> select database();
+------------+
| database() |
+------------+
| amxtest |
+------------+
1 row in set (0.00 sec)
```
5. テーブルを作成する
```
CREATE TABLE mojmap_summary_37201 (
filename varchar(100) PRIMARY KEY,
city_name varchar(100) ,
city_code char(5) ,
map_name varchar(100),
coordinate varchar(100) ,
version varchar(10),
sokuti_hanbetu varchar(10),
conv_pgm varchar(100),
conv_pgm_version varchar(100),
conv_pgm_param_version varchar(100),
numbers_of_zukaku int
);
```
- MySQL ワークベンチから行おうとすると、エラーが出ているのか?
- ![](https://i.imgur.com/ikcwarw.png)
- chcpコマンドが通らないと言っているが、そんな事があるのか?
- よくわかんないから、Workbenchを使わずに、コマンドからやることにする
- 具体的手順:データ読み込み
- 以下のコマンドを実行
- `LOAD DATA LOCAL INFILE 'e:\\amx\\37kawaga37021_summary.csv' INTO TABLE mojmap_summary_37201 FIELDS TERMINATED BY ',' IGNORE 1 LINES;`
```
mysql> LOAD DATA LOCAL INFILE 'e:\\amx\\37_xml_summary.csv' INTO TABLE mojmap_summary_37201 FIELDS TERMINATED BY ',' IGNORE 1 LINES;
Query OK, 2 rows affected (0.03 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
```
- 読み込んだ中身を表示
- `SELECT * FROM mojmap_summary_37201;`
```
mysql> SELECT * FROM mojmap_summary_37201;
+--------------------+-----------+-----------+--------------------------------------------------------------+------------------+---------+----------------+----------+------------------+------------------------+-------------------+
| filename | city_name | city_code | map_name | coordinate | version | sokuti_hanbetu | conv_pgm | conv_pgm_version | conv_pgm_param_version | numbers_of_zukaku |
+--------------------+-----------+-----------+--------------------------------------------------------------+------------------+---------+----------------+----------+------------------+------------------------+-------------------+
| 37201-4700-1.zip | 高松市 | 37201 | 茜町・西町A | 任意座標系 | ver1.0 | | | | | 1 |
| 37201-4700-10.zip | 高松市 | 37201 | 塩上町1丁目~3丁目・観光通1丁目 | 任意座標系 | ver1.0 | | | | | 7 |
| 37201-4700-100.zip | 高松市 | 37201 | 本町 | 任意座標系 | ver1.0 |
(中略)
| 37201-4700-99.zip | 高松市 | 37201 | 北浜町 | 任意座標系 | ver1.0 | | | | | 3 |
| 37208-4702-97.xml | 三豊市 | 37208 | YA1kouda14B01 | 公共座標4 系 | ver1.0 | 変換 | TKY2JGD | 1.3.79 | 2.1.1 | 400 |
+--------------------+-----------+-----------+--------------------------------------------------------------+------------------+---------+----------------+----------+------------------+------------------------+-------------------+
492 rows in set (0.00 sec)
```
- 表示OK
- 一部データを修正
- csvにしてしまっているため、本文中のコンマを$にかえているため
- 修正するデータの表示
- `SELECT map_name FROM mojmap_summary_37201 WHERE map_name LIKE '%$%';`
- ゼロでござる
- あった場合は、以下で置換
- `UPDATE mojmap_summary SET map_name=replace(map_name,'$',',') WHERE map_name LIKE '%$%';`
- 文字の中に$があった場合にどうするかは、検討
- 具体的手順 _zukaku ファイル群の登録
- tableを作成
```
CREATE TABLE mojmap_zukaku_37201 (
filename varchar(100),
map_no varchar(50),
scale varchar(10),
unknown_direct_flg varchar(10),
leftbottom_x float,
leftbottom_y float,
lefttop_x float,
lefttop_y float,
rightbottom_x float,
rightbottom_y float,
righttop_x float,
righttop_y float,
maptype varchar(100),
mapcategory varchar(100),
mapmaterial varchar(100),
sonae_ymd_y varchar(4),
sonae_ymd_m varchar(2),
sonae_ymd_d varchar(2),
map_ymd_y varchar(4),
map_ymd_m varchar(2),
map_ymd_d varchar(2)
);
CREATE INDEX idx_zkk_fn ON mojmap_zukaku_37201(filename);
```
- CREATE INDEX は、上のテーブルではいらないの?
- csvデータをテーブルにロードする
- `LOAD DATA LOCAL INFILE 'e:\\amx\\37kawaga37021_zukaku.csv' INTO TABLE mojmap_zukaku_37201 FIELDS TERMINATED BY ',' IGNORE 1 LINES;`
```
mysql> LOAD DATA LOCAL INFILE 'e:\\amx\\37kawaga37021_zukaku.csv' INTO TABLE mojmap_zukaku_37201 FIELDS TERMINATED BY ',' IGNORE 1 LINES;
Query OK, 16912 rows affected, 1133 warnings (0.51 sec)
Records: 16912 Deleted: 0 Skipped: 0 Warnings: 1133
```
- できた!
- ハマりどころを詰めておいていただいた、sakaikさんに感謝!
- 高松を例に集計
```
mysql> SELECT coordinate , COUNT(*) FROM mojmap_summary_37201 GROUP BY coordinate ORDER BY coordinate;
+------------------+----------+
| coordinate | COUNT(*) |
+------------------+----------+
| 任意座標系 | 168 |
| 公共座標4系 | 324 |
+------------------+----------+
2 rows in set (0.01 sec)
```
```
SELECT map_name , COUNT(*) FROM mojmap_summary_37201 WHERE coordinate = "任意座標系" GROUP BY map_name ORDER BY map_name;
```
```
mysql> SELECT map_name , COUNT(*) FROM mojmap_summary_37201 WHERE coordinate = "任意座標系" GROUP BY map_name ORDER BY map_name;
+-----------------------------------------------------------+----------+
| map_name | COUNT(*) |
+-----------------------------------------------------------+----------+
| A | 1 |
| B | 1 |
| C | 1 |
| D | 1 |
| E | 1 |
| F | 1 |
| G | 1 |
| H | 1 |
| 三条町・東ハゼ町 | 1 |
| 上之町2丁目 | 1 |
| 上福岡町A | 1 |
| 上福岡町B | 1 |
| 中新町 | 1 |
| 中野町 | 1 |
| 丸の内 | 1 |
| 亀岡町 | 1 |
| 井口町 | 1 |
| 今新町 | 1 |
| 八坂町 | 1 |
| 内町 | 1 |
| 北浜町 | 1 |
| 南 和紙 | 1 |
| 南和紙三木町 | 1 |
| 原字上井手西・南山田・城一 | 1 |
| 古馬場町 | 1 |
| 城東町1丁目・2丁目 | 1 |
| 塩上町1丁目~3丁目・観光通1丁目 | 1 |
| 塩屋町 | 1 |
| 多賀町1丁目・2丁目・3丁目 | 1 |
| 多賀町2丁目 | 1 |
| 大字上西字大屋敷・小出川 | 1 |
| 大字大野14B01 | 1 |
| 大字安原上東14B01 | 1 |
| 大字安原上東字大相 | 1 |
| 大字安原下(数値)13A | 1 |
| 大字安原下(数値)13B | 1 |
| 大字安原下14C02 | 1 |
| 大字安原下14C03 | 1 |
| 大字安原下14C04 | 1 |
| 大字安原下字コウソ・関・黒石・橋谷・他 | 1 |
| 大字安原下字浦山・コウソ | 1 |
| 大字安原下字金光A | 1 |
| 大字川内原14B01 | 1 |
| 大字川内原14B02 | 1 |
| 大字川内原14B03 | 1 |
| 大字川内原14B04 | 1 |
| 大字川内原14B05 | 1 |
| 大字川内原14C01 | 1 |
| 大字川東上14B01 | 1 |
| 大字川東下14B01 | 1 |
| 大字川東下14B02 | 1 |
| 大字東谷(数値)13A | 1 |
| 大字東谷(数値)14A01 | 1 |
| 大字東谷14B01 | 1 |
| 大字東谷14B02 | 1 |
| 大字東谷14B03 | 1 |
| 大字東谷14B04 | 1 |
| 大字東谷14B05 | 1 |
| 大字東谷14C02 | 1 |
| 大字東谷字下谷 | 1 |
| 大字東谷字久保田 | 1 |
| 大字東谷字仏坂 | 1 |
| 大字東谷字向坂 | 1 |
| 大字東谷字大杖 | 1 |
| 大字東谷字大深田 | 1 |
| 大字東谷字天神 | 1 |
| 大字東谷字引土 | 1 |
| 大字東谷字日向 | 1 |
| 大字東谷字森窪 | 1 |
| 大字東谷字白砂 | 1 |
| 大字東谷字芦脇 | 1 |
| 大字東谷字落合 | 1 |
| 大字東谷字遅越 | 1 |
| 大字東谷字釜床 | 1 |
| 大字東谷字額谷 | 1 |
| 大字浅野14B02 | 1 |
| 大字浅野14B03 | 1 |
| 大字浅野14B04 | 1 |
| 大字浅野14B05 | 1 |
| 大字浅野14B06 | 1 |
| 大字浅野14B07 | 1 |
| 大字由佐13C02 | 1 |
| 大工町 | 1 |
| 大町12A | 1 |
| 女木町 | 1 |
| 室新町 | 1 |
| 室新町字万蔵 | 1 |
| 宮脇町(2丁目) | 1 |
| 宮脇町1丁目 | 1 |
| 宮脇町1丁目(追加) | 1 |
| 宮脇町1丁目(追加1) | 1 |
| 宮脇町2丁目 | 1 |
| 寒川 和紙 | 1 |
| 寿町1丁目・2丁目・玉藻町 | 1 |
| 屋島東町A | 1 |
| 屋島西町A | 1 |
| 岡本町13B | 1 |
| 峯山町 | 1 |
| 川東上14A01 | 1 |
| 常盤町1丁目・2丁目 | 1 |
| 幸町 | 1 |
| 庵治2 | 1 |
| 庵治3 | 1 |
| 庵治4 | 1 |
| 庵治5 | 1 |
| 庵治町C | 1 |
| 庵治町D | 1 |
| 庵治町E | 1 |
| 庵治町F | 1 |
| 庵治町H | 1 |
| 庵治町数値 | 1 |
| 御坊町 | 1 |
| 扇町1丁目 | 1 |
| 新北町B | 1 |
| 昭和町1丁目・2丁目 | 1 |
| 朝日新町 | 1 |
| 朝日町1~4丁目 | 1 |
| 朝日町5丁目 | 1 |
| 朝日町6丁目 | 1 |
| 末広町 | 1 |
| 本町 | 1 |
| 東浜町1丁目 | 1 |
| 松島町 | 1 |
| 松島町1丁目~3丁目 | 1 |
| 松福町1丁目・2丁目 | 1 |
| 栗林町1丁目~3丁目 | 1 |
| 浜ノ町A | 1 |
| 浜ノ町B | 1 |
| 瀬戸内町A | 1 |
| 瀬戸内町B | 1 |
| 片原町 | 1 |
| 牟礼町B | 1 |
| 牟礼町C | 1 |
| 牟礼町D | 1 |
| 牟礼町E | 1 |
| 牟礼町H | 1 |
| 牟礼町J | 1 |
| 牟礼町K | 1 |
| 玉藻町 | 1 |
| 瓦町1丁目・2丁目 | 1 |
| 生島町A | 1 |
| 田町 | 1 |
| 番町1丁目~5丁目 | 1 |
| 百間町 | 1 |
| 福岡町1丁目・2丁目 | 1 |
| 福岡町1丁目B | 1 |
| 福岡町2丁目 | 1 |
| 福岡町3丁目・4丁目 | 1 |
| 福田町 | 1 |
| 築地町 | 1 |
| 花ノ宮町1丁目・2丁目・3丁目 | 1 |
| 花園町1丁目・2丁目・3丁目 | 1 |
| 茜町・西町A | 1 |
| 茜町・西町C | 1 |
| 藤塚町(1丁目~3丁目) | 1 |
| 西宝町1丁目・2丁目 | 1 |
| 西宝町3丁目 | 1 |
| 観光町 | 1 |
| 観光通1丁目・2丁目 | 1 |
| 観音寺和紙 | 1 |
| 通町 | 1 |
| 錦町1丁目・2丁目 | 1 |
| 香川町大字安原下字鮎滝下 | 1 |
| 高松市 | 1 |
| 高松市瀬戸内町_1 | 1 |
| 高松町 | 1 |
| 鶴屋町 | 1 |
| 鶴市町 | 1 |
+-----------------------------------------------------------+----------+
168 rows in set (0.00 sec)
```