
    HwgH                        d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d d	lmZ eeefZ G d
 d      Z G d dee      Z G d de      Z  G d d      Z! G d d      Z" G d de"e      Z# G d de      Z$ G d de      Z% G d de      Z& G d de      Z' G d de      Z( G d  d!e      Z) G d" d#e      Z* G d$ d%e"e       Z+ G d& d'e"e       Z, G d( d)e"e       Z- G d* d+      Z. G d, d-e.e"e      Z/ G d. d/e       Z0 G d0 d1e       Z1 G d2 d3e      Z2 G d4 d5e      Z3 G d6 d7e      Z4 G d8 d9e      Z5 G d: d;e"e       Z6ejn                   G d< d=ee             Z8ejn                   G d> d?e"ee             Z9 G d@ dAe.e"e      Z: G dB dCe      Z; G dD dEe       Z< G dF dGe      Z= G dH dIe      Z> G dJ dKe      Z? G dL dMe.e"e      Z@ G dN dOe"e       ZA G dP dQe      ZB G dR dSe!e       ZC G dT dUe!e       ZD G dV dWe"e       ZE G dX dYe       Z G dZ d[eC      ZF G d\ d]e"e       ZGy^)_    )Decimal)BaseSpatialFieldGeometryField)	AreaFieldDistanceField)GEOSGeometry)
FieldError)NotSupportedError)BinaryFieldBooleanField
FloatFieldFuncIntegerField	TextField	TransformValue)Cast)cached_propertyc                   d     e Zd ZdZdZ fdZed        Zed        Z	d	 fd	Z
 fdZd
dZ xZS )GeoFuncMixinN)r   c                    t        |   |i | | j                  D ]  }| j                  |   }t	        |t
              s#	 |j                  }|j                  }t	        |t              r|r-t	        |t              st        d| j                  |dz   fz        |j                  s|st        d      |rt        |t        |j                              | j                  |<    y # t        $ r d }Y w xY w)Nz9%s function requires a geometric argument in position %d.   z$SRID is required for all geometries.srid)output_field)super__init__geom_param_possource_expressions
isinstancer   r   r	   valuer   r   	TypeErrornamer   
ValueError)selfexpressionsextraposexprr   geom	__class__s          ]/var/www/horilla/myenv/lib/python3.12/site-packages/django/contrib/gis/db/models/functions.pyr   zGeoFuncMixin.__init__   s    +// && 	C**3/DdE*$#00 ::Dt\2"<?Oyy#'*+  99\ !GHH/4}$))'D0'',+	  $#$s   C%%C32C3c                 .    | j                   j                  S N)r+   __name__r%   s    r,   r#   zGeoFuncMixin.name9   s    ~~&&&    c                 N    | j                   | j                  d      j                  S Nr   )r   r   fieldr0   s    r,   	geo_fieldzGeoFuncMixin.geo_field=   s$    &&t':':1'=>DDDr1   c                     | j                   '|%|j                  j                  | j                        }t	        |   ||fd|i|S )Nfunction)r7   opsspatial_function_namer#   r   as_sql)r%   compiler
connectionr7   extra_contextr+   s        r,   r:   zGeoFuncMixin.as_sqlA   sE    == X%5!~~;;DIIFHw~h
WXWWWr1   c           
         t        
|   |i |}| j                  s|S |j                         }| j                  D ]K  }||   }t	        |t
              rt        | j                  d|dz   dt        |      j                  d       |j                  j                  }| j                  dd  D ]V  }|j                  |   }|j                  j                  }	|	|k7  s. t        ||      j                  |i ||j                  |<   X |S )Nz/ function requires a GeometryField in position r   z, got .)r   resolve_expressionr   get_source_fieldsr    r   r"   r#   typer/   r5   r   r   r   r   )r%   argskwargsressource_fieldsr(   r4   	base_sridr)   	expr_sridr+   s             r,   r@   zGeoFuncMixin.resolve_expressionF   s   g($9&9""J --/&& 
	C!#&Ee]3 		aU,,	 
	 MM&&	&&qr* 	6C))#.D))..II%/%i)/$$d/6.4/6&&s+	6 
