mapboxgl-jupyterでOpenStreetMap上に描画


MapBoxのアカウントを作らずに、MapBoxGLを用いて地図上に描画を行いたい場合に利用

import os
import pandas as pd
from mapboxgl.utils import create_color_stops, df_to_geojson
from mapboxgl.viz import CircleViz

# ベースとなるレイヤの定義(OpenStreetMap)
style_json = '''
{
  "version": 8,
  "sources": {
    "osmSource": {
      "type": "raster",
        "tiles": [
          "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png",
          "https://b.tile.openstreetmap.org/{z}/{x}/{y}.png"
        ],
        "tileSize": 256
     }
  },
  "layers": [
    {
      "id": "osmLayer",
      "type": "raster",
      "source": "osmSource",
      "minzoom": 0,
      "maxzoom": 22
    }
  ]
}
'''
style = json.loads(style_json)

# サンプルデータDL -> DataFrame
data_url = 'https://raw.githubusercontent.com/mapbox/mapboxgl-jupyter/master/examples/data/points.csv'
df = pd.read_csv(data_url)

# DataFrame -> GeoJsonに直変換(簡略化のためファイルには起こさない)
df_geo = df_to_geojson(df,
                       properties=['Avg Medicare Payments', 'Avg Covered Charges', 'date'],
                       lat='lat', lon='lon', precision=3,
                      )

# 色設定
color_breaks = [0,10,100,1000,10000]
color_stops = create_color_stops(color_breaks, colors='YlGnBu')

# 描画
viz = CircleViz(df_geo,
                style=style,
                height='400px',
                color_property = "Avg Medicare Payments",
                color_stops = color_stops,
                center = (-95, 40),
                zoom = 3,
               )
viz.show()

完全ではなさそうだが描画には成功
(Payments の値が10000しか描画されていない、ファイルに起こしていないことによるデータ点数起因?)

参考