🚃

貨物線入り鉄道線路図を作りたいので基盤地図情報と仲良くなる

2023/12/23に公開

前提

この記事は、 FOSS4G Advent Calendar 2023 の24日目です。
晴れてOSGeo.JPの個人会員の入会申し込みが承認されたmipsparcです。仲間も増えて嬉しいですし、引き続きGISと仲良くなっていきたいです。

この記事は基盤地図情報を扱ったことがなかったり、入門者など向けの記事です。

さて、私のことをご存知の方は知ってらっしゃると思いますが、鉄道マニアです。旅客線のみならず貨物線(旅客ではなく通常は貨物のみを運ぶための線路)も結構好きです。そこで、貨物線がしっかりと描かれた地図を見たいと考えました。

(ちなみに、過去には「だれでも撮影地マップ」というユーザー投稿型鉄道撮影地マップサービスを個人開発しました。今でもぽつぽつと投稿があって嬉しいです。)

各データソースごとの状況

武蔵野線(通称武蔵野南線) 梶ヶ谷貨物ターミナル駅の西側、地下に潜る地点で比較します。

Google Maps

以前Google Mapsがゼンリン地図ベースだった時代はだいぶ細かく書かれていたのですが、現在のGoogle Mapsではほとんどの場合表示されなかったり、空き地扱いなどが多いです。ここでは地上にある線路は描かれていますが、地下に入ってからは何もデータがありません。