r1   c                 ^    t        |d      s |rt        ||      st        d|d|d      |S )Nr@   zThe z) parameter has the wrong type: should be r?   )hasattrr    r"   )r%   r!   
param_namecheck_typess       r,   _handle_paramzGeoFuncMixin._handle_paramd   s7    u23:e[#A!;0  r1   r.    N)r/   
__module____qualname__r7   r   r   propertyr#   r   r5   r:   r@   rM   __classcell__r+   s   @r,   r   r      sL    HN: ' ' E EX
<r1   r   c                       e Zd Zy)GeoFuncNr/   rP   rQ    r1   r,   rV   rV   n       r1   rV   c                       e Zd Zed        Zy)GeomOutputGeoFuncc                 B    t        | j                  j                        S )Nr   )r   r5   r   r0   s    r,   r   zGeomOutputGeoFunc.output_fields   s    $.."5"566r1   N)r/   rP   rQ   r   r   rX   r1   r,   r[   r[   r   s    7 7r1   r[   c                       e Zd ZdZd Zy)SQLiteDecimalToFloatMixinz
    By default, Decimal values are converted to str by the SQLite backend, which
    is not acceptable by the GIS functions expecting numeric values.
    c           
      6   | j                         }|j                  |j                         D cg c]H  }t        |d      r8t	        |j
                  t              rt        t        |j
                              n|J c}        |j                  ||fi |S c c}w )Nr!   )
copyset_source_expressionsget_source_expressionsrJ   r    r!   r   r   floatr:   )r%   r;   r<   r=   r`   r)   s         r,   	as_sqlitez#SQLiteDecimalToFloatMixin.as_sqlite~   s    yy{##
 !779	  4)jW.M eDJJ'(	
 t{{8ZA=AAs   ABN)r/   rP   rQ   __doc__rd   rX   r1   r,   r^   r^   x   s    

Br1   r^   c                       e Zd ZdZd Zy)OracleToleranceMixing?c                    t        | j                  | j                  j                  d| j                        dt
                    }| j                         }|j                  g | j                         |        |j                  ||fi |S )N	tolerance)
r   rM   r'   getri   NUMERIC_TYPESr`   ra   rb   r:   )r%   r;   r<   r=   ri   clones         r,   	as_oraclezOracleToleranceMixin.as_oracle   s}    

{DNN;
	 		$$%Pt'B'B'D%Pi%PQu||HjBMBBr1   N)r/   rP   rQ   ri   rm   rX   r1   r,   rg   rg      s    I
Cr1   rg   c                   8     e Zd ZdZed        Z fdZd Z xZS )Arear   c                 ,    t        | j                        S r.   )r   r5   r0   s    r,   r   zArea.output_field   s    ((r1   c                     |j                   j                  s&| j                  j                  |      rt	        d      t        |   ||fi |S )Nz2Area on geodetic coordinate systems not supported.)featuressupports_area_geodeticr5   geodeticr
   r   r:   r%   r;   r<   r=   r+   s       r,   r:   zArea.as_sql   sP    ""99dnn>U>U?
 $D  w~h
