diff --git a/bindings/pydeck/pydeck/bindings/deck.py b/bindings/pydeck/pydeck/bindings/deck.py index 08c65c1a911..d08abaf56cd 100644 --- a/bindings/pydeck/pydeck/bindings/deck.py +++ b/bindings/pydeck/pydeck/bindings/deck.py @@ -8,7 +8,11 @@ from .view import View from .view_state import ViewState from .base_map_provider import BaseMapProvider -from .map_styles import DARK, get_from_map_identifier +from .map_styles import DARK, get_from_map_identifier, get_default_map_identifier + + +# Special default value to for querying the default style for a map provider. +_DEFAULT_MAP_STYLE_SENTINEL = '__MAP_STYLE__' def has_jupyter_extra(): @@ -29,7 +33,7 @@ def __init__( self, layers=None, views=[View(type="MapView", controller=True)], - map_style=DARK, + map_style=_DEFAULT_MAP_STYLE_SENTINEL, api_keys=None, initial_view_state=ViewState(latitude=0, longitude=0, zoom=1), width="100%", @@ -62,8 +66,11 @@ def __init__( Values can be ``carto``, ``mapbox`` or ``google_maps`` map_style : str or dict, default 'dark' One of 'light', 'dark', 'road', 'satellite', 'dark_no_labels', and 'light_no_labels', a URI for a basemap - style, which varies by provider, or a dict that follows the Mapbox style `specification `. - The default is Carto's Dark Matter map. For Mapbox examples, see Mapbox's `gallery `. + style, which varies by provider, or a dict that follows the Mapbox style `specification `_. + If ``map_provider='google_maps'``, the default is the ``roadmap`` map type. + if ``map_provider='mapbox'``, the default is `Mapbox Dark `_ style. + Otherwise, the default is Carto's Dark Matter map. + For Mapbox examples, see Mapbox's `gallery `_. If not using a basemap, set ``map_provider=None``. initial_view_state : pydeck.ViewState, default ``pydeck.ViewState(latitude=0, longitude=0, zoom=1)`` Initial camera angle relative to the map, defaults to a fully zoomed out 0, 0-centered map @@ -124,6 +131,8 @@ def __init__( assert map_provider == BaseMapProvider.MAPBOX.value, custom_map_style_error self.map_style = map_style else: + if map_provider and map_style == _DEFAULT_MAP_STYLE_SENTINEL: + map_style = get_default_map_identifier(map_provider) self.map_style = get_from_map_identifier(map_style, map_provider) self.parameters = parameters diff --git a/bindings/pydeck/pydeck/bindings/map_styles.py b/bindings/pydeck/pydeck/bindings/map_styles.py index 1524a49de6f..806773afda4 100644 --- a/bindings/pydeck/pydeck/bindings/map_styles.py +++ b/bindings/pydeck/pydeck/bindings/map_styles.py @@ -1,4 +1,4 @@ -import warnings +from .base_map_provider import BaseMapProvider DARK = "dark" @@ -31,6 +31,12 @@ SATELLITE: {"mapbox": MAPBOX_SATELLITE, "google_maps": GOOGLE_SATELLITE}, } +_default_map_identifers = { + BaseMapProvider.CARTO: DARK, + BaseMapProvider.MAPBOX: DARK, + BaseMapProvider.GOOGLE_MAPS: GOOGLE_ROAD, +} + def get_from_map_identifier(map_identifier: str, provider: str) -> str: """Attempt to get a style URI by map provider, otherwise pass the map identifier @@ -57,3 +63,12 @@ def get_from_map_identifier(map_identifier: str, provider: str) -> str: return styles[map_identifier][provider] except KeyError: return map_identifier + + +def get_default_map_identifier(provider: str): + try: + provider_enum = BaseMapProvider(provider) + except KeyError: + return DARK + + return _default_map_identifers[provider_enum] diff --git a/bindings/pydeck/tests/bindings/test_deck.py b/bindings/pydeck/tests/bindings/test_deck.py index c74ac16455e..0adad9b815c 100644 --- a/bindings/pydeck/tests/bindings/test_deck.py +++ b/bindings/pydeck/tests/bindings/test_deck.py @@ -9,6 +9,8 @@ from mock import MagicMock from pydeck import Deck +from pydeck import map_styles +from pydeck.bindings.base_map_provider import BaseMapProvider from IPython.display import HTML from . import pydeck_examples @@ -23,6 +25,22 @@ def test_deck_layer_args(): assert r.layers == expected_output +@pytest.mark.parametrize( + "map_provider_enum, expected_map_style", + ( + (BaseMapProvider.CARTO, map_styles.CARTO_DARK), + (BaseMapProvider.MAPBOX, map_styles.MAPBOX_DARK), + (BaseMapProvider.GOOGLE_MAPS, map_styles.GOOGLE_ROAD), + ), + ids=[BaseMapProvider.CARTO, BaseMapProvider.MAPBOX, BaseMapProvider.GOOGLE_MAPS], +) +def test_deck_default_map_style(map_provider_enum: BaseMapProvider, expected_map_style: str): + """Verify that a default map style is provided for all map providers.""" + r = Deck(**{"layers": [], "map_provider": map_provider_enum.value}) + assert r.map_provider == map_provider_enum.value + assert r.map_style == expected_map_style + + def test_json_output(): """Verify that the JSON rendering produces an @deck.gl/json library-compliant JSON object