U
    ꥡc                     @   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dddh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   sx  || _ |ptt | _| |}| | _|r\| D ]\}}t	|tr|d t
kr|d |d kr||d d||< q:t	|trt|rt|||< q:t	|trt| ||< q:t	|tr8|g kr8t	|d tr8d}t|D ]8\}	}
|	t|d kr|d|
7 }q|d|
7 }qd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uuidZ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vZarray_as_stri
identifier r1   9/tmp/pip-unpacked-wheel-srr0x9ui/pydeck/bindings/layer.py__init__   s4    ;

&
&
zLayer.__init__c                 C   s   | j S N)r'   r+   r1   r1   r2   r*   z   s    z
Layer.datac                 C   sJ   | j r| || _n2t|r,|jdd| _nt|r@t|| _n|| _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)ZorientN)r(   _prepare_binary_datar)   r   Zto_dictr'   r   r   )r+   data_setr1   r1   r2   r*   ~   s    c                 C   s   | j std| jS )Nz6Layer must be flagged with `use_binary_transport=True`)r(   r   r)   r5   r1   r1   r2   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 q2|S )Nz,Layer data must be a `pandas.DataFrame` typec                 S   s(   i | ] \}}t |tttfkr||qS r1   )r   r    dictset).0r-   r.   r1   r1   r2   
<dictcomp>   s       z.Layer._prepare_binary_data.<locals>.<dictcomp>)Zlayer_idZcolumn_nameaccessornp_data)r   r   r   r   columnsnpstackZto_numpyr%   appendr   r   )r+   r8   Zlayer_accessorsZinverted_accessor_mapZbinary_transmissioncolumnr?   r1   r1   r2   r7      s     

zLayer._prepare_binary_datac                 C   s
   t | tS r4   )getattrTYPE_IDENTIFIERr5   r1   r1   r2   r      s    z
Layer.typec                 C   s   |  t| d S r4   )__setattr__rF   )r+   	type_namer1   r1   r2   r      s    c                 C   s<   t j}t|tr8| j|kr8t|| j tr8|| j |}|S r4   )pydeck_settingsZdefault_layer_attributesr   r:   r   )r+   r,   
attributesr1   r1   r2   r      s    $z#Layer._add_default_layer_attributes)NNN)__name__
__module____qualname__r3   propertyr*   setterr9   r7   r   r   r1   r1   r1   r2   r      s   
g



r   )r   ZnumpyrA   Z
data_utilsr   r   r   Z
json_toolsr   r   r	   rI   Zpydeck.typesr
   r   Zpydeck.exceptionsr   rF   r   r   r   r1   r1   r1   r2   <module>   s   
