
    agW                        d Z ddlZddlmZ 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Z	 ddlZdZ eej,                        Z ee
j,                        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 Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0	 d0d Z1d! Z2d0d"Z3d# Z4d1d$Z5d% Z6d& Z7d'e8fd(Z9d) Z:d* Z;d+ Z<d, Z=d- Z>d. Z?y# e$ r dZY w xY w)2z4
Provides utilities to convert data and projections
    N)Hashablewraps)Version)FunctionTypeTFc                 6     t                fd       }|S )z;If hv.extension is not loaded, load before calling functionc                  n    r+t        t        j                  dd      sddlm}  |        | i |S )N_loadedF   )hvplot_extension)logo)getattrhv	extension r   )argskwargsr   r   funcr   s      +lib/python3.12/site-packages/hvplot/util.pywrapperz"with_hv_extension.<locals>.wrapper"   s2    WR\\9eD*YT2T$V$$    r   )r   r   r   r   s   ``` r   with_hv_extensionr      s"     4[% % Nr   c                  @    	 t               } | S # t        $ r d } Y | S w xY wN)get_ipython	NameError)ips    r   get_ipyr   -   s0    ] I  Is   
 c                    ddl }	 |j                  j                  }t	        | |j
                        r| }|S t	        | |      r#|j                  | j                         d      }|S t	        | t              st	        | t              rBt	        | t              r	 |j                  j                  |       } 	 |j                  | d      }|S d}|S # t        $ r  G d d      }|}Y w xY w# t        $ r% | j                  dd      j                  d	d
      } Y bw xY w# t        $ r* 	 |j                  | d      }n# t        $ r d}Y nw xY wY |S w xY w)a  
    Checks if the crs represents a valid grid, projection or ESPG string.

    (Code copied and adapted from https://github.com/fmaussion/salem)

    Examples
    --------
    >>> p = check_crs('epsg:26915 +units=m')
    >>> p.srs
    '+proj=utm +zone=15 +datum=NAD83 +units=m +no_defs'
    >>> p = check_crs('wrong')
    >>> p is None
    True

    Returns
    -------
    A valid crs if possible, otherwise None.
    r   Nc                       e Zd Zy)check_crs.<locals>.DummyN)__name__
__module____qualname__ r   r   Dummyr!   N   s    r   r&   T)preserve_units r   +z +)initr'   )pyprojcrsCRSAttributeError
isinstanceProjto_wktdictstrfrom_wktRuntimeErrorreplace)r,   r+   crs_typer&   outs        r   	check_crsr9   5   sS   & ::>> #v{{#& J% 
C	"kk#**,tk<" J! 
C	*S#"6c3>jj))#.	++c$+7C J J7  	 	    >kk#r*223=>
  	kks4k@  J	sY   C C& 2D C#"C#&+DD	E
!D54E
5E E
EE
	E
c                 n    	 | j                         S # t        $ r | j                  j                  cY S w xY w)z)Shortcut function because of deprecation.)
is_latlongr.   r,   is_geographic)projs    r   proj_is_latlongr>   j   s3    &   &xx%%%&s    44c           
         ddl m} 	 ddlm} d}| }t        |      } | t        d|      | j                  }|rddl}|j                         5  |j                  dt        d	       j                         }|j                  | j                         |j                         r|j                         }ddd       d
ddddddddd	}ddd}	ddd}
i }i }i }|j                  d      D ]!  }|j                  d      }t!        |      dk7  r$|d   j#                         }|d   j#                         }	 t%        |      }|dk(  r|dk(  r|j(                  }n|d k(  r|j*                  }d|d!<   nh|d"k(  r|j,                  }nV|d#k(  r|j.                  }nD|d$k(  r|j0                  }n2|d%k(  r|j2                  }n |d&k(  r|j4                  }nt7        d'|       ||v r|dk(  rt9        |      }||||   <   ||	v r|||	|   <   ||
v s|||
|   <   $ d}|r |j:                  d2d(d)i|}|r|d   |d   f|d*<   j<                  d+k(  r;|j?                  dd       |j?                  dd       d|v r|j?                  dd       n|j<                  d,k(  r1|j?                  dd       d|v r^|d   |d-<   |j?                  dd       nC|j<                  d.k(  r"d
|v r0|d
   d/z
  |d0<   |j?                  d
d       n|j?                  dd       	  |d2d1|i|S # t        $ r d}Y 
w xY w# 1 sw Y   mxY w# t&        $ r Y w xY w# t@        $ r |d!= Y nw xY w |d2d1|i|S )3a
  
    Converts a pyproj.Proj to a cartopy.crs.Projection

    (Code copied from https://github.com/fmaussion/salem)

    Parameters
    ----------
    proj: pyproj.Proj
        the projection to convert
    Returns
    -------
    a cartopy.crs.Projection object
    r   N)osrTFzInvalid proj projection ignorezNeither osr\.UseExceptions\(\) nor osr\.DontUseExceptions\(\) has been explicitly called\. In GDAL 4\.0, exceptions will be enabled by default)categorymessagecentral_longitudecentral_latitudefalse_eastingfalse_northinglatitude_true_scalecentral_rotated_longitudepole_latitudescale_factorzone)	lon_0lat_0x_0y_0lat_tso_lon_po_lat_pkrL   semimajor_axissemiminor_axis)ablat_1lat_2)rY   rZ   r)   =   r   r=   longlattmercapproxlccmercutmstereob_tranzUnknown projection ellipsespherestandard_parallelsMercatorStereographictrue_scale_latitudeRotatedPole   pole_longitudeglober%   )!cartopy.crsr,   osgeor@   ImportErrorr9   
ValueErrorsrswarningscatch_warningsfilterwarningsFutureWarningSpatialReferenceImportFromProj4ExportToProj4splitlenstripfloat	ExceptionPlateCarreeTransverseMercatorLambertConformalrh   UTMri   rk   NotImplementedErrorintGlober"   pop	TypeError)r=   ccrsr@   has_gdal
input_projrs   rt   s1km_projkm_globekm_stdkw_projkw_globekw_stdsrT   vclrn   s                      r   proj_to_cartopyr   s   s     JZ D|3J>BCC
((C$$& ##& $  %%'Btxx(!&&( '$ %#'."
G H
 F GHFYYs^GGCLq6Q;aDJJLaDJJL	aA ;I~%%g,,$(!e**f]]eXXg''i%%),?s*CDD<F{F"#GGAJ=$%HXa[!; !F6!9G J E

888x8)/&/(J$% 
{{j OT*$d+W$KK-t4		'ND) G+-45J-KG)*KK-t4		%')(/0C(Ds(JG$%KK+T2)40))))c   '&^  		n  H %E%W%%sB   L A$L3L+	L; LLL(+	L87L8;M
	M
c           	         g }	 ddl m} 	 ddl}	 ddl}|rt        ddj                  |       d      | j                         S t        | j                        r| S t        | t              rtt        |      D cg c]5  }t        t        ||            r|d	vr|d   j                         s|d
k(  r|7 }}| |v r| d
k7  r t        ||              S | d
k(  r2t        ||       S t        | j                        r| j                         } g }t        | t        t         j"                  f      rN| }t        | t        t         f      r*	 |j                  j%                  |       j                         }	 t)        |      S t        | t        t         f      rPt        | t              r.| j+                         j-                  dd      j/                         } 	 |j1                  |       S t3        d      t'        | # t        $ r |j                  d       Y w xY w# t        $ r |j                  d       Y  w xY w# t        $ r |j                  d       Y <w xY wc c}w # t&        $ r}	|j                  |	       Y d}	~	d}	~	ww xY w# t&        $ r}	|j                  |	       Y d}	~	(d}	~	ww xY w# t&        $ r}	|j                  |	       Y d}	~	d}	~	ww xY w)a  
    Parses cartopy CRS definitions defined in one of a few formats:

      1. EPSG codes:   Defined as string of the form "EPSG: {code}" or an integer
      2. proj.4 string: Defined as string of the form "{proj.4 string}"
      3. cartopy.crs.CRS instance
      3. pyproj.Proj or pyproj.CRS instance
      4. WKT string:    Defined as string of the form "{WKT string}"
      5. None defaults to crs.PlateCaree
    r   Ncartopygeoviewsr+   z(Geographic projection support requires: z, .)ABCMetar-   GOOGLE_MERCATORzEPSG:r   zProjection must be defined as a EPSG code, proj4 string, WKT string, cartopy CRS instance, cartopy CRS class name string, pyproj.Proj, or pyproj.CRS.)ro   r,   rq   appendr   r+   joinr   r/   r-   r3   dircallabler   isupperr1   r   r0   	from_epsgr   r   upperr6   r}   epsgrr   )
r,   missingr   gvr+   r=   all_crserrorswktes
             r   process_crsr      s    G""#! DTYYwEWDXXYZ[[
{!!	C	"
	C	 D	
!d+,..Q!(( ! 	 
 '>c%66%74%''%%4%%	C	$jjlF#S&++./cC:&!jj**3/668	"3'' #Sz"c3))+%%gr288:C	99S>! 	& f	o  "y!"  #z"#  !x !
*  !a  !  	MM!	  	MM!	s   G1 H H3 ;:I)I .
J J) 1HHH0/H03II	I>"I99I>	J&
J!!J&)	K2KKc                     t        | d      xrX t        | t               xrE t        | t        t        f       xr, t        | t
        j                        xr | j                  dk(   S )z<
    Adapted from pandas' is_list_like cython function.
    __iter__r   )hasattrr/   typer3   bytesnpndarrayndim)objs    r   is_list_liker   L  se     	Z  	@3%%	@ 3e--	@
 C,>Q?r   c                 ~    t        | g d      ryt        | d      r"ddlm} t        | |      r| j                  dk(  S y y)N)daskstreamzpandas	geopandascudfTintaker   
DataSource	dataframeF)check_libraryintake.source.baser   r/   	containerdatar   s     r   
is_tabularr   [  s@    TMN	tX	&1dJ'>>[00 ( r   c                 \   t        | g d      syt        | t        j                        ryt        | d      r(dd lm} t        | |j                  |j                  f      S t        | d      rdd lm} t        | |j                        S t        | d      rdd l}t        | |j                        S y)N)r   r   r   r   FTr   r   r   r   )	r   r/   pdSeriesstreamz.dataframer   Seriessdask.dataframer   )r   sdfddr   s       r   	is_seriesr   g  s    DE	D"))	$	tY	''$S[[ 9::	tV	$#$		**	tV	$$,,r   c                     t        |t              s|g}t        |D cg c]/  }| j                  j	                  d      d   j                  |      1 c}      S c c}w )Nr   r   )r/   listanyr#   r{   
startswith)r   librarylibs      r   r   r   |  sO    gt$)P$$S)!,77<PQQPs   4Ac                 T    dt         j                  v rddlm}m} t        | ||f      S y )Nr   r   )	DataFramer   )sysmodulesr   r   r   r/   )r   r   r   s      r   is_cudfr     s(    *$F 344 r   c                 l    t        | d      sydd lm} t        | |j                  |j
                  f      S )Nr   Fr   )r   r   r   r/   r   r   )r   r   s     r   is_daskr     s,    v&dR\\299566r   c                 h    t        | d      sydd l}t        | |j                  |j                  f      S )NduckdbFr   )r   r   r/   DuckDBPyRelationDuckDBPyConnection)r   r   s     r   	is_duckdbr     s0    x(dV44f6O6OPQQr   c                 ~    t        | d      sydd l}t        | |j                  |j                  |j
                  f      S )NpolarsFr   )r   r   r/   r   r   	LazyFramer   pls     r   	is_polarsr     s2    x(dR\\299bllCDDr   c                 L    dt         j                  vryddlm} t	        | |      S )Nr   Fr   r   )r   r   r   r   r/   r   s     r   	is_intaker     s!    s{{"-dJ''r   c                 P    t        | d      sydd l}t        | |j                        S )NibisFr   )r   r   r/   Expr)r   r   s     r   is_ibisr     s#    v&dDII&&r   c                     t        | d      sydd lm} |xr8 t        | |j                  |j
                  |j                  |j                  f      S )Nr   Fr   )r   r   r   r/   r   r   
DataFramesr   )r   r   s     r   
is_streamzr     s@    y)#]:dS]]CJJPSP[P[$\]]r   c                 H    t        | d      syddlm}m} t	        | ||f      S )NxarrayFr   )	DataArrayDataset)r   r   r   r   r/   )r   r   r   s      r   	is_xarrayr     s$    x()dY011r   c                 |    t        |       st        |       ryt        |       rddl}t	        | |j
                        S y)zCheck if data is lazy

    This checks if the datatype is Dask, Ibis, or Polars' LazyFrame.
    It is useful to avoid eager evaluation of the data.
    Tr   NF)r   r   r   r   r/   r   r   s     r   is_lazy_datar     s2     t}	4$--r   c                 @    t        | d      syddlm} t        | |      S )Nr   Fr   )r   )r   r   r   r/   )r   r   s     r   is_xarray_dataarrayr     s    x( dI&&r   c                 8    t        |       t        j                  u S )z
    HoloViews added in v1.19.0 support for retaining Pandas indexes (no longer
    calling .reset_index()).

    Update this utility when other data interfaces support that (geopandas, dask, etc.)
    )r   r   r   )r   s    r   support_indexr     s     :%%r   c                     | j                   dvrt        d      |r| j                         } | S | j                         } | S )N)r   r   zhPlotting interface currently only supports DataSource objects declaring a dataframe or xarray container.)r   r   to_daskread)r   use_dasks     r   process_intaker     sJ    ~~44!/
 	

 ||~ K yy{Kr   c                     dt         j                  v r1dd l}t        | |j                  |j
                  j                  f      ryt        | t        j                        xr t        | d      xr t        | d      S )Nspatialpandasr   T	geom_typegeometry)
r   r   r  r/   GeoDataFramer   DaskGeoDataFramer   r   r   )r   spds     r   is_geodataframer    s`    #++%#dS--sxx/H/HIJ4&c74+Ec'RVXbJcr   c           
      	   dd l }t        | |j                        r| }n&| j                  xs |xs |	}| j	                  |      }|
