地理数据#

Bokeh 支持创建基于地图的可视化并处理地理数据。

瓦片提供者地图#

Bokeh 兼容多种使用 Web Mercator 投影的 XYZ 瓦片服务。 Bokeh 使用 xyzservices 库来处理瓦片源及其归属。 要将这些添加到绘图中,请使用 add_tile() 方法。您可以传递 任何 xyzservices 可能识别的名称。retina 关键字可以控制瓦片的分辨率。

from bokeh.plotting import figure, show

# range bounds supplied in web mercator coordinates
p = figure(x_range=(-2000000, 2000000), y_range=(1000000, 7000000),
           x_axis_type="mercator", y_axis_type="mercator")

p.add_tile("CartoDB Positron", retina=True)

show(p)

如果你传递retina=True,Bokeh将尝试使用比默认设置高2倍分辨率的瓦片。然而,此功能需要瓦片提供商的支持。否则,该关键字将被忽略。或者,你可以将'retina'作为瓦片提供商名称字符串的一部分,例如'CartoDB Positron retina',这将与retina=True一样工作。

请注意,将x_axis_type="mercator"y_axis_type="mercator"传递给figure会生成带有纬度和经度标签的轴,而不是原始的Web Mercator坐标。

或者,您可以使用任何xyzservices.TileProvider,无论是预定义在xyzservices中的还是自定义的。

import xyzservices.providers as xyz

from bokeh.plotting import figure, show

# range bounds supplied in web mercator coordinates
p = figure(x_range=(-2000000, 6000000), y_range=(-1000000, 7000000),
           x_axis_type="mercator", y_axis_type="mercator")
p.add_tile(xyz.OpenStreetMap.Mapnik)

show(p)

可用的内置瓦片提供者列在xyzservices文档中,或者以交互方式作为xyzservices.providers模块。

下面展示了最常见的瓦片提供者的代表性样本。

CartoDB Positron#

CartoDB 瓦片服务的瓦片源

Esri 世界影像#

ESRI公共瓦片的瓦片源。

OSM#

Open Street Map Mapnik 的瓦片源。

谷歌地图#

要在Google地图上绘制符号,请使用函数gmap()。 为了使该函数正常工作,您必须传递一个Google API密钥并配置Google地图底层GMapOptions。 Google API密钥将存储在Bokeh文档JSON中。

from bokeh.models import ColumnDataSource, GMapOptions
from bokeh.plotting import gmap, show

map_options = GMapOptions(lat=30.2861, lng=-97.7394, map_type="roadmap", zoom=11)

# For GMaps to function, Google requires you obtain and enable an API key:
#
#     https://developers.google.com/maps/documentation/javascript/get-api-key
#
# Replace the value below with your personal API key:
p = gmap("GOOGLE_API_KEY", map_options, title="Austin")

source = ColumnDataSource(
    data=dict(lat=[ 30.29,  30.20,  30.29],
              lon=[-97.70, -97.74, -97.78]),
)

p.scatter(x="lon", y="lat", size=15, fill_color="blue", fill_alpha=0.8, source=source)

show(p)

注意

任何使用Bokeh与Google Maps的行为都必须遵守Google的服务条款。

Google Maps 始终对宽高比施加明确控制,这对 GMapPlot 施加了一些限制:

  • 仅支持Range1d范围。尝试使用其他范围类型将导致错误。

  • 使用 BoxZoomToolGMapPlot 不兼容,添加一个将不会产生任何效果。

GeoJSON 数据#

GeoJSON 是一种流行的开放标准,用于使用 JSON 表示地理特征。它将点、线和多边形(在 Bokeh 中称为 Patches)描述为特征的集合。每个特征还可以有一组属性。

Bokeh的GeoJSONDataSource几乎可以无缝替代Bokeh的ColumnDataSource。例如:

import json

from bokeh.models import GeoJSONDataSource
from bokeh.plotting import figure, show
from bokeh.sampledata.sample_geojson import geojson

data = json.loads(geojson)

for i in range(len(data['features'])):
    data['features'][i]['properties']['Color'] = ['blue', 'red'][i%2]

geo_source = GeoJSONDataSource(geojson=json.dumps(data))

TOOLTIPS = [('Organisation', '@OrganisationName')]

p = figure(background_fill_color="lightgrey", tooltips=TOOLTIPS)

p.scatter(x='x', y='y', size=15, color='Color', alpha=0.7, source=geo_source)

show(p)

警告

Bokeh 将 GeoJSON 坐标转换为名为 xyxsys 的列(取决于特征是点、线、多线、多边形还是多多边形)。在转换 GeoJSON 时,具有冲突名称的属性将被覆盖,应避免使用