🚅

日本の鉄道路線をMATLABでプロットしてみる

2023/08/31に公開

はじめに

日本の鉄道路線の緯度経度が国土交通省により公開されているため,
matlabでplotして遊ぶ.
matlabではgeoplotを使うと簡単に地図上のプロットが作成できる.

データの出典:国土交通省国土数値情報ダウンロードサイト(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-v2_3.html)

結論

めっちゃ楽しい!!!

今回のソースコードは下記リポジトリにある.
https://github.com/Spargel125/RailwayCoordinateData/tree/main

方法

データの取得

上記の国交省ページから鉄道路線数値データをダウンロードする.
今回は令和元年のデータを使用する.(そのため,西九州新幹線はない)
ダウンロードデータの中には会社名と路線の一覧や,鉄道路線や駅の緯度経度が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で開くとわかりやすい.

なお,色は下記サイトを参照する.
https://ayaito.net/webtips/color_code/164/

新幹線

新幹線だ!!

コード
%新幹線
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