はじめに
前回は、国や自治体が公開する地理情報のオープンデータと、そのファイルフォーマットを紹介しました。今回は、その中から GeoJSON形式のオープンデータをMySQLに登録してみます。
なお、今回で使用するデータの出典は、国土交通省の「国土数値情報ダウンロードサイト」です。
データの取得
日本の地理情報データを扱う際に使用されるケースで最も多いのは、行政区域データでしょう。都道府県の範囲や市区町村の境界を示すPOLYGONなどのデータが公開されています。
今回は、国土数値情報ダウンロードサイトから、行政区域(市区町村境界)データをダウンロードして、MySQLに登録するまでの流れを紹介します。
国土数値情報ダウンロードサイトにアクセスして、画面内で「2.政策区域 - 行政地域 - 行政区域(ポリゴン)」と辿ったリンクをクリックします。この時、ライセンスが「CC_BY_4.0」であることを確認します*。
*: 個人が学習用にダウンロードして使う分には他のライセンスでも問題ありませんが、何らかの形で公開する場合はライセンス形態によって制約が生じることがあります。国土数値情報の場合は「CC_BY_4.0」のようなライセンス形態表示から利用規約へリンクが貼ってあるので、使用前に一度確認しておきましょう。
リンク先では、都道府県ごとにデータをダウンロードできます。最新のものだけでなく過去のデータも公開されています。全国データを登録したいところですが、サイズが非常に大きいので、今回は千葉県のデータだけをダウンロードしてMySQLに登録することにしましょう。
都道府県リストから「千葉県」にチェックマークを入れて、画面下部にあるダウンロードリストのボタンからデータをダウンロードします。年度を指定してダウンロードリストを得たい場合は「年度で絞り込み」で指定できます。
「N03-20250101_12_GML.zip」ファイルがダウンロードされたと思います。
ファイル内容の確認
N03-20250101_12_GML.zipファイルを展開すると、いくつかファイルが出てきます。
【Zipファイル内のファイル一覧】
- KS-META-N03-20250101_12.xml(15K)
- N03-20250101_12.geojson(9.5M)
- N03-20250101_12.xml(16M)
- N03-20250101_12.cpg(5K)
- N03-20250101_12.dbf(420K)
- N03-20250101_12.prj(145K)
- N03-20250101_12.shp(4.6M)
- N03-20250101_12.shx(19K)
「KS-META-N03-20250101_12.xml」はデータの説明に関するファイルです。それ以外の「N03-20250101_12」ではじまるファイル名のものがデータ本体で、さまざまなフォーマットのデータが同梱されています。
拡張子がxmlのものがGML形式で、拡張子がgeojsonのものがGeoJSON形式です。その他のcpg、dbf、prj、shp、shxの拡張子を持つものがShapefile形式で、これら5個のファイルをまとめて一式のデータとなっています(Shapefileについては次回で紹介します)。
今回は、この中から GeoJSONのファイルを使って、MySQLに登録してみることにします。
GeoJSON形式である N03-20250101_12.geojson ファイルの中身は下図のようになっています。
このファイルが示すデータの基本情報がヘッダ情報として記述されており、その後に featuresセクションに具体的な行政区域データの名称やPOLYGON情報が記述されています。
千葉県データでは最初の1件が「所属未定地」となっているためイメージが掴みにくいですが、通常この欄には市区町村名が入っています。
ツール(ogr2ogr)のセットアップ
GeoJSONファイルをMySQLに登録する方法はいくつかありますが、ここではシンプルな方法として、GDALのogr2ogrコマンドを使用する例を紹介します。インストールはそれほど難しくないので、検索してインストールしてみてください。
筆者はUbuntu 24.04上で以下のコマンドを使用してインストールしました。
・GDALのインストール
$ sudo apt update
$ sudo apt install gdal-bin・ogr2ogrのバージョン確認
$ ogr2ogr --version
GDAL 3.8.4, released 2024/02/08GeoJSONファイルの内容確認
それでは、セットアップしたGDALコマンドを使って、まずはGeoJSONファイルの情報を確認してみましょう。ここではogrinfoコマンドを使います。
実行例は以下のとおりです。-alが全レイヤを対象にする指定、-soがサマリのみ表示するオプションです。
見てみると、以下のことが分かります。
- ジオメトリタイプ(データのタイプ)は POLYGONデータ
- 件数は2308件
- データが含まれる範囲(経度,緯度)は(139.739526, 34.897974) - (140.881620, 36.104100)
- 測地系はJGD2011で、そのEPSGコード(SRID)は6668
- 属性情報としてN03_001~N03_007という名前のカラムがあり、全て文字列型
(カラム名がこのように無味乾燥なものになっているのが国土数値情報データの特徴で、それぞれが何を示しているのかは仕様書を確認する必要あり)
$ ogrinfo -al -so N03-20250101_12.geojson
INFO: Open of `N03-20250101_12.geojson'
using driver `GeoJSON' successful.
Layer name: N03-20250101_12
Geometry: Polygon
Feature Count: 2308
Extent: (139.739526, 34.897974) - (140.881620, 36.104100)
Layer SRS WKT:
GEOGCRS["JGD2011",
DATUM["Japanese Geodetic Datum 2011",
ELLIPSOID["GRS 1980",6378137,298.257222101,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",6668]]
Data axis to CRS axis mapping: 2,1
N03_001: String (0.0)
N03_002: String (0.0)
N03_003: String (0.0)
N03_004: String (0.0)
N03_005: String (0.0)
N03_007: String (0.0)MySQLにデータを登録しよう
ogrinfoコマンドでGeoJSONファイルの概要が確認できたので、次にこのデータをMySQLに登録してみましょう。
ここではogr2ogrコマンドを使います。-fでMySQLに登録をしたい内容を伝え、接続文字列でMySQLへの接続情報を記述します(この例では localhostのMySQLにrootユーザ、パスワードMyPASSWORDで接続し、thinkitデータベースをカレントデータベースとして指定)。
続いてGeoJSONのファイル名を記述し、-nlnで登録したいテーブル名(新規作成される)、-progressで登録進捗状況表示を指定しています。
ogr2ogr -f "MySQL" \
"MySQL:thinkit,host=localhost,user=root,password=MyPASSWORD" \
N03-20250101_12.geojson \
-nln chiba_city \
-progress実行すると以下のように進捗状況が 10...20...のように表示されていきます。doneが表示されれば完了です。
$ ogr2ogr -f "MySQL" \
"MySQL:thinkit,host=localhost,user=root,password=MyPASSWORD" \
N03-20250101_12.geojson \
-nln chiba_city \
-progress
0...10...20...30...40...50...60...70...80...90...100 - done.確認
MySQLに接続して thinkitデータベースの中のテーブルを見ると chiba_city テーブルが作成されていることが分かります。先ほど -nlnオプションで指定したテーブル名ですね。カラム内容も先ほど ogrinfoで見たものと同じです。
mysql> DESC chiba_city;
+---------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+----------------+
| OGR_FID | int | NO | PRI | NULL | auto_increment |
| SHAPE | geometry | NO | MUL | NULL | |
| n03_001 | text | YES | | NULL | |
| n03_002 | text | YES | | NULL | |
| n03_003 | text | YES | | NULL | |
| n03_004 | text | YES | | NULL | |
| n03_005 | text | YES | | NULL | |
| n03_007 | text | YES | | NULL | |
+---------+----------+------+-----+---------+----------------+
8 rows in set (0.001 sec)データの中身も少しだけ見てみましょう。個別に列名を指定しているのは SHAPE列を表示対象から除外するためです(先ほどGeoJSONファイルの中身を見たとおり、非常に長い緯度経度の羅列となっている)。
mysql> SELECT OGR_FID, n03_001, n03_002, n03_003, n03_004, n03_005, n03_007 FROM chiba_city LIMIT 5;
+---------+-----------+---------+---------+-----------------+--------------+---------+
| OGR_FID | n03_001 | n03_002 | n03_003 | n03_004 | n03_005 | n03_007 |
+---------+-----------+---------+---------+-----------------+--------------+---------+
| 1 | 千葉県 | NULL | NULL | 所属未定地 | NULL | 12000 |
| 2 | 千葉県 | NULL | NULL | 千葉市 | 中央区 | 12101 |
| 3 | 千葉県 | NULL | NULL | 千葉市 | 中央区 | 12101 |
| 4 | 千葉県 | NULL | NULL | 千葉市 | 花見川区 | 12102 |
| 5 | 千葉県 | NULL | NULL | 千葉市 | 稲毛区 | 12103 |
+---------+-----------+---------+---------+-----------------+--------------+---------+
5 rows in set (0.000 sec)DBeaverで見てみよう
せっかく地理情報データを登録したのですから、POLYGONが正しく登録されていることも見てみたいですよね。本連載でお馴染みの DBeaverを使って見てみましょう。筆者のこよなく愛する我孫子市のデータを確認します。
SQLの例は以下のようになります。地元を愛する筆者は当然、我孫子市の自治体コードが12222であることを知っているので、このコードをn03_007列から検索しましたが(覚えやすいコードなので良かったらみなさんもぜひご記憶ください)、n03_004列から市町村名、あるいはn03_005列から区名で検索しても構いません。
SELECT * FROM chiba_city WHERE n03_007='12222';結果として得られたSHAPE列を地図に表示すると、下図のようになりました。
2件の結果が得られていますが、どちらも正しく我孫子市のデータです。実は我孫子市には飛び地があり、左端のほうに非常に小さなPOLYGONが隣市の柏市に存在しているのです。このように「意外と知らなかった地元の飛び地」に出会えることなどもあるので、やはりデータを見るのは楽しいものですね。
今回使用した国土数値情報ダウンロードサイトの行政区域データの解説を読んでいると、「境界未確定地」という言葉が出てきたことに気づいた人もいるかもしれません。
「暫定境界線一覧はこちらをご覧ください。」のリンクからは、暫定境界の自治体を記したPDFファイルをダウンロードできます。下図のような感じで3ページにわたって記述されています。
これを見ると、意外と県境の未確定も多いのだなということが分かります。地理情報マニアの集まりであれば「都道府県境が未確定の組み合わせをすべて挙げてください」というクイズを出せそうですね。もちろん私は全部は言えません。
- この記事のキーワード