DmDDr1   c                 t    | j                   j                  |      r
d|d<   d|d<    | j                  ||fi |S )Nz+%(function)s(%(expressions)s, %(spheroid)d)templateTspheroid)r5   rt   r:   )r%   r;   r<   r=   s       r,   rd   zArea.as_sqlite   s@    >>"":.(UM*%(,M*%t{{8ZA=AAr1   )	r/   rP   rQ   arityr   r   r:   rd   rS   rT   s   @r,   ro   ro      s&    E) )EBr1   ro   c                   "    e Zd Z e       ZdZdZy)Azimuth   r   r   Nr/   rP   rQ   r   r   ry   r   rX   r1   r,   r{   r{          <LENr1   r{   c                   8     e Zd Z e       Zd fd	Z fdZ xZS )	AsGeoJSONc                     |g}|&|j                  | j                  |dt                     d}|r|rd}n	|rd}n|rd}|r|j                  |       t        |   |i | y )N	precisionr      r   r|   appendrM   intr   r   )	r%   
expressionbboxcrsr   r'   r&   optionsr+   s	           r,   r   zAsGeoJSON.__init__   so    !l t11)[#NO4GGGw'+//r1   c                     | j                         }| j                         }|j                  |d d        t        t        |  ||fi |S )Nr   )rb   r`   ra   r   r   r:   )r%   r;   r<   r=   r   rl   r+   s         r,   rm   zAsGeoJSON.as_oracle   sL    !88:		$$%7%;<Y-h
TmTTr1   )FF   )r/   rP   rQ   r   r   r   rm   rS   rT   s   @r,   r   r      s    ;L0U Ur1   r   c                   <     e Zd ZdZ e       Zd fd	Z fdZ xZS )AsGML)r   c                 |    ||g}|&|j                  | j                  |dt                     t        |   |i | y Nr   r   )r%   r   versionr   r'   r&   r+   s         r,   r   zAsGML.__init__   sB    
+ t11)[#NO+//r1   c                     | j                         }|d   }| j                         }|j                  |d   g       |j                  dk(  rdnd|d<   t	        t
        |  ||fi |S )Nr   r   r   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr7   )rb   r`   ra   r!   r   r   r:   )r%   r;   r<   r=   r   r   rl   r+   s          r,   rm   zAsGML.as_oracle   sy    !88:$Q'		$$&8&;%<= }}! )* 	j!
 UE)(JP-PPr1   )r|   r   )	r/   rP   rQ   r   r   r   r   rm   rS   rT   s   @r,   r   r      s     N;L0
Q 
Qr1   r   c                   .     e Zd Z e       Zd fd	Z xZS )AsKMLc                 z    |g}|&|j                  | j                  |dt                     t        |   |i | y r   r   r%   r   r   r'   r&   r+   s        r,   r   zAsKML.__init__   ?    !l t11)[#NO+//r1   )r   r/   rP   rQ   r   r   r   rS   rT   s   @r,   r   r      s    ;L0 0r1   r   c                   .     e Zd Z e       Zd fd	Z xZS )AsSVGc                     t        |d      r|n
t        |      }||| j                  |dt              g}t        |   |i | y )Nr@   r   )rJ   r   rM   r   r   )r%   r   relativer   r'   r&   r+   s         r,   r   zAsSVG.__init__   sP    *>?HS] 	 y+s;

 	+//r1   )Fr   r   rT   s   @r,   r   r      s    ;L	0 	0r1   r   c                       e Zd Z e       ZdZy)AsWKBr   N)r/   rP   rQ   r   r   ry   rX   r1   r,   r   r     s    =LEr1   r   c                       e Zd Z e       ZdZy)AsWKTr   N)r/   rP   rQ   r   r   ry   rX   r1   r,   r   r     s    ;LEr1   r   c                   *     e Zd Zd fd	Z fdZ xZS )BoundingCirclec                 (    t        |   ||fi | y r.   )r   r   )r%   r   num_segr'   r+   s       r,   r   zBoundingCircle.__init__  s    W66r1   c                     | j                         }|j                  | j                         d   g       t        t        |  ||fi |S r3   )r`   ra   rb   r   r   rm   r%   r;   r<   r=   rl   r+   s        r,   rm   zBoundingCircle.as_oracle  sN    		$$d&A&A&CA&F%GH^U5j
$1
 	
r1   )0   )r/   rP   rQ   r   rm   rS   rT   s   @r,   r   r     s    7
 
