
    Ug8                        d dl mZ 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
Z
d dlmZ ddgZd Zd	 Z	 dd
Z	 ddZddZd ZddZd Z G d d      Z G d d      Z	 	 	 	 	 ddZ G d de      Z G d de      Zy# e$ r d\  Z
ZY bw xY w)    )annotations)	find_spec)BytesION)NNrender_tilesMercatorTileDefinitionc                    dd l }dd l}	  |j                  |        y # t        $ r$}|j                   |j                  k7  r Y d }~y d }~ww xY w)Nr   )errnoosmakedirsOSErrorEEXIST)pathr	   r
   es       0lib/python3.12/site-packages/datashader/tiles.py_create_dirr      sC    D 77ell" #s    	A
AA
c                T    | d   } || d   | d         } ||| d   | d   ||      }|S )N	tile_sizex_rangey_range)r   r   heightwidth )	tile_infoload_data_funcrasterize_funcr   dfaggs         r   _get_super_tile_min_maxr       sI    +&I		),i	.B	CB
Yy%9!*9!5 )<C J    c                   |dk(  rg }d}| D ]  }t        |||      }||d<   |j                  j                  dk(  rd}1|j                  t	        j
                  |j                               |j                  t	        j                  |j                                |rd}| |fS t        rKt        j                  |      }	t        j                  |	j                         |	j                               }| |fS t        d      t        d      )	NfullscanFr   bT)r      z%Dask is required for non-boolean dataz%Invalid color_ranging_strategy option)r   dtypekindappendnpnanmindatananmaxdaskdbfrom_sequencecomputeminmax
ValueError)
super_tilesr   r   color_ranging_strategystatsis_bool
super_tiler   spanr"   s
             r   calculate_zoom_level_statsr8   )   s     +%J)*nnUC #Juyy~~$RYYsxx01RYYsxx01 & D D     'A<<1D D   DEE @AAr   c           	        t         st        d      i }|D ]  }	t        dj                  |	             t	        t        t        | |	            |||      \  }
}t        dj                  t        |
      |	|             t        j                  |
      }|j                  t        ||||      j                          t        d|t        |
            ||	<    |S )Nz$Dask is required for rendering tilesz#calculating statistics for level {})r3   z6rendering {} supertiles for zoom level {} with span={}T)successr4   supertile_count)r+   ImportErrorprintformatr8   listgen_super_tileslenr,   r-   maprender_super_tiler.   dict)full_extentlevelsr   r   shader_funcpost_render_funcoutput_pathr3   resultslevelr2   r7   r"   s                r   r   r   C   s     @AAG3::5AB6tOKY^<_7`7E~NdfT 	FMMcR]N^NSUY[ 	\[)	{KAQRZZ\d$KHXY  Nr   c              #     K   | \  }}}}t        dd|z  dz        }t        ||f||f|      }|j                  | |      }	|	D ]/  }
|
d   }|d   |d   f}|d   |d   f}||||j                  |d 1 y w)	Ni         r   r   r      r   r#   )rK   r   r   r   r7   )r/   r   get_tiles_by_extentr   )extent
zoom_levelr7   xminyminxmaxymaxsuper_tile_sizesuper_tile_defr2   s	st_extentr   r   s                 r   r@   r@   W   s     #D$d,
?c13O+T4L4QU,6EGN 44VZHKaD	Q<1.Q<1."!!*44	 		 s   A3A5c                D    | d   } || d   |      }t        ||| ||      S )NrK   r   )r7   )create_sub_tiles)r   r7   rI   rG   rH   rK   ds_imgs          r   rC   rC   i   s1    gE5)5FFE9kCSTTr   c                    t        |       t        |d   |d   d      }|j                  d      rt        |||      }nt	        |||      }|j                  | |      S )Nr   r   rN   rO   zs3:)output_locationrH   )rK   )r   r   
startswithS3TileRendererFileSystemTileRendererrender)
data_arrayrK   r   rI   rH   tile_defrenderers          r   r]   r]   o   ss     &i	.B.7	.B035H
 e$!(K3CE *(K;KM ??:U?33r   c                    d|z  dz
  | z
  S )NrM   r#   r   )yzs     r   invert_y_tilerk      s    Fa<!r   c                  l    e Zd ZdZ	 	 	 ddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zy)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

    c	                   || _         || _        || _        || _        || _        || _        || _        || _        t        | j                  | j                  dz         D 	cg c]  }	| j                  |	       c}	| _
        y c c}	w Nr#   )r   r   r   min_zoommax_zoomx_origin_offsety_origin_offsetinitial_resolutionrange_get_resolution_resolutions)
