o
    h                     @   s   d dl Z d dlZddlmZmZmZ ddlmZm	Z	 ddl
m
Z d dlmZmZ d dlmZ d	Zd
Zh dZG dd deZdS )    N   )is_pandas_dfhas_geo_interfacerecords_from_geo_interface   )	JSONMixincamel_and_lower)settings)ImageFunction)BinaryTransportExceptionz@@typez@@=>   "'`c                   @   sb   e Zd ZdddZedd Zejdd Zdd Zd	d
 Zedd Z	e	jdd Z	dd Z
dS )LayerNc                 K   sl  || _ |p
tt | _| |}| | _|r| D ]\}}t	|tr>|d t
v r>|d |d kr>||d d||< qt	|trOt|rOt|||< qt	|tr[t| ||< qt	|tr|g krt	|d trd}t|D ]\}	}
|	t|d kr|d|
7 }qq|d|
7 }qqdt|||< qt	|tr| ||< q| j| d| _|| _d| _|| _dS )	a  Configures a deck.gl layer for rendering on a map. Parameters passed
        here will be specific to the particular deck.gl layer that you are choosing to use.

        Please see the deck.gl
        `Layer catalog <https://deck.gl/docs/api-reference/layers>`_
        to determine the particular parameters of your layer. You are highly encouraged to look
        at the examples in the pydeck documentation.

        Parameters
        ==========

        type : str
            Type of layer to render, e.g., `HexagonLayer`
        id : str, default None
            Unique name for layer
        data : str or list of dict of {str: Any} or pandas.DataFrame, default None
            Either a URL of data to load in or an array of data
        use_binary_transport : bool, default None
            Boolean indicating binary data
        **kwargs
            Any of the parameters passable to a deck.gl layer.

        Examples
        ========

        For example, here is a HexagonLayer which reads data from a URL.

          >>> import pydeck
          >>> # 2014 location of car accidents in the UK
          >>> UK_ACCIDENTS_DATA = ('https://raw.githubusercontent.com/uber-common/'
          >>>                     'deck.gl-data/master/examples/3d-heatmap/heatmap-data.csv')
          >>> # Define a layer to display on a map
          >>> layer = pydeck.Layer(
          >>>     'HexagonLayer',
          >>>     UK_ACCIDENTS_DATA,
          >>>     get_position=['lng', 'lat'],
          >>>     auto_highlight=True,
          >>>     elevation_scale=50,
          >>>     pickable=True,
          >>>     elevation_range=[0, 3000],
          >>>     extruded=True,
          >>>     coverage=1)

        Alternately, input can be a pandas.DataFrame:

          >>> import pydeck
          >>> df = pd.read_csv(UK_ACCIDENTS_DATA)
          >>> layer = pydeck.Layer(
          >>>     'HexagonLayer',
          >>>     df,
          >>>     get_position=['lng', 'lat'],
          >>>     auto_highlight=True,
          >>>     elevation_scale=50,
          >>>     pickable=True,
          >>>     elevation_range=[0, 3000],
          >>>     extruded=True,
          >>>     coverage=1)
        r    r   z{}z{}, z{}[{}]N)typestruuiduuid4id_add_default_layer_attributescopy_kwargsitems
isinstanceQUOTE_CHARSreplacer
   validateFUNCTION_IDENTIFIERlist	enumeratelenformatr   	serialize__dict__update_datause_binary_transport_binary_datadata)selfr   r+   r   r)   kwargskvarray_as_stri
identifier r3   I/var/www/vscode/kcb/lib/python3.10/site-packages/pydeck/bindings/layer.py__init__   s6   ;

&
 

zLayer.__init__c                 C   s   | j S N)r(   r,   r3   r3   r4   r+   z   s   z
Layer.datac                 C   sP   | j r| || _dS t|r|jdd| _dS t|r#t|| _dS || _dS )zMake the data attribute a list no matter the input type, unless
        use_binary_transport is specified, which case we circumvent
        serializing the data to JSON
        records)orientN)r)   _prepare_binary_datar*   r   to_dictr(   r   r   )r,   data_setr3   r3   r4   r+   ~   s   
c                 C   s   | j std| jS )Nz6Layer must be flagged with `use_binary_transport=True`)r)   r   r*   r7   r3   r3   r4   get_binary_data   s   zLayer.get_binary_datac                 C   sx   t |std| j}dd | D }g }|jD ] }t||  }| j|| = |	| j
|t|| |d q|S )Nz,Layer data must be a `pandas.DataFrame` typec                 S   s(   i | ]\}}t |tttfvr||qS r3   )r   r!   dictset).0r.   r/   r3   r3   r4   
<dictcomp>   s   ( z.Layer._prepare_binary_data.<locals>.<dictcomp>)layer_idcolumn_nameaccessornp_data)r   r   r   r   columnsnpstackto_numpyr&   appendr   r   )r,   r<   layer_accessorsinverted_accessor_mapbinary_transmissioncolumnrE   r3   r3   r4   r:      s    

zLayer._prepare_binary_datac                 C   s
   t | tS r6   )getattrTYPE_IDENTIFIERr7   r3   r3   r4   r      s   
z
Layer.typec                 C   s   |  t| d S r6   )__setattr__rP   )r,   	type_namer3   r3   r4   r      s   c                 C   s@   t j}t|tr| j|v rt|| j tri || j |}|S r6   )pydeck_settingsdefault_layer_attributesr   r>   r   )r,   r-   
attributesr3   r3   r4   r      s   $z#Layer._add_default_layer_attributes)NNN)__name__
__module____qualname__r5   propertyr+   setterr=   r:   r   r   r3   r3   r3   r4   r      s    
g



r   )r   numpyrG   
data_utilsr   r   r   
json_toolsr   r   r	   rS   pydeck.typesr
   r   pydeck.exceptionsr   rP   r    r   r   r3   r3   r3   r4   <module>   s    