
    I.eJ                        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n	#  dZY nxY w eej                  Z ee
j                  Ze ed	          k    Z eej                   ed
          k    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)dZ.d  Z/d)d!Z0d" Z1d*d#Z2d$ Z3d% Z4d&e5fd'Z6dS )+z4
Provides utilities to convert data and projections
    N)Hashablewraps)Version)FunctionTypeTFz3.0z2.0rc4bokehc                 D     t                      fd            }|S )z;If hv.extension is not loaded, load before calling functionc                  t    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.11/site-packages/hvplot/util.pywrapperz"with_hv_extension.<locals>.wrapper    s]     	3WR\9eDD 	3******YT2222tT$V$$$    r   )r   r   r   r   s   ``` r   with_hv_extensionr      s?    
4[[% % % % % % [%
 Nr   c                  8    	 t                      } n	#  d } Y nxY w| S N)get_ipython)ips    r   get_ipyr   )   s)    ]]Is    c                    ddl }	 |j        j        }n# t          $ r  G d d          }|}Y nw xY wt	          | |j                  r| }n%t	          | |          r*|                    |                                 d          }nt	          | t                    st	          | t                    rt	          | t                    rV	 |j        	                    |           } n:# t          $ r- |                     dd                              d	d
          } Y nw xY w	 |                    | d          }n=# t          $ r. 	 |                    | d          }n# t          $ r d}Y nw xY wY nw xY wd}|S )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dS )check_crs.<locals>.DummyN)__name__
__module____qualname__ r   r   Dummyr!   I   s        Dr   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   1   s   & MMM:>   	 	 	 	 	 	 	 	
 #v{## 	C	"	" kk#**,,tk<<	C		 *S#"6"6 c3 	>>j))#.. > > >kk#r**223==>	++c$+77CC 	 	 	kks4k@@   	 JsT    //C   4DDD3 3
E+>EE+E%"E+$E%%E+*E+c                 d    	 |                                  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>   d   sC    &    & & &x%%%%&s    //c           
      &   ddl m} 	 ddlm} d}n# t          $ r d}Y nw xY w| }t          |          } | t          d|          | j        }|rddl}|	                                5  |
                    dt          d	           |                                }|                    | j                   |                                r|                                }ddd           n# 1 swxY w Y   d
ddddddddd	}ddd}	ddd}
i }i }i }|                    d          D ]9}|                    d          }t!          |          dk    r,|d                                         }|d                                         }	 t%          |          }n#  Y nxY w|dk    ry|dk    r|j        }nk|d k    r|j        }d|d!<   nX|d"k    r|j        }nJ|d#k    r|j        }n<|d$k    r|j        }n.|d%k    r|j        }n |d&k    r|j        }nt5          d'|           ||v r |dk    rt7          |          }||||         <   ||	v r|||	|         <   ||
v r|||
|         <   ;d}|r |j        d2d(d)i|}|r|d         |d         f|d*<   |j        d+k    rG|                    dd           |                    dd           d|v r|                    dd           n|j        d,k    r<|                    dd           d|v r!|d         |d-<   |                    dd           nJ|j        d.k    r)d
|v r$|d
         d/z
  |d0<   |                    d