selfr   r   r   ro   rp   rq   rr   rs   rj   s
             r   __init__zMercatorTileDefinition.__init__   s     "  .."4-24==$--RSBS-TV-TD  #-TV Vs   A?c                     y)z.
        Create OGC tile metadata XML
        Nr   rw   output_file_paths     r   to_ogc_tile_metadataz+MercatorTileDefinition.to_ogc_tile_metadata        	r   c                     y)z0
        Create ESRI tile metadata JSON
        Nr   rz   s     r   to_esri_tile_metadataz,MercatorTileDefinition.to_esri_tile_metadata   r}   r   c                    |dk  s|t        j                  d|      k\  ry|dk  s|t        j                  d|      k\  ryy)Nr   rM   FT)mathpow)rw   xri   rj   s       r   is_valid_tilez$MercatorTileDefinition.is_valid_tile   s;    q5A!Q'q5A!Q'r   c                &    | j                   d|z  z  S )NrM   )rs   )rw   rj   s     r   ru   z&MercatorTileDefinition._get_resolution   s    &&!q&11r   c                B    |d   |d   z
  |z  }|d   |d   z
  |z  }||gS NrM   r   rP   r#   r   )rw   rR   r   r   x_rsy_rss         r   get_resolution_by_extentz/MercatorTileDefinition.get_resolution_by_extent   s:    q	F1I%.q	F1I%/d|r   c                    |d   |d   z
  |z  }|d   |d   z
  |z  }t        ||      }d}| j                  D ]  }||kD  r|dk(  r y|dkD  r|dz
  c S |dz  }! |dz
  S r   )r0   rv   )	rw   rR   r   r   r   r   
resolutionirs	            r   get_level_by_extentz*MercatorTileDefinition.get_level_by_extent   s    q	F1I%.q	F1I%/t_
 ""AA~6q5q5LFA # Ar   c                t    | j                  |      }||z  | j                  z
  }||z  | j                  z
  }||fS Nru   rq   rr   )rw   pxpyrK   resmxmys          r   pixels_to_metersz'MercatorTileDefinition.pixels_to_meters   sC    ""5)3h$...3h$...Bxr   c                t    | j                  |      }|| j                  z   |z  }|| j                  z   |z  }||fS r   r   )rw   r   r   rK   r   r   r   s          r   meters_to_pixelsz'MercatorTileDefinition.meters_to_pixels   sE    ""5)4'''3.4'''3.Bxr   c                    t        j                  || j                  z        }|dk(  r|n|dz
  }t        t        j                  || j                  z        dz
  d      }t	        |      t        t	        |      |      fS )Nr   r#   )r   ceilr   r0   intrk   )rw   r   r   rK   txtys         r   pixels_to_tilez%MercatorTileDefinition.pixels_to_tile   sg    YYrDNN*+7RQ2./!3Q7Bs2w677r   c                .    | j                   |z  }|||z
  fS r   )r   )rw   r   r   rK   map_sizes        r   pixels_to_rasterz'MercatorTileDefinition.pixels_to_raster  s    >>U*HrM""r   c                T    | j                  |||      \  }}| j                  |||      S r   )r   r   )rw   r   r   rK   r   r   s         r   meters_to_tilez%MercatorTileDefinition.meters_to_tile  s/    &&r2u5B""2r511r   c           
     8   |\  }}}}| j                  |||      \  }}| j                  |||      \  }	}
g }t        |
|dz         D ]R  }t        ||	dz         D ]>  }| j                  |||      s|||| j                  |||      f}|j	                  |       @ T |S rn   )r   rt   r   get_tile_metersr&   )rw   rR   rK   rT   rU   rV   rW   txmintymaxtxmaxtymintilesr   r   ts                  r   rQ   z*MercatorTileDefinition.get_tiles_by_extent
  s     "(dD$**4u=u**4u=u uqy)BE519-%%b"e4R(<(<RU(KLALLO . * r   c                    t        ||      }| j                  || j                  z  || j                  z  |      \  }}| j                  |dz   | j                  z  |dz   | j                  z  |      \  }}||||fS rn   )rk   r   r   )rw   r   r   rK   rT   rU   rV   rW   s           r   r   z&MercatorTileDefinition.get_tile_meters  s~    2u%**2+>T^^@SUZ[
d**BFdnn+D,.Fdnn+DeM
ddD$''r   N)rN   r      ףpEsAr   g|EA)__name__
__module____qualname____doc__rx   r|   r   r   ru   r   r   r   r   r   r   r   rQ   r   r   r   r   r   r      s\    &P NP>I$6V2
 8#2$(r   c                      e Zd Z	 	 ddZd Zy)TileRendererNc                    || _         || _        || _        || _        t	        d      t        d      | j                  dvrt        d      y )NPILz"pillow is required to render tiles)PNGJPGzInvalid output format)rf   r`   tile_formatrH   r   r<   r1   )rw   tile_definitionr`   r   rH   s        r   rx   zTileRenderer.__init__&  sY     (.& 0U#BCC>1455 2r   c              #    K   ddl m} | j                  j                  \  }}| j                  j                  \  }}||||f}| j                  j                  ||      }	|	D ]  }
