日本列島をLaTeXで表示させたかったのでSVGをTikZに変換するプログラムを作った

この記事はTeX & LaTeX Advent Calendar 2019 16日目の記事です. 15日目は aminophenさんでした.17日目はt-kemmochiさんです.

はじめに

LaTeXは論文や理工系のレポートを書くのにとても特化したすばらしいツールです. また,様々なパッケージが提供されており,TeXLaTeXだけで様々なものを作れます.

自分はこれまでそんなLaTeXを使っていろいろ遊んできました.

LaTeXで提供されているTikZという図を描画できるソフトでデレマスの名刺を作ったり muscle-keisuke.hatenablog.com

GPSのログをLaTeXで処理して表示した画像上にTikZでGPSの軌跡を表示したり muscle-keisuke.hatenablog.com

TeXで定義できるマクロを再帰的に呼び出せることを利用しTikZでフラクタル図形を描画したりしました. muscle-keisuke.hatenablog.com

さて,今回のテーマは

「日本列島をLaTeX(TikZ)のコマンドだけで描画してみる」です.

今年のAdvent CalendarのテーマはLuaLaTeXですが,全く守る気がありません.

きっかけ

CountriesOfEurope

CTANにはCountriesOfEuropeというヨーロッパ諸国を表示できるコマンドが定義されているパッケージがあります.

www.ctan.org

\documentclass{article}
\usepackage[Scale=7.5]{countriesofeurope}
\begin{document}
This is Germany $\rightarrow$ \EUCountry[Scale=3]{Germany}
\end{document}

もうこれだけでドイツが出ます.(もちろん他のヨーロッパ圏の国も出せます.) f:id:muscle_keisuke:20191211012542p:plain

しかし,ヨーロッパだけで自分が住んでいる日本がないのはとても悔しかったのです.

「なければ自分で作ればよい」

ということで,作ることにしました.

方針

自分の中で2つの方法が思い浮かびました. - 日本地図を目視で確認してTikZのコマンドを巧みに使って一から描いていく - ベクタ画像のテキストをTikZのコマンドに変換するスクリプトを作る

今回はスケジュールを見積もった結果2番目の方法が良さそうなので変換スクリプトを作ることにしました.

作っていく

まずは日本列島のベクタ画像を持ってくる

今回は画像をLaTeXの形式に変換するので,点で画像を構成しているラスタ画像ではなく,線で構成しているベクタ画像を持ってきます.

ここの画像を持ってきます. 画像形式はSVG形式です.SVGはScalable Vector Graphicsの略でXMLベースのスキーマで描画命令が書かれているベクタ画像の形式です.

https://d-maps.com/m/asia/japan/japon/japon04.svg

SVGだったのでSVGの描画命令を理解する

SVGを開くとテキストが以下のように羅列しています.

<path class="fil1 str0" d="M15159.54 1008.44l-433.65 0c8.17,33.38 12.53,58.06 17.98,92.12 4.78,30.66 17.04,45.65 24.53,76.3
 4.08,16.35 5.45,27.25 8.17,43.6 9.54,57.23 10.9,90.61 10.9,148.51 0,23.85 7.5,38.84 0,61.32 -2.72,8.86 -8.85,13.62 -13.62,21.79 
8.17,4.78 14.98,5.45 21.8,10.9 14.31,12.27 15.67,27.25 24.52,43.6 7.5,13.63 19.76,18.4 24.53,32.7 7.5,20.44 6.13,35.43 16.35,54.5 
7.5,14.31 19.76,18.4 29.97,29.98 17.04,18.4 29.3,27.25 51.78,38.15 3.41,-45.64 1.36,-73.58 21.8,-114.45 5.44,-11.58 5.44,-22.48 
13.62,-32.7 12.26,-14.99 32.7,-11.58 43.6,-27.25 6.81,-10.21 4.09,-21.11 8.17,-32.7 10.23,-27.25 22.49,-39.51 35.43,-65.4 
19.76,-40.19 25.89,-67.44 32.7,-111.72 2.05,-13.63 8.17,-21.8 8.17,-36.1l0 -85.84c0,-26.57 7.5,-41.56 16.35,-66.09 10.9,-29.97 
22.59,-52.61 36.9,-81.22zm
...
"/>

まずはこれらのテキストを読み解いてどういう描画を行っているのかを理解する必要があります.

以下のページを参考にSVGの描画命令について見てみました. triple-underscore.github.io

そうすると線の描画を行っているのは

<path class="fil1 str0" d="ここの部分"/>

d=の先の数字の羅列です.この数字の羅列をパスデータといいます. パスデータに含まれているアルファベットが直線を描くのか曲線を描くのかの命令になっています. アルファベットと描画命令の対応は以下のようになっています.

描画命令と引数 意味
M(x,y) 絶対座標(x,y)に描画点を移動する
L(x,y) 現在の描画点から絶対座標(x,y)に直線を描画する
C(x1,y1,x2,y2,x,y)+ 現在の描画点から絶対座標(x1,y1),(x2,y2)を制御点として(x,y)まで三次ベジェ曲線を描画する,3つ以上引数に取ることができて,その後の引数は第一制御点,第二制御点,曲線の終点の座標の順番を繰り返し指定する.
z(引数なし) 線を閉じるように直線を引く

