見出し画像

MapBox

Google Map にゼンリンがデータを提供するのをやめたと同時に,MapBoxとゼンリンの提携が報道された.

多くの一般ユーザーはGoogle MapのかわりにMapBoxを使おうとして失敗しているようだが,MapBoxはアプリではなく開発環境なのだ.

PythonからMapBoxを使って地図を書くにはユーザー登録をしてtokenを得てから,Plotly経由で書くのが一番簡単だ.

Plotlyのインストールは

conda install -c plotly plotly

もしくは

pip install plotly

できる.

Plotlyにおける図の構成要素は,

トレース:基本描画単位(Scatter, Line, Barなどのオブジェクト)
データ:トレースのリスト(複数のトレースをひとつの画面に描画)
レイアウト:図のレイアウト.タイトル,軸などを定義.
図:データとレイアウトから構成されるオブジェクト

であり,データ以外は,辞書(の辞書)から成るデータ構造で保管される.

描画は,オンラインとオフラインで描画できる.
オンラインの場合にはPlotlyのAPIキーが必要で,この場合には図はJupyter上だけでなく,サーバー側に保管される.無料ユーザーのデータはすべて公開(public)となるので注意が必要である.


オフラインの場合にはhtmlファイルを出力(と同時にブラウザで表示)する.肝心の地図の描画だが,前述したようにmapboxへの登録が別途必要(tokenを設定)で,枝が多いときには(Noneを間に挟むことによって)1つのトレースとして描画することによる高速化が必須になる.

# Plotlyによる描画の準備
import plotly
import plotly.plotly as py
from plotly.graph_objs import *
plotly.tools.set_credentials_file(username='ユーザー名' api_key='Plotlyのキー)
mapbox_access_token = 'トークン'
plotly.tools.set_config_file(world_readable=False,sharing='private')

と準備をした後で,こんな感じで書くと描画される.

edge_trace_x, edge_trace_y = [], []
for (c,b) in Edge:
   edge_trace_x +=[c.lat, b.lat, None ]
   edge_trace_y +=[c.lng, b.lng, None]

data = [
      Scattermapbox( #edge 
       lat=edge_trace_x,
       lon=edge_trace_y,
       line=dict(width=1,color='yellow'),
        hoverinfo='none',
        mode='lines',
        name ="枝"
      ), 
      Scattermapbox( #node
       lat=latitude,
       lon=longitude,
       mode='markers',
       marker=dict(
           size =20, color="blue", opacity=0.5
       ),
      text = text,
       name = "点"
     ),
     
layout = Layout(
   autosize=True,
   hovermode='closest',
   mapbox=dict(
       accesstoken=mapbox_access_token,
       bearing=0,
       center=dict(
           lat=35.8573157, 
           lon=139.64696
       ),
       pitch=0,
       zoom=5,
       style="dark" #'satellite-streets'
   ),
)
fig = dict(data=data, layout=layout)
plotly.offline.plot(fig, filename='地図.html', 
                   show_link=False, config={"displaylogo":False, "modeBarButtonsToRemove":["sendDataToCloud"]})

この記事が気に入ったらサポートをしてみませんか?