基盤地図情報の属性情報をISOM記号と対応させてOpenOrienteering MapperにインポートするためのCRTファイルを作る
OpenOrienteering Mapperでファイルをインポートするとき、記号の置き換えルールをテキストで書いたCRT(相互参照テーブル)ファイルというものを用意することで、記号が割り当てられた状態でオブジェクトを追加できます。
この機能を使えば基盤地図情報をインポートする作業を効率化できるのでは、ということでnoteの投稿画面をメモ帳として使いながら、今からCRTファイルを作っていきます。
今回やること
「基盤地図情報ダウンロードデータファイル仕様書」(以下「基盤地図情報仕様書」)を最初から読んでいって「ISOM 2017-2」に置換できそうな項目を見つけたら拾って検討し、CRTファイルの書式で置き換えルールを書いていきます。
CRTファイルの書式は簡単で、テキストエディタ上に「置換先の記号番号」、「半角スペース」、「抽出条件」を並べて書いていくだけです。抽出条件には、完全一致(=)、部分一致(~=)、不一致(!=)、AND、OR、NOTなどを使うことができます。前方一致・後方一致や正規表現などは未対応です。
基盤地図情報仕様書で定義されている内容が実際の基盤地図情報にどのように表現されているのかを確認するときにはQGISや地理院地図Vectorを使います。
CRTファイルを書いていく
等高線
数値標高モデル(DEM)ではなく基盤地図情報の標準項目のほうの10m間隔の等高線です。基盤地図情報仕様書に以下の説明があります。

「種別」の値を抽出条件に使えそうです。
QGISで「地物情報を表示」するとこんな感じに出てきます。項目名の「種別」が「type」、「標高値」が「alti」と英語になっていますが、値の中身は基盤地図情報仕様書と同じものが入っています。

ISOMの「101 等高線」に対して「type」が「一般等高線」の条件で抽出したものを割り当てるルールを作ることにします。
「凹地等高線」については今回は無視することにします。拾うとしたら、「101 等高線」に放り込んだら混ざってわからなくなるので、あらかじめOpenOrienteering Mapperで「101.x」に記号を追加して用意しておき、そこにインポートするといった方法が考えられます。
ということで、等高線項目については以下のルールになりました。という具合に進めていきます。
101 type = "一般等高線"
海岸線
以下の種別があります。

海だからと区別せず川や湖と同じ水涯線として、OpenOrienteering Mapperの記号セットに用意されている記号番号「301.4」を割り当てることにします。
ところで、これまでも水涯線を基盤地図情報からインポートするとき当たり前に「301.4」の記号を使ってきましたが、ISOMにはこの番号は存在しないのですね。ISOMで定義されている番号は水域と水涯線がセットになった「301 渡れない水域」だけで、下位分類を作って水域と水涯線に記号番号を割り振っているのはOpenOrienteering Mapper独自の実装のようです。
「露岩」については、ISOMに同じ名前の「214」の露岩がありますが、これは「表土や植生のない、走行可能な岩が露出した区域」という説明で、海岸線の種別としての露岩とは違いそうです。とりあえず「202」の岩がけを割り当ててみることにします。
301.4 type = "海岸線"
202 type = "露岩"
水涯線
以下の種別があります。

水涯線(河川)、水涯線(湖池)は区別せず、海岸線と同じ「301.4」に割り当てます。
「一条河川」、「用水路」についてはどういう意味なのか探したところ、「数値地図(国土基本情報 20 万) ファイル仕様書」に以下のように定義されていました。

他に「公共測量標準図式 数値地形図データ取得分類基準表」では以下の定義になっていました。
一条河川とは、流水部の幅が図上0.2mm以上、0.4 mm未満の河川をいい、解糸状の線で表示する。ただし、地下の部は表示しない。
「解糸状の線」というぜんぜんイメージのわかない言葉で説明されていますが、一条河川というのは、外周線と中の塗りつぶしを組み合わせる書き方をせず、言葉どおり一本の線として書く河川のことのようで、ISOMの似た記号に置き換えることができそうです。
縮尺によって川幅が変わりそうですが、とりあえず先に出した「数値地図(国土基本情報 20 万) ファイル仕様書」の定義を使うことにします。
ISOMと照らし合わせてみて、「304 渡れる水路」を割り当てるには「一条河川」も「用水路」も川幅が足りないことがわかります。とりあえず、「一条河川」を「305 渡れる小さな水路」、「用水路」を「306 細いもしくは季節的水路」に割り当てることにします。もし現地で確認したら違う記号が適切かもしれないし、または地図上に載せる必要のない些末な情報かもしれませんが、いったんこれで進めます。

ルールは以下のようになりました。
301.4 type = "水涯線(河川)" OR type = "水涯線(湖池)"
305 type = "一条河川"
306 type = "用水路"
202 type = "露岩"
水域
以下の種別があります。