それぞれの大文字に対応する小文字は引数に取る座標が現在の描画点に対する相対座標となります. また,引数の間はカンマでも空白でも認識されます. つまり

<path class="fil1 str0" d="M15159.54 1008.44l-433.65 0c8.17,33.38 12.53,58.06 17.98,92.12 4.78,30.66 17.04,45.65 24.53,76.3

というパスデータをアルファベット毎に改行すると

M15159.54 1008.44
l-433.65 0
c8.17,33.38 12.53,58.06 17.98,92.12 4.78,30.66 17.04,45.65 24.53,76.3

となり,絶対座標(15159.54, 1008.44)を開始点とし,そこから相対座標(-433.65, 0)へ直線を引き第一制御点を相対座標(8.17,33.38) ,第二制御点(12.53,58.06),曲線の終点(17.98,92.12)の三次ベジェ曲線,第一制御点を相対座標(4.78,30.66) ,第二制御点(17.04,45.65),曲線の終点(24.53,76.3)の三次ベジェ曲線を引く という命令になります.

3次ベジェ曲線とは

開始点P 第一制御点Q 第二制御点R 終点S としたとき PQ,QR,RSをt:1-tで内分したときのそれぞれの内分点P',Q',R'を結んだ P'Q',Q'R'を更にt:1-tで内分した点P'',Q''を結んだ点をt:1-tで内分した点の集合で描画される曲線(tを0から1動かしたときの軌跡)

以下のサイトは手書きでベジェ曲線を描いていてわかりやすいと思います.

nixeneko.hatenablog.com

SVGの命令を文字列処理してTikZに変換するプログラムを作る

SVGの命令がわかったところで,これをTikZに変換するプログラムを作っていきます.

Perlで作る(LaTeXでやれや)

現在,業務でPerlを使うことが多いので練習がてらPerlを使って作ることにします. いつもならLaTeXで全部実装するところなんですが,時間がないのでPerlでちゃちゃっと作っちゃいます.

SVGの命令とTikZのコマンド対応を考える

SVGの命令は先程の表の通りです.対応するTikZのコマンドは

描画命令と引数 意味 TikZコマンド
M(x,y) 絶対座標(x,y)に描画点を移動する | start_x,start_y,current_x,current_yx,yを代入する
L(x,y) 現在の描画点から絶対座標(x,y)に直線を描画する \draw(current_x, current_y) -- (x, y);
C(x1,y1,x2,y2,x,y)+ 現在の描画点から絶対座標(x1,y1),(x2,y2)を制御点として(x,y)まで三次ベジェ曲線を描画する,3つ以上引数に取ることができて,その後の引数は第一制御点,第二制御点,曲線の終点の座標の順番を繰り返し指定する. \draw (current_x, current_y) .. contorols (x1, y1) and (x2, y2) .. (x, y);
z(引数なし) 線を閉じるように直線を引く \draw (current_x, current_y) -- (start_x, start_y);

current_x, current_yは現在の描画点の座標start_x,start_yは描画開始した際の一番最初の座標です.

SVGは現在の描画点を内部的に保存して次の線を引きますが,TikZは線を引くたびに引き始めの座標を指定する必要があるのでプログラムの変数で保存しておく必要があります.

なので,描画点を決めるM(x,y)の命令が来たときにstart_x,start_y,current_x,current_yを代入するようにします.

原寸大はでかすぎてタイプセットできない

<path class="fil1 str0" d="M15159.54 1008.4...

のように最初から1万超えの座標から描画するとLaTeXはすぐに描画できなくなります. なので,TikZに変換するときに縮小して計算して,TikZのコードを生成します.

Perlで実装していく

SVGファイルを読み込む

sub load_SVG_file {
    my $file_name = shift;

    die 'Can\'t open file !' unless(
        open(
            my $svg, '<', $file_name
        )
    );
    my $svg_code = do {local $/; <$svg>};
    close $svg;

    return [ split(/\n/, $svg_code) ];
}

ファイルから読み込んだテキストから描画命令を分割する

sub read_path_list {
    my $svg_lines = shift;

    return grep { 
        $_ =~ /<path class=/ 
    } @$svg_lines;
}

<path class=...に描画に関する情報があるので,パターンマッチで取り出します.

sub get_svg_opes {
    my $svg_info = shift;

    $svg_info =~ /<path class=.*d="(.*)"\/>/;
    my $coodinates_string = $1;

    return [ split(/(?=[a-zA-Z])/, $coodinates_string) ]; # 肯定的先読み
}

正規表現を使って描画命令(アルファベット)毎に文字列を分割しますが,分割文字を消したくはないので肯定的先読みで分割した上でアルファベットを残します.

abicky.net

取得した描画命令によって分岐する

sub convert_tikz_from_svg_opes {
    my ($svg_opes, $scale) = @_;

    my $start_point = [0, 0];
    my $current_point = [0, 0];
    my $output_code = '';

    for my $cursor (@$svg_opes) {
        if ($cursor =~ /M/) {
            $current_point = fetch_abs_point($cursor, $scale);
            $start_point = $current_point;
        }
        elsif ($cursor =~ /m/) {
            $current_point = fetch_rel_point($cursor, $current_point, $scale);
            $start_point = $current_point;
        }
        elsif ($cursor =~ /l/) {
            my $converted = fetch_draw_line_ope($cursor, $current_point, $scale);
            $current_point = $converted->{new_point};
            $output_code .= $converted->{tikz_ope};
        }
        elsif ($cursor =~ /c/) {
            my $converted = fetch_draw_cubic_bezier_curve_ope($cursor, $current_point, $scale);
            $current_point = $converted->{new_point};
            $output_code .= $converted->{tikz_ope};
        }
        elsif($cursor =~ /z/) {
            my $converted = fetch_close_path_ope($current_point, $start_point);
            $current_point = $converted->{new_point};
            $output_code .= $converted->{tikz_ope};
        }
    }
    return $output_code;
}