d           n|                    dd           	  |d2d1|i|S # 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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   m   s        JZ  D|BJBBCCC
(C )$$&& 	) 	) ##H} $    %%''Btx(((!! )&&((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) ,*%&.5)"	 	G &% H  F GHFYYs^^ #" #"GGCLLq66Q;;aDJJLLaDJJLL	aAA	D;;I~~%g,$(!!e*f]eXg'i%)*C*C*CDDD<<F{{FF"#GGAJ==$%HXa[!;; !F6!9E 9
8888x88 K)/&/(J$% 
{j  OT***$d+++W$$KK-t444		'	'ND))) G++-45J-KG)*KK-t444		%	%'))(/0C(Ds(JG$%KK+T222)4000r))))))   H 2%%E%W%%%s=      )A4C))C-0C-FF,	M6 6NNc                    g }	 ddl m} n%# t          $ r |                    d           Y nw xY w	 ddl}n%# t          $ r |                    d           Y nw xY w	 ddl}n%# t          $ r |                    d           Y nw xY w|r&t          dd                    |           d          | |                                S t          | |j	                  r| S t          | |j	                  r| 
                                } g }t          | t          t          f          rZ	 |j	                            |           
                                } n,# t          $ r}|                    |           Y d}~nd}~ww xY wt          | t          |j        f          r<	 t!          |           S # t          $ r}|                    |           Y d}~nd}~ww xY wt#          d	          t          | )
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, .zmProjection must be defined as a EPSG code, proj4 string, WKT string, cartopy CRS, pyproj.Proj, or pyproj.CRS.)ro   r,   rq   appendr   r+   joinr   r/   r-   r1   r3   r   	from_epsg	Exceptionr0   r   rr   )r,   missingr   gvr+   errorses          r   process_crsr      sr    G"""""""" " " "y!!!!!"# # # #z"""""#! ! ! !x     ! \ZTYYwEWEWZZZ[[[
{!!!	C	"	" 
	C	$	$ jjllF#Sz"" 	*&&s++2244CC 	 	 	MM!	#V[)** 	"3''' 	 	 	MM!	 	?  fs]    --6 AAA! !BB#,E 
E9E44E9F( (
G2GGc                     t          | d          oXt          | t                     oBt          | t          t          f           o%t          | t
          j                  o
| 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   &  sj     	Z   	@C)>)>%> 	@3e---	@ C,,>Q?r   c                     t          | g d          rdS t          | d          r#ddlm} t          | |          r| j        dk    S d S dS )N)daskstreamzpandas	geopandascudfTintaker   
DataSource	dataframeF)check_libraryintake.source.baser   r/   	containerdatar   s     r   
is_tabularr   4  st    TMMMNN t	tX	&	& 111111dJ'' 	1>[00	1 	1 ur   c                 r   t          | g d          sdS t          | t          j                  rdS 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 dS )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   >  s    DDDEE u	D")	$	$ t	tY	'	' 
''''''$S[ 9:::	tV	$	$ ######$	***	tV	$	$ $,,,ur   c                 j     t          |t                    s|g}t           fd|D                       S )Nc                 v    g | ]5}j                             d           d                             |          6S )r   r   )r#   r{   
startswith).0lr   s     r   
<listcomp>z!check_library.<locals>.<listcomp>R  s<    LLLq$$S))!,77::LLLr   )r/   listany)r   librarys   ` r   r   r   O  s?    gt$$ )LLLLGLLLMMMr   c                 V    dt           j        v rddlm}m} t          | ||f          S d S )Nr   r   )	DataFramer   )sysmodulesr   r   r   r/   )r   r   r   s      r   is_cudfr   T  sD    ********$F 3444 r   c                 j    t          | d          sdS dd lm} t          | |j        |j        f          S )Nr   Fr   )r   r   r   r/   r   r   )r   r   s     r   is_daskr   Y  sD    v&& udR\295666r   c                 N    dt           j        vrdS ddlm} t	          | |          S )Nr   Fr   r   )r   r   r   r   r/   r   s     r   	is_intaker   _  s6    s{""u------dJ'''r   c                 X    t          | d          sdS dd l}t          | |j                  S )NibisFr   )r   r   r/   Expr)r   r   s     r   is_ibisr   e  s4    v&& uKKKdDI&&&r   c                     t          | d          sdS dd lm} |o't          | |j        |j        |j        |j        f          S )Nr   Fr   )r   r   r   r/   r   r   
DataFramesr   )r   r   s     r   
is_streamzr   k  sS    y)) u######]:dS]CJPSP[$\]]]r   c                 Z    t          | d          sdS ddlm}m} t	          | ||f          S )NxarrayFr   )	DataArrayDataset)r   r   r   r   r/   )r   r   r   s      r   	is_xarrayr   q  sF    x(( u))))))))dY0111r   c                 R    t          | d          sdS ddlm} t          | |          S )Nr   Fr   )r   )r   r   r   r/   )r   r   s     r   is_xarray_dataarrayr   w  s;    x(( u      dI&&&r   c                     | j         dvrt          d          |r|                                 } n|                                 } | 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   ~  sV    ~444! #E F F 	F  ||~~yy{{Kr   c                     dt           j        v rdd l}t          | |j                  rdS t          | t
          j                  ot          | d          ot          | d          S )Nspatialpandasr   T	geom_typegeometry)r   r   r   r/   GeoDataFramer   r   r   )r   spds     r   is_geodataframer     sg    #+%%####dC,-- 	4dBL))fgdK.H.HfWUY[eMfMffr   c                   
 dd l }t          | |j                  r| n!| j        p|p|	}|                     |          
rt          
          ng |fD ]W}t          |t
                    r                    |           -t          |t                    r                    |           X|sTfdD             }t          |          \  }}} j
        di fd|D              j        di fd|D             t          j                  }pg |pg z   fdj        D             d d d         fdD             }|rp} t                    d	k     r,fd
t          | j                  d d d         D             z  sbs`j        D ]X}|         j                            dd          }|                                dk    r|>|                                dk    r|Ys-s+t          |          dk    r
|d d	         n	d d	         \  n1rsfdD             d         nrsfdD             d         t                    d	k    rV|dvrR|sPt          | j                 j                  t          | j                 j                  z   
fd|D             }np|r-                                } |r|                                 n| } nE                                } t          | j        j                  dk    r|                                 } t                    dk    rdgrs|v rd         n|n(rsv r|d         nd         nssd         |cfD ]W}t          |t
                    r                    |           -t          |t                    r                    |           Xg D ]+}|j        v r                     |         j                   ,fd|D             }|fd|D             }| |fS )Nr   )namec                 j    g | ]/}|t          j                  t          j                  z   v-|0S r%   )r   	data_varscoordsr   vardatasets     r   r   z"process_xarray.<locals>.<listcomp>  s@    jjjS4@Q;R;RUYZaZhUiUi;i0i0iS0i0i0ir   c                 "    i | ]}||         S r%   r%   r   s     r   
