
    |Le7                       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 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dS )    )annotations)BytesION)	fromarrayrender_tilesMercatorTileDefinitionc                    dd l }dd l}	  |j        |            d S # t          $ r}|j         |j        k    r Y d }~d S d }~ww xY w)Nr   )errnoosmakedirsOSErrorEEXIST)pathr	   r
   es       0lib/python3.11/site-packages/datashader/tiles.py_create_dirr      sv    LLLIIID   7el"" #"""""s    
A=Ac                ~    | 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      sZ    +&I		),i	.B	C	CB
.Yy%9!*9!5 )< < <C J    fullscanc                   |dk    rg }d}| D ]}t          |||          }||d<   |j        j        dk    rd}+|                    t	          j        |j                             |                    t	          j        |j                             |rd}nMt          j	        |          }	t          j        |	                                |	                                          }| |fS t          d          )Nr    Fr   bT)r      z%Invalid color_ranging_strategy option)r   dtypekindappendnpnanmindatananmaxdbfrom_sequencedaskcomputeminmax
ValueError)
super_tilesr   r   color_ranging_strategystatsis_bool
super_tiler   spanr"   s
             r   calculate_zoom_level_statsr8   &   s     ++% 	2 	2J)*nnUUC #Juy~$$RYsx00111RYsx001111 	2DD ''A<11DD  @AAAr   c           	        i }|D ]}	t          d                    |	                     t          t          t	          | |	                    |||          \  }
}t          d                    t          |
          |	|                     t          j        |
          }|                    t          ||||          
                                 t          d|t          |
                    ||	<   |S )Nz#calculating statistics for level {})r3   z6rendering {} supertiles for zoom level {} with span={}T)successr4   supertile_count)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   >   s    G 	Z 	Z3::5AABBB6tOKY^<_<_7`7`7E~Ndf f fT 	FMMcR]N^N^NSUY[ [ 	\ 	\ 	\[))	{KAQRRZZ\\\d$KHXHXYYYNr   c              #    K   | \  }}}}t          dd|z  dz            }t          ||f||f|          }|                    | |          }	|	D ]9}
|
d         }|d         |d         f}|d         |d         f}||||j        |dV  :d S )	Ni         r   r   r      r   r#   )rJ   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?   P   s      #D$d,
?c13 3O+T4L4QU,6EG G GN 44VZHHK  aD	Q<1.Q<1."!!*4	  	 	 	 		 r   c                ^    | d         } || d         |          }t          ||| ||          S )NrJ   r   )r7   )create_sub_tiles)r   r7   rH   rF   rG   rJ   ds_imgs          r   rB   rB   b   s<    gE[5)555FFE9kCSTTTr   c                    t          |           t          |d         |d         d          }|                    d          rt          |||          }nt	          |||          }|                    | |          S )Nr   r   rM   rN   zs3:)output_locationrG   )rJ   )r   r   
startswithS3TileRendererFileSystemTileRendererrender)
data_arrayrJ   r   rH   rG   tile_defrenderers          r   r\   r\   h   s     &i	.B.7	.B035 5 5H
 e$$ M!(K3CE E E *(K;KM M M ??:U?333r   c                    d|z  dz
  | z
  S )NrL   r#   r   )yzs     r   invert_y_tilerj   |   s    Fa<!r   c                  n    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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

    rM   r      ףpEsA|EAc	                     | _         | _        | _        | _        | _        | _        | _        | _         fdt           j         j        dz             D              _	        d S )Nc                :    g | ]}                     |          S r   )_get_resolution).0ri   selfs     r   