M(描画点を指定の絶対座標に移動する)

sub fetch_abs_point {
    my ($ope, $scale) = @_;
    $ope =~ /M(-?[0-9.]*)[ ,](-?[0-9.]*)/;

    return [$1*$scale, $2*$scale];
}

m(描画点を指定の相対座標に移動する)

sub fetch_rel_point {
    my ($ope, $current_point, $scale) = @_;
    $ope =~ /m(-?[0-9.]*)[ ,](-?[0-9.]*)/;

    return [($1*$scale + $current_point->[0]), ($2*$scale + $current_point->[1])];
}

l(現在の描画点から指定の相対座標に直線を引く)

sub fetch_draw_line_ope {
    my ($ope, $current_point, $scale) = @_;
    $ope =~ /l(-?[0-9.]*)[ ,](-?[0-9.]*)/;
    my $tikz_ope = sprintf(
        "\\draw (%f, %f) -- (%f, %f);\n",
        $current_point->[0],
        $current_point->[1],
        $1*$scale + $current_point->[0], $2*$scale + $current_point->[1]
    );
    return +{
        new_point => [($1*$scale + $current_point->[0]), ($2*$scale + $current_point->[1])],
        tikz_ope  => $tikz_ope
    };
}

c(現在の描画点から指定した第一制御点,第二制御点を元に指定した相対座標まで三次ベジェ曲線を引く)

sub fetch_draw_cubic_bezier_curve_ope {
    my ($ope, $current_point, $scale) = @_;
    my $tikz_ope = '';
    while(
        $ope =~ /(-?[0-9.]*),(-?[0-9.]*) (-?[0-9.]*),(-?[0-9.]*) (-?[0-9.]*),(-?[0-9.]*)/g
    ) {
        $tikz_ope .= sprintf(
            "\\draw (%f, %f) .. controls (%f, %f) and (%f, %f) .. (%f, %f);\n",
            $current_point->[0], $current_point->[1],
            $1*$scale + $current_point->[0],
            $2*$scale + $current_point->[1],
            $3*$scale + $current_point->[0],
            $4*$scale + $current_point->[1],
            $5*$scale + $current_point->[0],
            $6*$scale + $current_point->[1]
        );
        $current_point = [($5*$scale + $current_point->[0]), ($6*$scale + $current_point->[1])];
    }
    return +{
        new_point => $current_point,
        tikz_ope  => $tikz_ope
    };
}

z(現在の描画点から引き始めの描画点まで閉じるように直線を引く)

sub fetch_close_path_ope {
    my ($current_point, $start_point) = @_;
    my $tikz_ope = sprintf(
        "\\draw (%f, %f) -- (%f, %f);\n",
        $current_point->[0],
        $current_point->[1],
        $start_point->[0],
        $start_point->[1]
    );
    return +{
        new_point => $start_point,
        tikz_ope  => $tikz_ope
    };
}

最後にTeXファイルに出力する

sub save_TeX_file {
    my ($file_name, $save_texts) = @_;
    die 'Can\'t open file !' unless(
        open(
            my $tex, '>', $file_name
        )
    );
    print $tex $save_texts;
    die 'Can\'t close file' unless(
        close $tex
    )
}

出力結果はこんな感じです.

\draw (151.595400, 10.084400) -- (147.258900, 10.084400);
\draw (147.258900, 10.084400) .. controls (147.340600, 10.418200) and (147.384200, 10.665000) .. (147.438700, 11.005600);
\draw (147.438700, 11.005600) .. controls (147.486500, 11.312200) and (147.609100, 11.462100) .. (147.684000, 11.768600);
\draw (147.684000, 11.768600) .. controls (147.724800, 11.932100) and (147.738500, 12.041100) .. (147.765700, 12.204600);
\draw (147.765700, 12.204600) .. controls (147.861100, 12.776900) and (147.874700, 13.110700) .. (147.874700, 13.689700);
\draw (147.874700, 13.689700) .. controls (147.874700, 13.928200) and (147.949700, 14.078100) .. (147.874700, 14.302900);
\draw (147.874700, 14.302900) .. controls (147.847500, 14.391500) and (147.786200, 14.439100) .. (147.738500, 14.520800);
\draw (147.738500, 14.520800) .. controls (147.820200, 14.568600) and (147.888300, 14.575300) .. (147.956500, 14.629800);
...

 よさそう. 早速,\inputで読み込んで出力してみます.

\documentclass[dvipdfmx]{standalone}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \input{island}
  \end{tikzpicture}
\end{document}

逆さまの日本列島

これで生成してみると逆さまの日本列島が出ました. これは座標系がSVGLaTeXで違うのが原因だと考えられます. f:id:muscle_keisuke:20191214210114p:plain

