a
    `6                     @   s   d dl mZmZmZ d dlmZ d dlZd dlZd dlZd dl	m
Z d dlZd dlmZ ddgZdd Zd	d
 Zd#ddZd$ddZd%ddZdd Zd&ddZdd ZG dd deZG dd deZd'ddZG dd  d eZG d!d" d"eZdS )(    )absolute_importdivisionprint_function)BytesION)	fromarrayrender_tilesMercatorTileDefinitionc              
   C   sV   dd l }dd l}z||  W n2 tyP } z|j|jkr< W Y d }~n
d }~0 0 d S )Nr   )oserrnomakedirsOSErrorZEEXIST)pathr	   r
   e r   /lib/python3.9/site-packages/datashader/tiles.py_create_dir   s    r   c                 C   s8   | d }|| d | d }||| d | d ||d}|S )N	tile_sizex_rangey_range)r   r   heightwidthr   )	tile_infoload_data_funcrasterize_funcr   Zdfaggr   r   r   _get_super_tile_min_max   s    
r   fullscanc           
      C   s   |dkrg }d}| D ]N}t |||}||d< |jjdkr>d}q|t|j |t|j q|rnd}nt	|}	t
|	 |	 }| |fS tdd S )Nr   Fr   bT)r      z%Invalid color_ranging_strategy option)r   ZdtypekindappendnpZnanmindataZnanmaxdbfrom_sequencedaskcomputeminmax
ValueError)
super_tilesr   r   color_ranging_strategystatsZis_boolZ
super_tiler   spanr   r   r   r   calculate_zoom_level_stats%   s     
r.   c                 C   s   t  }|D ]|}	td|	 ttt| |	|||d\}
}tdt|
|	| t|
}|	t
||||  t d|t|
d||	< q
|S )Nz#calculating statistics for level {})r+   z6rendering {} supertiles for zoom level {} with span={}T)successr,   Zsupertile_count)dictprintformatr.   listgen_super_tileslenr#   r$   maprender_super_tiler&   )full_extentZlevelsr   r   shader_funcpost_render_funcoutput_pathr+   resultslevelr*   r-   r   r   r   r   r   =   s    

c                 c   s   | \}}}}t dd| d }t||f||f|d}|| |}	|	D ]@}
|
d }|d |d f}|d |d f}||||j|dV  qDd S )	Ni         r   r   r      r   r   )r=   r   r   r   r-   )r'   r   get_tiles_by_extentr   )extentZ
zoom_levelr-   xminyminxmaxymaxZsuper_tile_sizeZsuper_tile_defr*   sZ	st_extentr   r   r   r   r   r4   N   s     
r4   c                 C   s(   | d }|| d |d}t ||| ||S )Nr=   r   )r-   )create_sub_tiles)r   r-   r;   r9   r:   r=   Zds_imgr   r   r   r7   _   s    r7   c                 C   sT   t | t|d |d dd}|dr8t|||d}nt|||d}|j| |dS )Nr   r   r?   r@   zs3:)output_locationr:   )r=   )r   r   
startswithS3TileRendererFileSystemTileRendererrender)Z
data_arrayr=   r   r;   r:   tile_defZrendererr   r   r   rI   e   s    
rI   c                 C   s   d| d |  S )Nr>   r   r   )yzr   r   r   invert_y_tiley   s    rR   c                   @   s   e Zd ZdZd$ddZd	d
 Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#S )%r   a   Implementation of mercator tile source
    In general, tile sources are used as a required input for ``TileRenderer``.

    Parameters
    ----------

    x_range : tuple
      full extent of x dimension in data units

    y_range : tuple
      full extent of y dimension in data units

    max_zoom : int
      A maximum zoom level for the tile layer. This is the most zoomed-in level.

    min_zoom : int
      A minimum zoom level for the tile layer. This is the most zoomed-out level.

    max_zoom : int
      A maximum zoom level for the tile layer. This is the most zoomed-in level.

    x_origin_offset : int
      An x-offset in plot coordinates.

    y_origin_offset : int
      An y-offset in plot coordinates.

    initial_resolution : int
      Resolution (plot_units / pixels) of minimum zoom level of tileset
      projection. None to auto-compute.

    format : int
      An y-offset in plot coordinates.

    Output
    ------
    tileScheme: MercatorTileSource

    r?   r      ףpEsA|EAc	           	         sV   | _ | _| _| _| _| _| _| _ fddt j jd D  _	d S )Nc                    s   g | ]}  |qS r   )_get_resolution).0rQ   selfr   r   
<listcomp>       z3MercatorTileDefinition.__init__.<locals>.<listcomp>r   )
r   r   r   min_zoommax_zoomx_origin_offsety_origin_offsetinitial_resolutionrange_resolutions)	rY   r   r   r   r\   r]   r^   r_   r`   r   rX   r   __init__   s    zMercatorTileDefinition.__init__c                 C   s   dS )z.
        Create OGC tile metadata XML
        Nr   rY   Zoutput_file_pathr   r   r   to_ogc_tile_metadata   s    z+MercatorTileDefinition.to_ogc_tile_metadatac                 C   s   dS )z0
        Create ESRI tile metadata JSON
        Nr   rd   r   r   r   to_esri_tile_metadata   s    z,MercatorTileDefinition.to_esri_tile_metadatac                 C   s<   |dk s|t d|krdS |dk s4|t d|kr8dS dS )Nr   r>   FT)mathpow)rY   xrP   rQ   r   r   r   is_valid_tile   s
    z$MercatorTileDefinition.is_valid_tilec                 C   s   | j d|  S )Nr>   )r`   )rY   rQ   r   r   r   rV      s    z&MercatorTileDefinition._get_resolutionc                 C   s0   |d |d  | }|d |d  | }||gS Nr>   r   rA   r   r   )rY   rC   r   r   x_rsy_rsr   r   r   get_resolution_by_extent   s    z/MercatorTileDefinition.get_resolution_by_extentc           	      C   s|   |d |d  | }|d |d  | }t ||}d}| jD ]6}||krj|dkrV dS |dkrj|d   S |d7 }q<|d S rk   )r(   rb   )	rY   rC   r   r   rl   rm   Z
resolutionirr   r   r   get_level_by_extent   s    


z*MercatorTileDefinition.get_level_by_extentc                 C   s.   |  |}|| | j }|| | j }||fS NrV   r^   r_   )rY   pxpyr=   resmxmyr   r   r   pixels_to_meters   s    
z'MercatorTileDefinition.pixels_to_metersc                 C   s.   |  |}|| j | }|| j | }||fS rr   rs   )rY   rw   rx   r=   rv   rt   ru   r   r   r   meters_to_pixels   s    
z'MercatorTileDefinition.meters_to_pixelsc                 C   sT   t || j }|dkr|n|d }tt || j d d}t|tt||fS )Nr   r   )rg   Zceilr   r(   intrR   )rY   rt   ru   r=   txtyr   r   r   pixels_to_tile   s    z%MercatorTileDefinition.pixels_to_tilec                 C   s   | j |> }||| fS rr   )r   )rY   rt   ru   r=   Zmap_sizer   r   r   pixels_to_raster   s    
z'MercatorTileDefinition.pixels_to_rasterc                 C   s    |  |||\}}| |||S rr   )rz   r~   )rY   rw   rx   r=   rt   ru   r   r   r   meters_to_tile   s    z%MercatorTileDefinition.meters_to_tilec              
   C   s   |\}}}}|  |||\}}|  |||\}	}
g }t|
|d D ]F}t||	d D ]2}| |||rT|||| |||f}|| qTqB|S Nr   )r   ra   rj   get_tile_metersr    )rY   rC   r=   rD   rE   rF   rG   ZtxminZtymaxZtxmaxZtymintilesr}   r|   tr   r   r   rB      s    z*MercatorTileDefinition.get_tiles_by_extentc                 C   sZ   t ||}| || j || j |\}}| |d | j |d | j |\}}||||fS r   )rR   ry   r   )rY   r|   r}   r=   rD   rE   rF   rG   r   r   r   r     s    
&z&MercatorTileDefinition.get_tile_metersN)r?   r   rS   rT   rT   rU   )__name__
__module____qualname____doc__rc   re   rf   rj   rV   rn   rq   ry   rz   r~   r   r   rB   r   r   r   r   r   r      s$   (   
c                   @   s   e Zd ZdddZdd ZdS )TileRendererPNGNc                 C   s.   || _ || _|| _|| _| jdvr*tdd S )N)r   ZJPGzInvalid output format)rO   rJ   tile_formatr:   r)   )rY   Ztile_definitionrJ   r   r:   r   r   r   rc     s    
zTileRenderer.__init__c                 c   s   | j j\}}| j j\}}||||f}| j ||}|D ]}	|	\}
}}}|\}}}}|jt||t||d }d|jv rzq6tt	|j
dd}| jrt|
||d}| j|fi |}||
||fV  q6d S )N)ri   rP   r   ZRGBA)ri   rP   rQ   )rO   r   r   rB   locsliceshaper   r!   Zflipr"   r:   r0   )rY   dar=   rD   rF   rE   rG   rC   r   r   ri   rP   rQ   Zdata_extentZdxminZdyminZdxmaxZdymaxZarrimgextrasr   r   r   rN   &  s    
zTileRenderer.render)r   N)r   r   r   rc   rN   r   r   r   r   r     s     
r   
index.htmlDatashader Tileset(   c	                 K   s  z8ddl m}
 ddlm} ddlm}m} ddlm} W n t	yR   t	dY n0 |rl||
|||d | \}}}}|r|r|
f ||||f||fdd	|	}n |
f d
||f||fdd|	}d|_d|j_d|j_||||d}|j|dd |r|| |S )zHelper function for creating a simple Bokeh figure with
    a WMTS Tile Source.

    Notes
    -----
    - if you don't supply height / width, stretch_both sizing_mode is used.
    - supply an output_dir to write figure to disk.
    r   )figure)WMTSTileSource)output_filesave)r   z<conda install bokeh to enable creation of simple tile viewer)filenametitlezpan,wheel_zoom,reset)r   r   r   r   toolsZstretch_both)Zsizing_moder   r   r   ZblackT)urlr\   r]   F)Zrender_parents)Zbokeh.plottingr   Zbokeh.models.tilesr   Zbokeh.ior   r   r	   r   ImportErrorjoinZbackground_fill_colorZgridZgrid_line_alphaZaxisZvisibleZadd_tile)r8   Ztileset_urlZ
output_dirr   r   r\   r]   r   r   kwargsr   r   r   r   r   rD   rE   rF   rG   pZtile_sourcer   r   r   tile_previewer=  sL    r   c                       s   e Zd Z fddZ  ZS )rM   c           
         st   t t| ||D ]\\}}}}d|| j }tj| j	t
|t
|}tj||}	t| ||	| j qd S )N{}.{})superrM   rN   r2   r   lowerr	   r   r   rJ   strr   r   )
rY   r   r=   r   ri   rP   rQ   tile_file_nameZtile_directoryr   	__class__r   r   rN   w  s    zFileSystemTileRenderer.renderr   r   r   rN   __classcell__r   r   r   r   rM   u  s   rM   c                       s   e Zd Z fddZ  ZS )rL   c                    s  zdd l }W n ty&   tdY n0 zddlm} W n tyV   ddlm} Y n0 || j}|j}|d}tt| 	||D ]p\}}	}
}d
|
| j }tj|jt|t|	|d}t }||| j |d |j|||dd qd	
||jS )
Nr   z-conda install boto3 to enable rendering to S3)urlparseZs3r   /zpublic-read)ZBodyZBucketZKeyZACLzhttps://{}.s3.amazonaws.com/{})boto3r   r   urllib.parserJ   netlocclientr   rL   rN   r2   r   r   r	   r   r   r   lstripr   r   seekZ
put_object)rY   r   r=   r   r   Zs3_infoZbucketr   r   ri   rP   rQ   r   keyZ
output_bufr   r   r   rN     s&    

"
zS3TileRenderer.renderr   r   r   r   r   rL     s   rL   )r   )r   )N)N)Nr   r   r   r   NN)Z
__future__r   r   r   ior   rg   r	   r%   Zdask.bagZbagr#   Znumpyr!   Z	PIL.Imager   __all__r   r   r.   r   r4   r7   rI   rR   objectr   r   r   rM   rL   r   r   r   r   <module>   s:   
 
 


 &     
8