a
    Df7                     @  s   d dl 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ZG dd dZd'ddZG dd  d eZG d!d" d"eZdS )(    )annotations)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   )errnoosmakedirsOSErrorEEXIST)pathr   r   e r   ]/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/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   i }|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)printformatr-   listgen_super_tileslenr"   r#   maprender_super_tiler%   dict)full_extent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   r2   P   s$    
r2   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   r5   b   s    r5   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   h   s    
rI   c                 C  s   d| d |  S )Nr>   r   r   )yzr   r   r   invert_y_tile|   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>   s   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   rc   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 rj   )r'   ra   )	rY   rC   r   r   rk   rl   
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   )rf   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   r`   ri   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__rb   rd   re   ri   rV   rm   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   rb     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)rh   rP   r   ZRGBA)rh   rP   rQ   )rO   r   r   rB   locsliceshaper   r    Zflipr!   r:   r6   )rY   dar=   rD   rF   rE   rG   rC   r   r   rh   rP   rQ   Zdata_extentZdxminZdyminZdxmaxZdymaxZarrimgextrasr   r   r   rN   +  s    
zTileRenderer.render)r   N)r   r   r   rb   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   z6install 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)r7   Ztileset_url
output_dirr   r   r[   r\   r   r   kwargsr   r   r   r   r   rD   rE   rF   rG   pZtile_sourcer   r   r   tile_previewerC  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   r0   r   lowerr   r   r   rJ   strr   r   )
rY   r   r=   r   rh   rP   rQ   tile_file_nameZtile_directoryr   	__class__r   r   rN   }  s    zFileSystemTileRenderer.renderr   r   r   rN   __classcell__r   r   r   r   rM   {  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'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   r0   r   r   r   r   r   r   lstripr   r   seekZ
put_object)rY   r   r=   r   r   Zs3_infoZbucketr   r   rh   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)
__future__r   ior   rf   r   r$   Zdask.bagZbagr"   numpyr    Z	PIL.Imager   __all__r   r   r-   r   r2   r5   rI   rR   r   r   r   rM   rL   r   r   r   r   <module>   s:    
 


 '     
8