y軸の正負を逆にする

Perlで変換する際のy軸の正負を逆にして出力します. f:id:muscle_keisuke:20191215220309p:plain

できた.

まとめ

ベクタ画像であるSVGも全てファイルはバイナリではなくテキストなので,簡単に変換できました.

汚いソースコードですが,一応,作ったものなので公開します.

Perl script for convert to SVG to TikZ

1年前のツーリングを振り返る 北海道1周ツーリング 13日目

蚊に刺されすぎて気が狂いそうになる

朝起きると,体中ぼこぼこに蚊に刺されまくっていました.

多分これまでの人生で最多刺されたと思います.

体をかきむしりながら札幌を出発しました.

初先頭

札幌から小樽まで走り,小樽は少しも観光せず,余市町まで行きました.

今では集団走行初心者ということで先頭が免除されてましたが,今ではグループが3人になってしまい, 2人の負担が大きくなってしまうので,自分も先頭を引くことになりました.

ハンドサインなどがちゃんと出せるか不安でしたが,特にトラブルもなく引くことができました.

自分は余市町セブンイレブンから積丹町のウニ丼のお店まで引きました.

ウニ丼のお店

積丹町といえば,ウニが有名です. その中でも「お食事処 みさき」というお店は割と人気なので自分たちもそこに行くことにしました.

昼過ぎに到着したので,ウニ丼はすでに売り切れでした. 自分はウニがそれほど好きではないのでダメージはなかったですが,他のメンバーはがっかりしていました.

自分はいくら丼を頼みました. いくらがキラキラ光っていてとてもキレイでした.

もちろん美味しかったです.

見事な積丹ブルー

満足したところで先に進みました.この先は少し道をそれると神威岬という岬があります.

何もないというか車が通らない

セイコーマートがない町村

漁港

#

走った距離

トンネルでGPSが狂ったので実際は124kmくらい

1年前のツーリングを振り返る 北海道1周ツーリング 12日目

テントで寝てる間も雨が土砂降りだったようでした.

明け方には雷が何度も鳴っていて,そのうちの一つはテントの近くに落ちて振動が来たくらいでした.

初パンク

今日は滝川にある大盛りメニューで有名な「マリン」というお店に行く予定です.

10時開店だったのでしばらくテントの中でゴロゴロしていると晴れてきました.

10時になるちょっと前に出発しようとした時,自分の自転車の異変に気づきました.

なんと,前輪の空気がまったくありませんでした.

ツーリング始まって以来の初めてのパンクでした.

急いでチューブを交換しましたが,交換して空気を入れた頃にはとっくに10時は過ぎてました.

マリン

泊まっていた公園から1.5kmくらいのところにあるのですぐ着きました.

とても派手な外見をしているのですぐわかりました. f:id:muscle_keisuke:20190822012301j:plain

席に通されてメニューを見てみると至って普通の品揃えと値段でした.

自分はカツカレーの普通盛り(850円)にしました.

できるまでは時間がかかるので,先程,修理したタイヤの空気を入れに外に出てました.

しばらくすると,カレーができたらしいので戻ってみると,

そこには

茶色い海がありました. f:id:muscle_keisuke:20190822012329j:plain

食いきれるか不安でしたが,毎日走ってお腹空いていていたので30分もかからずに平らげてしまいました. f:id:muscle_keisuke:20190822234214j:plain

まだ,お腹に余裕があったので,パフェもみんなで分け合って食べました. f:id:muscle_keisuke:20190822234339j:plain

美味しいし,安いし,大きいのでまた来たいと思えるお店でした.

お別れ

ここで,また一人メンバーとお別れになります.

稚内で膝を壊してしまったメンバーがこの後の日本縦断に備えて室蘭に直帰することになりました.

お互いにマリンの前でお別れをしました.

これで自分達の方は3人になってしまいました.

この期間がツーリングの中で一番人数が少なかった期間になります.

35km間コンビニなし

ひたすら国道275号線を走って札幌に向かいます.

辛いのはこの国道275号線には滝川市から月形町までの35km区間にコンビニが全くないことです.

起伏もないただ田んぼしかない道を35kmはかなりお尻も痛くて大変でした.

ちなみに2019年の6月くらいに滝川市と月形町の間にある浦臼町にローソンができたらしいです.

しかも,このローソン24時間営業じゃないんですね.

なぜか,この辺にはセイコーマートができずにローソンばっかりできるイメージがあります.

ついに札幌へ

月形町,当別町を抜けていくと,国道275号線とバイパスである国道337号線にぶち当たります.

ここでバイパスに乗り換えて札幌市内に向かっていきます.

しばらく走っていると,石狩川に架かる札幌大橋に差し掛かります.

ここから見える学園都市線の鉄橋が石狩川に反射してとてもキレイでした. f:id:muscle_keisuke:20190822012356j:plain

この札幌大橋を越えると札幌市に入ります.

北海道科学大学

今日は小樽市まで行く予定でしたが,札幌市で泊まることにしました.

札幌市内のセイコーマートで休んでいると近くに北海道科学大学があることがわかりました.

今日はもう走らないので見学がてら行ってみることにしました.

最近建て替えたばっかりらしくとてもきれいな建物でした. f:id:muscle_keisuke:20190822012423j:plain

手稲区に感動する