Google Maps( https://maps.app.goo.gl/N9oo4pdSZDqkAi3M7 )より著作権法に基づく引用 2023-12-20閲覧

国土数値情報 鉄道データ

国土交通省が提供する「国土数値情報」には、「鉄道データ」というものがあります。これは鉄道要覧などをベースに運営事業者、路線名メタデータなども入ったよくばりセットのようなものなのですが、注記に「旅客鉄道・軌道以外の路線・駅(貨物線、構内専用線、引込み線、索道等)が存在していないか比較」(つまり「貨物線、構内専用線、引込み線、索道等」をすべて丁寧に除去しているというのです)ということが書かれていてがっかりしました。これは今回の目的に全く合致しません。

OpenStreetMap

OpenStreetMapでは、マニアの方が入力に勤しまれている(すばらしい貢献だと思います)こともあり、多くの貨物線は網羅されています。地下を走る線路についてはあまり描かれていないと執筆時まで思っていたのですが、ラスタ(画像)にするときに優先度が低く描画されないだけで、実際にはかなり網羅されていました。以下の画像では地下線路は破線で描かれています。

© OpenStreetMap Contributors
メタデータも詳細にあるので、OSMで大抵は事足りると思います。

国土地理院 基盤地図情報

国土地理院にはすべての基本となるとされるベクタデータ「基盤地図情報」というものがあります。13項目ある内容のうちのひとつに「軌道の中心線」というのがあり、これが線路を示します。
仕様書「基盤地図情報ダウンロードデータファイル仕様書5.0」には

軌道法(大正十年法律第七十六号)第一条第一項に規定する軌道及び同法が準用され
る軌道に準ずべきもの並びに鉄道事業法(昭和六十一年法律第九十二号)第二条第一
項に規定する鉄道事業に係る鉄道線路の中心線。

と定義されています。これは期待できそうです。今回はこれを使ってみたいと思います。

基盤地図情報

データ構成

  • 場所: 座標が列挙されて作られた線分が複数まとめて1つの地物とされています。PostGISでいうところのMULTILINESTRING相当のデータです。
  • 種別: 以下8種類に分類されています
    • 普通鉄道
    • 路面の鉄道
    • 特殊軌道
    • 索道
    • トンネル内の鉄道
    • 建設中の鉄道
    • その他
    • 不明
  • 名称: これが大変に微妙で、全国で4159個しかNULLでない地物がありません。しかも、1路線に1つというわけでもなく、「整備されている線路(たとえば東海道新幹線)についてはいくつも名称付き地物があるが、整備されていない線路はなにもない」状況です。これは使えません。

入手手順

まず、国土地理院の基盤地図情報サイトにいって、ダウンロードページに遷移します。そこで基盤地図情報「基本項目」のファイル選択ページに移ります。

とにかく全国の入手が面倒!

「都道府県または市区町村で選択」をクリックすると、「全国」のチェックボックスがありますが、 全国の場合、項目別にダウンロードすることができません
そのため、全項目をダウンロードする必要があります。

「選択リストに追加」でリストに追加されます。この時点で日本のすべての地域メッシュが選択されており、このまま「ダウンロードファイル確認へ」を選択します。

このリストから、 ひとつひとつ ダウンロードする必要があります。なお、 いやらしいことに 1セッションにつき1つのファイルしか同時にダウンロードができません。気が狂いそうです。

ダウンロードするファイルの数を減らす

実は、項目が決まっている場合は全ファイルをダウンロードする必要はありません。

このように書かれていますから、今回の軌道の中心線については※1、3、5とダウンロードしていけばいいです。(こちらは比較的ファイルサイズが小さいので助かります)
とりあえず、ここはがんばってください。あ、ログインは予めしておきましょう。

ダウンロードしたファイルを扱う

cabファイルを展開する

CABファイルという古式ゆかしき圧縮形式ですが、Linuxでもcabextractというコマンドで展開できます。

cabextract ./*

というコマンドでカレントディレクトリのすべてのcabファイルが展開されますが、 あらかじめダウンロードディレクトリから別の新しいディレクトリを作ってその中に移動してから実行してください さもないとZIPファイルまみれになります。

(なんでZIPファイルをCABファイルでまとめているのか、それは宇宙の謎です)

ZIPファイルをさらに展開する

エリアごとに分けるとかは、したければすればいいですが、全国を扱う場合は不要です。

unzip "./*"

(シェルがワイルドカードを展開してしまうのでダブルクオートが大事です)
すると、
replace fmdid22-0701.xml? [y]es, [n]o, [A]ll, [N]one, [r]ename:
と聞かれるので、これは N (None)で大丈夫です。

今回不要なファイルを削除する

まずcabファイルは不要です。それと、ZIPファイルも不要です。削除してしまいましょう

$ rm *.cab
$ rm *.zip

つぎに、fmdidから始まるXMLファイルは、基盤地図情報についての立場や責任、測地系などの解説用のXMLファイルなので、1つ読めば削除して大丈夫です。

$ rm fmdid*.xml

さらに、今回は「軌道の中心線」だけ使いたいので、

$ rm *RdCompt*
$ rm *GCP*
$ rm *AdmArea*
$ rm *AdmPt*
$ rm *AdmBdry*
$ rm *Cstline*
$ rm *RdEdg*

と、関係ない地物種別を削除します。(grep使って除外削除してもいいです)
これで

$ ls -1
FG-GML-624002-RailCL-20160401-0001.xml
FG-GML-624011-RailCL-20230701-0001.xml
FG-GML-624012-RailCL-20220701-0001.xml
FG-GML-624021-RailCL-20220701-0001.xml
FG-GML-624022-RailCL-20230401-0001.xml
FG-GML-624032-RailCL-20230401-0001.xml
FG-GML-624033-RailCL-20230101-0001.xml
FG-GML-624043-RailCL-20230701-0001.xml
FG-GML-624044-RailCL-20230701-0001.xml
FG-GML-624054-RailCL-20230701-0001.xml
FG-GML-624055-RailCL-20230701-0001.xml
...

のようになったはずです。
やっとスタートラインに立てましたね!

QGISでまずGMLのままで表示してみる

とりあえず、XMLファイルをまずは全選択してドラッグ・アンド・ドロップしてみましょう。



どうでしょうか。どんな強力なマシンでもある程度の範囲を描画した時点で固まってしまうのではないでしょうか。

変換 -そもそもこのXMLはなにか-

これは、2次メッシュ単位でXMLフォーマットで記述した、GML(Geography Markup Language)と呼ばれるものです。ISO19136として標準化されており、それに準ずる国内規格としてJIS X 7136「地理情報-地理マーク付け言語(GML)」が標準化されています。
試しに、FG-GML-674211-RailCL-20220701-0001.xmlの中身を見てみましょう。

<?xml version="1.0" encoding="utf-8"?>
<Dataset xsi:schemaLocation="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema FGD_GMLSchema.xsd"
	xmlns:gml="http://www.opengis.net/gml/3.2"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xmlns="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema"
	gml:id="Dataset1">
  <gml:description>基盤地図情報メタデータ ID=fmdid:22-0701</gml:description>
  <gml:name>基盤地図情報ダウンロードデータ(GML版)</gml:name>
<RailCL gml:id="K21_5116516110_1">
<fid>51165-16110-s-367</fid>
<lfSpanFr gml:id="K21_5116516110_1-1">
<gml:timePosition>2018-12-10</gml:timePosition>
</lfSpanFr>
<devDate gml:id="K21_5116516110_1-2">
<gml:timePosition>2022-06-28</gml:timePosition>
</devDate>
<orgGILvl>25000</orgGILvl>
<vis>表示</vis>
<loc>
<gml:Curve gml:id="K21_5116516110_1-g" srsName="fguuid:jgd2011.bl">
<gml:segments>
<gml:LineStringSegment>
<gml:posList>
44.753099111 142.125000000
44.753109722 142.125287222
44.753109722 142.125555278
(省略)
44.751466944 142.133036389
44.751342778 142.133308889
44.751330917 142.133333333
</gml:posList>
</gml:LineStringSegment>
</gml:segments>
</gml:Curve>
</loc>
<type>普通鉄道</type>
</RailCL>
<RailCL gml:id="K21_5116816110_1">
<fid>51168-16110-s-1</fid>
<lfSpanFr gml:id="K21_5116816110_1-1">
<gml:timePosition>2014-01-23</gml:timePosition>
</lfSpanFr>
<devDate gml:id="K21_5116816110_1-2">
<gml:timePosition>2022-06-28</gml:timePosition>
</devDate>
<orgGILvl>25000</orgGILvl>
<vis>表示</vis>
<loc>
<gml:Curve gml:id="K21_5116816110_1-g" srsName="fguuid:jgd2011.bl">
<gml:segments>
<gml:LineStringSegment>
<gml:posList>
44.751330917 142.133333333
44.751195278 142.133612778
44.751023056 142.133934722
(省略)
44.750421667 142.134809722
44.750230000 142.134983333
44.750000000 142.135183194
</gml:posList>
</gml:LineStringSegment>
</gml:segments>
</gml:Curve>
</loc>
<type>普通鉄道</type>
</RailCL>
</Dataset>

このように、LINESTRING(座標の羅列によって線分を形成する)が1個以上含まれているものになっています。
しかし、これを1ファイルずつ2600以上に渡るファイルをパースするのはなかなか非効率なようです。

そこで、取れる方法はいくつかあります。
たとえば、

  • ogr2ogr コマンドなどでPostGISに入れる
  • 同コマンドで他形式(GeoPackageなど)に変換する
    などです。

しかし、ogr2ogrコマンドはあまりうまく行かなかったため、他の方策を検討しました。

その結果、結論としてはフリーオープンソースソフトウェアで完結しなかったのは残念ですが、 基盤地図情報ビューア (Windows専用アプリケーション)ですべてのGMLファイルを一括でインポート、シェープファイル形式などにエクスポートする機能が存在したため、それを活用することとしました。これにより、単一のシェープファイル(セット)に統合することができました。

QGISで表示

改めてQGISで表示しようと思います。
基盤地図情報はJGD2011という測地系が採用されていることに留意が必要です。

JGD2011からWGS84に変換する

1つのシェープファイル(群)に統合した結果、一瞬で全国の表示ができるようになりました。

東京貨物ターミナル駅(JR貨物)と、大井車両基地(JR東海・東海道新幹線)のあたりを表示してみました。1本1本の線路がきちんと表示されています。複線になっている区間も1本にまとめられることはありません。これは理想的な地図です。

地物選択画面では、メタデータがShift-JISエンコーディングのため、文字化けしてしまいます

そこで、左ペインのレイヤを右クリックして、文字コードをUTF-8からShift-JISに変更すると正常に表示されます

(基礎的なQGISの使い方ですが)

今後の展望

PostGISなどに挿入して、線分データをネットワーク化してなにかしら面白いことができないかなと夢想しています。
また、国土地理院の許可を得てWeb地図化するのも面白そうです。

次回

FOSS4G Advent Calendar 2023 明日、最終日はritoさんの「地図からこだわりの道を抽出する方法」(予定)です!

Discussion