<dictcomp>z"process_xarray.<locals>.<dictcomp>  s    *U*U*U3*U*U*Ur   c                 "    i | ]}||         S r%   r%   r   s     r   r   z"process_xarray.<locals>.<dictcomp>  s    #L#L#L#C#L#L#Lr   c                 >    g | ]}|         j         d k    |v|S )r%   )shape)r   cr   rA   s     r   r   z"process_xarray.<locals>.<listcomp>  s/    TTT!)9R)?)?AVOOAOOOr   c                 &    g | ]}|j         v |S r%   )indexes)r   dr   s     r   r   z"process_xarray.<locals>.<listcomp>  s%    :::Q'/%9%9!%9%9%9r   r\   c                     g | ]}|v|	S r%   r%   )r   dimdimss     r   r   z"process_xarray.<locals>.<listcomp>  s    MMMSS__S___r   axisr   xyr   c                      g | ]
}|k    |S r%   r%   )r   r  r  s     r   r   z"process_xarray.<locals>.<listcomp>      +++qAFFFFFr   c                      g | ]
}|k    |S r%   r%   )r   r  r	  s     r   r   z"process_xarray.<locals>.<listcomp>  r  r   )tabler   c                 0    g | ]}|fv|v|v|S r%   r%   )r   r  r  
other_dimsr  r	  s     r   r   z"process_xarray.<locals>.<listcomp>  s9    jjjQ!QATMMVW_iViViqViViVir   indexc                 "    g | ]}|z   v	|S r%   r%   )r   r  all_varscovered_dimss     r   r   z"process_xarray.<locals>.<listcomp>  s5     @ @ @|h'>>> >>>r   c                      g | ]
}|pg v|S r%   r%   )r   r   bys     r   r   z"process_xarray.<locals>.<listcomp>  s'    GGGQ1RX23F3Fq3F3F3Fr   r%   )r   r/   r   r   
to_datasetr   extendr3   r   process_derived_datetime_xarrayassign_coordsassignr   r   r|   r  attrsgetlowerto_dask_dataframepersistto_dataframer  namesreset_index)r   r  r	  r  groupbyr   r  griddedlabelvalue_labelr  kindxrr   r   	not_found_
extra_varsextra_coordsr   
index_dimsr   r  leftover_dimsr  r  r   r  rA   s    ```      `             @@@@@r   process_xarrayr/    s   $
## -y0E0[//t/,,#-5tJ2H1b'" ! !c4   	!OOC    S!! 	!OOC    NjjjjHjjj	&Egy&Y&Y#:|'''VV*U*U*U*U*U*U*UVV '.MM#L#L#L#L#L#L#LMMW&''IhB7=b)FTTTTTw~TTTUYUYWYUYZD::::T:::J 3Ht99q==MMMMDOODDbD$9MMMMD 	Q 	^  qz'++FB77::<<3&&AAZZ\\S((A 	/Q 	/%(__q%8%8:bqb>>d2A2hDAqq 	/q 	/++++D+++A.AA 	/q 	/++++D+++A.AIIMMd*>>>w>A+,,tDKN4G/H/HHDjjjjjjj*jjjG 	*,,..D%,64<<>>>$DD''))D4:#$$q((''))t99>>9D 	&Q 	&	>>QyAA 	&q 	& !T			!tAwAA 	&1 	&7IDAqq6 	% 	%C#t$$ %$$$$C%% %$$$ 	7 	7Cgn$$##GCL$5666@ @ @ @ @
 @ @ @ ?GGGG-GGGGAr7""r   c                    ddl m} g g |D ]f}d|v r`|                    d          d         } || |                   r4|| j        v r                    |           Q                    |           gfd|D             }|fS )Nr   is_datetime64_any_dtyper   c                 "    g | ]}|z   v	|S r%   r%   )r   r   r,  r+  s     r   r   z3process_derived_datetime_xarray.<locals>.<listcomp>  s(    RRRS
\8Q-Q-Q-Q-Q-Qr   )pandas.api.typesr2  r{   r   r   )r   r)  isdater   derived_fromr,  r+  s        @@r   r  r    s    BBBBBBJL + +#::99S>>!,Lvd<()) +4;.. '',,,,%%c***RRRRR	RRRIj,..r   c                   	 ddl m} |pg }i 	|D ]}d|v r|                    d          }|d         }|d         }|| j        v r0 || |                   rt	          | |         j        |          	|<   d|dk    r) || j                  rt	          | j        |          	|<   ||v r>| j        |                    |                   } ||          rt	          ||          	|<   ։	r | j        di 	} 	fd|D             }|| fS )Nr   r1  r   r   r  c                 @    g | ]}|                                 v|S r%   )keys)r   r   
extra_colss     r   r   z3process_derived_datetime_pandas.<locals>.<listcomp>	  s-    JJJS
8I8I-I-I-I-I-Ir   r%   )	r4  r2  r{   columnsr   dtr  axesr  )
r   r)  r  r5  r   partsbase_coldt_strr  r:  s
            @r   process_derived_datetime_pandasrA    sZ   BBBBBBmGJ = =#::IIcNNEQxH2YF4<''6$x.)) I&-d8n.?&H&HJsOW$$6$*%% B&-dj&&A&AJsOW$$	'--"9"9:6%== =&-eV&<&<JsO )t{((Z((JJJJ	JJJId?r   c                    i }g }g }t          |                                          d| fd|fd|fgz   D ]\  }}t          |t          j                  r|||<   %t
          r^t          |t          j        j                  r?t          t          j
                  t          d          k     r|j        j        ||<   |||<   |                                D ]o\  }}||vrft          |t                    rQt          |d          rA|j        d         }	|t          |	          z  }|t          |          t          |	          z  z  }p|||fS )Nr  r	  r'  z0.6.4_dinfodependencies)r   itemsr/   param	Parameterpanel_availablepnwidgetsWidgetr   __version__valuer   r   rC  r|   )
r  r	  r'  kwdsdynamicarg_deps	arg_namesrT   r   depss
             r   process_dynamic_argsrS    sH   GHITZZ\\""sAha64.%II  1a)) 	GAJJ 	Arz/@!A!A 	r~&&)9)999W]




 - -1G
1l ; ;8@T@T8N+DT

"Ha3t99,,IHi''r   c                     t          t          j                            |          |           }d |j                                        D             fd|                                D             }|S )Nc                 @    g | ]}t          |j                  D ]}|S r%   )r   allowed_keywords)r   grT   s      r   r   zfilter_opts.<locals>.<listcomp>'  sG     2 2 2QQ/002 2  2 2 2 2r   c                 $    i | ]\  }}|v 	||S r%   r%   )r   rT   r   alloweds      r   r   zfilter_opts.<locals>.<dictcomp>)  s$    ===TQWAqr   )r   r   StoreoptionsgroupsvaluesrE  )eltyper[  backendoptsrY  s       @r   filter_optsra  %  ss    28##G,,f55D2 2$+,,.. 2 2 2G====W]]__===DKr   c              #      K   | D ]It          fdt          t          t          fD                       rt	                    E d{V  EV  JdS )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   8   K   | ]}t          |          V  d S r   )r/   )r   tpelements     r   	<genexpr>z_flatten.<locals>.<genexpr>B  s-      EE2z'2&&EEEEEEr   N)r   r   tupler2   _flatten)linere  s    @r   rh  rh  -  s|      (   EEEE$t1DEEEEE 	((((((((((MMMM	 r   c                     t          | d          rt          | d          s| S d | j        D             }|r|                     |          } | S )z)
    Convert column names to string.
    r;  renamec                     i | ]<}t          |t                    t          |t                    ,|t          |          =S r%   )r/   r3   r   )r   r   s     r   r   z-_convert_col_names_to_str.<locals>.<dictcomp>Q  sT       !S!! '1H&=&=	3q66  r   )r;  )r   r;  rk  )r   renameds     r   _convert_col_names_to_strrn  H  sn     4## 74+B+B    G
  ,{{7{++Kr   crs_strc                 x    ddl m} |                                 dk    r|j        S  t	          ||           di |S )z=
    Instantiate a cartopy.crs.Projection from a string.
    r   NGOOGLE_MERCATORr%   )ro   r,   upperrq  r   )ro  r   r   s      r   instantiate_crs_strrs  [  sS     }}+++##!74!!++F+++r   )r   Fr   )r   )7__doc__r   collections.abcr   	functoolsr   packaging.versionr   typesr   r   numpyr   r   r   rF  	holoviewsr   panelrI  rH  rL  
hv_versionbokeh_versionbokeh3param2_fugue_ipythonr   r   r9   r>   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r/  r  rA  rS  ra  rh  rn  r3   rs  r%   r   r   <module>r     s    


 $ $ $ $ $ $       % % % % % %                    OOOOOWR^$$
)**	''%..	(	"	#	#wwx'8'8	8     0 0 0f& & &B& B& B&J1 1 1h      "N N N
5 5 5
7 7 7( ( (' ' '^ ^ ^2 2 2' ' '	 	 	g g g 9=O# O# O# O#d/ / /    4( ( (.     6  &, , , , , , ,s	   ; A