<listcomp>z3MercatorTileDefinition.__init__.<locals>.<listcomp>   s:     V V V()D  ##V V Vr   r#   )
r   r   r   min_zoommax_zoomx_origin_offsety_origin_offsetinitial_resolutionrange_resolutions)	rs   r   r   r   ru   rv   rw   rx   ry   s	   `        r   __init__zMercatorTileDefinition.__init__   s     "  .."4V V V V-24=$-RSBS-T-TV V Vr   c                    dS )z.
        Create OGC tile metadata XML
        Nr   rs   output_file_paths     r   to_ogc_tile_metadataz+MercatorTileDefinition.to_ogc_tile_metadata   	     	r   c                    dS )z0
        Create ESRI tile metadata JSON
        Nr   r~   s     r   to_esri_tile_metadataz,MercatorTileDefinition.to_esri_tile_metadata   r   r   c                    |dk     s|t          j        d|          k    rdS |dk     s|t          j        d|          k    rdS dS )Nr   rL   FT)mathpow)rs   xrh   ri   s       r   is_valid_tilez$MercatorTileDefinition.is_valid_tile   sK    q55A!Q''5q55A!Q''5tr   c                    | j         d|z  z  S )NrL   )ry   )rs   ri   s     r   rq   z&MercatorTileDefinition._get_resolution   s    &!q&11r   c                Z    |d         |d         z
  |z  }|d         |d         z
  |z  }||gS NrL   r   rO   r#   r   )rs   rQ   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 ]#}||k    r|dk    r dS |dk    r|dz
  c S |dz  }$|dz
  S r   )r0   r{   )	rs   rQ   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~~6611q55q5LLLFAAAr   c                h    |                      |          }||z  | j        z
  }||z  | j        z
  }||fS Nrq   rw   rx   )rs   pxpyrJ   resmxmys          r   pixels_to_metersz'MercatorTileDefinition.pixels_to_meters   s@    ""5))3h$..3h$..Bxr   c                h    |                      |          }|| j        z   |z  }|| j        z   |z  }||fS r   r   )rs   r   r   rJ   r   r   r   s          r   meters_to_pixelsz'MercatorTileDefinition.meters_to_pixels   sB    ""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   intrj   )rs   r   r   rJ   txtys         r   pixels_to_tilez%MercatorTileDefinition.pixels_to_tile   ss    YrDN*++77RRQ2.//!3Q77Bs2ww6677r   c                $    | j         |z  }|||z
  fS r   )r   )rs   r   r   rJ   map_sizes        r   pixels_to_rasterz'MercatorTileDefinition.pixels_to_raster   s    >U*HrM""r   c                d    |                      |||          \  }}|                     |||          S r   )r   r   )rs   r   r   rJ   r   r   s         r   meters_to_tilez%MercatorTileDefinition.meters_to_tile   s5    &&r2u55B""2r5111r   c           
     f   |\  }}}}|                      |||          \  }}|                      |||          \  }	}
g }t          |
|dz             D ]_}t          ||	dz             D ]I}|                     |||          r0||||                     |||          f}|                    |           J`|S Nr#   )r   rz   r   get_tile_metersr&   )rs   rQ   rJ   rS   rT   rU   rV   txmintymaxtxmaxtymintilesr   r   ts                  r   rP   z*MercatorTileDefinition.get_tiles_by_extent  s     "(dD$**4u==u**4u==u uqy)) 	$ 	$BE519-- $ $%%b"e44 $R(<(<RU(K(KLALLOOO$
 r   c                    t          ||          }|                     || j        z  || j        z  |          \  }}|                     |dz   | j        z  |dz   | j        z  |          \  }}||||fS r   )rj   r   r   )rs   r   r   rJ   rS   rT   rU   rV   s           r   r   z&MercatorTileDefinition.get_tile_meters  s    2u%%**2+>T^@SUZ[[
d**BFdn+D,.Fdn+DeM M
ddD$''r   N)rM   r   rl   rm   rm   rn   )__name__
__module____qualname____doc__r|   r   r   r   rq   r   r   r   r   r   r   r   rP   r   r   r   r   r   r      s       & &P NP>I$6V V V V      2 2 2  
       8 8 8# # #2 2 2  $( ( ( ( (r   c                       e Zd Z	 	 ddZd ZdS )TileRendererPNGNc                n    || _         || _        || _        || _        | j        dvrt	          d          d S )N)r   JPGzInvalid output format)re   r_   tile_formatrG   r1   )rs   tile_definitionr_   r   rG   s        r   r|   zTileRenderer.__init__  sJ     (.& 0 >114555 21r   c              #    K   | j         j        \  }}| j         j        \  }}||||f}| j                             ||          }|D ]}	|	\  }
}}}|\  }}}}|j        t          ||          t          ||          d         }d|j        v rFt          t          j	        |j
        d          d          }| j        r t          |
