JA:Mkgmap/help/style rules
ルールを使用すると、タグで表現されたOSM形式の地図情報を、Garmin地図に必要な、数字で識別された形式の地図情報に変換することができます。
custom styles に記載されているように、points(点)、lines(線)、polygons(多角形)の変換ルールは、それぞれに対応するファイル名のファイル内に書かれています。
各ファイルは、OSMのノードやウェイのタグの値をテストし、その結果に基づいて、特定のGarmin形式を選択する複数のルールを含んでいます。
参照: style examples
簡単な例
ほとんどの場合、全てはとても簡単です。例えば、highway=motorwayでタグ付けされた道を、ズームレベル3まで表示されるGarmin形式の0x01 ("motorway")にしたいとします。
その場合、次のルールを書きます。
highway=motorway [0x01 level 3]
IDやサブIDを持つノードは両方のIDを結合することで参照されます。
amenity=bank [0x2f06 level 3]
これは、選択的に複数のタグを使う方法と一緒に、以下の節で詳細に説明します。 しかし、この単純なルールを使うことで、あなたは古いmap-featuresファイルでできることは何でもできます。(訳注:古いバージョンのmkgmapで使用されていた設定ファイルを指しているので、これから新たにルールを作ろうとする場合は気にする必要はありません。)
はじめに
1つのルールは、2つまたは3つの節から構成されています。
- 1つ目の節は、必須です : 変換される項目のタグで実行される テスト(条件)の組です。
- 2つ目の節は任意です : 条件の一致により動作する アクションブロック で、この部分は、{...} のように、波括弧に囲われています。
- 3つ目の節は任意です : 要素タイプの定義 で、条件マッチ時に使われる、Garmin形式やその他のパラメータです。この部分は、[...] のように、角括弧に囲われています。
一般的に、スペースや改行は重要ではありません。1つのルールを同じ行に書く必要はなく、(ここでの例はほとんど1行に書いていますが)あなたが読みやすいのであれば、複数行に渡って書くこともできます。これは、3つの節の全てを含む例です:
natural=cliff { name '${name} cliff' | 'cliff' } [0x10501 resolution 22]
- テスト節は natural=cliff です。
- アクションブロック節は { name '${name} cliff' | 'cliff' } です。
- 要素タイプ定義節は [0x10501 resolution 22] です。
インクルードファイル
ルールを外部ファイルから持ってくることが可能です。これは、特に、複数のスタイルを使ったり、同じルールを(points, lines, polygons, relationsの)複数のスタイルファイルで使ったりしたい場合に、スタイルファイルを単純に保つために役立ちます。簡単な例は呼び出しルールです:
include 'inc/address';
これは、単に外部ファイル 'inc/address' の内容を、この場所にコピーします。addressファイルのルールの変更だけはインクルードファイル内で行わなければなりません。
タグのテスト
主なテストは、特定のOSMのタグがあり、値やキー(OSM用語でvalueやkey)を持っているかというものです。例:
highway=motorway
これは、OSMファイルからhighwayタグを探し、タグが存在して、値 'motorway' を持っている場合にマッチすることを意味します。
数値の大小比較をすることもできます:
population > 10000
maxspeed >= 30
population < 1000000
それぞれ、意味は、populationが1万より大きい、maxspeedが30以上、populationが100万未満、です。大小比較は、単位付きでもできます。例えば、
maxspeed > 30mph
もし、異なる単位がタグに含まれている場合(km/h)、変換が実施されます。この機能は、現時点では実装されていませんので、あなたが出会った実際の便利な使い方を私に教えてください。
正規表現を使うこともできます:
ele ~ '\d*00'
これは、eleが100の倍数であることをチェックします。
タグのテストの組み合わせ
ほとんどのOSMノードやウェイは単一のタグを使うことで変換することができますが、時々複数タグを使う必要があります。具体的には、特別な目的の地図では、よく複数タグを使う必要があります。
例えば、highway=unclassified だけがタグ付けされた道とは別に、highway=unclassified と maxspeed=60 の両方のタグが付けられた道を取り出したい場合です。この場合、次のように2つのルールを記載する必要があります:
highway=unclassified & maxspeed=60 [0x06] highway=unclassified [0x05]
これは、両方のタグを持つ道路はGarmin形式で0x06を使いますが、maxspeedタグのないunclassifiedな道路は0x05を使うことを意味します。
ここで、ルールの順序は重要であることに注意してください。ルールは、スタイルファイルに現れた順にマッチするか確認し、mkgmapは最初にマッチしたところでそのルールを適用するため、以降のマッチングを停止します。もし、上記のルールを逆の順序で書いていた場合、highway=unclassifiedのルールは、このタグを持つ全てのOSMのウェイに最初にマッチし、2番目のルールは全く適用されません。 したがって、一般的には、限定的なルールを先にして、その複雑な条件で拾われないものをマッチさせるための、単純で一般的なルールを後にすることになるでしょう。
また、パイプ記号 (|) を使うことで、選択肢を組み合わせて1つのルールにすることもできます。例:
highway=footway | highway=path [0x07]
これは、道路が highway=footway タグまたは highway=path タグ(または両方)を持っている場合、条件はマッチし、mkgmapは種別0x07を使います。footwayのルールとpathのルールの2つの別々のルールを書いた場合と、動作は完全に同じです。実際は、mkgmap内部で、2つの別々のルールに変換されます。
一つのルールについて、2つの条件を書くことは制限されていません。後述する例外を除く、ほとんどすべての方法で組み合わせてグループテストをすることができます。 やや強引ですが、下記の例が可能です:
place=town & (population > 1000000 | capital=true) | place=city
これは、town を値に持つ place タグがあり、かつ人口が100万以上または首都であるか、または、cityを値に持つ place タグがある場合にマッチします。
重要な注意事項
ルールを作成する場合、それぞれのテストは、タグ名の一致や値の存在することをチェックするような単純なテストから始めるべきです。 一致テストの式を先頭に再配置するためのいくつかの試みが、mkgmapによって行われます。
関数
関数は、OSMの要素の特定の属性を計算します。
関数 | ノード | ウェイ | リレーション | 説明 |
---|---|---|---|---|
length() | ○ | ○ | 長さをメートル単位で測ります。リレーションの場合は、サブリレーションを含む全メンバーの長さの合計です。 | |
is_complete() | ○ | 真 =ウェイの全てのノードがタイルに含まれている場合。偽 =ウェイのいくつかのノードがタイルに不足している場合。
| ||
is_closed() | ○ | 真 =ウェイが閉じている場合。 偽 =ウェイが閉じていなくて、多角形として処理できない場合。
|
このルールは、50mを超える長さのserviceウェイにマッチします。
highway=service & length()>50
追加のテスト
その他、以下のテストが利用可能です。
highway!=motorway これは、highwayタグがあって、それがmotorwayの値を持たない場合や、highwayタグ自体がない場合に真になります。
highway=* highwayタグが存在する場合に真になります。値は何であるかは関係ありません。これは、タグが存在するかを確認するために、特に役立ちます。
highway!=* このルールは、highwayタグを持たないOSMオブジェクトにマッチします。
アクションブロック
アクションブロックは、波括弧 {...} に囲われ、表示対象要素を変更できる1つまたは複数のステートメントを含んでいます。複数のステートメントは、; によって区切られています。アクションブロックがあり、かつ、element type definition(要素タイプ定義) を使う場合は、アクションブロックの後に書く必要があります。
name
Garmin地図で使用される、要素の最終的な名前を設定します。
要素の name タグとは別物です。
選択肢のリストを、パイプ記号 '|' を使って書くことができます。一致する最初の選択肢が使用されます。
nameは、一旦設定されると、上書きされることはないので、
複数のnameコマンドがマッチする場合は最初に設定されたものが有効になります。
注意:多くのオブジェクトはpoints(点)かつpolygons(多角形)として存在しうるので、points とpolygons の両方のスタイルファイルにnameコマンドを書いておく必要があります。タグは、${タグ名}の表記を使うことでその値を参照することができます。
道路の例:
{name '${name} (${ref})' | '${ref}' | '${name}'}
これは、name='Main St' で ref=A1 の場合、nameは"Main St (A1)"になりますが、nameタグがない場合は結果が "A1"になります。nameタグはあるけどrefタグがない場合、要素名がnameタグの値として使われます。 路線番号案内標識では、${タグ名|highway-symbol:box}の表記を使うことができます。有効な記号はinterstate, shield, round, hbox, box, ovalです。
add
addコマンドは、タグがない場合にタグを追加します。 直接的に有用なタグは、'oneway' と 'name' タグです。 oneway タグがセットされていない motorway を oneway にするには、次のようにします。
highway=motorway { add oneway=yes }
その他の使用方法は、リレーション における 'apply' コマンドです。
あなたがセットしたい任意のタグをセットできますが、それは有用かもしれないので、ルール内の他の場所でマッチさせることができます。
また、置換を使うことができます。
{set name='${ele}'; set name='${ref}';}
この2つのコマンドは、'name' タグを、'ele' タグがある場合はその値にセットし、'ref' タグがある場合はその値にセットします。 また、nameコマンドと同様に、縦棒で区切られた選択肢表現のリストを書くことができます。最初に全ての条件をみたすものが使われます。
{set key123 = '${name:en}' | '${name}'; }
この場合、'key123' を、 'name:en' タグがあればその値にセットし、なければ 'name'の値にセットします。
set
'set' コマンドは、タグがある場合でもタグを設定することを除けば、 'add' コマンドと同じです。
delete
delete コマンドは、タグを削除します。
{ delete key123 }
空っぽの文字列を設定することでも、同じ結果にすることができます。
{set key123 = '' }
apply
"apply" コマンドの動作は、リレーションにおいてのみ効果があります。 バス経路のリレーションがあって、さらに、そのリレーション内にバス経路の一部だと示すタグ付きのウェイが1つもない場合で、バスがどこに行くのか地図を見て分かるようにしたいとします。 relations ファイルに、次のようにルールを書くことができます。
type=route & route=bus { apply { set route=bus; set route_ref='${route_ref}'; } }
(デフォルトスタイルの relations ファイルによって、"route_ref"は既に作成されていることに注意してください。その値は、"ref"または"name"のどちらか存在しているほうの値にセットされています。)
lines ファイルの中に、route=busにマッチするルールを書く必要があります。 全てのリレーションルールは、それ以外のルールよりも先に実行されるので、これはうまく動きます。
'${route_ref}' の置換により、relation 上のタグの値になり、リレーションに含まれるそれぞれのウェイに適用されます。
'$(route_ref)' の置換は、実際に処理される、realationに含まれるそれぞれのウェイのタグの値のアドレッシングに使用できます。例:
type=route & route=bus { apply { set route=bus; set name='$(name) ${route_ref}'; } }
apply_once
apply_once コマンドの動作は、applyに似ていますが、リレーションの各要素につき一度だけ適用されます。往復ルートを示すリレーションでは、並行する一方通行の通りで定義されない限り、同一のウェイを複数回含むことがよくあります。
apply_once コマンドの動作は、バスの経路が、方向ごとに一つずつの、2つのリレーションであるような場合には便利ではありません。おすすめの実例:
195498 195498
1153657 1153657
sketch-route
ルーティングと住所検索のために有用なタグ
回避オプションを使った一般的なルーティングや、住所検索のために、特別なタグを使う必要があります。Mkgmap/help/Tags を参照してください。
要素タイプの定義
前述のように、要素タイプは角括弧内に含まれ、使用する場合は、ルールの最後 に書く必要があります。
最初の、そして要素タイプで唯一の必須部はGarmin形式コードで、これは必ず16進数で書かれます。その後に、いくつかのオプションのキーワードを含む値要素タイプ定義ルールが続きます。
level (resolutionも参照)
levelコマンドは、(mpフォーマットのEndLevelのように)要素が表示される最大のズームレベルです。オブジェクトのレベルが指定されない場合、レベルはデフォルトで0になり、オブジェクトは最も詳細なレベルでのみ表示されます。代わりに、resolutionコマンドを使って同じ結果を得ることができます。どちらの場合でも、levelとresolutionのどちらかのマッピングは、optionsファイルによって行われ、次のようになります。
# The levels specification for this style # levels = 0:24, 1:23, 2:22, 3:20, 4:18, 5:16
この場合、level0はresolution24と、level1はresolution23と等しくなります(以下同様)。
次の例では、highwayをズームレベル4からレベル0まで表示されるように設定します。
highway=motorway [0x01 level 4]
level の範囲
levelコマンドでは、範囲を指定することもでき(例:1-3)、地図上には、指定された範囲のレベルでのみオブジェクトが表示されます。この複数レベルのオプションを使う場合、小さいレベル(例:1)を先に、大きいレベル(例:3)を後に書かなければならないことに注意してください。例:
highway=motorway [0x01 level 3-5]
この例では、motorwayは最もズームアウトされたズームレベル5で表示され、ズームインしたレベル3まで表示されますが、ズームレベル2、1と、最もズームインされたズームレベル0では表示されません。
resolution (levelも参照)
これは、オブジェクトが表示されるズームレベルを指定する、別の方法です。1から24の数字で指定され、Garmin機器が認識するズームレベルのどれかと対応しています。levelコマンドを使用している場合は、resolutionコマンドを使うべきではありませんが、これらのコマンドの目的に違いはありません。(訳注:levelコマンドとresolutionコマンドは、数字の大小関係が逆になることに注意してください)
resolution の範囲
levelコマンドの場合と同様に、オブジェクトが表示されるresolutionの範囲を指定することができます。levelコマンドと同様、高い解像度(つまり、より大きな数字)を先に書き、低い解像度(小さな数字)を後に書きます。例えば、23-20のようになります。完全な例はこちら:
highway=residential [0x06 resolution 22-16 continue] highway=residential [0x07 resolution 24-23]
この例では、解像度16から22の間でのみ0x06のhighwayを表示し、解像度23と24では0x07のhighwayを表示します。この例では、詳しくは後述する、continue 記述を使用しています。
default_name
要素が他のルールによって定義された名前をまだ持っていない場合、default_nameによって指定された名前を持つことになります。このことは通常、名前もGarminで認識されるシンボルも持たないオブジェクトで役立ちます。例えば、'bus stop'のデフォルト名を指定することで、名前を持たないバス停にその名前を表示させることができます。
road_class
経路検索に使用します。4が最高品質の道(例えば高速道路motorway)で、0が住宅道路residentialなどです。classは、次のように使います。
クラス | 使用方法 |
---|---|
4 | 大きな道路/ランプ |
3 | 主要な道路 |
2 | 幹線の通り/その他の大きな道路 |
1 | ラウンドアバウト/コレクタ道路 |
0 | 住宅道路/未舗装道路/トレイル |
road_speed
このメール によると、速度制限はmkgmapにハードコーディングされているので注意する必要はありませんが、もし変更したい場合は、次のようにできます:
経路検索に使用するための、道路上の交通速度がどの程度早いかの指示です。0が最も低速で、7が最も高速です。 ガーミン機器が理解できる速度制限は、次の表のとおりです:
road_speed | 最高速度 |
---|---|
7 | 無制限 |
6 | 時速70マイル / 時速110km |
5 | 時速60マイル / 時速90km |
4 | 時速50マイル / 時速80km |
3 | 時速35マイル / 時速60km |
2 | 時速25マイル / 時速40km |
1 | 時速15マイル / 時速20km |
0 | 時速3マイル / 時速5km |
continue
前述のように、スタイルルールは、スタイルファイル内の記載の順にマッチします。デフォルトでは、全てのOSMオブジェクトは要素タイプ定義に一致する最初のルールまで各ルールとの比較を行います。つまり、OSMオブジェクトに対する、それ以降のルールとの比較は行いません。もし、ルールがアクションブロックだけを持つ場合、mkgmapはそれ以降のルールを探します。
しかし、continueの記述をルールの要素タイプ定義に追加すると、mkgmapはオブジェクトの処理を止めなくなり、continue記述を含まないルールと一致するまで検索を続けます。
デフォルトでは、continue記述を使うと、(1つだけ存在する場合)ルールのアクションブロックはこのルール内で適用され、以降のルールには適用されないことに注意してください。この振る舞いを変えたい場合は、continue with_actions記述を使用してください(次のセクションを見てください)。
continue with_actions
with_actions 記述は、continue動作の振る舞いを次のような方法で変更します。該当する要素が追加の変換を調べている場合、そのルールのaction blockも適用されます。
要素タイプ定義の完全な例:
[0x2 road_class=3 road_speed=5 level 2 default_name 'example street' continue with_actions]
この機能は、橋や一方通行などの表示の重ねあわせに使ったり、ズームレベルにより道の密度を変えたりするのに使うことができます。
例
スタイルルールがどう動くかの説明付きで、いくつかの例を示します。
points スタイルファイル
- インターネットカフェ
amenity=cafe & internet_access=wlan {name '${name} (wifi)'} [0x2a14 resolution 23]
OSMオブジェクトが、amenity=cafe と internet_access=wlan の両方のキー/タグの組を持っているか確認します。name=Joe's Coffee Shopだった場合、Garminオブジェクトは、Joe's Coffee Shop (wifi)という名前になります。Garminオブジェクトは、0x2a14になり、解像度23と24で表示されます。
- 道しるべ
information=guidepost {name '${name} - ${operator} - ${description} '| '${name} - ${description}' | '${name}' | '${description}' | '${operator}' | '${ref}' } [0x4c02 resolution 23 default_name 'Infopost']
OSMオブジェクトが、information=guidepost のキー/タグの組を持っているか確認します。
name=Route 7, operator=Kizomba National Parks, description=Trail signpost の場合、Garminオブジェクトは、Route 7 - Kizomba National Parks - Trail signpostという名前になります。
OSMオブジェクトがnameタグとdescriptionタグだけを持っている場合、Garminオブジェクトは、Route 7 - Trail signpostという名前になります。
nameタグだけを持っている場合、Garminオブジェクトは、Route 7という名前になります。
descriptionタグだけを持っている場合、Garminオブジェクトは、Trail signpostという名前になります。
operatorタグだけを持っている場合、Garminオブジェクトは、Kizomba National Parksという名前になります。
Garminオブジェクトは、0x4c02が使われ、解像度23と24でのみ表示されます。
- カーディーラー
shop=car {name '${name} (${operator})' | '${name}' |'${operator}'} [0x2f07 resolution 23]
name=Ali's Car Salesroom, operator=Nissan の場合、GerminオブジェクトはAli's Car Salesroom (Nissan)という名前になります。
- 営業時間
opening_hours=* {set addr:postcode = '${addr:postcode} open ${opening_hours}' | 'open ${opening_hours}'}
値のあるopening_hoursキーを持つ全てのOSMオブジェクトで、このルールは、郵便番号に営業時間を含めるようにします。例えば、addr:postcode=90210, addr:street=Alya Street, addr:city=Lagos, addr:housenumber=7, opening_hours=09.00-17.00の場合、Garmin POIのaddress領域は、7, Alya Street, Lagos, 90210 open 09.00-17.00に設定されます。
トラブルシューティング
それぞれの node/way/relation について、mkgmapはタグを一度だけ解析し、条件にマッチする最初のルールを探します。唯一の例外は、 continue 記述が使われる場合です。actions付きのルールは、それが見つかった時に動作します。
- 可能な場合、左側に同じタグを書きます。これによって、より予測しやすくなります。
- あとの方でマッチさせたい場合、既に使われているかもしれないタグではなく、完成したタグ名を設定します。
下位互換性に関する注意
古い map-features.csv ファイルを新しいスタイルファイルに変換する場合、古いmap-featuresファイルを使った場合と全く同じ結果を同じ速度で得ることができます。 new_style.py と呼ばれる変換スクリプトがスクリプトディレクトリにあります(動作にはpythonが必要です)。
下記の2つの例は、map-features の行がどのように独立したルールに変換されるかを示しています。
旧: point|amenity|bank|0x2f|0x06|21 新: amenity=bank [0x2f06 resolution 21] 旧: polyline|highway|primary|0x04||19 新: highway=primary [0x04 resolution 19]
map-features.csv ファイルと points, lines, polygons ファイルの両方がある場合、map-features の各行の内容を、各ルールファイルの最後に記載する場合と全く同じ結果になります。