器→工具, 工具软件

Python地理数据可视化工具mapboxgl jupyter

钱魏Way · · 578 次浏览

Mapbox简介

Mapbox由Eric Gunderson于2010年创立,其发展迅速,已经成为制图复兴浪潮的领导者。Mapbox专注于为地图和应用程序开发人员提供自定义底图图块,他们将自己定位为Web地图和移动应用程序的领先软件公司。除了已经广泛被程序开发人员和制图师所使用的底图样式工具集以外,他们还提供了Python和JavaScript编写的绘图工具。通过将这两种语言组合在一个包中Mapbox发布了新的”MapboxGL-Jupyter” Python模块,允许在Jupter Notebook环境中创建数据即时可视化。此外,Mapbox还提供了允许API访问帐户服务的Mapbox Python SDK。

MapboxGL.js

MapboxGL基于Leaflet.js。在Leaflet基础上,MapboxGL.js整合了WebGL库,它利用HTML5 canvas标签来支持Web图形而无需插件。MapboxGL.js支持矢量切片,以及平滑缩放和平移的3D环境。 它支持GeoJSON叠加以及标记和形状。事件(包括点击,缩放和平移)可用于触发数据处理功能,使其成为交互式Web地图应用程序的理想选择。

Mapbox Python SDK

Mapbox Python SDK用于访问大多数Mapbox服务,包括方向、地理编码、分析和数据集。对云端服务的底层访问支持数据编辑和上传、系统管理和基于位置的查询,允许企业将其与本地GIS集成和扩展。虽然MapboxGL-Jupter工具并不依赖此SDK,但是它在数据上传和查询方面非常有用。

Mapbox的使用

官方示例代码:

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


# Load data from sample csv
data_url = 'https://raw.githubusercontent.com/mapbox/mapboxgl-jupyter/master/examples/data/points.csv'
df = pd.read_csv(data_url)

# Must be a public token, starting with `pk`
token = os.getenv('MAPBOX_ACCESS_TOKEN')

# Create a geojson file export from a Pandas dataframe
df_to_geojson(df, filename='points.geojson',
              properties=['Avg Medicare Payments', 'Avg Covered Charges', 'date'],
              lat='lat', lon='lon', precision=3)

# Generate data breaks and color stops from colorBrewer
color_breaks = [0,10,100,1000,10000]
color_stops = create_color_stops(color_breaks, colors='YlGnBu')

# Create the viz from the dataframe
viz = CircleViz('points.geojson',
                access_token=token,
                height='400px',
                color_property = "Avg Medicare Payments",
                color_stops = color_stops,
                center = (-95, 40),
                zoom = 3,
                below_layer = 'waterway-label'
              )
viz.show()

执行结果:坐标点地图上不显示。如下图:

分析导致原因是CircleViz读取的’points.geojson’文件并不是通过相对路径读取的,而是通过拼接后的URL读取的,即请求URL是:127.0.0.1:8888/points.geojson,所以会导致如下错误:

404 GET /points.geojson (::1) 41.88ms referer=None

解决方案:将points.geojson文件存储于内存中,而不是直接存储为文件:

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

# Load data from sample csv
# data_url = 'https://raw.githubusercontent.com/mapbox/mapboxgl-jupyter/master/examples/data/points.csv'
data_url = 'points.csv'
df = pd.read_csv(data_url)
# Must be a public token, starting with `pk`
token = os.getenv('MAPBOX_ACCESS_TOKEN')

# Create a geojson file export from a Pandas dataframe
points_geojson = df_to_geojson(df, properties=['Avg Medicare Payments', 'Avg Covered Charges', 'date'], lat='lat', lon='lon', precision=3)

# Generate data breaks and color stops from colorBrewer
color_breaks = [0,10,100,1000,10000]
color_stops = create_color_stops(color_breaks, colors='YlGnBu')

# Create the viz from the dataframe
viz = CircleViz(points_geojson,
                access_token=token,
                height='500px',
                color_property = "Avg Medicare Payments",
                color_stops = color_stops,
                center = (-95, 40),
                zoom = 3,
                below_layer = 'waterway-label'
)
viz.show()

执行结果:

更多使用示例:

个人总结:整体功能不输folium,包括热力图、Choropleth图等都支持,并且也支持自定义瓦片。主要是Mapbox开源的负责人Sean Gillies,就是Shapely、Fiona和Rasterio的主要开发者。Leaflet的开发人员Vladimir Agafonkin自2013年以来一直为Mapbox工作。

参考链接:

发表评论

邮箱地址不会被公开。 必填项已用*标注