明日の朝ご飯を買いに手稲区にある複合商業施設に行きました.

それまでセイコーマートしかない街ばかり見ていたので 「すげー!一つの建物で100円ショップもあるしトライアルもあるのかよ!しかも同じ敷地に松屋まであるじゃん!」というこの十数日に田舎者からド田舎者になっていました.

とりあえず,この12日間で爪がかなり伸びてきていたので爪切りと明日の朝ご飯を買いました.

今日も自炊はせず松屋を食べて近くのスーパー銭湯に行きました.

地獄の公園

手稲区にある大きな公園に泊まることにしたのですが,この公園は今後の日程も含めて自分の中でワーストワンの公園でした.

トイレがめちゃくちゃ汚くて,蚊がめちゃくちゃ多かったです.少し歩くだけで蚊の壁にぶつかる感じです...

蚊取り線香も焚いたのですが,効果は今ひとつでした.

走った距離

1年前のツーリングを振り返る 北海道1周ツーリング 11日目

最高の朝焼け

今日は怪我のメンバーのことも考慮して4時半に起きました.

昨日は真っ暗の中到着したのでわからなかったのですが,とてもきれいな朝焼けが見えました. f:id:muscle_keisuke:20190822000437j:plain

いい一日が始まりそうな予感です.

ちなみにこの予感は外れることになります.

メカトラブルの悲劇

初山別村を超えて25km走った頃に事件は起きました.

自分の前を走っているメンバーの後輪が異常に横に振れてました.

一度止まって見てみると,スポークが1本折れてました.

羽幌町セイコーマートまで行き,修理をすることにしました.

奇跡的に別のメンバーがスポークとニップル回しを持っていたので修理できそうでした.

しかし,そのメンバーの後輪はスプロケットを外さなないとスポークを交換できない仕様になっていました.

さすがにスプロケ外しのような大きい工具は誰も持ってませんでした.

最寄りのサイクルショップは50km先の留萌市でした.

とりあえず他のメンバーで分散して荷物を持ち,ニップル回しで残りのスポークを調整して振れを取るという応急処置を取りました.

〒078-3714 苫前町字香川

こんなときにアレですが,香川という地名を発見しました. f:id:muscle_keisuke:20190822000526j:plain

25km程進み小平町鬼鹿というところに到着しました.

ここでも一応振れ取りを行い休憩後に 留萌市へ向けて出発しました.

一昨日まではオホーツク海で,昨日はずっと内陸を走っていましたが今日はずっと日本海が見えてました. 遠目から見たらオホーツク海日本海も変わらないように見えます. f:id:muscle_keisuke:20190822000555j:plain

あと25km.

なんとか留萌市

街並みが見えてきました.ついに留萌市に到着しました.

早速,サイクルショップに行くと,スプロケ外しやいろいろな工具を貸してくれました.

スポークが折れた人はずっとその工具で修理をしていました.

他の人は昼飯を買って食べたりしてました.

苦戦していたようですが,2時間くらいしたころについに修理が終わりました.

修理が終わった頃には雲ひとつない快晴の空が広がっていました.

これはいい再スタートになりそうな予感です.

ちなみにこの予感も外れることになります.

晴天からの土砂降り

留萌市の青看板についに「札幌」の文字が現れました. f:id:muscle_keisuke:20190822000639j:plain

自分の地元なのでなんだか嬉しい気持ちになりながら出発しました.

滝川市を目指して再び内陸へ走っていきます.

まずは北竜町を目指します.

留萌市北竜町の間には美葉牛峠というプチ峠があるのでそれをえっちらおっちら超えていくと,

見渡す限りの田んぼが広がっていました.

ひたすら何もない田んぼの中を走っているといきなり土砂降りの雨が降ってきた...

さっきまで雲ひとつなかったのに不幸でした.

レインウェアを来てなかったのでびちゃびちゃになったまま進みました.

やっとの思いで30km先の北竜町の碧水というところにあるセイコーマートに駆け込みました.

雨が一向に止む気配がないので レインウェアを来て残り20km頑張って走りきりました.

体が冷えてきたので「滝川ふれ愛の里」という施設にある温泉に入ることにしました.

雨が振っていましたが,露天風呂はいい湯でした.

風呂から上がって,今日は何を食べようか迷ってましたが,雨も降っていたので,結局,今日もコンビニで買うことにしました.

晴れからの土砂降りでテンションダダ下がり

ちょうど雨も上がったのでコンビニに行ってやきそば弁当やおにぎりなどを買い込んで今日,泊まる場所へ急ぎました.

その場所は少し坂を上ったところにあったので一生懸命登っていったのですが,結局,そこは泊まることが出来ないところでした.

しかも,そのタイミングで雨がまた土砂降りになって降ってきました.

テンションダダ下がりでさっきの温泉のところまで2.5km程戻って近くの泊まれそうなところに泊まることにしました.

みんな黙って雨の中テントを張ったりしてました.辛い.

トラック野郎

外は一向に土砂降りでした.

テントの中で冷えたやきそば弁当をすすってました.

メンバーのひとりがアマゾンプライでなにか見ようと言い出して,

何を見るのかと思えば「トラック野郎」という40年異常前にやっていた映画でした.