すべて「301.1」の渡れない水域(外周線なし)に割り当てます。
301.1 type = "海" OR type = "河川" OR type = "湖池" OR type = "河川・湖池"
水部構造物線
以下の種別があります。

ナビゲーションに役立つ地図化すべき情報も含まれているかもしれませんが、とりあえず今回は判断保留で拾わないことにします。
建築物の外周線
以下の種別があります。

「普通建物」「堅ろう建物」を「521.4」の建物の外周線に割り当てます。
「普通無壁舎」、「堅ろう無壁舎」について、建物と天蓋のどちらにすべきか検討のため、まず「公共測量標準図式 数値地形図データ取得分類基準表」の定義を確認します。
普通無壁舎:

堅ろう無壁舎:

少なくとも温室は走って通行可能ではないのですべてそのままISOMの天蓋に置き換えてOKというわけにはいかなそうです。
他に、地理院地図Vectorで右クリックして地物の情報を表示させて無壁舎を探したところ、公園のあずまや、駅前のバス停なども普通無壁舎で、これらは天蓋にしてよさそうです。

堅ろう無壁舎についてはちょうどいい例を見つけられませんでした。
ということで、ISOMの建物に該当するものと天蓋に該当するものが混在していますが、「普通無壁舎」、「堅ろう無壁舎」については「522.2」の天蓋の外周線に割り当てることにします。建築物の内部の面と区別するために「gml_id」に「K18」を含むという抽出条件を加えています。gml_idの採番規則は探しても見つからなかったので実際のデータからの判断です。たぶんこの部分は全メッシュ共通だろうと推測していますが、違っていたら修正が必要になります。
521.4 gml_id ~= "K18" AND (type = "普通建物" OR type = "堅ろう建物")
522.2 gml_id ~= "K18" AND (type = "普通無壁舎" OR type = "堅ろう無壁舎")
建築物
基盤地図情報ダウンロードページで、ダウンロードする項目の選択肢には入っていませんが、しぼりこまずに「全項目」にチェックをいれてダウンロードすると入っていることがある項目です。
「建築物の外周線」と同様の種別で「521.3」と「522.1」に割り当てて内部の面を塗りつぶします。
521.3 gml_id ~= "K17" AND (type = "普通建物" OR type = "堅ろう建物")
522.1 gml_id ~= "K17" AND (type = "普通無壁舎" OR type = "堅ろう無壁舎")
道路縁
以下の種別があります。

「真幅道路」についてGoogle検索するといきなり2つの異なる基準が出てきます。

単に一定の太さ以上の道路のことを真幅道路というような説明になっていますが、おそらく説明が不足していて、真幅道路とは地図上で実際の幅(を縮尺した幅)で作図されている道路のことで、道路を作図するときに実際の幅にするかどうかの基準が一定の太さ以上であることなのでしょう。
一定の太さ以上から実際の幅に合わせて道を作図するのはISOMでも規定されていることですね。

QGISを使い基盤地図情報の実データで種別ごとに色分けして確認すると、細くても実際の道幅で書かれている(「道路縁」のデータが存在する)なら真幅道路の分類です。


ということで、「真幅道路」を「501.2」の舗装路の境界線に割り当てます。
幅5m以下のところはそのまま使わず「503 道路」に置き換えるのが適切だろうと思います。
この記事の範囲からは外れますが、国土地理院ベクトルタイルを使うと基盤地図情報に含まれない道路中心線のデータをダウンロードできて、そこからrnkWidth = 1 (幅員区分 3m以上5.5m未満)のフィルタで「503 道路」を入手できます。
「軽車道」、「徒歩道」、「庭園路等」、「トンネル内の道路」について、「公共測量標準図式 数値地形図データ取得分類基準表」に以下の説明があります。

「軽車道」は「504 軽車道」、「徒歩道」は「505 徒歩道」にそのまま分類します。
「庭園路等」については真幅道路と区別する必要がないので真幅道路と同じ「501.2」の舗装路の境界線に割り当てます。
「トンネル内の道路」は拾わないことにします。
なお、「道路縁」(RdEdg)という名前で分類されているXMLファイルにいっしょに入っているデータですが、軽車道、徒歩道については縁の輪郭線ではなく中心線です。
以下のルールになりました。
501.2 type = "真幅道路" OR type = "庭園路等"
504 type = "軽車道"
505 type = "徒歩道"
道路構成線
以下の種別があります。

ナビゲーションに役立つ地図化すべき情報も含まれているかもしれませんが、とりあえず今回は判断保留で拾わないことにします。
軌道の中心線
以下の種別があります。

