#-----------------------------------------------------------------------------
# Copyright (c) Anaconda, Inc., and Bokeh Contributors.
# All rights reserved.
#
# The full license is in the file LICENSE.txt, distributed with this software.
#-----------------------------------------------------------------------------
''' Pre-configured tile sources for common third party tile services.
.. autofunction:: bokeh.tile_providers.get_provider
The available built-in tile providers are listed in the ``Vendors`` enum:
.. bokeh-enum:: Vendors
:module: bokeh.tile_providers
:noindex:
.. warning::
The built-in Vendors are deprecated as of Bokeh 3.0.0 and will be removed in a future
release. You can pass the same strings to ``add_tile`` directly.
Any of these values may be be passed to the ``get_provider`` function in order
to obtain a tile provider to use with a Bokeh plot. Representative samples of
each tile provider are shown below.
CARTODBPOSITRON
---------------
Tile Source for CartoDB Tile Service
.. raw:: html
CARTODBPOSITRON_RETINA
----------------------
Tile Source for CartoDB Tile Service (tiles at 'retina' resolution)
.. raw:: html
ESRI_IMAGERY
------------
Tile Source for ESRI public tiles.
.. raw:: html
OSM
---
Tile Source for Open Street Maps.
.. raw:: html
'''
#-----------------------------------------------------------------------------
# Boilerplate
#-----------------------------------------------------------------------------
from __future__ import annotations
import logging # isort:skip
log = logging.getLogger(__name__)
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
# Standard library imports
import sys
import types
# External imports
# __all__ defined at the bottom on the class module
import xyzservices
# Bokeh imports
from bokeh.core.enums import enumeration
# Bokeh imports
from .util.deprecation import deprecated
#-----------------------------------------------------------------------------
# Globals and constants
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# General API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Dev API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Private API
#-----------------------------------------------------------------------------
class _TileProvidersModule(types.ModuleType):
def deprecated_vendors():
deprecated((3, 0, 0), "tile_providers module", "add_tile directly")
return enumeration('CARTODBPOSITRON', 'CARTODBPOSITRON_RETINA',
'STAMEN_TERRAIN', 'STAMEN_TERRAIN_RETINA', 'STAMEN_TONER',
'STAMEN_TONER_BACKGROUND', 'STAMEN_TONER_LABELS',
'OSM', 'ESRI_IMAGERY',
case_sensitive=True)
Vendors = deprecated_vendors()
def get_provider(self, provider_name: str | Vendors | xyzservices.TileProvider):
"""Use this function to retrieve an instance of a predefined tile provider.
.. warning::
get_provider is deprecated as of Bokeh 3.0.0 and will be removed in a future
release. Use ``add_tile`` directly instead.
Args:
provider_name (Union[str, Vendors, xyzservices.TileProvider]):
Name of the tile provider to supply.
Use a ``tile_providers.Vendors`` enumeration value, or the string
name of one of the known providers. Use
:class:`xyzservices.TileProvider` to pass custom tile providers.
Returns:
WMTSTileProviderSource: The desired tile provider instance.
Raises:
ValueError: if the specified provider can not be found.
Example:
.. code-block:: python
>>> from bokeh.tile_providers import get_provider, Vendors
>>> get_provider(Vendors.CARTODBPOSITRON)
>>> get_provider('CARTODBPOSITRON')
>>> import xyzservices.providers as xyz
>>> get_provider(xyz.CartoDB.Positron)
"""
deprecated((3, 0, 0), "get_provider", "add_tile directly")
from bokeh.models import WMTSTileSource
if isinstance(provider_name, WMTSTileSource):
# This allows `get_provider(CARTODBPOSITRON)` to work
return WMTSTileSource(url=provider_name.url, attribution=provider_name.attribution)
if isinstance(provider_name, str):
provider_name = provider_name.lower()
if provider_name == "esri_imagery":
provider_name = "esri_worldimagery"
if provider_name == "osm":
provider_name = "openstreetmap_mapnik"
if provider_name.startswith("stamen"):
provider_name = f"stadia.{provider_name}"
if "retina" in provider_name:
provider_name = provider_name.replace("retina", "")
retina = True
else:
retina = False
scale_factor = "@2x" if retina else None
provider_name = xyzservices.providers.query_name(provider_name)
else:
scale_factor = None
if isinstance(provider_name, xyzservices.TileProvider):
return WMTSTileSource(
url=provider_name.build_url(scale_factor=scale_factor),
attribution=provider_name.html_attribution,
min_zoom=provider_name.get("min_zoom", 0),
max_zoom=provider_name.get("max_zoom", 30),
)
# Properties --------------------------------------------------------------
CARTODBPOSITRON = Vendors.CARTODBPOSITRON
CARTODBPOSITRON_RETINA = Vendors.CARTODBPOSITRON_RETINA
STAMEN_TERRAIN = Vendors.STAMEN_TERRAIN
STAMEN_TERRAIN_RETINA = Vendors.STAMEN_TERRAIN_RETINA
STAMEN_TONER = Vendors.STAMEN_TONER
STAMEN_TONER_BACKGROUND = Vendors.STAMEN_TONER_BACKGROUND
STAMEN_TONER_LABELS = Vendors.STAMEN_TONER_LABELS
OSM = Vendors.OSM
ESRI_IMAGERY = Vendors.ESRI_IMAGERY
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
_mod = _TileProvidersModule("bokeh.tile_providers")
_mod.__doc__ = __doc__
_mod.__all__ = (
'CARTODBPOSITRON',
'CARTODBPOSITRON_RETINA',
'STAMEN_TERRAIN',
'STAMEN_TERRAIN_RETINA',
'STAMEN_TONER',
'STAMEN_TONER_BACKGROUND',
'STAMEN_TONER_LABELS',
'OSM',
'ESRI_IMAGERY',
'get_provider',
'Vendors',
)
sys.modules['bokeh.tile_providers'] = _mod
del _mod, sys, types