||          } | j        |fi |}||
||fV  d S )N)r   rh   r   RGBA)r   rh   ri   )re   r   r   rP   locsliceshaper   r'   flipr)   rG   rC   )rs   darJ   rS   rU   rT   rV   rQ   r   r   r   rh   ri   data_extentdxmindymindxmaxdymaxarrimgextrass                        r   rc   zTileRenderer.render+  s!     ]*
d]*
dtT4'11&%@@ 	! 	!A#$ Aq![)4&E5%&uUE22ue9L9LMMNCCI~~ BGCHa00&99C$ ;Q!,,,+d+C::6::1a.    	! 	!r   )r   N)r   r   r   r|   rc   r   r   r   r   r     s=        EJ"&
6 
6 
6 
6! ! ! ! !r   r   
index.htmlDatashader Tileset(   c	           	        	 ddl m}
 ddlm} ddlm}m} ddlm} n# t          $ r t          d          w xY w|r! ||
                    ||          |           | \  }}}}|r|r |
d||||f||fdd	|	}n |
dd
||f||fdd|	}d|_        d|j        _        d|j        _         ||||          }|                    |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   toolsstretch_both)sizing_moder   r   r   blackT)urlru   rv   F)render_parentsr   )bokeh.plottingr   bokeh.models.tilesr   bokeh.ior   r   r
   r   ImportErrorjoinbackground_fill_colorgridgrid_line_alphaaxisvisibleadd_tile)rD   tileset_url
output_dirr   r   ru   rv   r   r   kwargsr   r   r   r   r   rS   rT   rU   rV   ptile_sources                        r   tile_previewerr   C  s    T))))))555555........ T T TRSSST  !TYYz8<<	! 	! 	! 	! )D$d 	;% 	;F ;v $< $</; ; 4:; ;
 F ;~ $< $</; ; 4:; ;
 &AAFAFN .[*2*24 4 4K JJ{5J111 QHs    7c                       e Zd Z fdZ xZS )rb   c                   t          t          |                               ||          D ]\  }}}}d                    || j                                                  }t          j                            | j	        t          |          t          |                    }t          j                            ||          }	t          |           |                    |	| j                   d S )N{}.{})superrb   rc   r=   r   lowerr
   r   r   r_   strr   r   )rs   r   rJ   r   r   rh   ri   tile_file_nametile_directoryr   	__class__s             r   rc   zFileSystemTileRenderer.render}  s    !"8$??FFr5QQ 	4 	4LCAq$^^At/?/E/E/G/GHHNW\\$*>AAOON',,~~FFK'''HH[$"23333	4 	4r   r   r   r   rc   __classcell__r   s   @r   rb   rb   {  s8        4 4 4 4 4 4 4 4 4r   rb   c                       e Zd Z fdZ xZS )ra   c                &   	 dd l }n# t          $ r t          d          w xY w	 ddlm} n# t          $ r	 ddlm} Y nw xY w || j                  }|j        }|                    d          }t          t          |           	                    ||          D ]\  }}	}
}d
                    |
| j                                                  }t          j                            |j        t!          |          t!          |	          |                              d          }t%                      }|                    || j                   |                    d           |                    |||d           d	
                    ||j                  S )
Nr   z'install boto3 to enable rendering to S3)urlparses3r   /zpublic-read)BodyBucketKeyACLzhttps://{}.s3.amazonaws.com/{})boto3r   r   urllib.parser_   netlocclientr   ra   rc   r=   r   r   r
   r   r   r   lstripr   r   seek
put_object)rs   r   rJ   r  r   s3_infobucketr  r   r   rh   ri   r   key
output_bufr   s                  r   rc   zS3TileRenderer.render  s   	ILLLL 	I 	I 	IGHHH	I	.))))))) 	. 	. 	.--------	. (4/00d##!.$77>>r5II 	Z 	ZLCAq$^^At/?/E/E/G/GHHN',,w|SVVSVV^LLSSTWXXC JHHZ!1222OOA:f#=YYYY/66vw|LLLs    "- A A r   r   s   @r   ra   ra     sA        M M M M M M M M Mr   ra   )r    r   )Nr   r   r   r   NN)
__future__r   ior   r   r
   r-   dask.bagbagr+   numpyr'   	PIL.Imager   __all__r   r   r8   r   r?   rB   r\   rj   r   r   r   rb   ra   r   r   r   <module>r     s   " " " " " "        				                 3
4     7AB B B B4 HR   $   $U U U4 4 4 4(  X( X( X( X( X( X( X( X(v#! #! #! #! #! #! #! #!N #(-(*&*5 5 5 5p4 4 4 4 4\ 4 4 4M M M M M\ M M M M Mr   