
    <i{              
           S SK JrJrJrJrJr  SrS\S\S\S\S\4
S jrSS
 jr	S\
\\4   S\\
\\4      S\\\
\\4         S\4S jrS\
\\4   S\\
\\4      S\S\4S jrg	)    )asincosradianssinsqrtg3333MXAlon1lat1lon2lat2returnc                     [        [        XX#/5      u  pp#X -
  nX1-
  n[        US-  5      S-  [        U5      [        U5      -  [        US-  5      S-  -  -   nS[	        [        U5      5      -  n[        U-  $ )z
Calculate distance between two points on Earth using Haversine formula.

Args:
    lon1: longitude of first point
    lat1: latitude of first point
    lon2: longitude of second point
    lat2: latitude of second point

Returns:
    distance in meters
   )mapr   r   r   r   r   MEAN_EARTH_RADIUS)r   r	   r
   r   dlondlatacs           Q/home/james-whalen/.local/lib/python3.13/site-packages/qdrant_client/local/geo.pygeo_distancer      s{     !4t*BCD;D;DD1HSYT2S]a5GGGA	DaMAq      Nc                  b   SSS.n SSS.nSSS.n[        U S   U S	   U S   U S	   5      S
:  d   e[        U S   U S	   US   US	   5      S:  d   e[        U S   U S	   US   US	   5      S:  d   e[        U S   U S	   US   US	   5      S:  d   e[        U S   U S	   US   US	   5      S:  d   eg )Ng鷯B@g(K@)lonlatg6[g{I@g(\*@g(\BJ@r   r   g      ?i $ i@' i j iP- )r   )moscowlondonberlins      r   test_geo_distancer       s    W-FW-FW-Fuve}fUmVE]SVYYYYuve}fUmVE]SVaaaauve}fUmVE]SVaaaauve}fUmVE]SVaaaauve}fUmVE]SVaaaar   pointexterior	interiorsc                     Sn[        XS5      (       aV  SnSnU[        U5      :  a:  U(       d3  [        XU   S5      (       a  SnUS-  nU[        U5      :  a	  U(       d  M3  U(       d  SnU$ )NFTr      )in_ringlen)r   r    r!   inside_polyin_holeks         r   boolean_point_in_polygonr)   -   so    
 Ku%%#i. ulE22FA #i.  Kr   ptringignore_boundaryc                 |   SnUS   S   U[        U5      S-
     S   :X  a/  US   S   U[        U5      S-
     S   :X  a  US[        U5      S-
   n[        U5      S-
  n[        S[        U5      5       H  nX   S   nX   S   nX   S   nX   S   n	U S   Xh-
  -  XxU S   -
  -  -   XS   U-
  -  -   S:H  =(       a+    X`S   -
  XS   -
  -  S:*  =(       a    XpS   -
  XS   -
  -  S:*  n
U
(       a	  U(       + s  $ XpS   :  XS   :  :g  =(       a    U S   X-
  U S   U-
  -  X-
  -  U-   :  nU(       a  U(       + nUnM     U$ )NFr   r#   )r%   range)r*   r+   r,   	is_insidejixiyixjyjon_boundary	intersects               r   r$   r$   A   s    IAwqzT#d)a-(++Q
d3t9q=>QRS>T0TAD	A&D	AA1c$i WQZWQZWQZWQZUbgBqEz!22Ra52:5FF!K 3!u*e,13!u*e,1 	
 &&&a5jba5j1 
qERWA,82== 	 %I# !$ r   )r   N)mathr   r   r   r   r   r   floatr   r   tuplelistboolr)   r$    r   r   <module>r>      s    . .  !u !E ! !e ! !2
b5&' Due|,-. 
	(eUl#'eUl(;#<OS	r   