r1   r   c                       e Zd ZdZy)Centroidr   Nr/   rP   rQ   ry   rX   r1   r,   r   r         Er1   r   c                       e Zd ZdZdZy)
Differencer|   r}   Nr/   rP   rQ   ry   r   rX   r1   r,   r   r         ENr1   r   c                   "    e Zd Zed        Zd Zy)DistanceResultMixinc                 ,    t        | j                        S r.   )r   r5   r0   s    r,   r   z DistanceResultMixin.output_field!  s    T^^,,r1   c                 d    | j                   j                  xr | j                   j                  dk(  S )Ni  )r5   	geographyr   r0   s    r,   source_is_geographyz'DistanceResultMixin.source_is_geography%  s&    ~~''GDNN,?,?4,GGr1   N)r/   rP   rQ   r   r   r   rX   r1   r,   r   r      s    - -Hr1   r   c                   <     e Zd ZdZdZd fd	Z fdZ fdZ xZS )Distancer}   Nc                 h    ||g}|| j                  |dt              | _        t        |   |i | y )Nrx   )rM   boolrx   r   r   )r%   expr1expr2rx   r'   r&   r+   s         r,   r   zDistance.__init__-  s:    en ..xTJDM+//r1   c                    | j                         }d }|j                  d   }| j                         }|j                  j                  |k7  rZt        |t              r||j                  _        n8t        |t        |j                  j                  |            |j                  d<   |s| j                  j                  |      r| j                  rY|j                  j                  d      }|j                  j                  t        | j                  j                  |                   n|j                  j                  d      }t!        t"        |J  ||fd|i|S )Nr   )r   r   DistanceSpheroidDistanceSpherer7   )r`   r   r   r   r   r    r   r   r   r   r5   rt   rx   r8   r9   r   r   r   r:   )	r%   r;   r<   r=   rl   r7   r   r   r+   s	           r,   as_postgresqlzDistance.as_postgresql3  s,   		((+,,.	''94%'/8"",.2!u'9'9'>'>)T/((+
 T^^44Z@ }} &>>??@RS((//$..11*=> &>>??@PQXu,j
+3
7D
 	
r1   c                     | j                   j                  |      r&d|d<   t        t        | j                              |d<   t        |   ||fi |S )Nz8COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)rw   rx   )r5   rt   r   r   rx   r   r:   ru   s       r,   rd   zDistance.as_sqliteR  sX    >>"":. K  ),D,?(@M*%w~h
DmDDr1   r.   )	r/   rP   rQ   r   rx   r   r   rd   rS   rT   s   @r,   r   r   )  s#    NH0
>E Er1   r   c                       e Zd ZdZy)Enveloper   Nr   rX   r1   r,   r   r   \  r   r1   r   c                       e Zd ZdZy)ForcePolygonCWr   Nr   rX   r1   r,   r   r   `  r   r1   r   c                   &    e Zd Z ed      ZdZdZy)FromWKBr   r   r   rX   Nr/   rP   rQ   r   r   ry   r   rX   r1   r,   r   r   d       a(LENr1   r   c                   &    e Zd Z ed      ZdZdZy)FromWKTr   r   r   rX   Nr   rX   r1   r,   r   r   j  r   r1   r   c                   4     e Zd Z e       Zd fd	Zd Z xZS )GeoHashc                 z    |g}|&|j                  | j                  |dt                     t        |   |i | y r   r   r   s        r,   r   zGeoHash.__init__s  r   r1   c                     | j                         }t        |j                        dk  r$|j                  j                  t	        d              |j
                  ||fi |S )Nr|   d   )r`   lenr   r   r   r:   )r%   r;   r<   r=   rl   s        r,   as_mysqlzGeoHash.as_mysqly  sP    		u''(1,$$++E#J7u||HjBMBBr1   r.   )r/   rP   rQ   r   r   r   r   rS   rT   s   @r,   r   r   p  s    ;L0Cr1   r   c                   *    e Zd Z e       ZdZdZdZdZy)GeometryDistancer|   rO   z <-> r}   N)	r/   rP   rQ   r   r   ry   r7   
arg_joinerr   rX   r1   r,   r   r     s    <LEHJNr1   r   c                       e Zd ZdZdZy)Intersectionr|   r}   Nr   rX   r1   r,   r   r     r   r1   r   c                       e Zd ZdZ e       Zy)IsEmptyisemptyN)r/   rP   rQ   lookup_namer   r   rX   r1   r,   r   r     s    K>Lr1   r   c                   0     e Zd ZdZ e       Z fdZ xZS )IsValidisvalidc                 :    t        |   ||fi |\  }}d|z  |fS )Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   rm   )r%   r;   r<   r=   sqlparamsr+   s         r,   rm   zIsValid.as_oracle  s-    g'*NNV6<fDDr1   )r/   rP   rQ   r   r   r   rm   rS   rT   s   @r,   r   r     s    K>LE Er1   r   c                   >     e Zd Zd fd	Z fdZ fdZ fdZ xZS )Lengthc                 4    || _         t        |   |fi | y r.   )rx   r   r   )r%   r   rx   r'   r+   s       r,   r   zLength.__init__  s     (%(r1   c                     | j                   j                  |      r!|j                  j                  st	        d      t        |   ||fi |S )Nz6This backend doesn't support Length on geodetic fields)r5   rt   rr   supports_length_geodeticr
   r   r:   ru   s       r,   r:   zLength.as_sql  sL    NN##J/''@@#H  w~h
DmDDr1   c                 2   | j                         }d }| j                         r/|j                  j                  t	        | j
                               n| j                  j                  |      rY|j                  j                  d      }|j                  j                  t	        | j                  j                  |                   n;t        d | j                         D              }|dkD  r|j                  j                  }t        t        |>  ||fd|i|S )NLengthSpheroidc              3   :   K   | ]  }|s|j                     y wr.   dim.0fs     r,   	<genexpr>z'Length.as_postgresql.<locals>.<genexpr>  s     CaeeCs   r|   r7   )r`   r   r   r   r   rx   r5   rt   r8   r9   minrA   length3dr   r   r:   )r%   r;   r<   r=   rl   r7   r   r+   s          r,   r   zLength.as_postgresql  s    		##%$$++E$--,@A^^$$Z0!~~;;<LMH$$++E$..2I2I*2U,VWCT%;%;%=CCCQw%>>22VU*j
