はじめに
MapboxはOSMを使っていると思われる人が多いと思いますが、日本の地図ではゼンリンデータを取り込んでいて海外ではOSMを使っている様です。今日はMapboxでナビ用のマップを作りながらMapbox Studioの操作方法を紹介したいと思います。この記事を読み終わる頃にはMapbox Studioの操作を把握でき、貴方もカッコイイマップをデザインできる様になればなと思います。
結論から言うと
結論からいいますと、完成したスタイルがこちらです。自ら地図をこんだけ編集でき、ゼンリンの様な高いクオリティーのデータを触れるのは素晴らしいと思います。私はデザイナーではないですが、いればかなり良い地図ができるのがMapboxの強みだと思います。
地図を作る上で必要なもの
アカウントを作る
Mapboxでアカウントを作る。
地図を作る
地図はMapboxではStyleと言われてます。
Mapbox Studioで新たなスタイルを作れますが、より良いのがこのサイトの下方にありましたので、それをコピーします。
スタイルを編集
地上路線を薄く表示
ナビ用の地図なので地上路線を薄く表示したいです。タブのComponent
では地上路線の設定を変更できなかったので、まずはマップ上の路線をクリックしてLayers
-> rail-low-dash
をクリックする。
rail-low-dash
は何を示しているのか知りたいのでSelect Data
をクリックする。このtransit_line
のFilter
で適用されている範囲は緑色で適用されていない所が赤色です。
少しズームアウトしてこれが地上線路か確認する。
少し違うので、他のレイヤーも検証してみる。rail-low
をクリックしてみたら、これっぽかったので一応これでOK。
ちなみにこのSelect Data
ではデータをフィルターしているのでとりあえずここで路線を選択する感じで、その後にStyle
で見せ方を帰る感じです。この場合だとv8-streets
パッケージの全てのtransit_lane
からgeometry-type=LineString
のフィルターが適用されています。後、ズームレベル5〜15の間の時だけデータを見せる感じです。
これで地上路線のデータを把握したので、Style
をクリックする。色を変えてみたが変に赤色になったのでおかしいと気づく。
Cmd + Z
で戻し、subway
(地下鉄)以外のレイヤー6つを選択し、Opacity
(透明度)を選択する。ちなみにスタジオで誤操作した場合はCmd + Z
で一つ前のアクションに戻る。RedoはCmd + Shift + Z
で後ろに戻したものを前に戻せる。
Transit
のSubway
以外の6つのレイヤーを選択し、Opacity
をクリックする。Rate of Change=linear
はズームレベルにより透明度が線形的に変わる意味です。この画像だとズームレベル14.99までは1(見える)でそれ以降は0(透明)です。他にstep
の様にズームレベルのレンジをif文的に指定したり、exponential
などで透明度の変化を線型ではなく急激に曲げることもできる。
なので、ズームレベルを15位上にするとどのレイヤーが地上路線を表示しているか検証してみる。
なんと、これがroad-rail-tracks
レイヤーで、Transit
に入っていない。半透明っぽい路線なのでナビ面では違和感が無く、表示されていても問題は無いと決断。とりあえず、ズームレベル1-14.99の太線を薄くみせたい。
先ほどの6レイヤーのOpacity
を0.5に変更。
Before | After |
---|---|
これで地上路線を半透明にできました。
地下鉄を消す
地下鉄は自動車内からは見えないので消したいです。
まずはスタイルで地下鉄を特定して、クリックする。ポップアップにsubway
が出てくるのでクリック。
subway
レイヤーをクリックしHide 1 Layer
をクリックする。
地下鉄は消えたが、ラベルが残っている。
これも同様にクリックしてレイヤーを選択し、Hide Layer
を選択する。
地下鉄は消えましたが駅が強調されているので、消したいです。
駅名を小さくする
駅名はナビではあまり重要では無いので少しフォントを小さくしたいです。
駅名をクリックして、transit-label
だと思うのでクリック。ラベル系は大体-label
なので、これの可能性が高い。
mode=rail
の場合だと16pxでその他は14px。mode=rail
はどういう意味か知りたい場合はSelect data
をクリックする。
ここのmode
の属性を元にフォントのサイズを16pxか14pxに設定している。
ちなみに東京
は緑(表示対象)なのに大手町
は赤(非表示対象)。なぜかと思い、大手町と東京の属性を比較する。
東京 | 大手町 |
---|---|
地下鉄のラベルは以前消したので表示されないのかな。データ単位で表示するかしないかのロジックはここに書いてあるが、
Ejectしないとわからないので、今は検証せずに、フォントを一旦小さくする。
駅名が小さくなりましたが少しアイコンがテキストに対して大きいので小さくしたいです。
アイコンサイズを1から0.75に設定する。この際デフォルトのレイヤーなのでOverride
をクリックする必要があります。
これでアイコンも小さくなりました。
路線と駅は消えましたが少し寂しいので自動車ナビで必要な要素を追加したいと思います。
交差点名を見せる
ナビ用なので交差点名は必須ですので追加したいと思います。
スタイルを使っていると気づくと思いますが、ズームする上で交差点名が表示されたり非表示になったりするのが解ります。
下のgifの虎ノ門二丁目
に注目してください。
ナビとしてはユーザーが地図を触って操作するのは危ないので交差点名を既に表示するべきだと考えてます。
この現象を厳密に調査したい場合はこちらのCollision Box
を有効にすると何故だか解ります。
この様にcollision box
が重なるからです。その場合何が優先されるかはレイヤー順によって変わってきます。スタジオでレイヤーが上にある方が優先度が高まります。
交差点名は一番重要なので、レイヤーを一番上に置きます。
+
-> Active sourcesの中の Mapbox Streets V8
-> road
を選択する。road
に関してはこちらのドキュメントをご参照ください。
この状態だとLine
型のroad
しか見えないのでType
でSymbol
を設定する。
これで交差点名が表示されます。今は交差点名と車道両方をハイライトしているので一旦交差点だけをフィルターします。
Filter
->Data field
->is
->intersection
を選ぶとイイ感じで緑(交差点)と赤(その他)の色分けがしっかりできてます。
データは良いのでレイヤーの名前をintersection
に変更し、Style
をクリックしデザインタブに移ります。
何も表示されないので、Text
タブのText field
にhoge
と入力すると先ほどのデータ全てがhoge
として表示されます。これだと運転手も迷っちゃいますね。
なので一旦hoge
を消して、See all formula options
->coalesce
を選択する。coalesce
はSQLを使っている人はご存知ですが、引数の設定順に値を参照し、NULL
では無い場合返します。
次にInsert a data field
をクリックしname_ja
を選択。
その後にコンマを入力し、同様にname
を選択。これでcoalesce(name_ja, name)
になり、意味的には「name_ja
を表示するが存在しない場合はname
を表示する」です。このマップはグローバルなので日本国外ではname_ja
が無い場合があるので、バックアップとしてname
を表示します。
coalesce
意外にもconcat
などを使って複数の表現を連携することも可能です。例えば全ての交差点に「交差点」などをつけるのも可能です。交差点の表現は文字ではなくアイコンを使うのもアリなので、それを使い改善していきます。
Textのフォントを13pxに色を#6894ca
に変え、Iconのタブでjp-intersection
を設定します。
アイコンがテキストをラップする様に設定する。
最後にIcon text padding
を設定するとイイ感じで交差点名が表示されます。
検証すると既存の交差点名が出てきたので、これも消します。
クリックしてroad-intersection-low-zoom
だと思うので、このレイヤーを選択しHide 1 layer
をクリックすると消えます。
結果としてこの様になります。
しかしズームアウトした時に沢山の交差点が見えるのはちょっとごちゃごちゃしてます。広域表示にした時は重要な交差点だけが見え、ズームインするにつれマイナーなの交差点も見せたいです。
今のintersection
レイヤーを重複(Duplicate)する。
intersection minor
に名前を変え、Data fieldのis not
でtrunk
,primary
,seondary
,tertiary
を追加する。これらは交差点をランク付けする属性でこれもSelect Data
で検証が可能です。
intersection minor
の方はズームレベル14.5~見える様にしましょう。
ちなみに設定をコピペするときは下の</>
をクリックし、JSONをコピーすれば他のレイヤーでも貼り付けれます。これはStyle spec
といい、こちらに詳細が書かれています。
一方でintersection
にもこの様な設定を加える。
最後にintersection
の方が表示の優先順位が高いので上に動かす。
これで交差点が出てきてナビっぽくなってきました。
道路名を表示する
交差点名も良いですが、ナビなので道路名も優先的に表示するべきです。
まずは道路名をクリックする。
このレイヤーを一番上に動かせないので重複する。
重複しかたレイヤーを一番上に動かし、
既存の動かせないレイヤーを隠す。
道路名のフォントが小さいのでフォントサイズを変更します。
文字サイズを20に大きくすると道路名が消えてしまう。
原因としてはintersection
の方が優先され、六本木二丁目
の交差点が高い状態だからです。
road-label copy
を一番上に持ってくることで解決できました。ですが、これは交差点名を隠すのでどちらを優先するかはユーザー次第です。アプリなどで動的にこのレイヤーの順序を変更することができますので、基本的なデザインだけを作ってあとで開発時に検証するのもありです。
道路番号を消す
この様に道路の番号を使って道を表さないのでシールドを消したいです。
最後に
最後にマップをPublish
(公開)して終わりです。公開しても他の人が勝手にアクセスはできない様になっています。マップをアプリケーションからアクセスするにはアクセストークンが必要です。こちらはShare
のタブの下の方にStyle URL
とAccess token
がありますのでそれを使って導入できます。
プレビューとして共有したい場合はMake Public
にしてAllow copying
を有効にすると誰でもこのリンクを持っていればスタイルをコピーできます。
今の例のスタイルはこちらです。
これでなんとかMapbox Studioになれてきました。他のテンプレートも選べたりするので自分で触ってみるのが一番勉強になると思います。
参考になればLGTMお願い致します!