Ë
    ómxiÃ  ã                   ó`   — d Z ddlZddlmZ ddlmZ d„ Zd„ Zd	„ Zd
„ Z	d„ Z
dd„Zd„ Zdefd„Zy)zO
Functions that make it easier to provide a default centering
for a view state
é    Né   )Ú	ViewStateé   )Úis_pandas_dfc                 ó   — || z
  || z
  z  S )N© )ÚxÚx0s     úY/home/htdocs/ttos/venv/lib/python3.12/site-packages/pydeck/data_utils/viewport_helpers.pyÚ_squared_diffr   
   s   € Ø�‰F�r˜A‘vÑÐó    c                 óÜ   — t        | «      t        |«      k(  st        d«      ‚t        j                  t	        t        | |«      D ��cg c]  \  }}t        ||«      ‘Œ c}}«      «      S c c}}w )a-  Euclidean distance in n-dimensions

    Parameters
    ----------
    y : tuple of float
        A point in n-dimensions
    y1 : tuple of float
        A point in n-dimensions

    Examples
    --------
    >>> EPSILON = 0.001
    >>> euclidean((3, 6, 5), (7, -5, 1)) - 12.369 < EPSILON
    True
    z,Input coordinates must be of the same length)ÚlenÚ	ExceptionÚmathÚsqrtÚsumÚzipr   )ÚyÚy1r	   r
   s       r   Ú	euclideanr      sS   € ô  ˆq‹6”S˜“WÒÜÐFÓGÐGÜ�9‰9”S¼CÀÀ2»J×G±5°1°bœ-¨¨2Õ.ÓGÓHÓIÐIùÓGs   ÁA(c           	      óâ   — t        | D �cg c]  }t        |d   «      ‘Œ c}«      t        | «      z  }t        | D �cg c]  }t        |d   «      ‘Œ c}«      t        | «      z  }||fS c c}w c c}w )zÙGets centroid in a series of points

    Parameters
    ----------
    points : list of list of float
        List of (x, y) coordinates

    Returns
    -------
    tuple
        The centroid of a list of points
    r   r   )r   Úfloatr   )ÚpointsÚpÚavg_xÚavg_ys       r   Úgeometric_meanr   #   sb   € ô  fÖ- ”�q˜‘t•Ò-Ó.´°V³Ñ<€EÜ fÖ- ”�q˜‘t•Ò-Ó.´°V³Ñ<€EØ�5ˆ>Ðùò .ùÚ-s
   ŠA'»A,c                 óÆ   — | D �cg c]  }|d   ‘Œ	 }}| D �cg c]  }|d   ‘Œ	 }}t        |«      }t        |«      }t        |«      }t        |«      }||f||ffS c c}w c c}w )a  Get the bounding box around the data,

    Parameters
    ----------
    points : list of list of float
        List of (x, y) coordinates

    Returns
    -------
    dict
        Dictionary containing the top left and bottom right points of a bounding box
    r   r   )ÚmaxÚmin)r   r   ÚxsÚysÚmax_xÚmax_yÚmin_xÚmin_ys           r   Úget_bboxr(   5   sq   € ð Ö	�1ˆ!ˆA‹$Ð	€BÐ	ØÖ	�1ˆ!ˆA‹$Ð	€BÐ	Ü�‹G€EÜ�‹G€EÜ�‹G€EÜ�‹G€EØ�EˆN˜U E˜NÐ+Ð+ùò 
 ùÚ	s
   …A—Ac                 ó¦   — | D �cg c]  }|t        ||«      f‘Œ }}t        |d„ ¬«      }|D �cg c]  }|d   ‘Œ	 c}dt        |«       S c c}w c c}w )aŠ  Gets the k furthest points from the center

    Parameters
    ----------
    points : list of list of float
        List of (x, y) coordinates
    center : list of list of float
        Center point
    k : int
        Number of points

    Returns
    -------
    list
        Index of the k furthest points

    Todo
    ---
    Currently implemently naively, needs to be more efficient
    c                 ó   — | d   S )Nr   r   )r	   s    r   ú<lambda>z%k_nearest_neighbors.<locals>.<lambda>a   s
   € ¸¸1¹€ r   )Úkeyr   N)r   ÚsortedÚint)r   ÚcenterÚkÚptÚpts_with_distanceÚ
sorted_ptsr	   s          r   Úk_nearest_neighborsr4   K   s\   € ð* @FÖF¸˜"œi¨¨FÓ3Ò4ÐFÐÐFÜÐ)©~Ô>€JØ$Ö%�QˆAˆa‹DÒ% h¬¨A«Ð/Ð/ùò Gùâ%s
   …A	®Ac                 ó‚   — |dk(  r| S t        | «      }t        j                  |t        | «      z  «      }t	        | ||«      S )as  Computes the bounding box of the maximum zoom for the specified list of points

    Parameters
    ----------
    points : list of list of float
        List of (x, y) coordinates
    proportion : float, default 1
        Value between 0 and 1 representing the minimum proportion of data to be captured

    Returns
    -------
    list
        k nearest data points
    r   )r   r   Úfloorr   r4   )r   Ú
proportionÚcentroidÚ	n_to_keeps       r   Ú	get_n_pctr:   e   s@   € ð �Q‚Øˆä˜fÓ%€Hä—
‘
˜:¬¨F«Ñ3Ó4€IÜ˜v x°Ó;Ð;r   c                 óú  — t        | d   d   | d   d   «      t        | d   d   | d   d   «      z
  }t        | d   d   | d   d   «      t        | d   d   | d   d   «      z
  }t        ||«      }d}|dt        j                  dd«      z  k  rd}|S t	        dt        j
                  |«      t        j
                  d	«      z  t        j
                  d«      t        j
                  d«      z  z
  z  «      }|dk  rd}|S )
aJ  Computes the zoom level of a lat/lng bounding box

    Parameters
    ----------
    bbox : list of list of float
        Northwest and southeast corners of a bounding box, given as two points in a list

    Returns
    -------
    int
        Zoom level of map in a WGS84 Mercator projection (e.g., like that of Google Maps)
    r   r   Ng     €v@r   é   é   éÿÿÿÿg       @)r    r!   r   Úpowr.   Úlog)ÚbboxÚlat_diffÚlng_diffÚmax_diffÚ
zoom_levels        r   Úbbox_to_zoom_levelrF   }   s  € ô �4˜‘7˜1‘:˜t A™w q™zÓ*¬S°°a±¸±¸TÀ!¹WÀQ¹ZÓ-HÑH€HÜ�4˜‘7˜1‘:˜t A™w q™zÓ*¬S°°a±¸±¸TÀ!¹WÀQ¹ZÓ-HÑH€Hä�8˜XÓ&€HØ€JØ�5œ4Ÿ8™8 A r›?Ñ*Ò+Øˆ
ð
 Ðô ˜¤§¡¨Ó 2´T·X±X¸c³]Ñ BÄtÇxÁxÐPUÃÔY]×YaÑYaÐbcÓYdÑGdÑeÑfÓgˆ
Ø˜Š>ØˆJØÐr   c                 ó¸   — t        | «      r| j                  d¬«      } t        t        | |«      «      }t	        |«      }t        | «      } ||d   |d   |¬«      }|S )a\  Automatically computes a zoom level for the points passed in.

    Parameters
    ----------
    points : list of list of float or pandas.DataFrame
        A list of points
    view_propotion : float, default 1
        Proportion of the data that is meaningful to plot
    view_type : class constructor for pydeck.ViewState, default :class:`pydeck.bindings.view_state.ViewState`
        Class constructor for a viewport. In the current version of pydeck,
        users most likely do not have to modify this attribute.

    Returns
    -------
    pydeck.Viewport
        Viewport fitted to the data
    F)Úindexr   r   )ÚlatitudeÚ	longitudeÚzoom)r   Ú
to_recordsr(   r:   rF   r   )r   Úview_proportionÚ	view_typerA   rK   r/   Úinstances          r   Úcompute_viewrP   ˜   s_   € ô$ �FÔØ×"Ñ"¨Ð"Ó/ˆÜ”I˜f oÓ6Ó7€DÜ˜dÓ#€DÜ˜FÓ#€FÙ &¨¡)°v¸a±yÀtÔL€HØ€Or   )r   )Ú__doc__r   Úbindings.view_stater   Útype_checkingr   r   r   r   r(   r4   r:   rF   rP   r   r   r   ú<module>rT      sE   ðñó Ý +Ý 'òòJò*ò$,ò,0ó4<ò0ð6 *+°iô r   