+3
7D
 	
r1   c                     d }| j                   j                  |      r| j                  rdnd}t        |   ||fd|i|S )NGeodesicLengthGreatCircleLengthr7   )r5   rt   rx   r   r:   )r%   r;   r<   r=   r7   r+   s        r,   rd   zLength.as_sqlite  sD    >>"":.+/=='>QHw~h
WXWWWr1   )T)r/   rP   rQ   r   r:   r   rd   rS   rT   s   @r,   r   r     s    )E
"X Xr1   r   c                   "    e Zd Z e       ZdZdZy)LineLocatePointr|   r}   Nr~   rX   r1   r,   r   r     r   r1   r   c                       e Zd Zy)	MakeValidNrW   rX   r1   r,   r   r     rY   r1   r   c                       e Zd Z e       ZdZy)MemSizer   Nr/   rP   rQ   r   r   ry   rX   r1   r,   r   r         >LEr1   r   c                       e Zd Z e       ZdZy)NumGeometriesr   Nr   rX   r1   r,   r   r     r   r1   r   c                       e Zd Z e       ZdZy)	NumPointsr   Nr   rX   r1   r,   r   r     r   r1   r   c                   ,     e Zd ZdZ fdZ fdZ xZS )	Perimeterr   c                    d }| j                   j                  |      r| j                         st        d      t	        d | j                         D              }|dkD  r|j                  j                  }t        | $  ||fd|i|S )Nz<ST_Perimeter cannot use a non-projected non-geography field.c              3   4   K   | ]  }|j                     y wr.   r   r   s     r,   r   z*Perimeter.as_postgresql.<locals>.<genexpr>  s     :A!%%:s   r|   r7   )
r5   rt   r   r
   r   rA   r8   perimeter3dr   r:   )r%   r;   r<   r=   r7   r   r+   s         r,   r   zPerimeter.as_postgresql  s    >>"":.t7O7O7Q#N  :!7!7!9::7!~~11Hw~h
WXWWWr1   c                 r    | j                   j                  |      rt        d      t        |   ||fi |S )Nz+Perimeter cannot use a non-projected field.)r5   rt   r
   r   r:   ru   s       r,   rd   zPerimeter.as_sqlite  s7    >>"":.#$QRRw~h