rt        |
      ng }||||fD ]F  }t        |t
              r|j                  |       %t        |t              s6|j                  |       H |s|D cg c]2  }|t        |j                        t        |j                        z   vs1|4 }}t        ||      \  }}} |j                  di |D ci c]  }|||   
 c}} |j                  di |D ci c]  }|||   
 c}}t        |j                        }|xs g |xs g z   }|j                  D cg c]  }||   j                  dk7  s||vs| c}d d d   }|D cg c]  }||j                  v s| }}|rz|} t!        |      dk  r1|t        | j"                        d d d   D cg c]	  }||vs| c}z  }|s^|s\|j                  D ]M  }||   j$                  j'                  dd      }|j)                         dk(  r|}8|j)                         d	k(  sL|}O |s|st!        |      d
kD  r|d d n|d d \  }}n;|r|s|D cg c]
  }||k7  s	| c}d   }n|r|s|D cg c]
  }||k7  s	| c}d   }t!        |      dkD  r|dvr|st        | j                  |   j"                        t        | j                  |   j"                        z   }|D cg c]  }|||fvs
||vs||
vs| }}ng|r%|j+                         } |r| j-                         n| } nM|j/                         } t1        |       s2t!        | j2                  j4                        d
kD  r| j7                         } t!        |      dk(  rdg}|r|s||v r|d   n|}n|r|s||v r|d   n|d   }n|s	|s|d   |}}||fD ]F  }t        |t
              r|j                  |       %t        |t              s6|j                  |       H g }|D ]/  }||j                  v s|j                  ||   j"                         1 |D cg c]  }|||z   vs| }}||D cg c]  }||xs g vs| }}| ||||fS c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nr   )namer%   r\   axisr   xyr   )tabledatasetindex)r   r/   r   r	  
