日本の鉄道路線をMATLABでプロットしてみる
はじめに
日本の鉄道路線の緯度経度が国土交通省により公開されているため,
matlabでplotして遊ぶ.
matlabではgeoplot
を使うと簡単に地図上のプロットが作成できる.
データの出典:国土交通省国土数値情報ダウンロードサイト(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-v2_3.html)
結論
めっちゃ楽しい!!!
今回のソースコードは下記リポジトリにある.
方法
データの取得
上記の国交省ページから鉄道路線数値データをダウンロードする.
今回は令和元年のデータを使用する.(そのため,西九州新幹線はない)
ダウンロードデータの中には会社名と路線の一覧や,鉄道路線や駅の緯度経度がxmlやgeojson(jsonの亜種?)で格納されている.
本記事では路線のデータのN02-19_RailroadSection.geojson
を使用する.
matlabコード
json
形式はMATLABのjsondecode()
でstruct
形式に読み込めるが,上記データのgeojson
はkeyが日本語であるので,読み込むのには一工夫する必要がある.
txt = readlines("N02-19_RailroadSection.geojson");
txt = strrep(txt,'鉄道区分','railsegments');
txt = strrep(txt,'事業者種別','companysegments');
txt = strrep(txt,'路線名','railname');
txt = strrep(txt,'運営会社','company');
geojson = jsondecode(strjoin(txt))
上記では,初めにreadlines
で読み込む.このときtxtは文字列配列になる.
次に,key
が日本語ではstruct
にした時のfield名が適当に割り当てられて使いにくいので,英語に置換する.
そして最後にjsondecode
により読み込む.なおこのとき,strjoin
で文字列配列の各要素を結合して文字列にしている.
次に,路線の座標を抽出する.
路線名や事業者名はgeojson.features.properties
に,緯度と経度はgeojson.features.geometry.coordinates
に格納されているので,for文で路線名と事業者が一致するインデックスを抽出していく.
山陽新幹線をプロットする場合は下記.
railName = "山陽新幹線";
company = "西日本旅客鉄道";
railcoordinate = [];
for ii=1:length(geojson.features)
if string(geojson.features(ii).properties.railname)==railName && string(geojson.features(ii).properties.company)==company
railcoordinate = [railcoordinate;geojson.features(ii).geometry.coordinates];
end
end
最後に,geoplot
によりプロットする.
geoplot(railcoordinate(:,2),railcoordinate(:,1),'.',"Color","#0072BA");
すると,下記のプロットが得られる.
山陽新幹線の見慣れた形が得られる!楽しい!!!
関門海峡を越えるS字カーブもばっちり見える!
いろいろなプロット
路線名と事業所名からプロットするまでを関数(下記)にまとめ,いろいろプロットしてみる.
下記関数は路線名,事業所名,色を指定する.
function plotCoordinate(gx,geojson,railName,company,color)
railcoordinate = [];
for ii=1:length(geojson.features)
if string(geojson.features(ii).properties.railname)==railName && string(geojson.features(ii).properties.company)==company
railcoordinate = [railcoordinate;geojson.features(ii).geometry.coordinates];
end
end
railcoordinate = sortrows(railcoordinate);
geoplot(gx,railcoordinate(:,2),railcoordinate(:,1),'.',"Color",color);
end
路線の正式名称は,N02-19_RailroadSection.dbf
をexcelで開くとわかりやすい.
なお,色は下記サイトを参照する.
新幹線
新幹線だ!!
コード
%新幹線
figure;
gx = geoaxes;
hold(gx)
railname = ["山陽新幹線","東海道新幹線","東北新幹線","北海道新幹線","九州新幹線"];
company = ["西日本旅客鉄道","東海旅客鉄道","東日本旅客鉄道","北海道旅客鉄道","九州旅客鉄道"];
color = ["#0072BA","#FF7E1C","#378640","#03C13D","#F62E36"];
for ii=1:length(railname)
plotCoordinate(gx,geojson,railname(ii),company(ii),color(ii))
end
function plotCoordinate(gx,geojson,railName,company,color)
railcoordinate = [];
for ii=1:length(geojson.features)
if string(geojson.features(ii).properties.railname)==railName && string(geojson.features(ii).properties.company)==company
railcoordinate = [railcoordinate;geojson.features(ii).geometry.coordinates];
end
end
railcoordinate = sortrows(railcoordinate);
geoplot(gx,railcoordinate(:,2),railcoordinate(:,1),'.',"Color",color);
end
大阪近辺
みなれた路線図が見える!!
コード
愛称と正式名称が違いすぎる!!!
%大阪
figure;
gx = geoaxes;
hold(gx)
railname = ["大阪環状線","東海道線","湖西線","福知山線","阪和線","関西線","JR東西線","片町線","関西空港線","おおさか東線","奈良線","山陰線","桜井線","和歌山線","草津線"];
color = ["#e73042","#0071be","#00a7e3","#fcc800","#f5a200","#00a469","#e73082","#e73082","#0071be","#3b7293","#bd7b19","#7c86c1","#cf1225","#f3a8be","#60ad3b"];
for ii=1:length(railname)
plotCoordinate(gx,geojson,railname(ii),"西日本旅客鉄道",color(ii))
end
geolimits([34.362 35.052],[135.060 136.124])
function plotCoordinate(gx,geojson,railName,company,color)
railcoordinate = [];
for ii=1:length(geojson.features)
if string(geojson.features(ii).properties.railname)==railName && string(geojson.features(ii).properties.company)==company
railcoordinate = [railcoordinate;geojson.features(ii).geometry.coordinates];
end
end
railcoordinate = sortrows(railcoordinate);
geoplot(gx,railcoordinate(:,2),railcoordinate(:,1),'.',"Color",color);
end
大阪の地下鉄
大阪メトロもばっちり!
コード
まだ大阪市営地下鉄だった...とおもったら正式名称違った(大阪市高速電気軌道)
そういえば路線名は1号線,2号線がつくんでしたね
%大阪地下鉄
figure;
gx = geoaxes;
hold(gx)
railname = ["1号線(御堂筋線)","2号線(谷町線)","3号線(四つ橋線)","4号線(中央線)","5号線(千日前線)","6号線(堺筋線)","7号線(長堀鶴見緑地線)","8号線(今里筋線)","南港ポートタウン線"];
color = ["#e5171f","#522886","#0078ba","#019a66","#e44d93","#814721","#a9cc51","#ee7b1a","#00a0de"];
for ii=1:length(railname)
plotCoordinate(gx,geojson,railname(ii),"大阪市高速電気軌道",color(ii))
end
geolimits([34.541 34.785],[135.348 135.724])
function plotCoordinate(gx,geojson,railName,company,color)
railcoordinate = [];
for ii=1:length(geojson.features)
if string(geojson.features(ii).properties.railname)==railName && string(geojson.features(ii).properties.company)==company
railcoordinate = [railcoordinate;geojson.features(ii).geometry.coordinates];
end
end
railcoordinate = sortrows(railcoordinate);
geoplot(gx,railcoordinate(:,2),railcoordinate(:,1),'.',"Color",color);
end
最後に
私鉄(阪急とか阪神など)もデータはあるので,いっぱい遊べそう
Discussion