DmDDr1   )r/   rP   rQ   ry   r   rd   rS   rT   s   @r,   r  r    s    E	XE Er1   r  c                       e Zd ZdZy)PointOnSurfacer   Nr   rX   r1   r,   r  r    r   r1   r  c                       e Zd ZdZy)Reverser   Nr   rX   r1   r,   r
  r
    r   r1   r
  c                         e Zd Zd fd	Z xZS )Scalec                     || j                  |dt              | j                  |dt              g}|dk7  r&|j                  | j                  |dt                     t        |   |i | y )Nxy        z)rM   rk   r   r   r   )r%   r   r  r  r  r'   r&   r+   s          r,   r   zScale.__init__  si    q#}5q#}5

 8t11!S-HI+//r1   )r  r/   rP   rQ   r   rS   rT   s   @r,   r  r    s    0 0r1   r  c                        e Zd Z fdZ xZS )
SnapToGridc           
      "    t        |      }|g}|dv r5|j                  |D cg c]  } j                  |dt               c}       n2|dk(  r"|g  fd|dd  D         fd|dd D        z  }nt	        d      t           |i | y c c}w )	N)r   r|   rO      c              3   L   K   | ]  }j                  |d t                ywrN   rM   rk   r   argr%   s     r,   r   z&SnapToGrid.__init__.<locals>.<genexpr>  s      Q$$$S"m<Q   !$r|   c              3   L   K   | ]  }j                  |d t                ywrN   r  r  s     r,   r   z&SnapToGrid.__init__.<locals>.<genexpr>  s      R$$$S"m<Rr  r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r   extendrM   rk   r$   r   r   )r%   r   rC   r'   nargsr&   r  r+   s   `      r,   r   zSnapToGrid.__init__  s    D	!lF?GKL##C];L aZ QQRQRQq	R K
 QRR+// Ms   Br  rT   s   @r,   r  r    s    0 0r1   r  c                       e Zd ZdZdZy)SymDifferencer|   r}   Nr   rX   r1   r,   r   r     r   r1   r   c                        e Zd Z fdZ xZS )r   c                 |    || j                  |dt              g}d|vrt        |      |d<   t        |   |i | y )Nr   r   r   )rM   r   r   r   r   )r%   r   r   r'   r&   r+   s        r,   r   zTransform.__init__  sJ    tVS1
 &$1t$<E.!+//r1   r  rT   s   @r,   r   r     s    0 0r1   r   c                        e Zd Z fdZ xZS )	Translatec                     | j                         }t        | j                        dk  r$|j                  j                  t	        d             t        t        |  ||fi |S )Nr  r   )r`   r   r   r   r   r   r$  rd   r   s        r,   rd   zTranslate.as_sqlite*  sR    		t&&'!+$$++E!H5Y0:WWWr1   )r/   rP   rQ   rd   rS   rT   s   @r,   r$  r$  )  s    X Xr1   r$  c                       e Zd ZdZdZy)Unionr|   r}   Nr   rX   r1   r,   r'  r'  2  r   r1   r'  N)Hdecimalr   #django.contrib.gis.db.models.fieldsr   r    django.contrib.gis.db.models.sqlr   r   django.contrib.gis.geosr   django.core.exceptionsr	   	django.dbr
   django.db.modelsr   r   r   r   r   r   r   r   django.db.models.functionsr   django.utils.functionalr   r   rc   rk   r   rV   r[   r^   rg   ro   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   register_lookupr   r   r   r   r   r   r   r   r  r  r
  r  r  r   r$  r'  rX   r1   r,   <module>r2     s    O E 0 - '	 	 	 , 3eW%S Sl	lD 	7 7B B&C C B B.g U U2QG Q.0G 00G 0G 
G 
	
)+< 	
#%6 %'8 
H H0E"$8' 0Ef  & g g Cg C"w '): 
 !!"lI " ""
 !!E"L) E "E$X "6 $XNg 	! 	g 
G 
 
E#%97 E()+< g 	0%'8 	00*,= 0&(*; 
0! 0X X "3 r1   