47都道府県の TopoJSON (あるいは shapefile でも GeoJSON でも良い)がほしいのだが、これが案外見つからない。同じ問題に直面した人が他にもいた。
GeoJSON を提供してくれている人を見つけたが、ライセンスが不明確なので使うのが躊躇される。
行政区域データの全国版の GeoJSON がある(仕様には書かれていないが平成30年度以降の行政区域データには GeoJSON も含まれている)ので試しに geo2topo
をやってみたら、
# node:buffer:791
# return this.utf8Slice(0, this.length);
# ^
# Error: Cannot create a string longer than 0x1fffffe8 characters
# at Buffer.toString (node:buffer:791:17)
# at JSON.parse (<anonymous>)
# at ReadStream.<anonymous> (/.../topojson-server/bin/geo2topo:107:46)
# at ReadStream.emit (node:events:513:28)
# at endReadableNT (node:internal/streams/readable:1359:12)
# at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
# code: 'ERR_STRING_TOO_LONG'
# }
というエラーが出てきた。 GeoJson のファイルは1.2GBもあり、 JSON が巨大すぎて Node の string サイズの上限(512MiB)を超えているらしい。
ここで47都道府県の TopoJSON を得るために3つの選択肢が出てきた。
1. humdata.org のデータを使う
国際連合人道問題調整事務所が提供しているデータ。
ライセンスも CC BY-IGO (初めて聞いた🤯。おそらく3.0?)なので取り回しが良さそう。これを使うのが一番手っ取り早いと思われる。
2. 巨大なJSONを頑張ってパースする
ライブラリを使うことで JSON を分割してパースすることが可能らしい。
ただし使うにはおそらく geo2topo のソースをいじる必要があるので難易度がかなり高い。僕の技術力で実現可能かわからない。
3. 各都道府県をつなぎ合わせる
各都道府県を topomerge
とかを駆使して行政区をマージして、47都道府県が揃ったら全部をつなぎ合わせる方法。少しとりかかってみて、都道府県のキーでマージしようとして topomerge -k 'd.properties.N03_001'
をやって出力ファイルをQGISで確認してみたけど何も映らなかった(ファイルの中身はちゃんと TopoJSON っぽいんだけど)。僕の技術力でもギリギリ達成可能な気がするし一番勉強になりそうだけど前途多難な感じがする。
結論
humdata.org のデータを使います。