o
    hO&                     @   s   d dl Z d dlZddlmZ ddlmZ ddlmZ ddlmZ	 ddl
mZ dd	lmZ dd
lmZ ddlmZmZ dd Zdejv ZG dd deZdS )    N   )	JSONMixin)Layer   )deck_to_html)settings)View)	ViewState)BaseMapProvider)DARKget_from_map_identifierc               	   C   s2   zddl m}  |   W dS  ttfy   Y dS w )Nr   DeckGLWidgetTF)widgetr   ImportErrorNotImplementedErrorr    r   H/var/www/vscode/kcb/lib/python3.10/site-packages/pydeck/bindings/deck.pyhas_jupyter_extra   s   r   zgoogle.colabc                   @   s   e Zd Zdedddgededddddd	dddejjdfd
dZ	e
dd ZddefddZdd Zdd Z								dddZdd ZdS )DeckNMapViewT)type
controllerr   r   )latitude	longitudezoom100%  c                 C   s   g | _ t|tr| j | n|pg | _ || _|| _|pi }|	| _|
| _|r,t|	 nd| _
|| _t rYddlm} | | _tj| j_tj| j_|| j_|| j_|| j_|| j_
| | d}t|trs|tjjksoJ ||| _nt||| _|| _dS )a  This is the renderer and configuration for a deck.gl visualization, similar to the
        `Deck <https://deck.gl/docs/api-reference/core/deck>`_ class from deck.gl.
        Pass `Deck` a Mapbox API token to display a basemap; see the notes below.

        Parameters
        ----------

        layers : pydeck.Layer or list of pydeck.Layer, default None
            List of :class:`pydeck.bindings.layer.Layer` layers to render.
        views : list of pydeck.View, default ``[pydeck.View(type="MapView", controller=True)]``
            List of :class:`pydeck.bindings.view.View` objects to render.
        api_keys : dict, default None
            Dictionary of geospatial API service providers, where the keys are ``mapbox``, ``google_maps``, or ``carto``
            and the values are the API key. Defaults to None if not set. Any of the environment variables
            ``MAPBOX_API_KEY``, ``GOOGLE_MAPS_API_KEY``, and ``CARTO_API_KEY`` can be set instead of hardcoding the key here.
        map_provider : str, default 'carto'
            If multiple API keys are set (e.g., both Mapbox and Google Maps), inform pydeck which basemap provider to prefer.
            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 <https://docs.mapbox.com/mapbox-gl-js/style-spec/>`.
            The default is Carto's Dark Matter map. For Mapbox examples, see  Mapbox's `gallery <https://www.mapbox.com/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
            To compute a viewport from data, see :func:`pydeck.data_utils.viewport_helpers.compute_view`
        height : int, default 500
            Height of Jupyter notebook cell, in pixels.
        width : int` or string, default '100%'
            Width of visualization, in pixels (if a number) or as a CSS value string.
        tooltip : bool or dict of {str: str}, default True
            If ``True``/``False``, toggles a default tooltip on visualization hover.
            Layers must have ``pickable=True`` set in order to display a tooltip.
            For more advanced usage, the user can pass a dict to configure more custom tooltip features.
            Further documentation is `here <tooltip.html>`_.

        .. _Deck:
            https://deck.gl/docs/api-reference/core/deck
        .. _gallery:
            https://www.mapbox.com/gallery/
        Nr   r   zQThe map_provider parameter must be 'mapbox' when map_style is provided as a dict.)layers
isinstancer   appendviewsinitial_view_statedescriptioneffectsstrlowermap_provider_tooltipr   r   r   deck_widgetpydeck_settingscustom_librariesconfigurationheightwidthtooltip_set_api_keysdictr
   MAPBOXvalue	map_styler   
parameters)selfr   r!   r4   api_keysr"   r.   r-   r/   r#   r$   r'   r5   r   custom_map_style_errorr   r   r   __init__   s6   8






zDeck.__init__c                 C   s   | j jsd S | j jS N)r)   selected_datar6   r   r   r   r;   |   s   zDeck.selected_datar7   c                 C   sr   |D ]}|o	t | qt D ])}|j d}|j d}||jp%t|}t| || t r6t| j|| qdS )zQSets API key for base map provider for both HTML embedding and the Jupyter widget_key_API_KEYN)	r
   r3   namegetosgetenvsetattrr   r)   )r6   r7   kprovider	attr_nameprovider_env_var
attr_valuer   r   r   r0      s   
zDeck._set_api_keysc                 C   s   | j ddS )z2Display current Deck object for a Jupyter notebookTnotebook_display)to_htmlr<   r   r   r   show   s   z	Deck.showc                 C   s   t d)a  Update a deck.gl map to reflect the current configuration

        For example, if you've modified data passed to Layer and rendered the map using `.show()`,
        you can call `update` to change the data on the map.

        Intended for use in a Jupyter environment.
        zAJupyter-specific features not currently supported in pydeck v0.9.)r   r<   r   r   r   update   s   zDeck.updateFc                 K   s@   |   }	t|	f| j| j|||||| jtjtj||d|}
|
S )a  Write a file and loads it to an iframe, if in a Jupyter environment;
        otherwise, write a file and optionally open it in a web browser

        Parameters
        ----------
        filename : str, default None
            Name of the file.
        open_browser : bool, default False
            Whether a browser window will open or not after write.
        notebook_display : bool, default None
            Display the HTML output in an iframe if True. Set to True automatically if rendering in Jupyter.
        iframe_width : str or int, default '100%'
            Width of Jupyter notebook iframe in pixels, if rendered in a Jupyter environment.
        iframe_height : int, default 500
            Height of Jupyter notebook iframe in pixels, if rendered in Jupyter or Colab.
        as_string : bool, default False
            Returns HTML as a string, if True and ``filename`` is None.
        css_background_color : str, default None
            Background color for visualization, specified as a string in any format accepted for CSS colors.

        Returns
        -------
        str
            Returns absolute path of the file
        )
mapbox_keygoogle_maps_keyfilenameopen_browserrJ   iframe_heightiframe_widthr/   r+   r,   	as_stringoffline)to_jsonr   rN   rO   r(   r*   r+   r,   )r6   rP   rQ   rJ   rS   rR   rT   rU   kwargs	deck_jsonfr   r   r   rK      s(   $zDeck.to_htmlc                 C   s   | j dd}t|ddS )NTrI   data )rK   getattr)r6   htmlr   r   r   _repr_html_   s   zDeck._repr_html_r:   )NFNr   r   FF)__name__
__module____qualname__r   r   r	   r
   CARTOr3   r9   propertyr;   r1   r0   rL   rM   rK   r^   r   r   r   r   r      s8    
`


7r   )rA   sys
json_toolsr   layerr   io.htmlr   r   r*   viewr   
view_stater	   base_map_providerr
   
map_stylesr   r   r   modulesin_google_colabr   r   r   r   r   <module>   s    