その映画はシリーズになっていて自分達が見たやつは北海道が舞台でこれまで走ってきたところが出てきたのもあってみんなななだかんだ最後まで見てました.面白いかどうかは自分にはよくわかりませんでした(笑)

走った距離

1年前のツーリングを振り返る 北海道1周ツーリング 10日目

別れの日

今まで5人でツーリングをしてきたのですが,一人,留学のスケジュールの関係で帰らなければなりませんでした.

その人は朝6半くらいに稚内から一人去っていきました.自走して室蘭に帰るらしいです.

自分は爆睡して見送れませんでした... f:id:muscle_keisuke:20190821000135j:plain

米軍バーガーガチ勢

今日はどんなに出発が遅れても米軍バーガーを食べることにしてました.

なので,11時の開店まではなんとかして時間を潰さなければなりません.

といってもやることがないので他のメンバーより先にライダーハウスを後にしました.

これまで溜まっていたセイコーマートのレシートを引き換えにセイコーマートへ行きました(確かこのとき5店舗くらいのセイコーマートのレシートを持っていくといろいろ引き換えにするフェアをやってたはず). f:id:muscle_keisuke:20190821000331j:plain

補給はセイコーマート縛りかってくらい行っていたのでそれなりにレシートは持っていました.

とりあえず,セイコーマートのソフトクリームを2つ引き換えて稚内駅で2個食いして時間を潰していました.

食い終わってもまだ時間があったので,防波堤ドームの奥の方を見てみようと行ってみました.

昨日は遠目から見て工事中だったのでスルーしていましたが,今日,近づいて見てみると,奥の方は全然工事していませんでした.

ってかパイロンがおいてあるだけで全然工事中じゃなかった. f:id:muscle_keisuke:20190821000405j:plain

そうこうしてるうちに残りのメンバーもやってきました.

自転車に空気を入れたいということで稚内駅に戻ることにしました.

稚内駅のすごいところはWi-fiスポットが完備だったり,自転車のフロアポンプを無料で貸し出していることです. f:id:muscle_keisuke:20190821000437j:plain

他のメンバーがフロアポンプを借りて自転車の空気を入れていると,いかにもツーリングしてそうな3人組がいました.

声をかけると山形大学から来ている人達でした.

山形大学の人達とデノーズへ

せっかくということで一緒にデノーズで米軍バーガーを食べることにしました.

もちろん店には一番乗りで入りました.

みんなそれぞれ米軍バーガーを頼んで,みんなで分けようと,「スラッピージョー」というメニューも頼みました.

しばらくすると,香ばしい匂いが漂ってきて米軍バーガーがやってきました.

目の前に置かれてびっくり,普段食べているハンバーガーの2回り3回りくらい大きかったです. f:id:muscle_keisuke:20190820235551j:plain

早速いただくと焼きたてのバンズがめちゃくちゃ香ばしくて感動しました. パティも横にめちゃくちゃでかいです.

これ一つで十分お腹いっぱいになるのですが,「スラッピージョー」なるメニューもやってきました. f:id:muscle_keisuke:20190821000502j:plain

米軍バーガーと同じくらいのサイズのハンバーグがやってきました.これもめちゃくちゃいい匂いで美味しそうです.

頂くと味付けが自分好みで濃厚でこってりした味でした.とても美味しかったしこれから元気に走れそうでした.

店を出て山形大学の人達と記念撮影をして,お互いに励まして別れました.

メンバーの一人の膝が破壊される

稚内を出発したのは昼頃です.

これまではひたすら北に向かっていたのを今度は逆に南へ向かいます.

また何もない道を4人で走っていたのですが,メンバーの一人の様子がおかしかったです.

その人は昨日強風の中宗谷岬から稚内市街まで全力で前を引いてくれた人でした.

様子を聞くと,膝が痛くて力が入らないとのことでした.原因は言わずもがな昨日の引きでした.

そこからは巡航速度17km/hくらいで進みました.

ゆるポタの日

昨日までの一日190km走っていたのとは打って変わってかなりゆるゆるのポタリングになりました.

違うメンバーの一人が何もなさすぎて暇になったのか音楽を大音量で流し始めました.

それもあってかその日は寝るまでずっとa-haの「Take On Me」がずっと頭の中で流れてました.

初ナイトライド

遠別町に到着した頃には外が薄暗くなってきました.

今日はここから20km先のキャンプ場に泊まる予定でした.

予定よりも遅かったので,今日は自炊を諦めて遠別町セイコーマートでがっつり食べて出発しました.

出発して遠別町を離れるとめちゃくちゃ暗くて怖かったです.街頭も全くなければ人家もないので自分達がつけてるフロントライトとたまに通る車のライトくらいしか明かりはありませんでした.

また,メンバーの一人が音楽を流し始めましたがこんな暗い中だったら逆に怖くなくなってよかったと思います.

初山別村カントリーサインが見えてきて後少しのところで登りが始まりました.

後ろを振り向くと暗闇しか見えなくて登っていくたびにどんどん下から暗闇が迫ってくるように見えました.

登り切ると,下にぽつらぽつらと明かりが見えてきました.ついにゴールが見えました.

一気に下っていってゴールしました.

併設されている温泉に入りテントを張って眠りにつきました.

走った距離

1年前のツーリングを振り返る 北海道1周ツーリング 9日目

太陽は素晴らしい