|
\  }}}}|\  }}}}|j                  t        ||      t        ||      d   }d|j                  v rF |t        j                  |j                  d      d      }| j                  r!t        |||      } | j                  |fi |}||||f  y w)Nr   )	fromarray)r   ri   RGBA)r   ri   rj   )	PIL.Imager   rf   r   r   rQ   locsliceshaper'   flipr)   rH   rD   )rw   darK   r   rT   rV   rU   rW   rR   r   r   r   ri   rj   data_extentdxmindymindxmaxdymaxarrimgextrass                         r   rd   zTileRenderer.render4  s    ']]**
d]]**
dtT4'11&%@A#$ Aq![)4&E5%&&uUE2ue9LMNCCII~ BGGCHHa0&9C$$Q!,+d++C:6:1a.  s   DD)r   N)r   r   r   rx   rd   r   r   r   r   r   $  s    EJ"&6!r   r   c	           	        	 ddl m}
 ddlm} ddlm}m} ddlm} |r ||j                  ||      |       | \  }}}}|r|r |
d||||f||fdd	|	}n |
dd
||f||fdd|	}d|_        d|j                  _        d|j                  _         ||||      }|j!                  |d       |r ||       |S # t        $ r t        d      w xY w)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   toolsstretch_both)sizing_moder   r   r   blackT)urlro   rp   F)render_parentsr   )bokeh.plottingr   bokeh.models.tilesr   bokeh.ior   r   r
   r   r<   joinbackground_fill_colorgridgrid_line_alphaaxisvisibleadd_tile)rE   tileset_url
output_dirr   r   ro   rp   r   r   kwargsr   r   r   r   r   rT   rU   rV   rW   ptile_sources                        r   tile_previewerr   N  s    T)5. TYYz8<	! )D$d% ;v $< $</; 4:;
  ;~ $< $</; 4:;
 &AAFFAFFN [*2*24K JJ{5J1QHA  TRSSTs   B: :Cc                       e Zd Z fdZ xZS )rc   c                   t         
|   ||      D ]  \  }}}}dj                  || j                  j	                               }t
        j                  j                  | j                  t        |      t        |            }t
        j                  j                  ||      }	t        |       |j                  |	| j                          y )N{}.{})superrd   r>   r   lowerr
   r   r   r`   strr   r   )rw   r   rK   r   r   ri   rj   tile_file_nametile_directoryr   	__class__s             r   rd   zFileSystemTileRenderer.render  s    !GN2u5LCAq$^^At/?/?/E/E/GHNWW\\$*>*>AAON'',,~~FK'HH[$"2"23 6r   r   r   r   rd   __classcell__r   s   @r   rc   rc     s    4 4r   rc   c                       e Zd Z fdZ xZS )rb   c                   	 dd l }ddlm}  || j                        }|j
                  }|j                  d      }t        | !  ||      D ]  \  }}	}
}dj                  |
| j                  j                               }t        j                  j                  |j                  t        |      t        |	      |      j!                  d      }t#               }|j%                  || j                         |j'                  d       |j)                  |||d        d	j                  ||j                        S # t        $ r t        d      w xY w)
Nr   z'install boto3 to enable rendering to S3)urlparses3r   /zpublic-read)BodyBucketKeyACLzhttps://{}.s3.amazonaws.com/{})boto3r<   urllib.parser   r`   netlocclientr   rd   r>   r   r   r
   r   r   r   lstripr   r   seek
put_object)rw   r   rK   r   r   s3_infobucketr  r   r   ri   rj   r   key
output_bufr   s                  r   rd   zS3TileRenderer.render  s   	I 	*4//0d#!GN2u5LCAq$^^At/?/?/E/E/GHN'',,w||SVSV^LSSTWXC JHHZ!1!12OOA:f#=Y 6 066vw||LL!  	IGHH	Is   D5 5E
r   r   s   @r   rb   rb     s    M Mr   rb   )r!   r   )Nz
index.htmlzDatashader Tilesetr   (   NN)
__future__r   importlib.utilr   ior   r   r
   numpyr'   r+   dask.bagbagr,   r<   __all__r   r   r8   r   r@   rC   r]   rk   r   r   r   rc   rb   r   r   r   <module>r     s    " $   	  3
4 7AB8 HR($U4(X( X(v'! '!V #(-(*&*5p4\ 4M\ MG  HD"s   
B   
BB