to_datasetr   extendr3   r   	data_varscoordsprocess_derived_datetime_xarrayassign_coordsassignshapeindexesr|   dimsattrsgetlowerto_dask_dataframepersistto_dataframer   r  namesreset_index)r   r  r  bygroupbyr   r  griddedlabelvalue_label
other_dimskindxrr  r	  all_varsvar	not_found_
extra_varsextra_coordsr  rA   cr  d
index_dimsdimr  covered_dimsleftover_dimss                                  r   process_xarrayr7    s    $

#yy0E0[//t/,#-tJ2H1b'"c4 OOC S!OOC 	 # #
#Cs$w7H7H2IDQXQ_Q_L`2`'`C8 	 
 'Fgy&Y#:|''''V*U3+<*UV '..M#L#C$5#LMW&&'IhB7=b)F~~T~!)9)9R)?AVOA~TUYWYUYZD!:TQ'//%9!TJ:t9q=DODbD$9M$9SS_S$9MMDQ^^qz''++FB7::<3&AZZ\S(A $ Q%(_q%8:bq>d2AhDAqq +DqAFD+A.Aq +DqAFD+A.At9q=T)==gA++,tDKKN4G4G/HHD%%a1a&Qd]qXbOb:   ,,.D%,4<<>$D'')D &3tzz/?/?+@1+D'')t9>9DQ	>QyAq !T		!tAwA17IqAq6C#t$$C%$	  Cgnn$##GCL$5$56  )3Y
cPXAX6X
Y?"/G-Q1RX23Fq-GGAr7""C
 +V#L U:
 N ,+< Z Hs   (2RRR!'R&)R+R+R+R0+R0"	R5,R5=
R:R:
R?&R?SS!S&S(S	5S	SSc                    ddl m} g }g }|D ]X  }d|v s|j                  d      d   } || |         s(|| j                  v r|j	                  |       H|j	                  |       Z |D cg c]  }|||z   vs| }}|||fS c c}w )Nr   is_datetime64_any_dtyper   )pandas.api.typesr:  r{   r  r   )r   r-  isdater/  r0  r,  derived_froms          r   r  r  R  s    BJL#:99S>!,Ld<()4;;. '',%%c*  !*R	S
\8Q-Q	IRj,.. Ss   ,B9Bc                 2   ddl m} |xs g }i }|D ]  }d|v s|j                  d      }|d   }|d   }|| j                  v r) || |         s=t	        | |   j
                  |      ||<   Z|dk(  r- || j                        srt	        | j                  |      ||<   ||v s| j                  |j                  |         }	 ||	      st	        |	|      ||<    |r | j                  di |} |D cg c]  }||j                         vs| }}|| fS c c}w )Nr   r9  r   r
  r  r%   )
r;  r:  r{   columnsr   dtr  axesr  keys)
r   r-  r  r<  
extra_colsr,  partsbase_coldt_strr  s
             r   process_derived_datetime_pandasrG  c  s   BmGJ#:IIcNEQxH2YF4<<'$x.)&-d8n.?.?&HJsOW$$**%&-djj&&AJsOW$		'--"9:%=&-eV&<JsO  t{{(Z( )J	S
8I-I	IJd? Ks   2D
Dc                    i }g }g }t        |j                               d| fd|fd|fgz   D ]V  \  }}t        |t        j                        r|||<   &t
        s-t        |t        j                  j                        sR|||<   X |j                         D ]_  \  }}||vst        |t              st        |d      s)|j                  d   }	|t        |	      z  }|t        |      t        |	      z  z  }a |||fS )Nr  r  r)  _dinfodependencies)r   itemsr/   param	Parameterpanel_availablepnwidgetsWidgetr   r   rI  r|   )
r  r  r)  kwdsdynamicarg_deps	arg_namesrT   r   depss
             r   process_dynamic_argsrW  ~  s    GHITZZ\"sAha64.%II1a)GAJArzz/@/@!AGAJ	 J 

1G
1l ;8@T88N+DT
"Ha3t9,,I	  Hi''r   c                 F   t        t        j                  j                  |      |       }|j                  j                         D cg c]  }t        |j                        D ]  }|   }}}|j                         D ci c]  \  }}||v s|| }}}|S c c}}w c c}}w r   )	r   r   Storeoptionsgroupsvaluesr   allowed_keywordsrK  )eltyperZ  backendoptsgrT   allowedr   s           r   filter_optsrc    s    288##G,f5D++,,.Q.QQ=O=O8P1q8Pq.GQ$]]_=_TQWAqD_D=K R=s   #B BBc              #      K   | D ]=  t        fdt        t        t        fD              rt	              E d{    : ? y7 w)a-  
    Flatten an arbitrarily nested sequence.

    Inspired by: pd.core.common.flatten

    Parameters
    ----------
    line : sequence
        The sequence to flatten

    Notes
    -----
    This only flattens list, tuple, and dict sequences.

    Returns
    -------
    flattened : generator
    c              3   6   K   | ]  }t        |        y wr   )r/   ).0tpelements     r   	<genexpr>z_flatten.<locals>.<genexpr>  s     E1D2z'2&1Ds   N)r   r   tupler2   _flatten)linerh  s    @r   rk  rk    s>     ( E$t1DEE(((M	 (s   7A	AA	c                     t        | d      rt        | d      s| S | j                  D ci c]0  }t        |t              rt        |t              s%|t        |      2 }}|r| j                  |      } | S c c}w )z)
    Convert column names to string.
    r?  rename)r?  )r   r?  r/   r3   r   rn  )r   r1  renameds      r   _convert_col_names_to_strrp    sw     4#74+B<<'az!S/AjQRT\F]3q6	<   {{7{+Ks   A6A6A6crs_strc                 p    ddl m} | j                         dk(  r|j                  S  t	        ||       di |S )z=
    Instantiate a cartopy.crs.Projection from a string.
    r   Nr   r%   )ro   r,   r   r   r   )rq  r   r   s      r   instantiate_crs_strrs    s9     }}++###!74!+F++r   c                  F    d } 	 dd l } | S # t        $ r t        d      d w xY w)Nr   znThe `datashader` package must be installed in order to use datashading features. Install it with pip or conda.)
datashaderModuleNotFoundError)ru  s    r   import_datashaderrw    s@    J   !B
 	   
  c                  F    d } 	 dd l } | S # t        $ r t        d      d w xY w)Nr   zkThe `geoviews` package must be installed in order to use geographic features. Install it with pip or conda.)r   rv  )r   s    r   import_geoviewsrz    s?    H O  !A
 	rx  c                 .    |r | j                   di |} | S )z(Conditionally relabel a HoloViews objectr%   )relabelhv_objr   s     r   r|  r|    s    )&)Mr   c                 .    |r | j                   di |} | S )z&Conditionally redim a HoloViews objectr%   )redimr}  s     r   redim_r    s    ''Mr   c                 V    |r | j                   di |} |r | j                  di |} | S )z5Conditionally relabel and/or redim a HoloViews objectr%   )r|  r  )r~  relabel_kwargsredim_kwargss      r   relabel_redimr    s3    1.1--Mr   c                 L    dt         j                  vryddlm} t	        | |      S )z<Check if the object is a Matplotlib LinearSegmentedColormap.
matplotlibFr   )LinearSegmentedColormap)r   r   matplotlib.colorsr  r/   )r   r  s     r   is_mpl_cmapr    s"    3;;&9c233r   )bokehFr   )r  )@__doc__r   collections.abcr   	functoolsr   packaging.versionr   typesr   r  numpyr   r   r   rL  	holoviewsr   panelrO  rN  rq   __version__
hv_versionbokeh_version_fugue_ipythonr   r   r9   r>   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r7  r  rG  rW  rc  rk  rp  r3   rs  rw  rz  r|  r  r  r  r%   r   r   <module>r     sE    $  %      O R^^$
))*2j&J&ZIX	*R57RE('^2'& _cT#n/"6((6", ,		4Q  Os   C C"!C"