今日は稚内まで走るのでかなり早く起きました. テントから出てみると,綺羅びやかな太陽がちょうど,昇り始めていました.

さすが「日の出岬キャンプ場」というだけあるキレイな日の出でした. f:id:muscle_keisuke:20190819231044j:plain f:id:muscle_keisuke:20190819231117j:plain

まるで雲が太陽に吸い込まれているように見えます.

北見神威岬公園

何もないのはいつも通りのことですが,枝幸町に入ったタイミングで 公園があったので寄ってみました. f:id:muscle_keisuke:20190819231220j:plain f:id:muscle_keisuke:20190819231259j:plain

確かにキレイですが,それ以上のものは特にありませんでした.

ちなみにこちらは「北見神威岬」といい,北海道の積丹町にある直線距離にして260km先にある「神威岬」は数日後に通ります. f:id:muscle_keisuke:20190819003046p:plain

圧巻の風力発電

枝幸町を抜けると浜頓別町に入ります,

ここには市街地に到着するまでの間に巨大な風力発電機がずらりと並んでいるのが印象に残っています.

何もないの極み,エサヌカ線

浜頓別町を抜けて少し走ると,ツーリストの間で有名なエサヌカ線に入る道が出てきます.

今までも何もなかったのですがこのエサヌカ線

まじで何もないです.

今までは,電柱とかはあったのですが,それすらもないし,カーブもなければアップダウンもありません. f:id:muscle_keisuke:20190819231446j:plain f:id:muscle_keisuke:20190819231534j:plain

おまけに車もいないので,このように写真撮り放題です.

宗谷岬前の謎のアップダウン

猿払村を抜けるといよいよ稚内市に入ります. まずは日本最北端の「宗谷岬」を目指します.

青看板にも「宗谷岬」 の表示が見えてきました. 最北端でこれ以上先がないので真っすぐ行っても左に曲がっても稚内市街に行けるという表示が面白いですね. f:id:muscle_keisuke:20190819231713j:plain

岬まで何もない平地だと思っていたのですが...

とてつもないアップダウンが待ってました. f:id:muscle_keisuke:20190819232024j:plain f:id:muscle_keisuke:20190819232108j:plain

景色はとてもキレイでしたが...

日本最北端の岬

「日本最北端の給油所」,「日本最北端の郵便局」という表示がちらほら見え始めた頃に宗谷岬に到着しました. f:id:muscle_keisuke:20190819232202j:plain

近くのお土産屋で記念キーホルダーも買っちゃいました. f:id:muscle_keisuke:20190819232246j:plain

稚内市街までラストスパートです.

第2弾タイムアタック 米軍バーガー編

さて,この時点で160kmくらい走っているのですが

ここから更に30km程走らないといけません...

しかも,今日食べる予定だった稚内市街にあるデノーズというとてつもなくでかいハンバーガー(米軍バーガー)を食べられるお店があと1時間40分くらい(たしかそのくらい)でラストオーダーが終わってしまいます.

ということで第2弾タイムアタックが始まりました.

強風の向かい風が吹く中一人のメンバーがずっと先頭を走ってくれました.それでも風が強すぎて巡航速度は20kmちょっとしか出なかったです.

そのうち,自分がお腹が減ってしまい稚内空港辺りで千切れてしまいました.

後ろについてくれていたメンバーの一人が前に出てくれて自分のことを引いてくれました.

あのときはありがたかったし,申し訳なかったです...

市街地に入る直前のセイコーマートで補給をし,事なきを得ました...

ぎりぎりラストオーダー前にデノーズに到着しました.

しかし,ラストオーダーとは関係なしに米軍バーガーが品切れということでどちらにせよ食べられない運命でした...

せっかく30kmの間前を走ってくれたメンバーの頑張りも虚しく終わってしまいました. (しかも,次の日にこの人に更に恐ろしいことが...)

防波堤ドーム 工事中

気を取り直してツーリストの間で有名な「防波堤ドーム」に行ってみました. f:id:muscle_keisuke:20190819232332j:plain

すると...

工事中で中に入れませんでした...

踏んだり蹴ったりでした...

異質なライダーハウス

今日は「みどり湯」というライダーハウスに宿泊予定です.

噂によるとこのライダーハウスには謎の文化があるらしいです...

というわけで到着しました. f:id:muscle_keisuke:20190819232408j:plain

21時に全員集合の謎ルール

宿の主人であるおばあさんと話すと,いろいろライダーハウスのシステムについて説明してくれました.

  • 基本的に自由行動
  • 隣に銭湯あるけど,ここに泊まっている人は一回無料で入れる
  • 21時には今日泊まっている人,大広間に強制集合,時間厳守

最後の決まりに謎の文化が関係しているらしいです...

2時間以内に風呂と炊事と食事を済ませる

21時まであと2時間程しかなかったので急いで隣の銭湯で風呂を済ませ,

ライダーハウスのキッチンを借りて大急ぎで自炊をしました. 今日はカレーでした.

21時になる前になんとか食べ終えました.

ミラーボールの中でする謎の自己紹介

そして,ついに21時が来ました.

今日,ライダーハウスに泊まる予定の人が続々大広間に集まりました.

何が始まるのかと思いきや電気が消えて大広間にあるミラーボールが回り始めました.これだけでも異質なのですが...