今回ISOMなので「普通鉄道」と「路面の鉄道」を両方とも「509 線路」に割り当てます。
ISSprOMのCRTを作る場合は「509.1 線路」と「509.2 路面軌道」で別の記号が用意されているので分けて割り当てると良さそうです。
「特殊軌道」、「索道」については「公共測量標準図式 数値地形図データ取得分類基準表」に以下の説明があります。「特殊軌道」ではなく「特殊鉄道」になっていますが、同じものだろうと思うことにします。

「特殊軌道」を「509 線路」、「索道」を「510 送電線、空中ケーブルスキーリリフト」に割り当てることにします。
それと、「トンネル内の鉄道」は拾いません。CRTファイルを使うことで、インポートしたあと不要な情報を探して取り除く手間も削減されます。
以下のルールになりました。
509 type = "普通鉄道" OR type = "路面鉄道" OR type = "特殊軌道"
510 type = "索道"
できあがり
以下内容のCRTファイルができあがりました。
#等高線
101 type = "一般等高線"
# 海岸線
301.4 type = "海岸線"
202 type = "露岩"
# 水涯線
301.4 type = "水涯線(河川)" OR type = "水涯線(湖池)"
305 type = "一条河川"
306 type = "用水路"
# 水域
301.1 type = "海" OR type = "河川" OR type = "湖池" OR type = "河川・湖池"
# 建築物の外周線
521.4 gml_id ~= "K18" AND (type = "普通建物" OR type = "堅ろう建物")
522.2 gml_id ~= "K18" AND (type = "普通無壁舎" OR type = "堅ろう無壁舎")
# 建築物
521.3 gml_id ~= "K17" AND (type = "普通建物" OR type = "堅ろう建物")
522.1 gml_id ~= "K17" AND (type = "普通無壁舎" OR type = "堅ろう無壁舎")
# 道路縁
501.2 type = "真幅道路" OR type = "庭園路等"
504 type = "軽車道"
505 type = "徒歩道"
# 軌道の中心線
509 type = "普通鉄道" OR type = "路面鉄道" OR type = "特殊軌道"
510 type = "索道"
「.crt」という拡張子をつけて保存します。公式ドキュメントにも書いてありますが、証明書ファイルとまぎらわしいです。
CRTファイルを使ってみる
それではさっそくCRTファイルを使った基盤地図情報のインポートを試していきましょう。
基盤地図情報のダウンロード
まずは基盤地図情報ダウンロードサービスでファイルをダウンロードするところからです。日本のオリエンテーリング発祥の地・高尾山を含むメッシュを選んでみました。

ダウンロードが終わったらファイルを解凍します。今回使うのは名前に「BldA」(建築物)、「BldL」(建築物の外周線)、「Cntr」(等高線)、「RailCl」(軌道の中心線)、「RdEdg」(道路縁)、「WA」(水域)、「WL」(水涯線)が入っているXMLファイルです。

インポート作業
OpenOrienteering Mapper を起動します。基盤地図情報のXMLファイルに含まれる日本語の文字列を検索条件に使うので、設定の「ファイルのインポートとエクスポート」のところで文字コードを「UTF-8」に変更して合わせます。

XMLファイルを一つずつインポートしていきます。
メニューバー > ファイル > インポート から、読み込むXMLファイルを選択し開きます。

記号マッピング > CRTファイルを開く… から、用意したCRTファイルを選択し開きます。

置換ルールが表示されることを確認し、OKでインポートを開始します。

残りのXMLファイルに対しても同じことを繰り返します。
結果確認
OpenOrienteering Mapperを起動してから2分もかからず、必要なすべてのXMLを読み終わりました。


インポートした直後の地図を見ていきます。
「RdEdg」(道路縁)のXMLにいっしょに含まれていた道路縁と徒歩道で別の記号が割り当てられています。

・「WL」(水涯線)のXMLにいっしょに含まれていた水涯線と一条河川で別の記号が割り当てられています。

「RailCl」(軌道の中心線)のXMLにいっしょに含まれていた鉄道 (ここではケーブルカー) と索道 (ここではリフト) で別の記号が割り当てられています。ISOMで索道は支柱のあるところに横線を引くことになっているので、ISOMに適合させる場合は別途調査で修正するとよいでしょう。また、トンネルの箇所の線路に隙間があいていて、「トンネル内の鉄道」の割り当てルールをあえて作らなかったのが反映されていることを確認できます。未定義のままインポートされた紫色のオブジェクトは、記号ウィンドウで「この記号のオブジェクトをすべて選択する」で選択してDeleteキーでまとめて削除できます。

雑感
冒頭に書いた目論見どおり基盤地図情報をOpenOrienteering Mapperにインポートする作業の効率化に成功したと言っていいと思います。
あと、CRTファイルを作る過程の調査で基盤地図情報のファイルの中身やISOMにも少しだけ詳しくなれました。
興味持った人はぜひやってみてください。