主人のおばあさんがマイクを持っていろいろ挨拶を始めました.集まった自分達はただただそれを聞いてました.

すると,次は今日集まった人達で自己紹介をするということでした.

というわけで一人ずつミラーボールが回る中で自己紹介を始めました.

自分もしました.といっても先に他のメンバーが自己紹介したので特に言うこともなかったですね.

知らない人達と肩を組みながら歌を歌う会

自己紹介が終わると,おばあさんが「私の好きな歌をみなさんにも歌ってほしいので皆さん立ってください」的なことを言うと,

明かりがついて目の前の巻き上げ型の遮光シートのようなものを引っ張ると松山千春の「大空と大地の中で」の歌詞が出てきました.

もはや意味がわかりません.

そして,音楽が始まり,みんな肩を組んで歌い始めました.

ちらっとおばあさんを見るとじっと座ってました!(笑)

歌わんのかい!!(笑)

「大空と大地の中で」はちょうどこの頃どこのセイコーマートの外でも流れていて死ぬほど聞いたことあったのでなんとか歌えました(笑) f:id:muscle_keisuke:20190819232539j:plain

意味がわからなかったですけどある意味思い出には残りました(笑)

いまだに残っているこのときのブログ

そして,このライダーハウスでは毎日泊まった人の写真とブログをアップロードしているらしいです. この日の記事もまだしっかり残っています. blog.livedoor.jp

なぜか,20日だけど...(笑)

というわけでいろいろ楽しいライダーハウスでした.

走った距離

1年前のツーリングを振り返る 北海道1周ツーリング 8日目

さらば,クリオネ

ベッドで寝たおかげで疲れはだいぶ軽減しました.

洗濯もしたので服もいい匂いだし,最高のスタートになりました.

2日お世話になったクリオネに別れを告げて出発しました. f:id:muscle_keisuke:20190818141404j:plain

雨上がり,向かい風との戦い

雨が降っていなかったのはいいのですが,今日はこれまで以上に風が強かったです.

平地なのにあっという間にみんなに置いてかれてしまいました. f:id:muscle_keisuke:20190818141433j:plain

泣きそうになりながら小清水町の道の駅にしました. まだ,20kmも走っていないのにすごい疲労感... f:id:muscle_keisuke:20190818142125j:plain

アマゾンタイム 〜受け取り編〜

小清水町から網走市までの記憶は特にありませんが,どことなく市街地になってきて網走市に到着したので,補給をしました.

網走には用事がありました.そうです.ツーリング3日目にアマゾンで頼んだ荷物を受取りにローソンまで行かなければなりません.

muscle-keisuke.hatenablog.com

無事,受け取りできました. 自分はアクションカムに使うmicroSDを注文してました.

北見市常呂町岐阜

網走市を抜けてオホーツクサイクリングロードに入ります. 右手には主に能取湖が見えます. f:id:muscle_keisuke:20190818142013j:plain

車が通らないので安心して進めます.

しばらく進むと北見市に入ります.

合併前は常呂町というところで現在は北見市常呂町となっています.

サイクリングロードを抜けた辺りの地名は 岐阜地区となっています. f:id:muscle_keisuke:20190818142442j:plain

自分はこういう「辺境の地にある有名な地名と同名の地区」が何となく好きです.

これからもちょくちょく出てきます(笑)

サロマ湖あたりを抜けて湧別町に入ります. f:id:muscle_keisuke:20190818142502j:plain

この辺りから太陽が出てきました.

何もない道に現れたきれいな景色

西日になってきた頃に紋別市を通過し,興部町を目指します.

今日は久しぶりの太陽に恵まれたおかげでいつもなら脳死状態で走る何もない道もきれいな景色で色づいてました. f:id:muscle_keisuke:20190818142555j:plain

これぞ北海道って感じですね.

補給失敗

やっとの思いで興部町に到着しました.

今日はここで夜ご飯の具材を買うことになりました.

この時点で今日は170km位走っていたので,自分はてっきりこの興部町で泊まると思っていたので,補給を行いませんでした.

しかし,実際はここから10km先にキャンプ場があるからそこに泊まろうという話でした.

少しお腹が減ってましたが「まあ,10kmなら大丈夫か」くらいに思っていました.

しかし,残り10kmは完全に登りでした. あっという間に置いてかれてしまいました.

太陽はほとんど沈み真っ暗の中一人で泣きそうになりながら進みました.

温泉へのラストスパート

なんとかキャンプ場に到着しました.

ホッとしたのも束の間,今日入る予定の温泉は更に登った先にある旅館でした.

安心してからの絶望はショックがでかいです....

また,一人ぼっちになり一人で「チクショウ!チクショウ!」と叫びながら最後の坂を登りました.

登った先にあった旅館は道東の果てに建っているとは思えないほどキレイで大きな旅館でした.

更に驚きなのが日帰り温泉が500円なことです.500円なのにアメニティは完備だし,オホーツクを一望できる大浴場と露天風呂があるという贅沢ぶりでした.

テント泊じゃなくここに泊まりてぇと思いながら,叫びならがら登った坂を下りキャンプ場に到着しました.

カレーうどん

キャンプ場に到着したので炊事場でご飯の準備をします.興部町で買った具材を調理して 今日はカレーうどんにしました. f:id:muscle_keisuke:20190818142630j:plain

めちゃ美味しかったです!

走った距離